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 @@
    -
  • © 2021 GitHub, Inc.
  • +
  • © + GitHub, Inc.
  • Terms
  • 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 @@
    -
  • © 2021 GitHub, Inc.
  • +
  • © + GitHub, Inc.
  • Terms
  • -
  • Privacy
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 +@localtypedeclstmt 349 @@ -16910,11 +16910,11 @@ -isLocalClass +isLocalClassOrInterface 349 -classid +typeid 349 @@ -16924,7 +16924,7 @@ -classid +typeid parent @@ -16941,7 +16941,7 @@ parent -classid +typeid 12 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", "Class"] and + node.asExpr() = ma.getAnArgument() + ) } } @@ -295,6 +317,8 @@ class UnsafeTypeConfig extends TaintTracking2::Configuration { ma.getMethod() instanceof ObjectMapperReadMethod or ma.getMethod() instanceof JabsorbUnmarshallMethod + or + ma.getMethod() instanceof JoddJsonParseMethod ) and // Note `JacksonTypeDescriptorType` includes plain old `java.lang.Class` arg.getType() instanceof JacksonTypeDescriptorType and @@ -356,3 +380,85 @@ class SafeObjectMapperConfig extends DataFlow2::Configuration { ) } } + +/** + * A method that configures Jodd's JsonParser, either enabling dangerous deserialization to + * arbitrary Java types or restricting the types that can be instantiated. + */ +private class JoddJsonParserConfigurationMethodQualifier extends DataFlow::ExprNode { + JoddJsonParserConfigurationMethodQualifier() { + exists(MethodAccess ma, Method m | ma.getQualifier() = this.asExpr() and m = ma.getMethod() | + m instanceof WithClassMetadataMethod + or + m instanceof SetClassMetadataNameMethod + or + m instanceof AllowClassMethod + ) + } +} + +/** + * Configuration tracking flow from methods that configure `jodd.json.JsonParser`'s class + * instantiation feature to a `.parse` call on the same parser. + */ +private class JoddJsonParserConfigurationMethodConfig extends DataFlow2::Configuration { + JoddJsonParserConfigurationMethodConfig() { + this = "UnsafeDeserialization::JoddJsonParserConfigurationMethodConfig" + } + + override predicate isSource(DataFlow::Node src) { + src instanceof JoddJsonParserConfigurationMethodQualifier + } + + override predicate isSink(DataFlow::Node sink) { + exists(MethodAccess ma | + ma.getMethod() instanceof JoddJsonParseMethod and + sink.asExpr() = ma.getQualifier() // The class type argument + ) + } +} + +/** + * Gets the qualifier to a method call that configures a `jodd.json.JsonParser` instance unsafely. + * + * Such a parser may instantiate an arbtirary type when deserializing untrusted data. + */ +private DataFlow::Node getAnUnsafelyConfiguredParser() { + exists(MethodAccess ma | result.asExpr() = ma.getQualifier() | + ma.getMethod() instanceof WithClassMetadataMethod and + ma.getArgument(0).(CompileTimeConstantExpr).getBooleanValue() = true + or + ma.getMethod() instanceof SetClassMetadataNameMethod and + not ma.getArgument(0) instanceof NullLiteral + ) +} + +/** + * Gets the qualifier to a method call that configures a `jodd.json.JsonParser` instance safely. + * + * Such a parser will not instantiate an arbtirary type when deserializing untrusted data. + */ +private DataFlow::Node getASafelyConfiguredParser() { + exists(MethodAccess ma | result.asExpr() = ma.getQualifier() | + ma.getMethod() instanceof WithClassMetadataMethod and + ma.getArgument(0).(CompileTimeConstantExpr).getBooleanValue() = false + or + ma.getMethod() instanceof SetClassMetadataNameMethod and + ma.getArgument(0) instanceof NullLiteral + or + ma.getMethod() instanceof AllowClassMethod + ) +} + +/** + * Holds if `parseMethodQualifierExpr` is a `jodd.json.JsonParser` instance that is configured unsafely + * and which never appears to be configured safely. + */ +private predicate joddJsonParserConfiguredUnsafely(Expr parserExpr) { + exists(DataFlow::Node parser, JoddJsonParserConfigurationMethodConfig config | + parser.asExpr() = parserExpr + | + config.hasFlow(getAnUnsafelyConfiguredParser(), parser) and + not config.hasFlow(getASafelyConfiguredParser(), parser) + ) +} diff --git a/java/ql/src/semmle/code/java/security/UrlRedirect.qll b/java/ql/lib/semmle/code/java/security/UrlRedirect.qll similarity index 100% rename from java/ql/src/semmle/code/java/security/UrlRedirect.qll rename to java/ql/lib/semmle/code/java/security/UrlRedirect.qll diff --git a/java/ql/src/semmle/code/java/security/Validation.qll b/java/ql/lib/semmle/code/java/security/Validation.qll similarity index 100% rename from java/ql/src/semmle/code/java/security/Validation.qll rename to java/ql/lib/semmle/code/java/security/Validation.qll diff --git a/java/ql/src/semmle/code/java/security/XPath.qll b/java/ql/lib/semmle/code/java/security/XPath.qll similarity index 100% rename from java/ql/src/semmle/code/java/security/XPath.qll rename to java/ql/lib/semmle/code/java/security/XPath.qll diff --git a/java/ql/src/semmle/code/java/security/XSS.qll b/java/ql/lib/semmle/code/java/security/XSS.qll similarity index 95% rename from java/ql/src/semmle/code/java/security/XSS.qll rename to java/ql/lib/semmle/code/java/security/XSS.qll index a24ad2e22dc..2ebcff73998 100644 --- a/java/ql/src/semmle/code/java/security/XSS.qll +++ b/java/ql/lib/semmle/code/java/security/XSS.qll @@ -93,7 +93,10 @@ private class DefaultXssSink extends XssSink { /** A default sanitizer that considers numeric and boolean typed data safe for writing to output. */ private class DefaultXSSSanitizer extends XssSanitizer { DefaultXSSSanitizer() { - this.getType() instanceof NumericType or this.getType() instanceof BooleanType + this.getType() instanceof NumericType or + this.getType() instanceof BooleanType or + // Match `org.springframework.web.util.HtmlUtils.htmlEscape` and possibly other methods like it. + this.asExpr().(MethodAccess).getMethod().getName().regexpMatch("(?i)html_?escape.*") } } diff --git a/java/ql/src/semmle/code/java/security/XmlParsers.qll b/java/ql/lib/semmle/code/java/security/XmlParsers.qll similarity index 100% rename from java/ql/src/semmle/code/java/security/XmlParsers.qll rename to java/ql/lib/semmle/code/java/security/XmlParsers.qll diff --git a/java/ql/src/semmle/code/xml/AndroidManifest.qll b/java/ql/lib/semmle/code/xml/AndroidManifest.qll similarity index 100% rename from java/ql/src/semmle/code/xml/AndroidManifest.qll rename to java/ql/lib/semmle/code/xml/AndroidManifest.qll diff --git a/java/ql/src/semmle/code/xml/Ant.qll b/java/ql/lib/semmle/code/xml/Ant.qll similarity index 100% rename from java/ql/src/semmle/code/xml/Ant.qll rename to java/ql/lib/semmle/code/xml/Ant.qll diff --git a/java/ql/src/semmle/code/xml/MavenPom.qll b/java/ql/lib/semmle/code/xml/MavenPom.qll similarity index 100% rename from java/ql/src/semmle/code/xml/MavenPom.qll rename to java/ql/lib/semmle/code/xml/MavenPom.qll diff --git a/java/ql/src/semmle/code/xml/WebXML.qll b/java/ql/lib/semmle/code/xml/WebXML.qll similarity index 100% rename from java/ql/src/semmle/code/xml/WebXML.qll rename to java/ql/lib/semmle/code/xml/WebXML.qll diff --git a/java/ql/src/semmle/code/xml/XML.qll b/java/ql/lib/semmle/code/xml/XML.qll similarity index 100% rename from java/ql/src/semmle/code/xml/XML.qll rename to java/ql/lib/semmle/code/xml/XML.qll diff --git a/java/ql/src/semmle/files/FileSystem.qll b/java/ql/lib/semmle/files/FileSystem.qll similarity index 100% rename from java/ql/src/semmle/files/FileSystem.qll rename to java/ql/lib/semmle/files/FileSystem.qll diff --git a/java/ql/src/DeadCode/FLinesOfDeadCode.ql b/java/ql/src/DeadCode/FLinesOfDeadCode.ql index c5f209d557e..0137778e744 100644 --- a/java/ql/src/DeadCode/FLinesOfDeadCode.ql +++ b/java/ql/src/DeadCode/FLinesOfDeadCode.ql @@ -37,8 +37,8 @@ where // Remove local classes defined in the dead method - they are reported separately as a dead // class. We keep anonymous class counts, because anonymous classes are not reported // separately. - sum(LocalClass localClass | - localClass.getLocalClassDeclStmt().getEnclosingCallable() = deadMethod + sum(LocalClassOrInterface localClass | + localClass.getLocalTypeDeclStmt().getEnclosingCallable() = deadMethod | localClass.getNumberOfLinesOfCode() ) diff --git a/java/ql/src/Likely Bugs/Statements/UseBraces.ql b/java/ql/src/Likely Bugs/Statements/UseBraces.ql index 1d844cfe913..e9c8a082f3f 100644 --- a/java/ql/src/Likely Bugs/Statements/UseBraces.ql +++ b/java/ql/src/Likely Bugs/Statements/UseBraces.ql @@ -122,8 +122,8 @@ where not abortsControlFlow(s) and // Exclude the double semicolon case `if (cond) s;;`. not t instanceof EmptyStmt and - // `LocalClassDeclStmt`s yield false positives since their `Location` doesn't include the `class` keyword. - not t instanceof LocalClassDeclStmt + // `LocalTypeDeclStmt`s yield false positives since their `Location` doesn't include the `class` keyword. + not t instanceof LocalTypeDeclStmt select s, "Indentation suggests that $@ belongs to $@, but this is not the case; consider adding braces or adjusting indentation.", t, "the next statement", c, "the control structure" diff --git a/java/ql/src/Security/CWE/CWE-089/SqlUnescaped.ql b/java/ql/src/Security/CWE/CWE-089/SqlUnescaped.ql index 6ec2be3e1c8..e9e6cba3770 100644 --- a/java/ql/src/Security/CWE/CWE-089/SqlUnescaped.ql +++ b/java/ql/src/Security/CWE/CWE-089/SqlUnescaped.ql @@ -5,7 +5,7 @@ * @kind problem * @problem.severity error * @security-severity 8.8 - * @precision high + * @precision medium * @id java/concatenated-sql-query * @tags security * external/cwe/cwe-089 diff --git a/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp b/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp index 9c87aae7e37..0e7cfae08d0 100644 --- a/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp +++ b/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp @@ -15,7 +15,7 @@ may have unforeseen effects, such as the execution of arbitrary code.

There are many different serialization frameworks. This query currently supports Kryo, XmlDecoder, XStream, SnakeYaml, JYaml, JsonIO, YAMLBeans, HessianBurlap, Castor, Burlap, -Jackson, Jabsorb and Java IO serialization through +Jackson, Jabsorb, Jodd JSON and Java IO serialization through ObjectInputStream/ObjectOutputStream.

@@ -105,6 +105,10 @@ Blog posts by the developer of Jackson libraries: Jabsorb documentation on deserialization: Jabsorb JSON Serializer. +
  • +Jodd JSON documentation on deserialization: +JoddJson Parser. +
  • 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: +

    + +
    + + +
  • + Wikipedia: + Initialization vector. +
  • +
  • + National Institute of Standards and Technology: + Recommendation for Block Cipher Modes of Operation. +
  • +
  • + National Institute of Standards and Technology: + FIPS 140-2: Security Requirements for Cryptographic Modules. +
  • +
    +
    \ No newline at end of file diff --git a/java/ql/src/experimental/Security/CWE/CWE-1204/StaticInitializationVector.ql b/java/ql/src/experimental/Security/CWE/CWE-1204/StaticInitializationVector.ql new file mode 100644 index 00000000000..9980f68ed80 --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-1204/StaticInitializationVector.ql @@ -0,0 +1,26 @@ +/** + * @name Using a static initialization vector for encryption + * @description A cipher needs an initialization vector (IV) in some cases, + * for example, when CBC or GCM modes are used. IVs are used to randomize the encryption, + * therefore they should be unique and ideally unpredictable. + * Otherwise, the same plaintexts result in same ciphertexts under a given secret key. + * If a static IV is used for encryption, this lets an attacker learn + * if the same data pieces are transferred or stored, + * or this can help the attacker run a dictionary attack. + * @kind path-problem + * @problem.severity warning + * @precision high + * @id java/static-initialization-vector + * @tags security + * external/cwe/cwe-329 + * external/cwe/cwe-1204 + */ + +import java +import experimental.semmle.code.java.security.StaticInitializationVectorQuery +import DataFlow::PathGraph + +from DataFlow::PathNode source, DataFlow::PathNode sink, StaticInitializationVectorConfig conf +where conf.hasFlowPath(source, sink) +select sink.getNode(), source, sink, "A $@ should not be used for encryption.", source.getNode(), + "static initialization vector" diff --git a/java/ql/src/experimental/semmle/code/java/security/StaticInitializationVectorQuery.qll b/java/ql/src/experimental/semmle/code/java/security/StaticInitializationVectorQuery.qll new file mode 100644 index 00000000000..5d88d620c21 --- /dev/null +++ b/java/ql/src/experimental/semmle/code/java/security/StaticInitializationVectorQuery.qll @@ -0,0 +1,165 @@ +import java +import semmle.code.java.dataflow.TaintTracking +import semmle.code.java.dataflow.TaintTracking2 + +/** + * Holds if `array` is initialized only with constants. + */ +private predicate initializedWithConstants(ArrayCreationExpr array) { + // creating an array without an initializer, for example `new byte[8]` + not exists(array.getInit()) + or + // creating a multidimensional array with an initializer like `{ new byte[8], new byte[16] }` + // This works around https://github.com/github/codeql/issues/6552 -- change me once there is + // a better way to distinguish nested initializers that create zero-filled arrays + // (e.g. `new byte[1]`) from those with an initializer list (`new byte[] { 1 }` or just `{ 1 }`) + array.getInit().getAnInit().getAChildExpr() instanceof IntegerLiteral + or + // creating an array wit an initializer like `new byte[] { 1, 2 }` + forex(Expr element | element = array.getInit().getAnInit() | + element instanceof CompileTimeConstantExpr + ) +} + +/** + * An expression that creates a byte array that is initialized with constants. + */ +private class StaticByteArrayCreation extends ArrayCreationExpr { + StaticByteArrayCreation() { + this.getType().(Array).getElementType().(PrimitiveType).getName() = "byte" and + initializedWithConstants(this) + } +} + +/** An expression that updates `array`. */ +private class ArrayUpdate extends Expr { + Expr array; + + ArrayUpdate() { + exists(Assignment assign | + assign = this and + assign.getDest().(ArrayAccess).getArray() = array and + not assign.getSource() instanceof CompileTimeConstantExpr + ) + or + exists(StaticMethodAccess ma | + ma.getMethod().hasQualifiedName("java.lang", "System", "arraycopy") and + ma = this and + ma.getArgument(2) = array + ) + or + exists(MethodAccess ma, Method m | + m = ma.getMethod() and + ma = this and + ma.getArgument(0) = array + | + m.hasQualifiedName("java.io", "InputStream", "read") or + m.hasQualifiedName("java.nio", "ByteBuffer", "get") or + m.hasQualifiedName("java.security", "SecureRandom", "nextBytes") or + m.hasQualifiedName("java.util", "Random", "nextBytes") + ) + } + + /** Returns the updated array. */ + Expr getArray() { result = array } +} + +/** + * A config that tracks dataflow from creating an array to an operation that updates it. + */ +private class ArrayUpdateConfig extends TaintTracking2::Configuration { + ArrayUpdateConfig() { this = "ArrayUpdateConfig" } + + override predicate isSource(DataFlow::Node source) { + source.asExpr() instanceof StaticByteArrayCreation + } + + override predicate isSink(DataFlow::Node sink) { + exists(ArrayUpdate update | update.getArray() = sink.asExpr()) + } +} + +/** + * A source that defines an array that doesn't get updated. + */ +private class StaticInitializationVectorSource extends DataFlow::Node { + StaticInitializationVectorSource() { + exists(StaticByteArrayCreation array | array = this.asExpr() | + not exists(ArrayUpdateConfig config | config.hasFlow(DataFlow2::exprNode(array), _)) + ) + } +} + +/** + * A config that tracks initialization of a cipher for encryption. + */ +private class EncryptionModeConfig extends TaintTracking2::Configuration { + EncryptionModeConfig() { this = "EncryptionModeConfig" } + + override predicate isSource(DataFlow::Node source) { + source + .asExpr() + .(FieldRead) + .getField() + .hasQualifiedName("javax.crypto", "Cipher", "ENCRYPT_MODE") + } + + override predicate isSink(DataFlow::Node sink) { + exists(MethodAccess ma, Method m | m = ma.getMethod() | + m.hasQualifiedName("javax.crypto", "Cipher", "init") and + ma.getArgument(0) = sink.asExpr() + ) + } +} + +/** + * A sink that initializes a cipher for encryption with unsafe parameters. + */ +private class EncryptionInitializationSink extends DataFlow::Node { + EncryptionInitializationSink() { + exists(MethodAccess ma, Method m, EncryptionModeConfig config | m = ma.getMethod() | + m.hasQualifiedName("javax.crypto", "Cipher", "init") and + m.getParameterType(2) + .(RefType) + .hasQualifiedName("java.security.spec", "AlgorithmParameterSpec") and + ma.getArgument(2) = this.asExpr() and + config.hasFlowToExpr(ma.getArgument(0)) + ) + } +} + +/** + * Holds if `fromNode` to `toNode` is a dataflow step + * that creates cipher's parameters with initialization vector. + */ +private predicate createInitializationVectorSpecStep(DataFlow::Node fromNode, DataFlow::Node toNode) { + exists(ConstructorCall cc, RefType type | + cc = toNode.asExpr() and type = cc.getConstructedType() + | + type.hasQualifiedName("javax.crypto.spec", "IvParameterSpec") and + cc.getArgument(0) = fromNode.asExpr() + or + type.hasQualifiedName("javax.crypto.spec", ["GCMParameterSpec", "RC2ParameterSpec"]) and + cc.getArgument(1) = fromNode.asExpr() + or + type.hasQualifiedName("javax.crypto.spec", "RC5ParameterSpec") and + cc.getArgument(3) = fromNode.asExpr() + ) +} + +/** + * A config that tracks dataflow to initializing a cipher with a static initialization vector. + */ +class StaticInitializationVectorConfig extends TaintTracking::Configuration { + StaticInitializationVectorConfig() { this = "StaticInitializationVectorConfig" } + + override predicate isSource(DataFlow::Node source) { + source instanceof StaticInitializationVectorSource + } + + override predicate isSink(DataFlow::Node sink) { sink instanceof EncryptionInitializationSink } + + override predicate isAdditionalTaintStep(DataFlow::Node fromNode, DataFlow::Node toNode) { + createInitializationVectorSpecStep(fromNode, toNode) + } +} diff --git a/java/ql/src/qlpack.lock.yml b/java/ql/src/qlpack.lock.yml new file mode 100644 index 00000000000..06dd07fc7dc --- /dev/null +++ b/java/ql/src/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 7c48700e295..23f00c438be 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,7 @@ -name: codeql-java -version: 0.0.0 -dbscheme: config/semmlecode.dbscheme +name: codeql/java-queries +version: 0.0.2 suites: codeql-suites extractor: java +dependencies: + codeql/java-all: ^0.0.2 + codeql/suite-helpers: ^0.0.2 diff --git a/java/ql/src/semmle/code/java/frameworks/apache/Collections.qll b/java/ql/src/semmle/code/java/frameworks/apache/Collections.qll deleted file mode 100644 index ba71731aae7..00000000000 --- a/java/ql/src/semmle/code/java/frameworks/apache/Collections.qll +++ /dev/null @@ -1,264 +0,0 @@ -/** 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 `isNotEmpty` 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;KeyValue;true;getKey;;;MapKey of Argument[-1];ReturnValue;value", - "org.apache.commons.collections4;KeyValue;true;getValue;;;MapValue of Argument[-1];ReturnValue;value", - "org.apache.commons.collections;KeyValue;true;getKey;;;MapKey of Argument[-1];ReturnValue;value", - "org.apache.commons.collections;KeyValue;true;getValue;;;MapValue of Argument[-1];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.keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setKey;;;MapValue of Argument[-1];ReturnValue;value", - "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setKey;;;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value", - "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;toString;;;MapKey of Argument[-1];ReturnValue;taint", - "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;toString;;;MapValue of Argument[-1];ReturnValue;taint", - "org.apache.commons.collections4.keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;toString;;;MapKey of Argument[-1];ReturnValue;taint", - "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;toString;;;MapValue of Argument[-1];ReturnValue;taint", - "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;toMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;toMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;TiedMapEntry;true;TiedMapEntry;;;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;TiedMapEntry;true;TiedMapEntry;;;Argument[1];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;AbstractKeyValue;true;setKey;;;MapValue of Argument[-1];ReturnValue;value", - "org.apache.commons.collections.keyvalue;AbstractKeyValue;true;setKey;;;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value", - "org.apache.commons.collections.keyvalue;AbstractKeyValue;true;setValue;;;Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;AbstractKeyValue;true;toString;;;MapKey of Argument[-1];ReturnValue;taint", - "org.apache.commons.collections.keyvalue;AbstractKeyValue;true;toString;;;MapValue of Argument[-1];ReturnValue;taint", - "org.apache.commons.collections.keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.apache.commons.collections.keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.apache.commons.collections.keyvalue;AbstractMapEntryDecorator;true;toString;;;MapKey of Argument[-1];ReturnValue;taint", - "org.apache.commons.collections.keyvalue;AbstractMapEntryDecorator;true;toString;;;MapValue of Argument[-1];ReturnValue;taint", - "org.apache.commons.collections.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultKeyValue;true;toMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.apache.commons.collections.keyvalue;DefaultKeyValue;true;toMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.apache.commons.collections.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;TiedMapEntry;true;TiedMapEntry;;;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;TiedMapEntry;true;TiedMapEntry;;;Argument[1];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.apache.commons.collections.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.apache.commons.collections.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;MapUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;fixedSizeMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;fixedSizeMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;fixedSizeSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;fixedSizeSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;getMap;;;MapValue of Argument[0];ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;getMap;;;Argument[2];ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;getObject;;;MapValue of Argument[0];ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;getObject;;;Argument[2];ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;getString;;;MapValue of Argument[0];ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;getString;;;Argument[2];ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;invertMap;;;MapKey of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;invertMap;;;MapValue of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;iterableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;iterableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;iterableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;iterableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;lazyMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;lazyMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;lazySortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;lazySortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;multiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;multiValueMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;orderedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;orderedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;populateMap;(Map,Iterable,Transformer);;Element of Argument[1];MapValue of Argument[0];value", - "org.apache.commons.collections4;MapUtils;true;populateMap;(MultiMap,Iterable,Transformer);;Element of Argument[1];MapValue of Argument[0];value", - // Note that when lambdas are supported we should have more models for populateMap - "org.apache.commons.collections4;MapUtils;true;predicatedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;predicatedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;predicatedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;predicatedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of Argument[0];value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of Argument[0];value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of Argument[0];value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of Argument[0];value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of Argument[0];value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of Argument[0];value", - "org.apache.commons.collections4;MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;safeAddToMap;;;Argument[1];MapKey of Argument[0];value", - "org.apache.commons.collections4;MapUtils;true;safeAddToMap;;;Argument[2];MapValue of Argument[0];value", - "org.apache.commons.collections4;MapUtils;true;synchronizedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;synchronizedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;synchronizedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;synchronizedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;toMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;toMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;transformedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;transformedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;transformedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;transformedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;unmodifiableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;unmodifiableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;unmodifiableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections4;MapUtils;true;unmodifiableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;fixedSizeMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;fixedSizeMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;fixedSizeSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;fixedSizeSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;getMap;;;MapValue of Argument[0];ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;getMap;;;Argument[2];ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;getObject;;;MapValue of Argument[0];ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;getObject;;;Argument[2];ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;getString;;;MapValue of Argument[0];ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;getString;;;Argument[2];ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;invertMap;;;MapKey of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;invertMap;;;MapValue of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;iterableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;iterableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;iterableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;iterableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;lazyMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;lazyMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;lazySortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;lazySortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;multiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;multiValueMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;orderedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;orderedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;populateMap;(Map,Iterable,Transformer);;Element of Argument[1];MapValue of Argument[0];value", - "org.apache.commons.collections;MapUtils;true;populateMap;(MultiMap,Iterable,Transformer);;Element of Argument[1];MapValue of Argument[0];value", - // Note that when lambdas are supported we should have more models for populateMap - "org.apache.commons.collections;MapUtils;true;predicatedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;predicatedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;predicatedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;predicatedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of Argument[0];value", - "org.apache.commons.collections;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of Argument[0];value", - "org.apache.commons.collections;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of Argument[0];value", - "org.apache.commons.collections;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of Argument[0];value", - "org.apache.commons.collections;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of Argument[0];value", - "org.apache.commons.collections;MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of Argument[0];value", - "org.apache.commons.collections;MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;safeAddToMap;;;Argument[1];MapKey of Argument[0];value", - "org.apache.commons.collections;MapUtils;true;safeAddToMap;;;Argument[2];MapValue of Argument[0];value", - "org.apache.commons.collections;MapUtils;true;synchronizedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;synchronizedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;synchronizedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;synchronizedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;toMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;toMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;transformedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;transformedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;transformedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;transformedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;unmodifiableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;unmodifiableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;unmodifiableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.collections;MapUtils;true;unmodifiableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" - ] - } -} diff --git a/java/ql/src/utils/FlowTestCase.qll b/java/ql/src/utils/FlowTestCase.qll new file mode 100644 index 00000000000..5bf5517f4e5 --- /dev/null +++ b/java/ql/src/utils/FlowTestCase.qll @@ -0,0 +1,309 @@ +/** + * Classes pertaining to test cases themselves. + */ + +import java +private import semmle.code.java.dataflow.internal.DataFlowUtil +private import semmle.code.java.dataflow.ExternalFlow +private import semmle.code.java.dataflow.FlowSummary +private import semmle.code.java.dataflow.internal.FlowSummaryImpl +private import FlowTestCaseUtils +private import FlowTestCaseSupportMethods + +/** + * A CSV row to generate tests for. Users should extend this to define which + * tests to generate. Rows specified here should also satisfy `SummaryModelCsv.row`. + */ +class TargetSummaryModelCsv extends Unit { + /** + * Holds if a test should be generated for `row`. + */ + abstract predicate row(string r); +} + +/** + * Gets a CSV row for which a test has been requested, but `SummaryModelCsv.row` does not hold of it. + */ +query string missingSummaryModelCsv() { + any(TargetSummaryModelCsv target).row(result) and + not any(SummaryModelCsv model).row(result) +} + +/** + * Returns type of parameter `i` of `callable`, including the type of `this` for parameter -1. + */ +Type getParameterType(CallableToTest callable, int i) { + if i = -1 then result = callable.getDeclaringType() else result = callable.getParameterType(i) +} + +private class CallableToTest extends Callable { + CallableToTest() { + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext + | + summaryModel(namespace, type, subtypes, name, signature, ext, _, _, _) and + this = interpretElement(namespace, type, subtypes, name, signature, ext) and + this.isPublic() and + getRootType(this.getDeclaringType()).(RefType).isPublic() + ) + } +} + +/** + * A test snippet (a fragment of Java code that checks that `row` causes `callable` to propagate value/taint (according to `preservesValue`) + * from `input` to `output`). Usually there is one of these per CSV row (`row`), but there may be more if `row` describes more than one + * override or overload of a particular method, or if the input or output specifications cover more than one argument. + */ +private newtype TTestCase = + MkTestCase( + CallableToTest callable, SummaryComponentStack input, SummaryComponentStack output, string kind, + string row + ) { + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string inputSpec, string outputSpec + | + any(TargetSummaryModelCsv tsmc).row(row) and + summaryModel(namespace, type, subtypes, name, signature, ext, inputSpec, outputSpec, kind, row) and + callable = interpretElement(namespace, type, subtypes, name, signature, ext) and + Private::External::interpretSpec(inputSpec, input) and + Private::External::interpretSpec(outputSpec, output) + ) + } + +/** + * A test snippet (as `TTestCase`, except `baseInput` and `baseOutput` hold the bottom of the summary stacks + * `input` and `output` respectively (hence, `baseInput` and `baseOutput` are parameters or return values). + */ +class TestCase extends TTestCase { + CallableToTest callable; + SummaryComponentStack input; + SummaryComponentStack output; + SummaryComponentStack baseInput; + SummaryComponentStack baseOutput; + string kind; + string row; + + TestCase() { + this = MkTestCase(callable, input, output, kind, row) and + baseInput = input.drop(input.length() - 1) and + baseOutput = output.drop(output.length() - 1) + } + + /** + * Returns a representation of this test case's parameters suitable for debugging. + */ + string toString() { + result = + row + " / " + callable + " / " + input + " / " + output + " / " + baseInput + " / " + + baseOutput + " / " + kind + } + + /** + * Returns a value to pass as `callable`'s `argIdx`th argument whose value is irrelevant to the test + * being generated. This will be a zero or a null value, perhaps typecast if we need to disambiguate overloads. + */ + string getFiller(int argIdx) { + exists(Type t | t = callable.getParameterType(argIdx) | + t instanceof RefType and + ( + if mayBeAmbiguous(callable) + then result = "(" + getShortNameIfPossible(t) + ")null" + else result = "null" + ) + or + result = getZero(t) + ) + } + + /** + * Returns the value to pass for `callable`'s `i`th argument, which may be `in` if this is the input argument for + * this test, `out` if it is the output, `instance` if this is an instance method and the instance is neither the + * input nor the output, or a zero/null filler value otherwise. + */ + string getArgument(int i) { + (i = -1 or exists(callable.getParameter(i))) and + if baseInput = SummaryComponentStack::argument(i) + then result = "in" + else + if baseOutput = SummaryComponentStack::argument(i) + then result = "out" + else + if i = -1 + then result = "instance" + else result = this.getFiller(i) + } + + /** + * Returns a statement invoking `callable`, passing `input` and capturing `output` as needed. + */ + string makeCall() { + // For example, one of: + // out = in.method(filler); + // or + // out = filler.method(filler, in, filler); + // or + // out = Type.method(filler, in, filler); + // or + // filler.method(filler, in, out, filler); + // or + // Type.method(filler, in, out, filler); + // or + // out = new Type(filler, in, filler); + // or + // new Type(filler, in, out, filler); + // or + // in.method(filler, out, filler); + // or + // out.method(filler, in, filler); + exists(string storePrefix, string invokePrefix, string args | + ( + if + baseOutput = SummaryComponentStack::return() + or + callable instanceof Constructor and baseOutput = SummaryComponentStack::argument(-1) + then storePrefix = "out = " + else storePrefix = "" + ) and + ( + if callable instanceof Constructor + then invokePrefix = "new " + else + if callable.(Method).isStatic() + then invokePrefix = getShortNameIfPossible(callable.getDeclaringType()) + "." + else invokePrefix = this.getArgument(-1) + "." + ) and + args = concat(int i | i >= 0 | this.getArgument(i), ", " order by i) and + result = storePrefix + invokePrefix + callable.getName() + "(" + args + ")" + ) + } + + /** + * Returns an inline test expectation appropriate to this CSV row. + */ + string getExpectation() { + kind = "value" and result = "// $ hasValueFlow" + or + kind = "taint" and result = "// $ hasTaintFlow" + } + + /** + * Returns a declaration and initialisation of a variable named `instance` if required; otherwise returns an empty string. + */ + string getInstancePrefix() { + if + callable instanceof Method and + not callable.(Method).isStatic() and + baseOutput != SummaryComponentStack::argument(-1) and + baseInput != SummaryComponentStack::argument(-1) + then + // In this case `out` is the instance. + result = getShortNameIfPossible(callable.getDeclaringType()) + " instance = null;\n\t\t\t" + else result = "" + } + + /** + * Returns the type of the output for this test. + */ + Type getOutputType() { + if baseOutput = SummaryComponentStack::return() + then result = callable.getReturnType() + else + exists(int i | + baseOutput = SummaryComponentStack::argument(i) and + result = getParameterType(callable, i) + ) + } + + /** + * Returns the type of the input for this test. + */ + Type getInputType() { + exists(int i | + baseInput = SummaryComponentStack::argument(i) and + result = getParameterType(callable, i) + ) + } + + /** + * Returns the Java name for the type of the input to this test. + */ + string getInputTypeString() { result = getShortNameIfPossible(this.getInputType()) } + + /** + * Returns a call to `source()` wrapped in `newWith` methods as needed according to `input`. + * For example, if the input specification is `ArrayElement of MapValue of Argument[0]`, this + * will return `newWithMapValue(newWithArrayElement(source()))`. + */ + string getInput(SummaryComponentStack stack) { + stack = input and result = "source()" + or + exists(SummaryComponentStack s | s.tail() = stack | + // we currently only know the type if the stack is one level in + if stack = baseInput + then result = SupportMethod::genMethodFor(this.getInputType(), s).getCall(this.getInput(s)) + else result = SupportMethod::genMethodForContent(s).getCall(this.getInput(s)) + ) + } + + /** + * Returns `out` wrapped in `get` methods as needed according to `output`. + * For example, if the output specification is `ArrayElement of MapValue of Argument[0]`, this + * will return `getArrayElement(getMapValue(out))`. + */ + string getOutput(SummaryComponentStack componentStack) { + componentStack = output.drop(_) and + ( + if componentStack = baseOutput + then result = "out" + else + result = + SupportMethod::getMethodForContent(componentStack) + .getCall(this.getOutput(componentStack.tail())) + ) + } + + /** + * Returns the definition of a `newWith` method needed to set up the input or a `get` method needed to set up the output for this test. + */ + SupportMethod getASupportMethod() { + exists(SummaryComponentStack s | s = input.drop(_) and s.tail() != baseInput | + result = SupportMethod::genMethodForContent(s) + ) + or + exists(SummaryComponentStack s | s = input.drop(_) and s.tail() = baseInput | + result = SupportMethod::genMethodFor(this.getInputType(), s) + ) + or + result = SupportMethod::getMethodFor(this.getOutputType(), output) + or + result = SupportMethod::getMethodForContent(output.tail().drop(_)) + } + + /** + * Gets an outer class name that this test would ideally import (and will, unless it clashes with another + * type of the same name). + */ + Type getADesiredImport() { + result = + getRootSourceDeclaration([ + this.getOutputType(), this.getInputType(), callable.getDeclaringType() + ]) + or + // Will refer to parameter types in disambiguating casts, like `(String)null` + mayBeAmbiguous(callable) and result = getRootSourceDeclaration(callable.getAParamType()) + } + + /** + * Gets a test snippet (test body fragment) testing this `callable` propagates value or taint from + * `input` to `output`, as specified by `row_` (which necessarily equals `row`). + */ + string getATestSnippetForRow(string row_) { + row_ = row and + result = + "\t\t{\n\t\t\t// \"" + row + "\"\n\t\t\t" + getShortNameIfPossible(this.getOutputType()) + + " out = null;\n\t\t\t" + this.getInputTypeString() + " in = (" + this.getInputTypeString() + + ")" + this.getInput(baseInput) + ";\n\t\t\t" + this.getInstancePrefix() + this.makeCall() + + ";\n\t\t\t" + "sink(" + this.getOutput(output) + "); " + this.getExpectation() + "\n\t\t}\n" + } +} diff --git a/java/ql/src/utils/FlowTestCaseSupportMethods.qll b/java/ql/src/utils/FlowTestCaseSupportMethods.qll new file mode 100644 index 00000000000..fd19f555f79 --- /dev/null +++ b/java/ql/src/utils/FlowTestCaseSupportMethods.qll @@ -0,0 +1,393 @@ +/** + * Contains predicates and classes relating to support methods for tests, such as the `source()` and `sink()`. + */ + +import java +private import semmle.code.java.dataflow.internal.DataFlowUtil +private import semmle.code.java.dataflow.ExternalFlow +private import semmle.code.java.dataflow.FlowSummary +private import semmle.code.java.dataflow.internal.FlowSummaryImpl +private import FlowTestCaseUtils +private import FlowTestCase + +/** + * Returns a valid Java token naming the field `fc`. + */ +private string getFieldToken(FieldContent fc) { + result = + fc.getField().getDeclaringType().getSourceDeclaration().getName() + "_" + + fc.getField().getName() +} + +/** + * Returns a valid Java token naming the synthetic field `fc`, + * assuming that the name of that field consists only of characters valid in a Java identifier and `.`. + */ +private string getSyntheticFieldToken(SyntheticFieldContent fc) { + exists(string name, int parts | + name = fc.getField() and + parts = count(name.splitAt(".")) + | + if parts = 1 + then result = name + else result = name.splitAt(".", parts - 2) + "_" + name.splitAt(".", parts - 1) + ) +} + +/** + * Returns a token suitable for incorporation into a Java method name describing content `c`. + */ +private string contentToken(Content c) { + c instanceof ArrayContent and result = "ArrayElement" + or + c instanceof CollectionContent and result = "Element" + or + c instanceof MapKeyContent and result = "MapKey" + or + c instanceof MapValueContent and result = "MapValue" + or + result = getFieldToken(c) + or + result = getSyntheticFieldToken(c) +} + +/** + * Returns the `content` wrapped by `component`, if any. + */ +private Content getContent(SummaryComponent component) { + component = SummaryComponent::content(result) +} + +/** Contains utility predicates for getting relevant support methods. */ +module SupportMethod { + /** Gets a generator method for the content type of the head of the component stack `c`. */ + GenMethod genMethodForContent(SummaryComponentStack c) { + result = genMethodFor(any(VoidType v), c) + } + + /** Gets a generator method for the type `t` and the content type of the head of the component stack `c`. */ + GenMethod genMethodFor(Type t, SummaryComponentStack c) { + result = min(GenMethod g | g.appliesTo(t, getContent(c.head())) | g order by g.getPriority(), g) + } + + /** Gets a getter method for the content type of the head of the component stack `c`. */ + GetMethod getMethodForContent(SummaryComponentStack c) { + result = getMethodFor(any(VoidType v), c) + } + + /** Gets a getter method for the type `t` and the content type of the head of the component stack `c`. */ + GetMethod getMethodFor(Type t, SummaryComponentStack c) { + result = min(GetMethod g | g.appliesTo(t, getContent(c.head())) | g order by g.getPriority(), g) + } +} + +/** + * A support method for tests, such as `source()` or `sink()`. + */ +bindingset[this] +abstract class SupportMethod extends string { + /** Gets an import that is required for this support method. */ + string getARequiredImport() { none() } + + /** Gets the Java definition of this support method, if one is necessary. */ + string getDefinition() { none() } + + /** Gets the priority of this support method. Lower priorities are preferred when multiple support methods apply. */ + bindingset[this] + int getPriority() { result = 50 } + + /** + * Gets the CSV row describing this support method if it is needed to set up the output for this test. + * + * For example, `newWithMapValue` will propagate a value from `Argument[0]` to `MapValue of ReturnValue`, and `getMapValue` + * will do the opposite. + */ + string getCsvModel() { none() } +} + +/** + * The method `source()` which is considered as the source for the flow test. + */ +class SourceMethod extends SupportMethod { + SourceMethod() { this = "source" } + + override string getDefinition() { result = "Object source() { return null; }" } +} + +/** + * The method `sink()` which is considered as the sink for the flow test. + */ +class SinkMethod extends SupportMethod { + SinkMethod() { this = "sink" } + + override string getDefinition() { result = "void sink(Object o) { }" } +} + +/** + * A method for getting content from a type. + */ +bindingset[this] +abstract class GetMethod extends SupportMethod { + /** + * Holds if this get method can be used to get the content `c` from the type `t`. + */ + abstract predicate appliesTo(Type t, Content c); + + /** + * Gets the call to get the content from the argument `arg`. + */ + bindingset[this, arg] + abstract string getCall(string arg); +} + +private class DefaultGetMethod extends GetMethod { + Content c; + + DefaultGetMethod() { this = "DefaultGet" + contentToken(c) } + + string getName() { result = "get" + contentToken(c) } + + override int getPriority() { result = 999 } + + override predicate appliesTo(Type t, Content c1) { + c = c1 and + // suppress unused variable warning + t = [any(TestCase tc).getOutputType(), any(VoidType v)] + } + + bindingset[arg] + override string getCall(string arg) { result = this.getName() + "(" + arg + ")" } + + override string getDefinition() { + result = "Object get" + contentToken(c) + "(Object container) { return null; }" + } + + override string getCsvModel() { + result = + "generatedtest;Test;false;" + this.getName() + ";;;" + + getComponentSpec(SummaryComponent::content(c)) + " of Argument[0];ReturnValue;value" + } +} + +private class ListGetMethod extends GetMethod { + ListGetMethod() { this = "listgetmethod" } + + override predicate appliesTo(Type t, Content c) { + t.(RefType).getASourceSupertype*().hasQualifiedName("java.lang", "Iterable") and + c instanceof CollectionContent + } + + override string getDefinition() { + result = " T getElement(Iterable it) { return it.iterator().next(); }" + } + + bindingset[arg] + override string getCall(string arg) { result = "getElement(" + arg + ")" } +} + +private class IteratorGetMethod extends GetMethod { + IteratorGetMethod() { this = "iteratorgetmethod" } + + override predicate appliesTo(Type t, Content c) { + t.(RefType).getASourceSupertype*().hasQualifiedName("java.util", "Iterator") and + c instanceof CollectionContent + } + + override string getDefinition() { + result = " T getElement(Iterator it) { return it.next(); }" + } + + bindingset[arg] + override string getCall(string arg) { result = "getElement(" + arg + ")" } +} + +private class OptionalGetMethod extends GetMethod { + OptionalGetMethod() { this = "optionalgetmethod" } + + override predicate appliesTo(Type t, Content c) { + t.(RefType).getSourceDeclaration().hasQualifiedName("java.util", "Optional") and + c instanceof CollectionContent + } + + override string getDefinition() { result = " T getElement(Optional o) { return o.get(); }" } + + bindingset[arg] + override string getCall(string arg) { result = "getElement(" + arg + ")" } +} + +private class MapGetKeyMethod extends GetMethod { + MapGetKeyMethod() { this = "mapgetkeymethod" } + + override predicate appliesTo(Type t, Content c) { + t.(RefType).getASourceSupertype*().hasQualifiedName("java.util", "Map") and + c instanceof MapKeyContent + } + + override string getDefinition() { + result = " K getMapKey(Map map) { return map.keySet().iterator().next(); }" + } + + bindingset[arg] + override string getCall(string arg) { result = "getMapKey(" + arg + ")" } +} + +private class MapValueGetMethod extends GetMethod { + MapValueGetMethod() { this = "MapValueGetMethod" } + + override predicate appliesTo(Type t, Content c) { + t.(RefType).getASourceSupertype*().hasQualifiedName("java.util", "Map") and + c instanceof MapValueContent + } + + override string getDefinition() { + result = " V getMapValue(Map map) { return map.get(null); }" + } + + bindingset[arg] + override string getCall(string arg) { result = "getMapValue(" + arg + ")" } +} + +private class ArrayGetMethod extends GetMethod { + ArrayGetMethod() { this = "arraygetmethod" } + + override predicate appliesTo(Type t, Content c) { + t instanceof Array and + c instanceof ArrayContent + } + + override string getDefinition() { + result = " T getArrayElement(T[] array) { return array[0]; }" + } + + bindingset[arg] + override string getCall(string arg) { result = "getArrayElement(" + arg + ")" } +} + +/** + * A method for generating a type with content. + */ +bindingset[this] +abstract class GenMethod extends SupportMethod { + /** + * Holds if this generator method can be used to generate a new `t` that contains content `c`. + */ + abstract predicate appliesTo(Type t, Content c); + + /** + * Gets the call to generate an object with content `arg`. + */ + bindingset[this, arg] + abstract string getCall(string arg); +} + +private class DefaultGenMethod extends GenMethod { + Content c; + + DefaultGenMethod() { this = "DefaultGen" + contentToken(c) } + + string getName() { result = "newWith" + contentToken(c) } + + override int getPriority() { result = 999 } + + override predicate appliesTo(Type t, Content c1) { + c = c1 and + // suppress unused variable warning + t = [any(TestCase tc).getInputType(), any(VoidType v)] + } + + bindingset[arg] + override string getCall(string arg) { result = this.getName() + "(" + arg + ")" } + + override string getDefinition() { + result = "Object newWith" + contentToken(c) + "(Object element) { return null; }" + } + + override string getCsvModel() { + result = + "generatedtest;Test;false;" + this.getName() + ";;;Argument[0];" + + getComponentSpec(SummaryComponent::content(c)) + " of ReturnValue;value" + } +} + +private class ListGenMethod extends GenMethod { + ListGenMethod() { this = "listgenmethod" } + + override predicate appliesTo(Type t, Content c) { + exists(GenericType list | list.hasQualifiedName("java.util", "List") | + t = list or list.getAParameterizedType().getASupertype*() = t + ) and + c instanceof CollectionContent + } + + bindingset[arg] + override string getCall(string arg) { result = "List.of(" + arg + ")" } +} + +private class OptionalGenMethod extends GenMethod { + OptionalGenMethod() { this = "optionalgenmethod" } + + override predicate appliesTo(Type t, Content c) { + exists(GenericType list | list.hasQualifiedName("java.util", "List") | + list.getAParameterizedType().getASupertype*() = t + ) and + c instanceof CollectionContent + } + + bindingset[arg] + override string getCall(string arg) { result = "Optional.of(" + arg + ")" } +} + +private class MapGenKeyMethod extends GenMethod { + MapGenKeyMethod() { this = "mapkeygenmethod" } + + override predicate appliesTo(Type t, Content c) { + exists(GenericType map | map.hasQualifiedName("java.util", "Map") | + map.getAParameterizedType().getASupertype*() = t + ) and + c instanceof MapKeyContent + } + + bindingset[arg] + override string getCall(string arg) { result = "Map.of(" + arg + ", null)" } +} + +private class MapGenValueMethod extends GenMethod { + MapGenValueMethod() { this = "mapvaluegenmethod" } + + override predicate appliesTo(Type t, Content c) { + exists(GenericType map | map.hasQualifiedName("java.util", "Map") | + map.getAParameterizedType().getASupertype*() = t + ) and + c instanceof MapValueContent + } + + bindingset[arg] + override string getCall(string arg) { result = "Map.of(null, " + arg + ")" } +} + +/** + * Returns a cast to type `t` if `t` is not `java.lang.Object`, or an empty string otherwise. + */ +string getConvertExprIfNotObject(RefType t) { + if t.hasQualifiedName("java.lang", "Object") + then result = "" + else result = "(" + getShortNameIfPossible(t) + ")" +} + +private class ArrayGenMethod extends GenMethod { + Array type; + + ArrayGenMethod() { this = type.getName() + "genmethod" } + + override predicate appliesTo(Type t, Content c) { + replaceTypeVariable(t.(Array).getComponentType()) = type.getComponentType() and + c instanceof ArrayContent + } + + bindingset[arg] + override string getCall(string arg) { + result = + "new " + getShortNameIfPossible(type) + "{" + + getConvertExprIfNotObject(type.getComponentType()) + arg + "}" + } +} diff --git a/java/ql/src/utils/FlowTestCaseUtils.qll b/java/ql/src/utils/FlowTestCaseUtils.qll new file mode 100644 index 00000000000..8a48272a2ae --- /dev/null +++ b/java/ql/src/utils/FlowTestCaseUtils.qll @@ -0,0 +1,133 @@ +/** + * Utility predicates useful for test generation. + */ + +import java +private import semmle.code.java.dataflow.internal.DataFlowUtil +private import semmle.code.java.dataflow.FlowSummary +private import FlowTestCase + +/** + * Returns `t`'s outermost enclosing type, in raw form (i.e. generic types are given without generic parameters, and type variables are replaced by their bounds). + */ +Type getRootSourceDeclaration(Type t) { + if t instanceof RefType + then result = getRootType(replaceTypeVariable(t)).(RefType).getSourceDeclaration() + else result = t +} + +/** + * Holds if type `t` does not clash with another type we want to import that has the same base name. + */ +predicate isImportable(Type t) { + t = any(TestCase tc).getADesiredImport() and + t = + unique(Type sharesBaseName | + sharesBaseName = any(TestCase tc).getADesiredImport() and + sharesBaseName.getName() = t.getName() + | + sharesBaseName + ) +} + +/** + * Returns `t`'s first upper bound if `t` is a type variable; otherwise returns `t`. + */ +RefType replaceTypeVariable(RefType t) { + if t instanceof TypeVariable + then result = replaceTypeVariable(t.(TypeVariable).getFirstUpperBoundType()) + else result = t +} + +/** + * Returns a zero value of primitive type `t`. + */ +string getZero(PrimitiveType t) { + t.hasName("float") and result = "0.0f" + or + t.hasName("double") and result = "0.0" + or + t.hasName("int") and result = "0" + or + t.hasName("boolean") and result = "false" + or + t.hasName("short") and result = "(short)0" + or + t.hasName("byte") and result = "(byte)0" + or + t.hasName("char") and result = "'\\0'" + or + t.hasName("long") and result = "0L" +} + +/** + * Holds if `c` may require disambiguation from an overload with the same argument count. + */ +predicate mayBeAmbiguous(Callable c) { + exists(Callable other, string package, string type, string name | + c.hasQualifiedName(package, type, name) and + other.hasQualifiedName(package, type, name) and + other.getNumberOfParameters() = c.getNumberOfParameters() and + other != c + ) + or + c.isVarargs() +} + +/** + * Returns the outermost type enclosing type `t` (which may be `t` itself). + */ +Type getRootType(Type t) { + if t instanceof NestedType + then result = getRootType(t.(NestedType).getEnclosingType()) + else + if t instanceof Array + then result = getRootType(t.(Array).getElementType()) + else result = t +} + +/** + * Returns a printable name for type `t`, stripped of generics and, if a type variable, + * replaced by its bound. Usually this is a short name, but it may be package-qualified + * if we cannot import it due to a name clash. + */ +string getShortNameIfPossible(Type t) { + if t instanceof Array + then result = getShortNameIfPossible(t.(Array).getComponentType()) + "[]" + else ( + if t instanceof RefType + then + getRootSourceDeclaration(t) = any(TestCase tc).getADesiredImport() and + exists(RefType replaced, string nestedName | + replaced = replaceTypeVariable(t).getSourceDeclaration() and + nestedName = replaced.nestedName().replaceAll("$", ".") + | + if isImportable(getRootSourceDeclaration(t)) + then result = nestedName + else result = replaced.getPackage().getName() + "." + nestedName + ) + else result = t.getName() + ) +} + +/** + * Gets a string that specifies summary component `c` in a summary specification CSV row. + */ +string getComponentSpec(SummaryComponent c) { + exists(Content content | + c = SummaryComponent::content(content) and + ( + content instanceof ArrayContent and result = "ArrayElement" + or + content instanceof MapValueContent and result = "MapValue" + or + content instanceof MapKeyContent and result = "MapKey" + or + content instanceof CollectionContent and result = "Element" + or + result = "Field[" + content.(FieldContent).getField().getQualifiedName() + "]" + or + result = "SyntheticField[" + content.(SyntheticFieldContent).getField() + "]" + ) + ) +} diff --git a/java/ql/src/utils/GenerateFlowTestCase.py b/java/ql/src/utils/GenerateFlowTestCase.py index 757a94fe92d..15bdfc2eb87 100755 --- a/java/ql/src/utils/GenerateFlowTestCase.py +++ b/java/ql/src/utils/GenerateFlowTestCase.py @@ -127,7 +127,7 @@ queryDir = os.path.join(workDir, "query") os.makedirs(queryDir) qlFile = os.path.join(queryDir, "gen.ql") with open(os.path.join(queryDir, "qlpack.yml"), "w") as f: - f.write("name: test-generation-query\nversion: 0.0.0\nlibraryPathDependencies: codeql-java") + f.write("name: test-generation-query\nversion: 0.0.0\nlibraryPathDependencies: codeql/java-queries") with open(qlFile, "w") as f: f.write( "import java\nimport utils.GenerateFlowTestCase\n\nclass GenRow extends TargetSummaryModelCsv {\n\n\toverride predicate row(string r) {\n\t\tr = [\n") diff --git a/java/ql/src/utils/GenerateFlowTestCase.qll b/java/ql/src/utils/GenerateFlowTestCase.qll index 0f7f0328f46..405f2794a61 100644 --- a/java/ql/src/utils/GenerateFlowTestCase.qll +++ b/java/ql/src/utils/GenerateFlowTestCase.qll @@ -8,25 +8,9 @@ private import semmle.code.java.dataflow.internal.DataFlowUtil private import semmle.code.java.dataflow.ExternalFlow private import semmle.code.java.dataflow.FlowSummary private import semmle.code.java.dataflow.internal.FlowSummaryImpl - -/** - * A CSV row to generate tests for. Users should extend this to define which - * tests to generate. Rows specified here should also satisfy `SummaryModelCsv.row`. - */ -class TargetSummaryModelCsv extends Unit { - /** - * Holds if a test should be generated for `row`. - */ - abstract predicate row(string r); -} - -/** - * Gets a CSV row for which a test has been requested, but `SummaryModelCsv.row` does not hold of it. - */ -query string missingSummaryModelCsv() { - any(TargetSummaryModelCsv target).row(result) and - not any(SummaryModelCsv model).row(result) -} +import FlowTestCase +private import FlowTestCaseSupportMethods +private import FlowTestCaseUtils /** * Gets a CSV row for which a test has been requested, and `SummaryModelCsv.row` does hold, but @@ -73,477 +57,17 @@ query string noTestCaseGenerated() { not exists(any(TestCase tc).getATestSnippetForRow(result)) } -private class CallableToTest extends Callable { - CallableToTest() { - exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext - | - summaryModel(namespace, type, subtypes, name, signature, ext, _, _, _) and - this = interpretElement(namespace, type, subtypes, name, signature, ext) and - this.isPublic() and - getRootType(this.getDeclaringType()).isPublic() - ) - } -} - /** - * Returns type of parameter `i` of `callable`, including the type of `this` for parameter -1. + * Gets a valid test case, i.e. one that has a test snippet. */ -Type getParameterType(CallableToTest callable, int i) { - if i = -1 then result = callable.getDeclaringType() else result = callable.getParameterType(i) -} - -/** - * Returns a zero value of primitive type `t`. - */ -string getZero(PrimitiveType t) { - t.hasName("float") and result = "0.0f" - or - t.hasName("double") and result = "0.0" - or - t.hasName("int") and result = "0" - or - t.hasName("boolean") and result = "false" - or - t.hasName("short") and result = "(short)0" - or - t.hasName("byte") and result = "(byte)0" - or - t.hasName("char") and result = "'a'" - or - t.hasName("long") and result = "0L" -} - -/** - * Holds if `c` may require disambiguation from an overload with the same argument count. - */ -predicate mayBeAmbiguous(Callable c) { - exists(Callable other, string package, string type, string name | - c.hasQualifiedName(package, type, name) and - other.hasQualifiedName(package, type, name) and - other.getNumberOfParameters() = c.getNumberOfParameters() and - other != c - ) -} - -/** - * Returns the `content` wrapped by `component`, if any. - */ -Content getContent(SummaryComponent component) { component = SummaryComponent::content(result) } - -/** - * Returns a valid Java token naming the field `fc`. - */ -string getFieldToken(FieldContent fc) { - result = - fc.getField().getDeclaringType().getSourceDeclaration().getName() + "_" + - fc.getField().getName() -} - -/** - * Returns a valid Java token naming the synthetic field `fc`, - * assuming that the name of that field consists only of characters valid in a Java identifier and `.`. - */ -string getSyntheticFieldToken(SyntheticFieldContent fc) { - exists(string name, int parts | - name = fc.getField() and - parts = count(name.splitAt(".")) - | - if parts = 1 - then result = name - else result = name.splitAt(".", parts - 2) + "_" + name.splitAt(".", parts - 1) - ) -} - -/** - * Returns a token suitable for incorporation into a Java method name describing content `c`. - */ -string contentToken(Content c) { - c instanceof ArrayContent and result = "ArrayElement" - or - c instanceof CollectionContent and result = "Element" - or - c instanceof MapKeyContent and result = "MapKey" - or - c instanceof MapValueContent and result = "MapValue" - or - result = getFieldToken(c) - or - result = getSyntheticFieldToken(c) -} - -/** - * Returns the outermost type enclosing type `t` (which may be `t` itself). - */ -RefType getRootType(RefType t) { - if t instanceof NestedType - then result = getRootType(t.(NestedType).getEnclosingType()) - else - if t instanceof Array - then result = getRootType(t.(Array).getElementType()) - else result = t -} - -/** - * Returns `t`'s first upper bound if `t` is a type variable; otherwise returns `t`. - */ -RefType replaceTypeVariable(RefType t) { - if t instanceof TypeVariable - then result = replaceTypeVariable(t.(TypeVariable).getFirstUpperBoundType()) - else result = t -} - -/** - * Returns `t`'s outermost enclosing type, in raw form (i.e. generic types are given without generic parameters, and type variables are replaced by their bounds). - */ -Type getRootSourceDeclaration(Type t) { - if t instanceof RefType - then result = getRootType(replaceTypeVariable(t)).getSourceDeclaration() - else result = t -} - -/** - * A test snippet (a fragment of Java code that checks that `row` causes `callable` to propagate value/taint (according to `preservesValue`) - * from `input` to `output`). Usually there is one of these per CSV row (`row`), but there may be more if `row` describes more than one - * override or overload of a particular method, or if the input or output specifications cover more than one argument. - */ -private newtype TTestCase = - MkTestCase( - CallableToTest callable, SummaryComponentStack input, SummaryComponentStack output, string kind, - string row - ) { - exists( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string inputSpec, string outputSpec - | - any(TargetSummaryModelCsv tsmc).row(row) and - summaryModel(namespace, type, subtypes, name, signature, ext, inputSpec, outputSpec, kind, row) and - callable = interpretElement(namespace, type, subtypes, name, signature, ext) and - Private::External::interpretSpec(inputSpec, input) and - Private::External::interpretSpec(outputSpec, output) - ) - } - -/** - * A test snippet (as `TTestCase`, except `baseInput` and `baseOutput` hold the bottom of the summary stacks - * `input` and `output` respectively (hence, `baseInput` and `baseOutput` are parameters or return values). - */ -class TestCase extends TTestCase { - CallableToTest callable; - SummaryComponentStack input; - SummaryComponentStack output; - SummaryComponentStack baseInput; - SummaryComponentStack baseOutput; - string kind; - string row; - - TestCase() { - this = MkTestCase(callable, input, output, kind, row) and - baseInput = input.drop(input.length() - 1) and - baseOutput = output.drop(output.length() - 1) - } - - /** - * Returns a representation of this test case's parameters suitable for debugging. - */ - string toString() { - result = - row + " / " + callable + " / " + input + " / " + output + " / " + baseInput + " / " + - baseOutput + " / " + kind - } - - /** - * Returns a value to pass as `callable`'s `argIdx`th argument whose value is irrelevant to the test - * being generated. This will be a zero or a null value, perhaps typecast if we need to disambiguate overloads. - */ - string getFiller(int argIdx) { - exists(Type t | t = callable.getParameterType(argIdx) | - t instanceof RefType and - ( - if mayBeAmbiguous(callable) - then result = "(" + getShortNameIfPossible(t) + ")null" - else result = "null" - ) - or - result = getZero(t) - ) - } - - /** - * Returns the value to pass for `callable`'s `i`th argument, which may be `in` if this is the input argument for - * this test, `out` if it is the output, `instance` if this is an instance method and the instance is neither the - * input nor the output, or a zero/null filler value otherwise. - */ - string getArgument(int i) { - (i = -1 or exists(callable.getParameter(i))) and - if baseInput = SummaryComponentStack::argument(i) - then result = "in" - else - if baseOutput = SummaryComponentStack::argument(i) - then result = "out" - else - if i = -1 - then result = "instance" - else result = this.getFiller(i) - } - - /** - * Returns a statement invoking `callable`, passing `input` and capturing `output` as needed. - */ - string makeCall() { - // For example, one of: - // out = in.method(filler); - // or - // out = filler.method(filler, in, filler); - // or - // out = Type.method(filler, in, filler); - // or - // filler.method(filler, in, out, filler); - // or - // Type.method(filler, in, out, filler); - // or - // out = new Type(filler, in, filler); - // or - // new Type(filler, in, out, filler); - // or - // in.method(filler, out, filler); - // or - // out.method(filler, in, filler); - exists(string storePrefix, string invokePrefix, string args | - ( - if - baseOutput = SummaryComponentStack::return() - or - callable instanceof Constructor and baseOutput = SummaryComponentStack::argument(-1) - then storePrefix = "out = " - else storePrefix = "" - ) and - ( - if callable instanceof Constructor - then invokePrefix = "new " - else - if callable.(Method).isStatic() - then invokePrefix = getShortNameIfPossible(callable.getDeclaringType()) + "." - else invokePrefix = this.getArgument(-1) + "." - ) and - args = concat(int i | i >= 0 | this.getArgument(i), ", " order by i) and - result = storePrefix + invokePrefix + callable.getName() + "(" + args + ")" - ) - } - - /** - * Returns an inline test expectation appropriate to this CSV row. - */ - string getExpectation() { - kind = "value" and result = "// $ hasValueFlow" - or - kind = "taint" and result = "// $ hasTaintFlow" - } - - /** - * Returns a declaration and initialisation of a variable named `instance` if required; otherwise returns an empty string. - */ - string getInstancePrefix() { - if - callable instanceof Method and - not callable.(Method).isStatic() and - baseOutput != SummaryComponentStack::argument(-1) and - baseInput != SummaryComponentStack::argument(-1) - then - // In this case `out` is the instance. - result = getShortNameIfPossible(callable.getDeclaringType()) + " instance = null;\n\t\t\t" - else result = "" - } - - /** - * Returns the type of the output for this test. - */ - Type getOutputType() { - if baseOutput = SummaryComponentStack::return() - then result = callable.getReturnType() - else - exists(int i | - baseOutput = SummaryComponentStack::argument(i) and - result = getParameterType(callable, i) - ) - } - - /** - * Returns the type of the input for this test. - */ - Type getInputType() { - exists(int i | - baseInput = SummaryComponentStack::argument(i) and - result = getParameterType(callable, i) - ) - } - - /** - * Returns the Java name for the type of the input to this test. - */ - string getInputTypeString() { result = getShortNameIfPossible(this.getInputType()) } - - /** - * Returns a call to `source()` wrapped in `newWith` methods as needed according to `input`. - * For example, if the input specification is `ArrayElement of MapValue of Argument[0]`, this - * will return `newWithMapValue(newWithArrayElement(source()))`. - */ - string getInput(SummaryComponentStack stack) { - stack = input and result = "source()" - or - exists(SummaryComponentStack s | - result = "newWith" + contentToken(getContent(s.head())) + "(" + this.getInput(s) + ")" and - stack = s.tail() - ) - } - - /** - * Returns `out` wrapped in `get` methods as needed according to `output`. - * For example, if the output specification is `ArrayElement of MapValue of Argument[0]`, this - * will return `getArrayElement(getMapValue(out))`. - */ - string getOutput(SummaryComponentStack componentStack) { - componentStack = output.drop(_) and - ( - if componentStack = baseOutput - then result = "out" - else - result = - "get" + contentToken(getContent(componentStack.head())) + "(" + - this.getOutput(componentStack.tail()) + ")" - ) - } - - /** - * Returns the definition of a `newWith` method needed to set up the input or a `get` method needed to set up the output for this test. - */ - string getASupportMethod() { - result = - "Object newWith" + contentToken(getContent(input.drop(_).head())) + - "(Object element) { return null; }" or - result = - "Object get" + contentToken(getContent(output.drop(_).head())) + - "(Object container) { return null; }" - } - - /** - * Gets a string that specifies summary component `c` in a summary specification CSV row. - */ - string getComponentSpec(SummaryComponent c) { - exists(Content content | - c = SummaryComponent::content(content) and - ( - content instanceof ArrayContent and result = "ArrayElement" - or - content instanceof MapValueContent and result = "MapValue" - or - content instanceof MapKeyContent and result = "MapKey" - or - content instanceof CollectionContent and result = "Element" - or - result = "Field[" + content.(FieldContent).getField().getQualifiedName() + "]" - or - result = "SyntheticField[" + content.(SyntheticFieldContent).getField() + "]" - ) - ) - } - - /** - * Returns a CSV row describing a support method (`newWith` or `get` method) needed to set up the output for this test. - * - * For example, `newWithMapValue` will propagate a value from `Argument[0]` to `MapValue of ReturnValue`, and `getMapValue` - * will do the opposite. - */ - string getASupportMethodModel() { - exists(SummaryComponent c, string contentCsvDescription | - c = input.drop(_).head() and contentCsvDescription = getComponentSpec(c) - | - result = - "generatedtest;Test;false;newWith" + contentToken(getContent(c)) + ";;;Argument[0];" + - contentCsvDescription + " of ReturnValue;value" - ) - or - exists(SummaryComponent c, string contentCsvDescription | - c = output.drop(_).head() and contentCsvDescription = getComponentSpec(c) - | - result = - "generatedtest;Test;false;get" + contentToken(getContent(c)) + ";;;" + contentCsvDescription - + " of Argument[0];ReturnValue;value" - ) - } - - /** - * Gets an outer class name that this test would ideally import (and will, unless it clashes with another - * type of the same name). - */ - Type getADesiredImport() { - result = - getRootSourceDeclaration([ - this.getOutputType(), this.getInputType(), callable.getDeclaringType() - ]) - or - // Will refer to parameter types in disambiguating casts, like `(String)null` - mayBeAmbiguous(callable) and result = getRootSourceDeclaration(callable.getAParamType()) - } - - /** - * Gets a test snippet (test body fragment) testing this `callable` propagates value or taint from - * `input` to `output`, as specified by `row_` (which necessarily equals `row`). - */ - string getATestSnippetForRow(string row_) { - row_ = row and - result = - "\t\t{\n\t\t\t// \"" + row + "\"\n\t\t\t" + getShortNameIfPossible(this.getOutputType()) + - " out = null;\n\t\t\t" + this.getInputTypeString() + " in = (" + this.getInputTypeString() + - ")" + this.getInput(baseInput) + ";\n\t\t\t" + this.getInstancePrefix() + this.makeCall() + - ";\n\t\t\t" + "sink(" + this.getOutput(output) + "); " + this.getExpectation() + "\n\t\t}\n" - } -} - -/** - * Holds if type `t` does not clash with another type we want to import that has the same base name. - */ -predicate isImportable(Type t) { - t = any(TestCase tc).getADesiredImport() and - t = - unique(Type sharesBaseName | - sharesBaseName = any(TestCase tc).getADesiredImport() and - sharesBaseName.getName() = t.getName() - | - sharesBaseName - ) -} - -/** - * Returns a printable name for type `t`, stripped of generics and, if a type variable, - * replaced by its bound. Usually this is a short name, but it may be package-qualified - * if we cannot import it due to a name clash. - */ -string getShortNameIfPossible(Type t) { - if t instanceof Array - then result = getShortNameIfPossible(t.(Array).getComponentType()) + "[]" - else ( - getRootSourceDeclaration(t) = any(TestCase tc).getADesiredImport() and - if t instanceof RefType - then - exists(RefType replaced, string nestedName | - replaced = replaceTypeVariable(t).getSourceDeclaration() and - nestedName = replaced.nestedName().replaceAll("$", ".") - | - if isImportable(getRootSourceDeclaration(t)) - then result = nestedName - else result = replaced.getPackage().getName() + "." + nestedName - ) - else result = t.getName() - ) -} +TestCase getAValidTestCase() { exists(result.getATestSnippetForRow(_)) } /** * Returns an import statement to include in the test case header. */ string getAnImportStatement() { exists(RefType t | - t = any(TestCase tc).getADesiredImport() and + t = getAValidTestCase().getADesiredImport() and isImportable(t) and t.getPackage().getName() != "java.lang" | @@ -554,16 +78,16 @@ string getAnImportStatement() { /** * Returns a support method to include in the generated test class. */ -string getASupportMethod() { - result = "Object source() { return null; }" or - result = "void sink(Object o) { }" or - result = any(TestCase tc).getASupportMethod() +SupportMethod getASupportMethod() { + result instanceof SourceMethod or + result instanceof SinkMethod or + result = getAValidTestCase().getASupportMethod() } /** * Returns a CSV specification of the taint-/value-propagation behaviour of a test support method (`get` or `newWith` method). */ -query string getASupportMethodModel() { result = any(TestCase tc).getASupportMethodModel() } +query string getASupportMethodModel() { result = getASupportMethod().getCsvModel() } /** * Gets a Java file body testing all requested CSV rows against whatever classes and methods they resolve against. @@ -572,7 +96,8 @@ query string getTestCase() { result = "package generatedtest;\n\n" + concat(getAnImportStatement() + "\n") + "\n// Test case generated by GenerateFlowTestCase.ql\npublic class Test {\n\n" + - concat("\t" + getASupportMethod() + "\n") + "\n\tpublic void test() throws Exception {\n\n" + + concat("\t" + getASupportMethod().getDefinition() + "\n") + + "\n\tpublic void test() throws Exception {\n\n" + concat(string row, string snippet | snippet = any(TestCase tc).getATestSnippetForRow(row) | diff --git a/java/ql/src/utils/Stubs.qll b/java/ql/src/utils/Stubs.qll index 96b7d2332fa..47e4b5597f4 100644 --- a/java/ql/src/utils/Stubs.qll +++ b/java/ql/src/utils/Stubs.qll @@ -8,15 +8,10 @@ import java /** A type that should be in the generated code. */ -abstract private class GeneratedType extends RefType { +abstract private class GeneratedType extends ClassOrInterface { GeneratedType() { - ( - this instanceof Interface - or - this instanceof Class - ) and not this instanceof AnonymousClass and - not this instanceof LocalClass and + not this.isLocal() and not this.getPackage() instanceof ExcludedPackage } @@ -134,8 +129,6 @@ private class IndirectType extends GeneratedType { or this = any(GeneratedType t).getSourceDeclaration() or - exists(GeneratedType t | this = t.(BoundedType).getATypeBound().getType()) - or exists(GeneratedDeclaration decl | decl.(Member).getDeclaringType().getSourceDeclaration() = this ) @@ -143,8 +136,6 @@ private class IndirectType extends GeneratedType { this.(NestedType).getEnclosingType() instanceof GeneratedType or exists(NestedType nt | nt instanceof GeneratedType and this = nt.getEnclosingType()) - or - this = any(GeneratedType a).(Array).getComponentType() } } @@ -156,6 +147,10 @@ private Type getAContainedType(Type t) { result = t or result = getAContainedType(t.(ParameterizedType).getATypeArgument()) + or + result = getAContainedType(t.(Array).getElementType()) + or + result = getAContainedType(t.(BoundedType).getATypeBound().getType()) } /** diff --git a/java/ql/test/experimental/query-tests/security/CWE-1204/StaticInitializationVector.java b/java/ql/test/experimental/query-tests/security/CWE-1204/StaticInitializationVector.java new file mode 100644 index 00000000000..f964d17239b --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-1204/StaticInitializationVector.java @@ -0,0 +1,167 @@ +import javax.crypto.Cipher; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import java.security.SecureRandom; +import java.util.Arrays; + +public class StaticInitializationVector { + + // BAD: AES-GCM with static IV from a byte array + public byte[] encryptWithStaticIvByteArrayWithInitializer(byte[] key, byte[] plaintext) throws Exception { + byte[] iv = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }; + + GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $staticInitializationVector + cipher.update(plaintext); + return cipher.doFinal(); + } + + // BAD: AES-GCM with static IV from zero-initialized byte array + public byte[] encryptWithZeroStaticIvByteArray(byte[] key, byte[] plaintext) throws Exception { + byte[] iv = new byte[16]; + + GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $staticInitializationVector + cipher.update(plaintext); + return cipher.doFinal(); + } + + // BAD: AES-CBC with static IV from zero-initialized byte array + public byte[] encryptWithStaticIvByteArray(byte[] key, byte[] plaintext) throws Exception { + byte[] iv = new byte[16]; + for (byte i = 0; i < iv.length; i++) { + iv[i] = 1; + } + + IvParameterSpec ivSpec = new IvParameterSpec(iv); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $staticInitializationVector + cipher.update(plaintext); + return cipher.doFinal(); + } + + // BAD: AES-GCM with static IV from a multidimensional byte array + public byte[] encryptWithOneOfStaticIvs01(byte[] key, byte[] plaintext) throws Exception { + byte[][] staticIvs = new byte[][] { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 42 } + }; + + GCMParameterSpec ivSpec = new GCMParameterSpec(128, staticIvs[1]); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $staticInitializationVector + cipher.update(plaintext); + return cipher.doFinal(); + } + + // BAD: AES-GCM with static IV from a multidimensional byte array + public byte[] encryptWithOneOfStaticIvs02(byte[] key, byte[] plaintext) throws Exception { + byte[][] staticIvs = new byte[][] { + new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }, + new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 42 } + }; + + GCMParameterSpec ivSpec = new GCMParameterSpec(128, staticIvs[1]); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $staticInitializationVector + cipher.update(plaintext); + return cipher.doFinal(); + } + + // BAD: AES-GCM with static IV from a multidimensional byte array + public byte[] encryptWithOneOfStaticZeroIvs(byte[] key, byte[] plaintext) throws Exception { + byte[][] ivs = new byte[][] { + new byte[8], + new byte[16] + }; + + GCMParameterSpec ivSpec = new GCMParameterSpec(128, ivs[1]); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $staticInitializationVector + cipher.update(plaintext); + return cipher.doFinal(); + } + + // GOOD: AES-GCM with a random IV + public byte[] encryptWithRandomIv(byte[] key, byte[] plaintext) throws Exception { + byte[] iv = new byte[16]; + + SecureRandom random = SecureRandom.getInstanceStrong(); + random.nextBytes(iv); + + GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); + cipher.update(plaintext); + return cipher.doFinal(); + } + + // GOOD: AES-GCM with a random IV + public byte[] encryptWithRandomIvByteByByte(byte[] key, byte[] plaintext) throws Exception { + SecureRandom random = SecureRandom.getInstanceStrong(); + byte[] iv = new byte[16]; + for (int i = 0; i < iv.length; i++) { + iv[i] = (byte) random.nextInt(); + } + + GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); + cipher.update(plaintext); + return cipher.doFinal(); + } + + // GOOD: AES-GCM with a random IV + public byte[] encryptWithRandomIvWithSystemArrayCopy(byte[] key, byte[] plaintext) throws Exception { + byte[] randomBytes = new byte[16]; + SecureRandom.getInstanceStrong().nextBytes(randomBytes); + + byte[] iv = new byte[16]; + System.arraycopy(randomBytes, 0, iv, 0, 16); + + GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); + cipher.update(plaintext); + return cipher.doFinal(); + } + + // GOOD: AES-GCM with a random IV + public byte[] encryptWithRandomIvWithArraysCopy(byte[] key, byte[] plaintext) throws Exception { + byte[] randomBytes = new byte[16]; + SecureRandom.getInstanceStrong().nextBytes(randomBytes); + + byte[] iv = new byte[16]; + iv = Arrays.copyOf(randomBytes, 16); + + GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv); + SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); + + Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); + cipher.update(plaintext); + return cipher.doFinal(); + } +} diff --git a/python/ql/test/query-tests/Security/CWE-209/ExceptionInfo.expected b/java/ql/test/experimental/query-tests/security/CWE-1204/StaticInitializationVectorTest.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-209/ExceptionInfo.expected rename to java/ql/test/experimental/query-tests/security/CWE-1204/StaticInitializationVectorTest.expected diff --git a/java/ql/test/experimental/query-tests/security/CWE-1204/StaticInitializationVectorTest.ql b/java/ql/test/experimental/query-tests/security/CWE-1204/StaticInitializationVectorTest.ql new file mode 100644 index 00000000000..29afc31ab04 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-1204/StaticInitializationVectorTest.ql @@ -0,0 +1,20 @@ +import java +import experimental.semmle.code.java.security.StaticInitializationVectorQuery +import TestUtilities.InlineExpectationsTest + +class StaticInitializationVectorTest extends InlineExpectationsTest { + StaticInitializationVectorTest() { this = "StaticInitializationVectorTest" } + + override string getARelevantTag() { result = "staticInitializationVector" } + + override predicate hasActualResult(Location location, string element, string tag, string value) { + tag = "staticInitializationVector" and + exists(DataFlow::Node src, DataFlow::Node sink, StaticInitializationVectorConfig conf | + conf.hasFlow(src, sink) + | + sink.getLocation() = location and + element = sink.toString() and + value = "" + ) + } +} diff --git a/java/ql/test/library-tests/fields/FieldDecl.expected b/java/ql/test/library-tests/fields/FieldDecl.expected index 593808f58e4..edc8c0f6a1b 100644 --- a/java/ql/test/library-tests/fields/FieldDecl.expected +++ b/java/ql/test/library-tests/fields/FieldDecl.expected @@ -5,3 +5,7 @@ | fields/FieldTest.java:5:9:5:39 | Object obj, ...; | 1/2 | fields/FieldTest.java:5:35:5:38 | obj2 | | fields/FieldTest.java:6:9:6:58 | List<> l, ...; | 0/2 | fields/FieldTest.java:6:54:6:54 | l | | fields/FieldTest.java:6:9:6:58 | List<> l, ...; | 1/2 | fields/FieldTest.java:6:57:6:57 | m | +| fields/FieldTest.java:7:9:7:18 | int x, ...; | 0/1 | fields/FieldTest.java:7:13:7:13 | x | +| fields/FieldTest.java:8:9:8:22 | int y, ...; | 0/1 | fields/FieldTest.java:8:13:8:13 | y | +| fields/FieldTest.java:12:9:12:25 | int z, ...; | 0/1 | fields/FieldTest.java:12:20:12:20 | z | +| fields/FieldTest.java:13:9:13:29 | int w, ...; | 0/1 | fields/FieldTest.java:13:20:13:20 | w | diff --git a/java/ql/test/library-tests/fields/FieldDeclLocation.expected b/java/ql/test/library-tests/fields/FieldDeclLocation.expected index 951a3166ef5..53e5fb2f8b5 100644 --- a/java/ql/test/library-tests/fields/FieldDeclLocation.expected +++ b/java/ql/test/library-tests/fields/FieldDeclLocation.expected @@ -1,3 +1,7 @@ | List<> l, ...; | 6 | 9 | 6 | 58 | | Object obj, ...; | 5 | 9 | 5 | 39 | | float ff, ...; | 4 | 9 | 4 | 32 | +| int w, ...; | 13 | 9 | 13 | 29 | +| int x, ...; | 7 | 9 | 7 | 18 | +| int y, ...; | 8 | 9 | 8 | 22 | +| int z, ...; | 12 | 9 | 12 | 25 | diff --git a/java/ql/test/library-tests/fields/FieldInitializers.expected b/java/ql/test/library-tests/fields/FieldInitializers.expected new file mode 100644 index 00000000000..9047dc42d5e --- /dev/null +++ b/java/ql/test/library-tests/fields/FieldInitializers.expected @@ -0,0 +1,6 @@ +| fields/FieldTest.java:4:19:4:19 | g | fields/FieldTest.java:4:23:4:26 | 2.3f | +| fields/FieldTest.java:5:23:5:25 | obj | fields/FieldTest.java:5:29:5:32 | null | +| fields/FieldTest.java:7:13:7:13 | x | fields/FieldTest.java:7:17:7:17 | 0 | +| fields/FieldTest.java:8:13:8:13 | y | fields/FieldTest.java:8:17:8:21 | ...=... | +| fields/FieldTest.java:12:20:12:20 | z | fields/FieldTest.java:12:24:12:24 | 0 | +| fields/FieldTest.java:13:20:13:20 | w | fields/FieldTest.java:13:24:13:28 | ...=... | diff --git a/java/ql/test/library-tests/fields/FieldInitializers.ql b/java/ql/test/library-tests/fields/FieldInitializers.ql new file mode 100644 index 00000000000..b7354c2ead4 --- /dev/null +++ b/java/ql/test/library-tests/fields/FieldInitializers.ql @@ -0,0 +1,4 @@ +import java + +from Field f +select f, f.getInitializer() diff --git a/java/ql/test/library-tests/fields/FieldLocation.expected b/java/ql/test/library-tests/fields/FieldLocation.expected index 361fb1ad51a..d9fb41fd8b0 100644 --- a/java/ql/test/library-tests/fields/FieldLocation.expected +++ b/java/ql/test/library-tests/fields/FieldLocation.expected @@ -5,3 +5,7 @@ | fields/FieldTest.java:5:35:5:38 | obj2 | 5 | 35 | 5 | 38 | | fields/FieldTest.java:6:54:6:54 | l | 6 | 54 | 6 | 54 | | fields/FieldTest.java:6:57:6:57 | m | 6 | 57 | 6 | 57 | +| fields/FieldTest.java:7:13:7:13 | x | 7 | 13 | 7 | 13 | +| fields/FieldTest.java:8:13:8:13 | y | 8 | 13 | 8 | 13 | +| fields/FieldTest.java:12:20:12:20 | z | 12 | 20 | 12 | 20 | +| fields/FieldTest.java:13:20:13:20 | w | 13 | 20 | 13 | 20 | diff --git a/java/ql/test/library-tests/fields/PrintAst.expected b/java/ql/test/library-tests/fields/PrintAst.expected index 60f8a7fee45..e0ba17d7403 100644 --- a/java/ql/test/library-tests/fields/PrintAst.expected +++ b/java/ql/test/library-tests/fields/PrintAst.expected @@ -12,3 +12,29 @@ fields/FieldTest.java: # 6| 1: [Annotation] SuppressWarnings # 6| 1: [StringLiteral] "rawtypes" # 6| -1: [TypeAccess] List<> +# 7| 7: [FieldDeclaration] int x, ...; +# 7| -1: [TypeAccess] int +# 7| 0: [IntegerLiteral] 0 +# 8| 8: [FieldDeclaration] int y, ...; +# 8| -1: [TypeAccess] int +# 8| 0: [AssignExpr] ...=... +# 8| 0: [VarAccess] x +# 8| 1: [IntegerLiteral] 1 +# 9| 9: [BlockStmt] { ... } +# 10| 0: [ExprStmt] ; +# 10| 0: [AssignExpr] ...=... +# 10| 0: [VarAccess] x +# 10| 1: [IntegerLiteral] 2 +# 12| 10: [FieldDeclaration] int z, ...; +# 12| -1: [TypeAccess] int +# 12| 0: [IntegerLiteral] 0 +# 13| 11: [FieldDeclaration] int w, ...; +# 13| -1: [TypeAccess] int +# 13| 0: [AssignExpr] ...=... +# 13| 0: [VarAccess] z +# 13| 1: [IntegerLiteral] 1 +# 14| 12: [BlockStmt] { ... } +# 15| 0: [ExprStmt] ; +# 15| 0: [AssignExpr] ...=... +# 15| 0: [VarAccess] z +# 15| 1: [IntegerLiteral] 2 diff --git a/java/ql/test/library-tests/fields/fields/FieldTest.java b/java/ql/test/library-tests/fields/fields/FieldTest.java index 3916b7c75c2..756c6e0d9ff 100644 --- a/java/ql/test/library-tests/fields/fields/FieldTest.java +++ b/java/ql/test/library-tests/fields/fields/FieldTest.java @@ -4,4 +4,14 @@ public class FieldTest { float ff, g = 2.3f, hhh; static Object obj = null, obj2; @SuppressWarnings("rawtypes") java.util.List l, m; + int x = 0; + int y = x = 1; + { + x = 2; // Shouldn't show up as an initializer + } + static int z = 0; + static int w = z = 1; + static { + z = 2; // Shouldn't show up as an initializer + } } diff --git a/java/ql/test/library-tests/frameworks/apache-collections/Test.java b/java/ql/test/library-tests/frameworks/apache-collections/Test.java index f043b30399e..6884ff8b055 100644 --- a/java/ql/test/library-tests/frameworks/apache-collections/Test.java +++ b/java/ql/test/library-tests/frameworks/apache-collections/Test.java @@ -1,18 +1,69 @@ package generatedtest; +import java.util.Collection; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; import java.util.Map; +import java.util.NavigableSet; +import java.util.Queue; import java.util.ResourceBundle; +import java.util.Set; import java.util.SortedMap; +import java.util.SortedSet; +import java.util.StringTokenizer; import java.util.TreeMap; +import java.util.TreeSet; import java.util.Vector; +import org.apache.commons.collections4.ArrayStack; +import org.apache.commons.collections4.Bag; +import org.apache.commons.collections4.BagUtils; +import org.apache.commons.collections4.BidiMap; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.EnumerationUtils; import org.apache.commons.collections4.Factory; +import org.apache.commons.collections4.FluentIterable; +import org.apache.commons.collections4.Get; +import org.apache.commons.collections4.IterableGet; import org.apache.commons.collections4.IterableMap; import org.apache.commons.collections4.IterableSortedMap; +import org.apache.commons.collections4.IterableUtils; +import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.collections4.KeyValue; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.collections4.ListValuedMap; +import org.apache.commons.collections4.MapIterator; import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.MultiMap; +import org.apache.commons.collections4.MultiMapUtils; +import org.apache.commons.collections4.MultiSet; +import org.apache.commons.collections4.MultiSetUtils; +import org.apache.commons.collections4.MultiValuedMap; +import org.apache.commons.collections4.OrderedIterator; import org.apache.commons.collections4.OrderedMap; +import org.apache.commons.collections4.OrderedMapIterator; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Put; +import org.apache.commons.collections4.QueueUtils; +import org.apache.commons.collections4.ResettableIterator; +import org.apache.commons.collections4.ResettableListIterator; +import org.apache.commons.collections4.SetUtils; +import org.apache.commons.collections4.SetValuedMap; +import org.apache.commons.collections4.SortedBag; +import org.apache.commons.collections4.SplitMapUtils; import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.Trie; +import org.apache.commons.collections4.TrieUtils; +import org.apache.commons.collections4.bag.TreeBag; +import org.apache.commons.collections4.bidimap.TreeBidiMap; +import org.apache.commons.collections4.iterators.BoundedIterator; +import org.apache.commons.collections4.iterators.IteratorEnumeration; +import org.apache.commons.collections4.iterators.SkippingIterator; +import org.apache.commons.collections4.iterators.ZippingIterator; import org.apache.commons.collections4.keyvalue.AbstractKeyValue; import org.apache.commons.collections4.keyvalue.AbstractMapEntry; import org.apache.commons.collections4.keyvalue.AbstractMapEntryDecorator; @@ -20,37 +71,80 @@ import org.apache.commons.collections4.keyvalue.DefaultKeyValue; import org.apache.commons.collections4.keyvalue.DefaultMapEntry; import org.apache.commons.collections4.keyvalue.TiedMapEntry; import org.apache.commons.collections4.keyvalue.UnmodifiableMapEntry; +import org.apache.commons.collections4.map.AbstractIterableMap; +import org.apache.commons.collections4.map.AbstractMapDecorator; +import org.apache.commons.collections4.map.HashedMap; +import org.apache.commons.collections4.map.LinkedMap; import org.apache.commons.collections4.map.MultiValueMap; +import org.apache.commons.collections4.multimap.ArrayListValuedHashMap; +import org.apache.commons.collections4.multimap.HashSetValuedHashMap; +import org.apache.commons.collections4.multiset.HashMultiSet; +import org.apache.commons.collections4.trie.PatriciaTrie; -//Test case generated by GenerateFlowTestCase.ql +// Test case generated by GenerateFlowTestCase.ql public class Test { + static Object getArrayElement(Object[] container) { return container[0]; } + static Object getElement(Enumeration container) { return container.nextElement(); } + static T getElement(Iterable container) { return container.iterator().next(); } + static Object getElement(Iterator container) { return container.next(); } + static Object getElement(MultiSet.Entry container) { return container.getElement(); } static Object getMapKey(AbstractKeyValue container) { return container.getKey(); } static Object getMapKeyFromEntry(Map.Entry container) { return container.getKey(); } static Object getMapKey(AbstractMapEntryDecorator container) { return container.getKey(); } static Object getMapKey(Map container) { return container.keySet().iterator().next(); } + static Object getMapKey(MultiValuedMap container) { return container.keySet().iterator().next(); } + static Object getMapKeyFromPut(Put container) { return getMapKey((Map)container); } static Object getMapValue(AbstractKeyValue container) { return container.getValue(); } static Object getMapValueFromEntry(Map.Entry container) { return container.getValue(); } static Object getMapValue(AbstractMapEntryDecorator container) { return container.getValue(); } static Object getMapValue(Map container) { return container.get(null); } + static Object getMapValue(MapIterator container) { return container.getValue(); } + static Collection getMapValue(MultiValuedMap container) { return container.get(null); } + static Object getMapValueFromPut(Put container) { return getMapValue((Map)container); } Object[] newWithArrayElement(Object element) { return new Object[] {element}; } - Iterable newWithElement(String element) { Vector v = new Vector(); v.add(element); return v; } + ArrayStack newArrayStackWithElement(String element) { ArrayStack a = new ArrayStack(); a.push(element); return a; } + Enumeration newEnumerationWithElement(String element) { return new IteratorEnumeration(newVectorWithElement(element).iterator()); } + FluentIterable newFluentIterableWithElement(String element) { return FluentIterable.of(element); } + ListIterator newListIteratorWithElement(String element) { return newVectorWithElement(element).listIterator(); } + MultiSet.Entry newMultiSetEntryWithElement(String element) { return getElement(newMultiSetWithElement(element).entrySet()); } + MultiSet newMultiSetWithElement(String element) { HashMultiSet h = new HashMultiSet(); h.add(element); return h; } + Queue newQueueWithElement(String element) { LinkedList q = new LinkedList(); q.add(element); return q; } + MySetView newSetViewWithElement(String element) { MySetView s = new MySetView(); s.add(element); return s; } + TreeBag newTreeBagWithElement(String element) { TreeBag b = new TreeBag(); b.add(element); return b; } + TreeSet newTreeSetWithElement(String element) { TreeSet h = new TreeSet(); h.add(element); return h; } + Vector newVectorWithElement(String element) { Vector v = new Vector(); v.add(element); return v; } + Vector> newVectorWithElement(Iterable element) { Vector> v = new Vector>(); v.add(element); return v; } + TreeBidiMap newTreeBidiMapWithMapKey(Object element) { TreeBidiMap m = new TreeBidiMap(); m.put(element,null); return m; } MyAbstractKeyValue newMAKVWithMapKey(Object element) { return new MyAbstractKeyValue(element,null); } DefaultKeyValue newDKVWithMapKey(Object element) { return new DefaultKeyValue(element,null); } + HashedMap newHashedMapWithMapKey(Object element) { HashedMap m = new HashedMap(); m.put(element,null); return m; } MyAbstractMapEntry newMAMEWithMapKey(Object element) { return new MyAbstractMapEntry(element,null); } MyAbstractMapEntryDecorator newMAMEDWithMapKey(Object element) { return new MyAbstractMapEntryDecorator(newMAMEWithMapKey(element)); } + MultiValueMap newMVMWithMapKey(Object element) { MultiValueMap m = new MultiValueMap(); m.put(element,null); return m; } + ArrayListValuedHashMap newALVHMWithMapKey(Object element) { ArrayListValuedHashMap m = new ArrayListValuedHashMap(); m.put(element,null); return m; } + OrderedMapIterator newOMIWithElement(Object element) { LinkedMap m = new LinkedMap(); m.put(element,null); return m.mapIterator(); } ResourceBundle newRBWithMapKey(Object element) { return (ResourceBundle)null; } SortedMap newTreeMapWithMapKey(Object element) { SortedMap m = new TreeMap(); m.put(element,null); return m; } - TiedMapEntry newTMEWithMapKey(Object element) { return new TiedMapEntry(newTreeMapWithMapKey(element),element); } + Trie newTrieWithMapKey(Object element) { Trie m = new PatriciaTrie(); m.put(element,null); return m; } + TiedMapEntry newTMEWithMapKey(Object element) { return new TiedMapEntry(new TreeMap(),element); } + TreeBidiMap newTreeBidiMapWithMapValue(Object element) { TreeBidiMap m = new TreeBidiMap(); m.put(null,element); return m; } MyAbstractKeyValue newMAKVWithMapValue(Object element) { return new MyAbstractKeyValue(null,element); } DefaultKeyValue newDKVWithMapValue(Object element) { return new DefaultKeyValue(null,element); } + HashedMap newHashedMapWithMapValue(Object element) { HashedMap m = new HashedMap(); m.put(null,element); return m; } MyAbstractMapEntry newMAMEWithMapValue(Object element) { return new MyAbstractMapEntry(null,element); } MyAbstractMapEntryDecorator newMAMEDWithMapValue(Object element) { return new MyAbstractMapEntryDecorator(newMAMEWithMapValue(element)); } + MultiValueMap newMVMWithMapValue(Object element) { MultiValueMap m = new MultiValueMap(); m.put(null,element); return m; } + MultiMap newMMWithMapValue(Object element) { MultiMap m = new MultiValueMap(); m.put(null,element); return m; } + ArrayListValuedHashMap newALVHMWithMapValue(Object element) { ArrayListValuedHashMap m = new ArrayListValuedHashMap(); m.put(null,element); return m; } + HashSetValuedHashMap newHSVHMWithMapValue(Object element) { HashSetValuedHashMap m = new HashSetValuedHashMap(); m.put(null,element); return m; } + OrderedMapIterator newOMIWithMapValue(Object element) { LinkedMap m = new LinkedMap(); m.put(null,element); return m.mapIterator(); } ResourceBundle newRBWithMapValue(Object element) { return (ResourceBundle)null; } SortedMap newTreeMapWithMapValue(Object element) { SortedMap m = new TreeMap(); m.put(null,element); return m; } + Trie newTrieWithMapValue(Object element) { Trie m = new PatriciaTrie(); m.put(null,element); return m; } TiedMapEntry newTMEWithMapValue(Object element) { return new TiedMapEntry(newTreeMapWithMapValue(element),null); } UnmodifiableMapEntry newUMEWithMapValue(Object element) { return new UnmodifiableMapEntry(null,element); } @@ -91,6 +185,15 @@ public class Test { } } + class MySetView extends SetUtils.SetView { + MySetView() { super(); } + + @Override + protected Iterator createIterator() { return null; } + + Iterator myCreateIterator() { return createIterator(); } + } + public void test() { { @@ -98,891 +201,3481 @@ public class Test { AbstractKeyValue out = null; Object in = source(); out = new MyAbstractKeyValue(in, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[1];MapValue of Argument[-1];value" AbstractKeyValue out = null; Object in = source(); out = new MyAbstractKeyValue(null, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setKey;;;Argument[0];MapKey of Argument[-1];value" DefaultKeyValue out = null; Object in = source(); out.setKey(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setKey;;;Argument[0];MapKey of Argument[-1];value" MyAbstractKeyValue out = null; Object in = source(); out.mySetKey(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { - // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setKey;;;MapValue of Argument[-1];ReturnValue;value" + // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setKey;;;MapKey of Argument[-1];ReturnValue;value" Object out = null; - DefaultKeyValue in = newDKVWithMapValue(source()); + DefaultKeyValue in = newDKVWithMapKey((String)source()); out = in.setKey(null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { - // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setKey;;;MapValue of Argument[-1];ReturnValue;value" + // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setKey;;;MapKey of Argument[-1];ReturnValue;value" Object out = null; - MyAbstractKeyValue in = newMAKVWithMapValue(source()); + MyAbstractKeyValue in = newMAKVWithMapKey((String)source()); out = in.mySetKey(null); - sink(out); // $hasValueFlow - } - { - // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setKey;;;MapValue of Argument[-1];ReturnValue;value" - Object out = null; - MyAbstractKeyValue in = newMAKVWithMapValue(source()); - out = in.mySetKey((Object)null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;Argument[0];MapValue of Argument[-1];value" UnmodifiableMapEntry out = null; Object in = source(); out.setValue(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;Argument[0];MapValue of Argument[-1];value" DefaultKeyValue out = null; Object in = source(); out.setValue(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;Argument[0];MapValue of Argument[-1];value" AbstractMapEntry out = null; Object in = source(); out.setValue(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;Argument[0];MapValue of Argument[-1];value" MyAbstractKeyValue out = null; Object in = source(); out.mySetValue(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - UnmodifiableMapEntry in = newUMEWithMapValue(source()); + UnmodifiableMapEntry in = newUMEWithMapValue((String)source()); out = in.setValue(null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - DefaultKeyValue in = newDKVWithMapValue(source()); + DefaultKeyValue in = newDKVWithMapValue((String)source()); out = in.setValue(null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - AbstractMapEntry in = newMAMEWithMapValue(source()); + AbstractMapEntry in = newMAMEWithMapValue((String)source()); out = in.setValue(null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - AbstractMapEntry in = newMAMEWithMapValue(source()); + AbstractMapEntry in = newMAMEWithMapValue((String)source()); out = in.setValue(null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - MyAbstractKeyValue in = newMAKVWithMapValue(source()); + MyAbstractKeyValue in = newMAKVWithMapValue((String)source()); out = in.mySetValue(null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - MyAbstractKeyValue in = newMAKVWithMapValue(source()); - out = in.mySetValue(null); - sink(out); // $hasValueFlow - } - { - // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;toString;;;MapKey of Argument[-1];ReturnValue;taint" - String out = null; - AbstractKeyValue in = newMAKVWithMapKey(source()); - out = in.toString(); - sink(out); // $hasTaintFlow - } - { - // "org.apache.commons.collections4.keyvalue;AbstractKeyValue;true;toString;;;MapValue of Argument[-1];ReturnValue;taint" - String out = null; - AbstractKeyValue in = newMAKVWithMapValue(source()); - out = in.toString(); - sink(out); // $hasTaintFlow + MyAbstractKeyValue in = newMAKVWithMapValue((String)source()); + out = in.mySetValue((Object)null); + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[0];MapKey of Argument[-1];value" AbstractMapEntry out = null; Object in = source(); out = new MyAbstractMapEntry(in, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[1];MapValue of Argument[-1];value" AbstractMapEntry out = null; Object in = source(); out = new MyAbstractMapEntry(null, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapKey of Argument[0];MapKey of Argument[-1];value" AbstractMapEntryDecorator out = null; - Map.Entry in = newMAMEWithMapKey(source()); + Map.Entry in = newMAMEWithMapKey((String)source()); out = new MyAbstractMapEntryDecorator(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value" AbstractMapEntryDecorator out = null; - Map.Entry in = newMAMEWithMapValue(source()); + Map.Entry in = newMAMEWithMapValue((String)source()); out = new MyAbstractMapEntryDecorator(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value" Map.Entry out = null; - MyAbstractMapEntryDecorator in = newMAMEDWithMapKey(source()); + MyAbstractMapEntryDecorator in = newMAMEDWithMapKey((String)source()); out = in.myGetMapEntry(); - sink(getMapKeyFromEntry(out)); // $hasValueFlow + sink(getMapKeyFromEntry(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value" Map.Entry out = null; - MyAbstractMapEntryDecorator in = newMAMEDWithMapValue(source()); + MyAbstractMapEntryDecorator in = newMAMEDWithMapValue((String)source()); out = in.myGetMapEntry(); - sink(getMapValueFromEntry(out)); // $hasValueFlow - } - { - // "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;toString;;;MapKey of Argument[-1];ReturnValue;taint" - String out = null; - AbstractMapEntryDecorator in = newMAMEDWithMapKey(source()); - out = in.toString(); - sink(out); // $hasTaintFlow - } - { - // "org.apache.commons.collections4.keyvalue;AbstractMapEntryDecorator;true;toString;;;MapValue of Argument[-1];ReturnValue;taint" - String out = null; - AbstractMapEntryDecorator in = newMAMEDWithMapValue(source()); - out = in.toString(); - sink(out); // $hasTaintFlow + sink(getMapValueFromEntry(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value" DefaultKeyValue out = null; - Map.Entry in = newMAMEWithMapKey(source()); + Map.Entry in = newMAMEWithMapKey((String)source()); out = new DefaultKeyValue(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value" DefaultKeyValue out = null; - Map.Entry in = newMAMEWithMapValue(source()); + Map.Entry in = newMAMEWithMapValue((String)source()); out = new DefaultKeyValue(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value" DefaultKeyValue out = null; - KeyValue in = newMAKVWithMapKey(source()); + KeyValue in = newMAKVWithMapKey((String)source()); out = new DefaultKeyValue(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value" DefaultKeyValue out = null; - KeyValue in = newMAKVWithMapValue(source()); + KeyValue in = newMAKVWithMapValue((String)source()); out = new DefaultKeyValue(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[0];MapKey of Argument[-1];value" DefaultKeyValue out = null; Object in = source(); out = new DefaultKeyValue(in, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[1];MapValue of Argument[-1];value" DefaultKeyValue out = null; Object in = source(); out = new DefaultKeyValue(null, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;toMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value" Map.Entry out = null; - DefaultKeyValue in = newDKVWithMapKey(source()); + DefaultKeyValue in = newDKVWithMapKey((String)source()); out = in.toMapEntry(); - sink(getMapKeyFromEntry(out)); // $hasValueFlow + sink(getMapKeyFromEntry(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultKeyValue;true;toMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value" Map.Entry out = null; - DefaultKeyValue in = newDKVWithMapValue(source()); + DefaultKeyValue in = newDKVWithMapValue((String)source()); out = in.toMapEntry(); - sink(getMapValueFromEntry(out)); // $hasValueFlow + sink(getMapValueFromEntry(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value" DefaultMapEntry out = null; - Map.Entry in = newMAMEWithMapKey(source()); + Map.Entry in = newMAMEWithMapKey((String)source()); out = new DefaultMapEntry(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value" DefaultMapEntry out = null; - Map.Entry in = newMAMEWithMapValue(source()); + Map.Entry in = newMAMEWithMapValue((String)source()); out = new DefaultMapEntry(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value" DefaultMapEntry out = null; - KeyValue in = newMAKVWithMapKey(source()); + KeyValue in = newMAKVWithMapKey((String)source()); out = new DefaultMapEntry(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value" DefaultMapEntry out = null; - KeyValue in = newMAKVWithMapValue(source()); + KeyValue in = newMAKVWithMapValue((String)source()); out = new DefaultMapEntry(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value" DefaultMapEntry out = null; Object in = source(); out = new DefaultMapEntry(in, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value" DefaultMapEntry out = null; Object in = source(); out = new DefaultMapEntry(null, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;TiedMapEntry;true;TiedMapEntry;;;Argument[1];MapKey of Argument[-1];value" TiedMapEntry out = null; Object in = source(); out = new TiedMapEntry(null, in); - sink(getMapKeyFromEntry(out)); // $hasValueFlow + sink(getMapKeyFromEntry(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;TiedMapEntry;true;TiedMapEntry;;;MapValue of Argument[0];MapValue of Argument[-1];value" TiedMapEntry out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = new TiedMapEntry(in, null); - sink(getMapValueFromEntry(out)); // $hasValueFlow + sink(getMapValueFromEntry(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value" UnmodifiableMapEntry out = null; - Map.Entry in = newMAMEWithMapKey(source()); + Map.Entry in = newMAMEWithMapKey((String)source()); out = new UnmodifiableMapEntry(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value" UnmodifiableMapEntry out = null; - Map.Entry in = newMAMEWithMapValue(source()); + Map.Entry in = newMAMEWithMapValue((String)source()); out = new UnmodifiableMapEntry(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value" UnmodifiableMapEntry out = null; - KeyValue in = newMAKVWithMapKey(source()); + KeyValue in = newMAKVWithMapKey((String)source()); out = new UnmodifiableMapEntry(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value" UnmodifiableMapEntry out = null; - KeyValue in = newMAKVWithMapValue(source()); + KeyValue in = newMAKVWithMapValue((String)source()); out = new UnmodifiableMapEntry(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value" UnmodifiableMapEntry out = null; Object in = source(); out = new UnmodifiableMapEntry(in, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4.keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value" UnmodifiableMapEntry out = null; Object in = source(); out = new UnmodifiableMapEntry(null, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;KeyValue;true;getKey;;;MapKey of Argument[-1];ReturnValue;value" Object out = null; - TiedMapEntry in = newTMEWithMapKey(source()); + TiedMapEntry in = newTMEWithMapKey((String)source()); out = in.getKey(); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;KeyValue;true;getKey;;;MapKey of Argument[-1];ReturnValue;value" Object out = null; - KeyValue in = newMAKVWithMapKey(source()); + KeyValue in = newMAKVWithMapKey((String)source()); out = in.getKey(); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;KeyValue;true;getKey;;;MapKey of Argument[-1];ReturnValue;value" Object out = null; - AbstractMapEntryDecorator in = newMAMEDWithMapKey(source()); + AbstractMapEntryDecorator in = newMAMEDWithMapKey((String)source()); out = in.getKey(); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;KeyValue;true;getKey;;;MapKey of Argument[-1];ReturnValue;value" Object out = null; - AbstractKeyValue in = newMAKVWithMapKey(source()); + AbstractKeyValue in = newMAKVWithMapKey((String)source()); out = in.getKey(); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;KeyValue;true;getValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - TiedMapEntry in = newTMEWithMapValue(source()); + TiedMapEntry in = newTMEWithMapValue((String)source()); out = in.getValue(); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;KeyValue;true;getValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - KeyValue in = newMAKVWithMapValue(source()); + KeyValue in = newMAKVWithMapValue((String)source()); out = in.getValue(); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;KeyValue;true;getValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - AbstractMapEntryDecorator in = newMAMEDWithMapValue(source()); + AbstractMapEntryDecorator in = newMAMEDWithMapValue((String)source()); out = in.getValue(); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;KeyValue;true;getValue;;;MapValue of Argument[-1];ReturnValue;value" Object out = null; - AbstractKeyValue in = newMAKVWithMapValue(source()); + AbstractKeyValue in = newMAKVWithMapValue((String)source()); out = in.getValue(); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value" Map out = null; Map in = (Map)source(); out = MapUtils.emptyIfNull(in); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;fixedSizeMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.fixedSizeMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;fixedSizeMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.fixedSizeMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;fixedSizeSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapKey(source()); + SortedMap in = newTreeMapWithMapKey((String)source()); out = MapUtils.fixedSizeSortedMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;fixedSizeSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapValue(source()); + SortedMap in = newTreeMapWithMapValue((String)source()); out = MapUtils.fixedSizeSortedMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;getMap;;;Argument[2];ReturnValue;value" Map out = null; Map in = (Map)source(); out = MapUtils.getMap(null, null, in); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;getMap;;;MapValue of Argument[0];ReturnValue;value" Map out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.getMap(in, null, null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;getMap;;;MapValue of Argument[0];ReturnValue;value" Map out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.getMap(in, null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;getObject;;;Argument[2];ReturnValue;value" Object out = null; Object in = source(); out = MapUtils.getObject(null, null, in); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;getObject;;;MapValue of Argument[0];ReturnValue;value" Object out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.getObject(in, null, null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;getObject;;;MapValue of Argument[0];ReturnValue;value" Object out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.getObject(in, null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;getString;;;Argument[2];ReturnValue;value" String out = null; String in = (String)source(); out = MapUtils.getString(null, null, in); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;getString;;;MapValue of Argument[0];ReturnValue;value" String out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.getString(in, null, null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;getString;;;MapValue of Argument[0];ReturnValue;value" String out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.getString(in, null); - sink(out); // $hasValueFlow + sink(out); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;invertMap;;;MapKey of Argument[0];MapValue of ReturnValue;value" Map out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.invertMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;invertMap;;;MapValue of Argument[0];MapKey of ReturnValue;value" Map out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.invertMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;iterableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.iterableMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;iterableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.iterableMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;iterableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" IterableSortedMap out = null; - SortedMap in = newTreeMapWithMapKey(source()); + SortedMap in = newTreeMapWithMapKey((String)source()); out = MapUtils.iterableSortedMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;iterableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" IterableSortedMap out = null; - SortedMap in = newTreeMapWithMapValue(source()); + SortedMap in = newTreeMapWithMapValue((String)source()); out = MapUtils.iterableSortedMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;lazyMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.lazyMap(in, (Transformer)null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;lazyMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.lazyMap(in, (Factory)null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;lazyMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.lazyMap(in, (Transformer)null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;lazyMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.lazyMap(in, (Factory)null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;lazySortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapKey(source()); + SortedMap in = newTreeMapWithMapKey((String)source()); out = MapUtils.lazySortedMap(in, (Transformer)null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;lazySortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapKey(source()); + SortedMap in = newTreeMapWithMapKey((String)source()); out = MapUtils.lazySortedMap(in, (Factory)null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;lazySortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapValue(source()); + SortedMap in = newTreeMapWithMapValue((String)source()); out = MapUtils.lazySortedMap(in, (Transformer)null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;lazySortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapValue(source()); + SortedMap in = newTreeMapWithMapValue((String)source()); out = MapUtils.lazySortedMap(in, (Factory)null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;multiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" MultiValueMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.multiValueMap(in, (Factory)null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;multiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" MultiValueMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.multiValueMap(in, (Class)null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;multiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" MultiValueMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.multiValueMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;multiValueMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" MultiValueMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.multiValueMap(in, (Factory)null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;multiValueMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" MultiValueMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.multiValueMap(in, (Class)null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;multiValueMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" MultiValueMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.multiValueMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;orderedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" OrderedMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.orderedMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;orderedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" OrderedMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.orderedMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;populateMap;(Map,Iterable,Transformer);;Element of Argument[1];MapValue of Argument[0];value" Map out = null; - Iterable in = newWithElement((String)source()); + Iterable in = newVectorWithElement((String)source()); MapUtils.populateMap(out, in, (Transformer)null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // Note it is tricky to get this to compile - the compiler thinks it is ambiguous // which overload it should choose unless you put the generic types in correctly // "org.apache.commons.collections4;MapUtils;true;populateMap;(MultiMap,Iterable,Transformer);;Element of Argument[1];MapValue of Argument[0];value" MultiMap out = null; - Iterable in = newWithElement((String)source()); + Iterable in = newVectorWithElement((String)source()); MapUtils.populateMap(out, in, (Transformer)null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;predicatedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.predicatedMap(in, null, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;predicatedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.predicatedMap(in, null, null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;predicatedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapKey(source()); + SortedMap in = newTreeMapWithMapKey((String)source()); out = MapUtils.predicatedSortedMap(in, null, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;predicatedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapValue(source()); + SortedMap in = newTreeMapWithMapValue((String)source()); out = MapUtils.predicatedSortedMap(in, null, null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of Argument[0];value" Map out = null; - Object[] in = newWithArrayElement(source()); + Object[] in = newWithArrayElement((String)source()); MapUtils.putAll(out, in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of ReturnValue;value" Map out = null; - Object[] in = newWithArrayElement(source()); + Object[] in = newWithArrayElement((String)source()); out = MapUtils.putAll(null, in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of Argument[0];value" Map out = null; - Object[] in = newWithArrayElement(source()); + Object[] in = newWithArrayElement((String)source()); MapUtils.putAll(out, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of ReturnValue;value" Map out = null; - Object[] in = newWithArrayElement(source()); + Object[] in = newWithArrayElement((String)source()); out = MapUtils.putAll(null, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of Argument[0];value" Map out = null; - Object[] in = newWithArrayElement(newWithArrayElement(source())); + Object[] in = newWithArrayElement(newWithArrayElement((String)source())); MapUtils.putAll(out, in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of ReturnValue;value" Map out = null; - Object[] in = newWithArrayElement(newWithArrayElement(source())); + Object[] in = newWithArrayElement(newWithArrayElement((String)source())); out = MapUtils.putAll(null, in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of Argument[0];value" Map out = null; - Object[] in = newWithArrayElement(newWithArrayElement(source())); + Object[] in = newWithArrayElement(newWithArrayElement((String)source())); MapUtils.putAll(out, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of ReturnValue;value" Map out = null; - Object[] in = newWithArrayElement(newWithArrayElement(source())); + Object[] in = newWithArrayElement(newWithArrayElement((String)source())); out = MapUtils.putAll(null, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of Argument[0];value" Map out = null; - Object[] in = newWithArrayElement(newMAKVWithMapKey(source())); + Object[] in = newWithArrayElement(newMAKVWithMapKey((String)source())); MapUtils.putAll(out, in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of ReturnValue;value" Map out = null; - Object[] in = newWithArrayElement(newMAKVWithMapKey(source())); + Object[] in = newWithArrayElement(newMAKVWithMapKey((String)source())); out = MapUtils.putAll(null, in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of Argument[0];value" Map out = null; - Object[] in = newWithArrayElement(newMAKVWithMapValue(source())); + Object[] in = newWithArrayElement(newMAKVWithMapValue((String)source())); MapUtils.putAll(out, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of ReturnValue;value" Map out = null; - Object[] in = newWithArrayElement(newMAKVWithMapValue(source())); + Object[] in = newWithArrayElement(newMAKVWithMapValue((String)source())); out = MapUtils.putAll(null, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;safeAddToMap;;;Argument[1];MapKey of Argument[0];value" Map out = null; Object in = source(); MapUtils.safeAddToMap(out, in, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;safeAddToMap;;;Argument[2];MapValue of Argument[0];value" Map out = null; Object in = source(); MapUtils.safeAddToMap(out, null, in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;synchronizedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" Map out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.synchronizedMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;synchronizedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" Map out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.synchronizedMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;synchronizedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapKey(source()); + SortedMap in = newTreeMapWithMapKey((String)source()); out = MapUtils.synchronizedSortedMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;synchronizedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapValue(source()); + SortedMap in = newTreeMapWithMapValue((String)source()); out = MapUtils.synchronizedSortedMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;toMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" Map out = null; - ResourceBundle in = newRBWithMapKey(source()); + ResourceBundle in = newRBWithMapKey((String)source()); out = MapUtils.toMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;toMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" Map out = null; - ResourceBundle in = newRBWithMapValue(source()); + ResourceBundle in = newRBWithMapValue((String)source()); out = MapUtils.toMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;transformedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.transformedMap(in, null, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;transformedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" IterableMap out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.transformedMap(in, null, null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;transformedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapKey(source()); + SortedMap in = newTreeMapWithMapKey((String)source()); out = MapUtils.transformedSortedMap(in, null, null); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;transformedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapValue(source()); + SortedMap in = newTreeMapWithMapValue((String)source()); out = MapUtils.transformedSortedMap(in, null, null); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;unmodifiableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" Map out = null; - Map in = newTreeMapWithMapKey(source()); + Map in = newTreeMapWithMapKey((String)source()); out = MapUtils.unmodifiableMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;unmodifiableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" Map out = null; - Map in = newTreeMapWithMapValue(source()); + Map in = newTreeMapWithMapValue((String)source()); out = MapUtils.unmodifiableMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;unmodifiableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapKey(source()); + SortedMap in = newTreeMapWithMapKey((String)source()); out = MapUtils.unmodifiableSortedMap(in); - sink(getMapKey(out)); // $hasValueFlow + sink(getMapKey(out)); // $ hasValueFlow } { // "org.apache.commons.collections4;MapUtils;true;unmodifiableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" SortedMap out = null; - SortedMap in = newTreeMapWithMapValue(source()); + SortedMap in = newTreeMapWithMapValue((String)source()); out = MapUtils.unmodifiableSortedMap(in); - sink(getMapValue(out)); // $hasValueFlow + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ArrayStack;true;peek;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + ArrayStack in = newArrayStackWithElement((String)source()); + out = in.peek(0); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ArrayStack;true;peek;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + ArrayStack in = newArrayStackWithElement((String)source()); + out = in.peek(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ArrayStack;true;pop;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + ArrayStack in = newArrayStackWithElement((String)source()); + out = in.pop(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ArrayStack;true;push;;;Argument[0];Element of Argument[-1];value" + ArrayStack out = null; + Object in = source(); + out.push(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ArrayStack;true;push;;;Argument[0];ReturnValue;value" + Object out = null; + Object in = source(); + ArrayStack instance = null; + out = instance.push(in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Bag;true;add;;;Argument[0];Element of Argument[-1];value" + Bag out = null; + Object in = source(); + out.add(in, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Bag;true;add;;;Argument[0];Element of Argument[-1];value" + Bag out = null; + Object in = source(); + out.add(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Bag;true;uniqueSet;;;Element of Argument[-1];Element of ReturnValue;value" + Set out = null; + Bag in = newTreeBagWithElement((String)source()); + out = in.uniqueSet(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BagUtils;true;collectionBag;;;Element of Argument[0];Element of ReturnValue;value" + Bag out = null; + Bag in = newTreeBagWithElement((String)source()); + out = BagUtils.collectionBag(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BagUtils;true;predicatedBag;;;Element of Argument[0];Element of ReturnValue;value" + Bag out = null; + Bag in = newTreeBagWithElement((String)source()); + out = BagUtils.predicatedBag(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BagUtils;true;predicatedSortedBag;;;Element of Argument[0];Element of ReturnValue;value" + SortedBag out = null; + SortedBag in = newTreeBagWithElement((String)source()); + out = BagUtils.predicatedSortedBag(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BagUtils;true;synchronizedBag;;;Element of Argument[0];Element of ReturnValue;value" + Bag out = null; + Bag in = newTreeBagWithElement((String)source()); + out = BagUtils.synchronizedBag(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BagUtils;true;synchronizedSortedBag;;;Element of Argument[0];Element of ReturnValue;value" + SortedBag out = null; + SortedBag in = newTreeBagWithElement((String)source()); + out = BagUtils.synchronizedSortedBag(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BagUtils;true;transformingBag;;;Element of Argument[0];Element of ReturnValue;value" + Bag out = null; + Bag in = newTreeBagWithElement((String)source()); + out = BagUtils.transformingBag(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BagUtils;true;transformingSortedBag;;;Element of Argument[0];Element of ReturnValue;value" + SortedBag out = null; + SortedBag in = newTreeBagWithElement((String)source()); + out = BagUtils.transformingSortedBag(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BagUtils;true;unmodifiableBag;;;Element of Argument[0];Element of ReturnValue;value" + Bag out = null; + Bag in = newTreeBagWithElement((String)source()); + out = BagUtils.unmodifiableBag(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BagUtils;true;unmodifiableSortedBag;;;Element of Argument[0];Element of ReturnValue;value" + SortedBag out = null; + SortedBag in = newTreeBagWithElement((String)source()); + out = BagUtils.unmodifiableSortedBag(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BidiMap;true;getKey;;;MapKey of Argument[-1];ReturnValue;value" + Object out = null; + BidiMap in = newTreeBidiMapWithMapKey((String)source()); + out = in.getKey(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BidiMap;true;inverseBidiMap;;;MapKey of Argument[-1];MapValue of ReturnValue;value" + BidiMap out = null; + BidiMap in = newTreeBidiMapWithMapKey((String)source()); + out = in.inverseBidiMap(); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BidiMap;true;inverseBidiMap;;;MapValue of Argument[-1];MapKey of ReturnValue;value" + BidiMap out = null; + BidiMap in = newTreeBidiMapWithMapValue((String)source()); + out = in.inverseBidiMap(); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;BidiMap;true;removeValue;;;MapKey of Argument[-1];ReturnValue;value" + Object out = null; + BidiMap in = newTreeBidiMapWithMapKey((String)source()); + out = in.removeValue(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;addAll;(Collection,Enumeration);;Element of Argument[1];Element of Argument[0];value" + Collection out = null; + Enumeration in = newEnumerationWithElement((String)source()); + CollectionUtils.addAll(out, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;addAll;(Collection,Iterable);;Element of Argument[1];Element of Argument[0];value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + CollectionUtils.addAll(out, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;addAll;(Collection,Iterator);;Element of Argument[1];Element of Argument[0];value" + Collection out = null; + Iterator in = newListIteratorWithElement((String)source()); + CollectionUtils.addAll(out, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;addAll;(Collection,Object[]);;ArrayElement of Argument[1];Element of Argument[0];value" + Collection out = null; + Object[] in = newWithArrayElement((String)source()); + CollectionUtils.addAll(out, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;addIgnoreNull;;;Argument[1];Element of Argument[0];value" + Collection out = null; + Object in = source(); + CollectionUtils.addIgnoreNull(out, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;collate;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.collate(in, null, null, false); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;collate;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.collate(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;collate;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.collate(in, (Iterable)null, false); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;collate;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.collate(in, (Iterable)null, (Comparator)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;collate;;;Element of Argument[1];Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.collate(null, in, null, false); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;collate;;;Element of Argument[1];Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.collate(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;collate;;;Element of Argument[1];Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.collate((Iterable)null, in, false); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;collate;;;Element of Argument[1];Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.collate((Iterable)null, in, (Comparator)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;disjunction;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.disjunction(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;disjunction;;;Element of Argument[1];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.disjunction(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value" + Collection out = null; + Collection in = (Collection)source(); + out = CollectionUtils.emptyIfNull(in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;extractSingleton;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Collection in = newVectorWithElement((String)source()); + out = CollectionUtils.extractSingleton(in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;find;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.find(in, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;get;(Iterator,int);;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = CollectionUtils.get(in, 0); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;get;(Iterable,int);;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.get(in, 0); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;get;(Map,int);;MapKey of Argument[0];MapKey of ReturnValue;value" + Map.Entry out = null; + Map in = newTreeMapWithMapKey((String)source()); + out = CollectionUtils.get(in, 0); + sink(getMapKeyFromEntry(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;get;(Map,int);;MapValue of Argument[0];MapValue of ReturnValue;value" + Map.Entry out = null; + Map in = newTreeMapWithMapValue((String)source()); + out = CollectionUtils.get(in, 0); + sink(getMapValueFromEntry(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;get;(Object,int);;ArrayElement of Argument[0];ReturnValue;value" + Object out = null; + Object in = newWithArrayElement((String)source()); + out = CollectionUtils.get(in, 0); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;get;(Object,int);;Element of Argument[0];ReturnValue;value" + Object out = null; + Object in = newVectorWithElement((String)source()); + out = CollectionUtils.get(in, 0); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;get;(Object,int);;MapKey of Argument[0];MapKey of ReturnValue;value" + Map.Entry out = null; + Object in = newTreeMapWithMapKey((String)source()); + out = (Map.Entry)CollectionUtils.get(in, 0); + sink(getMapKeyFromEntry(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;get;(Object,int);;MapValue of Argument[0];MapValue of ReturnValue;value" + Map.Entry out = null; + Object in = newTreeMapWithMapValue((String)source()); + out = (Map.Entry)CollectionUtils.get(in, 0); + sink(getMapValueFromEntry(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;getCardinalityMap;;;Element of Argument[0];MapKey of ReturnValue;value" + Map out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.getCardinalityMap(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;intersection;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.intersection(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;intersection;;;Element of Argument[1];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.intersection(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;permutations;;;Element of Argument[0];Element of Element of ReturnValue;value" + Collection out = null; + Collection in = newVectorWithElement((String)source()); + out = CollectionUtils.permutations(in); + sink(getElement((Iterable)getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;predicatedCollection;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Collection in = newVectorWithElement((String)source()); + out = CollectionUtils.predicatedCollection(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;removeAll;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.removeAll(in, null, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;removeAll;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Collection in = newVectorWithElement((String)source()); + out = CollectionUtils.removeAll(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;retainAll;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.retainAll(in, null, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;retainAll;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Collection in = newVectorWithElement((String)source()); + out = CollectionUtils.retainAll(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;select;(Iterable,Predicate);;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.select(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;select;(Iterable,Predicate,Collection);;Argument[2];ReturnValue;value" + Collection out = null; + Collection in = (Collection)source(); + out = CollectionUtils.select(null, null, in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;select;(Iterable,Predicate,Collection);;Element of Argument[0];Element of Argument[2];value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + CollectionUtils.select(in, null, out); + sink(getElement(out)); // $ hasValueFlow + } + { + Collection mid = null; + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.select(in, null, mid); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Argument[2];ReturnValue;value" + Collection out = null; + Collection in = (Collection)source(); + out = CollectionUtils.select(null, null, in, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Element of Argument[0];Element of Argument[2];value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + CollectionUtils.select(in, null, out, null); + sink(getElement(out)); // $ hasValueFlow + } + { + Collection mid = null; + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.select(in, null, mid, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Element of Argument[0];Element of Argument[3];value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + CollectionUtils.select(in, null, null, out); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;selectRejected;(Iterable,Predicate);;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.selectRejected(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;selectRejected;(Iterable,Predicate,Collection);;Argument[2];ReturnValue;value" + Collection out = null; + Collection in = (Collection)source(); + out = CollectionUtils.selectRejected(null, null, in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;selectRejected;(Iterable,Predicate,Collection);;Element of Argument[0];Element of Argument[2];value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + CollectionUtils.selectRejected(in, null, out); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;subtract;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.subtract(in, null, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;subtract;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.subtract(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;synchronizedCollection;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Collection in = newVectorWithElement((String)source()); + out = CollectionUtils.synchronizedCollection(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;transformingCollection;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Collection in = newVectorWithElement((String)source()); + out = CollectionUtils.transformingCollection(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;union;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.union(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;union;;;Element of Argument[1];Element of ReturnValue;value" + Collection out = null; + Iterable in = newVectorWithElement((String)source()); + out = CollectionUtils.union(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;CollectionUtils;true;unmodifiableCollection;;;Element of Argument[0];Element of ReturnValue;value" + Collection out = null; + Collection in = newVectorWithElement((String)source()); + out = CollectionUtils.unmodifiableCollection(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;EnumerationUtils;true;get;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Enumeration in = newEnumerationWithElement((String)source()); + out = EnumerationUtils.get(in, 0); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;EnumerationUtils;true;toList;(Enumeration);;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Enumeration in = newEnumerationWithElement((String)source()); + out = EnumerationUtils.toList(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;EnumerationUtils;true;toList;(StringTokenizer);;Argument[0];Element of ReturnValue;taint" + List out = null; + StringTokenizer in = (StringTokenizer)source(); + out = EnumerationUtils.toList(in); + sink(getElement(out)); // $ hasTaintFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;append;(Iterable);;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.append((Iterable)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;append;(Iterable);;Element of Argument[0];Element of ReturnValue;value" + FluentIterable out = null; + Iterable in = newFluentIterableWithElement((String)source()); + FluentIterable instance = null; + out = instance.append(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;append;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value" + FluentIterable out = null; + Object in = source(); + FluentIterable instance = null; + out = instance.append(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;append;(Object[]);;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.append(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;asEnumeration;;;Element of Argument[-1];Element of ReturnValue;value" + Enumeration out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.asEnumeration(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;collate;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.collate(null, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;collate;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.collate(null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;collate;;;Element of Argument[0];Element of ReturnValue;value" + FluentIterable out = null; + Iterable in = newFluentIterableWithElement((String)source()); + FluentIterable instance = null; + out = instance.collate(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;collate;;;Element of Argument[0];Element of ReturnValue;value" + FluentIterable out = null; + Iterable in = newFluentIterableWithElement((String)source()); + FluentIterable instance = null; + out = instance.collate(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;copyInto;;;Element of Argument[-1];Element of Argument[0];value" + Collection out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + in.copyInto(out); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;eval;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.eval(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;filter;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.filter(null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;get;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.get(0); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;limit;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.limit(0L); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;loop;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.loop(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;of;(Iterable);;Element of Argument[0];Element of ReturnValue;value" + FluentIterable out = null; + Iterable in = newFluentIterableWithElement((String)source()); + out = FluentIterable.of(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;of;(Object);;Argument[0];Element of ReturnValue;value" + FluentIterable out = null; + Object in = source(); + out = FluentIterable.of(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;of;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value" + FluentIterable out = null; + Object[] in = newWithArrayElement((String)source()); + out = FluentIterable.of(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;reverse;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.reverse(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;skip;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.skip(0L); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;toArray;;;Element of Argument[-1];ArrayElement of ReturnValue;value" + Object[] out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.toArray(null); + sink(getArrayElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;toList;;;Element of Argument[-1];Element of ReturnValue;value" + List out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.toList(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;unique;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.unique(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;unmodifiable;;;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.unmodifiable(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;zip;(Iterable);;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.zip((Iterable)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;zip;(Iterable);;Element of Argument[0];Element of ReturnValue;value" + FluentIterable out = null; + Iterable in = newFluentIterableWithElement((String)source()); + FluentIterable instance = null; + out = instance.zip(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;zip;(Iterable[]);;Element of Argument[-1];Element of ReturnValue;value" + FluentIterable out = null; + FluentIterable in = newFluentIterableWithElement((String)source()); + out = in.zip((Iterable)null, (Iterable)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;FluentIterable;true;zip;(Iterable[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value" + FluentIterable out = null; + Iterable in = newVectorWithElement((String)source()); + FluentIterable instance = null; + out = instance.zip(in, (Iterable)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;entrySet;;;MapKey of Argument[-1];MapKey of Element of ReturnValue;value" + Set out = null; + MultiValueMap in = newMVMWithMapKey((String)source()); + out = in.entrySet(); + sink(getMapKeyFromEntry(getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;entrySet;;;MapKey of Argument[-1];MapKey of Element of ReturnValue;value" + Set out = null; + Get in = newTrieWithMapKey((String)source()); + out = in.entrySet(); + sink(getMapKeyFromEntry(getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;entrySet;;;MapKey of Argument[-1];MapKey of Element of ReturnValue;value" + Set out = null; + AbstractMapDecorator in = newMVMWithMapKey((String)source()); + out = in.entrySet(); + sink(getMapKeyFromEntry(getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;entrySet;;;MapValue of Argument[-1];MapValue of Element of ReturnValue;value" + Set out = null; + MultiValueMap in = newMVMWithMapValue((String)source()); + out = in.entrySet(); + sink(getMapValueFromEntry(getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;entrySet;;;MapValue of Argument[-1];MapValue of Element of ReturnValue;value" + Set out = null; + Get in = newTrieWithMapValue((String)source()); + out = in.entrySet(); + sink(getMapValueFromEntry(getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;entrySet;;;MapValue of Argument[-1];MapValue of Element of ReturnValue;value" + Set out = null; + AbstractMapDecorator in = newMVMWithMapValue((String)source()); + out = in.entrySet(); + sink(getMapValueFromEntry(getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;get;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + MultiMap in = newMMWithMapValue((String)source()); + out = in.get(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;get;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + Get in = newTrieWithMapValue((String)source()); + out = in.get(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;get;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + AbstractMapDecorator in = newMVMWithMapValue((String)source()); + out = in.get(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;keySet;();;MapKey of Argument[-1];Element of ReturnValue;value" + Set out = null; + Get in = newTrieWithMapKey((String)source()); + out = in.keySet(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;keySet;();;MapKey of Argument[-1];Element of ReturnValue;value" + Set out = null; + AbstractMapDecorator in = newMVMWithMapKey((String)source()); + out = in.keySet(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;remove;(Object);;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + MultiMap in = newMMWithMapValue((String)source()); + out = in.remove(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;remove;(Object);;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + Get in = newTrieWithMapValue((String)source()); + out = in.remove(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;remove;(Object);;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + AbstractMapDecorator in = newMVMWithMapValue((String)source()); + out = in.remove(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value" + Set out = null; + BidiMap in = newTreeBidiMapWithMapValue((String)source()); + out = in.values(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + MultiValueMap in = newMVMWithMapValue((String)source()); + out = in.values(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + MultiMap in = newMMWithMapValue((String)source()); + out = in.values(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + Get in = newTrieWithMapValue((String)source()); + out = in.values(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Get;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + AbstractMapDecorator in = newMVMWithMapValue((String)source()); + out = in.values(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableGet;true;mapIterator;;;MapKey of Argument[-1];Element of ReturnValue;value" + OrderedMapIterator out = null; + OrderedMap in = newTreeBidiMapWithMapKey((String)source()); + out = in.mapIterator(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableGet;true;mapIterator;;;MapKey of Argument[-1];Element of ReturnValue;value" + MapIterator out = null; + IterableGet in = newHashedMapWithMapKey((String)source()); + out = in.mapIterator(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableGet;true;mapIterator;;;MapKey of Argument[-1];Element of ReturnValue;value" + MapIterator out = null; + AbstractIterableMap in = newMVMWithMapKey((String)source()); + out = in.mapIterator(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableGet;true;mapIterator;;;MapValue of Argument[-1];MapValue of ReturnValue;value" + OrderedMapIterator out = null; + OrderedMap in = newTreeBidiMapWithMapValue((String)source()); + out = in.mapIterator(); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableGet;true;mapIterator;;;MapValue of Argument[-1];MapValue of ReturnValue;value" + MapIterator out = null; + IterableGet in = newHashedMapWithMapValue((String)source()); + out = in.mapIterator(); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableGet;true;mapIterator;;;MapValue of Argument[-1];MapValue of ReturnValue;value" + MapIterator out = null; + AbstractIterableMap in = newMVMWithMapValue((String)source()); + out = in.mapIterator(); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;boundedIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.boundedIterable(in, 0L); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(in, (Iterable)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(in, null, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(null, in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Element of Argument[2];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(null, null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(in, null, null, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(null, in, null, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[2];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(null, null, in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[3];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.chainedIterable(null, null, null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;collatedIterable;(Comparator,Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.collatedIterable(null, in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;collatedIterable;(Comparator,Iterable,Iterable);;Element of Argument[2];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.collatedIterable(null, null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;collatedIterable;(Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.collatedIterable(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;collatedIterable;(Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.collatedIterable(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value" + Iterable out = null; + Iterable in = (Iterable)source(); + out = IterableUtils.emptyIfNull(in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;filteredIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.filteredIterable(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;find;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.find(in, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;first;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.first(in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;forEachButLast;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.forEachButLast(in, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;get;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.get(in, 0); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;loopingIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.loopingIterable(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;partition;;;Element of Argument[0];Element of Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.partition(in, (Factory)null, (Predicate)null, (Predicate)null); + sink(getElement((Iterable)getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;partition;;;Element of Argument[0];Element of Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.partition(in, (Predicate)null, (Predicate)null); + sink(getElement((Iterable)getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;partition;;;Element of Argument[0];Element of Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.partition(in, (Predicate)null, (Predicate)null); + sink(getElement((Iterable)getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;reversedIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.reversedIterable(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;skippingIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.skippingIterable(in, 0L); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;toList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.toList(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;toString;;;Argument[2];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = IterableUtils.toString(null, null, in, null, null); + sink(out); // $ hasTaintFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;toString;;;Argument[3];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = IterableUtils.toString(null, null, null, in, null); + sink(out); // $ hasTaintFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;toString;;;Argument[4];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = IterableUtils.toString(null, null, null, null, in); + sink(out); // $ hasTaintFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;uniqueIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.uniqueIterable(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;unmodifiableIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.unmodifiableIterable(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;zippingIterable;(Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.zippingIterable((Iterable)null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;zippingIterable;(Iterable,Iterable[]);;Element of ArrayElement of Argument[1];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.zippingIterable((Iterable)null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;zippingIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.zippingIterable(in, (Iterable)null, (Iterable)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IterableUtils;true;zippingIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterable in = newVectorWithElement((String)source()); + out = IterableUtils.zippingIterable(in, (Iterable)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableIterator out = null; + Object[] in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayIterator(in, 0, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableIterator out = null; + Object[] in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayIterator(in, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableIterator out = null; + Object in = source(); + out = IteratorUtils.arrayIterator(in, (Object)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableIterator out = null; + Object in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayIterator(in, 0, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableIterator out = null; + Object in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayIterator(in, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableIterator out = null; + Object in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayListIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableListIterator out = null; + Object[] in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayListIterator(in, 0, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayListIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableListIterator out = null; + Object[] in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayListIterator(in, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayListIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableListIterator out = null; + Object in = source(); + out = IteratorUtils.arrayListIterator(in, (Object)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayListIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableListIterator out = null; + Object in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayListIterator(in, 0, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayListIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableListIterator out = null; + Object in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayListIterator(in, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;arrayListIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + ResettableListIterator out = null; + Object in = newWithArrayElement((String)source()); + out = IteratorUtils.arrayListIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;asEnumeration;;;Element of Argument[0];Element of ReturnValue;value" + Enumeration out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.asEnumeration(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;asIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.asIterable(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;asIterator;;;Element of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Enumeration in = newEnumerationWithElement((String)source()); + out = IteratorUtils.asIterator(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;asIterator;;;Element of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Enumeration in = newEnumerationWithElement((String)source()); + out = IteratorUtils.asIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;asMultipleUseIterable;;;Element of Argument[0];Element of ReturnValue;value" + Iterable out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.asMultipleUseIterable(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;boundedIterator;;;Element of Argument[0];Element of ReturnValue;value" + BoundedIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.boundedIterator(in, 0L, 0L); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;boundedIterator;;;Element of Argument[0];Element of ReturnValue;value" + BoundedIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.boundedIterator(in, 0L); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;chainedIterator;(Collection);;Element of Element of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Collection in = newVectorWithElement(newVectorWithElement((String)source())); + out = IteratorUtils.chainedIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;chainedIterator;(Iterator[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.chainedIterator(in, (Iterator)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;chainedIterator;(Iterator,Iterator);;Element of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.chainedIterator(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;chainedIterator;(Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.chainedIterator(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;collatedIterator;(Comparator,Collection);;Element of Element of Argument[1];Element of ReturnValue;value" + Iterator out = null; + Collection in = newVectorWithElement(newVectorWithElement((String)source())); + out = IteratorUtils.collatedIterator((Comparator)null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;collatedIterator;(Comparator,Iterator[]);;Element of ArrayElement of Argument[1];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.collatedIterator((Comparator)null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;collatedIterator;(Comparator,Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.collatedIterator(null, in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;collatedIterator;(Comparator,Iterator,Iterator);;Element of Argument[2];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.collatedIterator(null, null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;filteredIterator;;;Element of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.filteredIterator(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;filteredListIterator;;;Element of Argument[0];Element of ReturnValue;value" + ListIterator out = null; + ListIterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.filteredListIterator(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;find;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.find(in, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;first;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.first(in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;forEachButLast;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.forEachButLast(in, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;get;;;Element of Argument[0];ReturnValue;value" + Object out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.get(in, 0); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;getIterator;;;Argument[0];Element of ReturnValue;value" + Iterator out = null; + Object in = source(); + out = IteratorUtils.getIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;getIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Object in = newWithArrayElement((String)source()); + out = IteratorUtils.getIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;getIterator;;;Element of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Object in = newVectorWithElement((String)source()); + out = IteratorUtils.getIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;getIterator;;;MapValue of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Map in = newTreeMapWithMapValue((String)source()); + out = IteratorUtils.getIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;loopingIterator;;;Element of Argument[0];Element of ReturnValue;value" + ResettableIterator out = null; + Collection in = newVectorWithElement((String)source()); + out = IteratorUtils.loopingIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;loopingListIterator;;;Element of Argument[0];Element of ReturnValue;value" + ResettableListIterator out = null; + List in = newVectorWithElement((String)source()); + out = IteratorUtils.loopingListIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;peekingIterator;;;Element of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.peekingIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;pushbackIterator;;;Element of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.pushbackIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;singletonIterator;;;Argument[0];Element of ReturnValue;value" + ResettableIterator out = null; + Object in = source(); + out = IteratorUtils.singletonIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;singletonListIterator;;;Argument[0];Element of ReturnValue;value" + ListIterator out = null; + Object in = source(); + out = IteratorUtils.singletonListIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;skippingIterator;;;Element of Argument[0];Element of ReturnValue;value" + SkippingIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.skippingIterator(in, 0L); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;toArray;;;Element of Argument[0];ArrayElement of ReturnValue;value" + Object[] out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.toArray(in, null); + sink(getArrayElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;toArray;;;Element of Argument[0];ArrayElement of ReturnValue;value" + Object[] out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.toArray(in); + sink(getArrayElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;toList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.toList(in, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;toList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.toList(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;toListIterator;;;Element of Argument[0];Element of ReturnValue;value" + ListIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.toListIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;toString;;;Argument[2];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = IteratorUtils.toString(null, null, in, null, null); + sink(out); // $ hasTaintFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;toString;;;Argument[3];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = IteratorUtils.toString(null, null, null, in, null); + sink(out); // $ hasTaintFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;toString;;;Argument[4];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = IteratorUtils.toString(null, null, null, null, in); + sink(out); // $ hasTaintFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;unmodifiableIterator;;;Element of Argument[0];Element of ReturnValue;value" + Iterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.unmodifiableIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;unmodifiableListIterator;;;Element of Argument[0];Element of ReturnValue;value" + ListIterator out = null; + ListIterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.unmodifiableListIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;unmodifiableMapIterator;;;Element of Argument[0];Element of ReturnValue;value" + MapIterator out = null; + MapIterator in = newOMIWithElement((String)source()); + out = IteratorUtils.unmodifiableMapIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;unmodifiableMapIterator;;;MapValue of Argument[0];MapValue of ReturnValue;value" + MapIterator out = null; + MapIterator in = newOMIWithMapValue((String)source()); + out = IteratorUtils.unmodifiableMapIterator(in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;zippingIterator;(Iterator[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value" + ZippingIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.zippingIterator(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;zippingIterator;(Iterator,Iterator);;Element of Argument[0];Element of ReturnValue;value" + ZippingIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.zippingIterator(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;zippingIterator;(Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value" + ZippingIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.zippingIterator(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[0];Element of ReturnValue;value" + ZippingIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.zippingIterator(in, null, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value" + ZippingIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.zippingIterator(null, in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[2];Element of ReturnValue;value" + ZippingIterator out = null; + Iterator in = newListIteratorWithElement((String)source()); + out = IteratorUtils.zippingIterator(null, null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;defaultIfNull;;;Argument[0];ReturnValue;value" + List out = null; + List in = (List)source(); + out = ListUtils.defaultIfNull(in, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;defaultIfNull;;;Argument[1];ReturnValue;value" + List out = null; + List in = (List)source(); + out = ListUtils.defaultIfNull(null, in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value" + List out = null; + List in = (List)source(); + out = ListUtils.emptyIfNull(in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;fixedSizeList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.fixedSizeList(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;intersection;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.intersection(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;intersection;;;Element of Argument[1];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.intersection(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;lazyList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.lazyList(in, (Transformer)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;lazyList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.lazyList(in, (Factory)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;longestCommonSubsequence;(CharSequence,CharSequence);;Argument[0];ReturnValue;taint" + String out = null; + CharSequence in = (CharSequence)source(); + out = ListUtils.longestCommonSubsequence(in, (CharSequence)null); + sink(out); // $ hasTaintFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;longestCommonSubsequence;(CharSequence,CharSequence);;Argument[1];ReturnValue;taint" + String out = null; + CharSequence in = (CharSequence)source(); + out = ListUtils.longestCommonSubsequence((CharSequence)null, in); + sink(out); // $ hasTaintFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;longestCommonSubsequence;(List,List);;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.longestCommonSubsequence(in, (List)null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;longestCommonSubsequence;(List,List);;Element of Argument[1];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.longestCommonSubsequence((List)null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;longestCommonSubsequence;(List,List,Equator);;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.longestCommonSubsequence(in, null, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;longestCommonSubsequence;(List,List,Equator);;Element of Argument[1];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.longestCommonSubsequence(null, in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;partition;;;Element of Argument[0];Element of Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.partition(in, 0); + sink(getElement((Iterable)getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;predicatedList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.predicatedList(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;removeAll;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Collection in = newVectorWithElement((String)source()); + out = ListUtils.removeAll(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;retainAll;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Collection in = newVectorWithElement((String)source()); + out = ListUtils.retainAll(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;select;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Collection in = newVectorWithElement((String)source()); + out = ListUtils.select(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;selectRejected;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + Collection in = newVectorWithElement((String)source()); + out = ListUtils.selectRejected(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;subtract;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.subtract(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;sum;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.sum(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;sum;;;Element of Argument[1];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.sum(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;synchronizedList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.synchronizedList(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;transformedList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.transformedList(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;union;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.union(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;union;;;Element of Argument[1];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.union(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;ListUtils;true;unmodifiableList;;;Element of Argument[0];Element of ReturnValue;value" + List out = null; + List in = newVectorWithElement((String)source()); + out = ListUtils.unmodifiableList(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MapIterator;true;getKey;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + MapIterator in = newOMIWithElement((String)source()); + out = in.getKey(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MapIterator;true;getValue;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + MapIterator in = newOMIWithMapValue((String)source()); + out = in.getValue(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MapIterator;true;setValue;;;Argument[0];MapValue of Argument[-1];value" + MapIterator out = null; + Object in = source(); + out.setValue(in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MapIterator;true;setValue;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + MapIterator in = newOMIWithMapValue((String)source()); + out = in.setValue(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMap;true;get;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + MultiMap in = newMMWithMapValue((String)source()); + out = (Collection)in.get(null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMap;true;put;;;Argument[0];MapKey of Argument[-1];value" + MultiValueMap out = null; + Object in = source(); + out.put(in, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMap;true;put;;;Argument[0];MapKey of Argument[-1];value" + MultiMap out = null; + Object in = source(); + out.put(in, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMap;true;put;;;Argument[1];Element of MapValue of Argument[-1];value" + MultiValueMap out = null; + Object in = source(); + out.put(null, in); + sink(getElement((Collection)getMapValue(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMap;true;put;;;Argument[1];Element of MapValue of Argument[-1];value" + MultiMap out = null; + Object in = source(); + out.put(null, in); + sink(getElement((Collection)getMapValue(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMap;true;values;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + MultiValueMap in = newMVMWithMapValue((String)source()); + out = in.values(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMap;true;values;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + MultiMap in = newMMWithMapValue((String)source()); + out = in.values(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMapUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value" + MultiValuedMap out = null; + MultiValuedMap in = (MultiValuedMap)source(); + out = MultiMapUtils.emptyIfNull(in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;entries;;;MapKey of Argument[-1];MapKey of Element of ReturnValue;value" + Collection out = null; + MultiValuedMap in = newALVHMWithMapKey((String)source()); + out = in.entries(); + sink(getMapKeyFromEntry(getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;entries;;;Element of MapValue of Argument[-1];MapValue of Element of ReturnValue;value" + Collection out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = in.entries(); + sink(getMapValueFromEntry(getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMapUtils;true;getCollection;;;MapValue of Argument[0];ReturnValue;value" + Collection out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = MultiMapUtils.getCollection(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMapUtils;true;getValuesAsBag;;;Element of MapValue of Argument[0];Element of ReturnValue;value" + Bag out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = MultiMapUtils.getValuesAsBag(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMapUtils;true;getValuesAsList;;;Element of MapValue of Argument[0];Element of ReturnValue;value" + List out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = MultiMapUtils.getValuesAsList(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMapUtils;true;getValuesAsSet;;;Element of MapValue of Argument[0];Element of ReturnValue;value" + Set out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = MultiMapUtils.getValuesAsSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMapUtils;true;transformedMultiValuedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" + MultiValuedMap out = null; + MultiValuedMap in = newALVHMWithMapKey((String)source()); + out = MultiMapUtils.transformedMultiValuedMap(in, null, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMapUtils;true;transformedMultiValuedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" + MultiValuedMap out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = MultiMapUtils.transformedMultiValuedMap(in, null, null); + sink(getElement(getMapValue(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMapUtils;true;unmodifiableMultiValuedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" + MultiValuedMap out = null; + MultiValuedMap in = newALVHMWithMapKey((String)source()); + out = MultiMapUtils.unmodifiableMultiValuedMap(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiMapUtils;true;unmodifiableMultiValuedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" + MultiValuedMap out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = MultiMapUtils.unmodifiableMultiValuedMap(in); + sink(getElement(getMapValue(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiSet$Entry;true;getElement;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + MultiSet.Entry in = newMultiSetEntryWithElement((String)source()); + out = in.getElement(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiSet;true;add;;;Argument[0];Element of Argument[-1];value" + MultiSet out = null; + Object in = source(); + out.add(in, 0); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiSet;true;add;;;Argument[0];Element of Argument[-1];value" + MultiSet out = null; + Object in = source(); + out.add(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiSet;true;entrySet;;;Element of Argument[-1];Element of Element of ReturnValue;value" + Set out = null; + MultiSet in = newMultiSetWithElement((String)source()); + out = in.entrySet(); + sink(getElement(getElement(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiSet;true;uniqueSet;;;Element of Argument[-1];Element of ReturnValue;value" + Set out = null; + MultiSet in = newMultiSetWithElement((String)source()); + out = in.uniqueSet(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiSetUtils;true;predicatedMultiSet;;;Element of Argument[0];Element of ReturnValue;value" + MultiSet out = null; + MultiSet in = newMultiSetWithElement((String)source()); + out = MultiSetUtils.predicatedMultiSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiSetUtils;true;synchronizedMultiSet;;;Element of Argument[0];Element of ReturnValue;value" + MultiSet out = null; + MultiSet in = newMultiSetWithElement((String)source()); + out = MultiSetUtils.synchronizedMultiSet(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiSetUtils;true;unmodifiableMultiSet;;;Element of Argument[0];Element of ReturnValue;value" + MultiSet out = null; + MultiSet in = newMultiSetWithElement((String)source()); + out = MultiSetUtils.unmodifiableMultiSet(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;asMap;;;Element of MapValue of Argument[-1];Element of MapValue of ReturnValue;value" + Map out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = in.asMap(); + sink(getElement((Collection)getMapValue(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;asMap;;;MapKey of Argument[-1];MapKey of ReturnValue;value" + Map out = null; + MultiValuedMap in = newALVHMWithMapKey((String)source()); + out = in.asMap(); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;get;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + Set out = null; + SetValuedMap in = newHSVHMWithMapValue((String)source()); + out = in.get(null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;get;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + List out = null; + ListValuedMap in = newALVHMWithMapValue((String)source()); + out = in.get(null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;get;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = in.get(null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;keySet;;;MapKey of Argument[-1];Element of ReturnValue;value" + Set out = null; + MultiValuedMap in = newALVHMWithMapKey((String)source()); + out = in.keySet(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;keys;;;MapKey of Argument[-1];Element of ReturnValue;value" + MultiSet out = null; + MultiValuedMap in = newALVHMWithMapKey((String)source()); + out = in.keys(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;mapIterator;;;Element of MapValue of Argument[-1];MapValue of ReturnValue;value" + MapIterator out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = in.mapIterator(); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;mapIterator;;;MapKey of Argument[-1];Element of ReturnValue;value" + MapIterator out = null; + MultiValuedMap in = newALVHMWithMapKey((String)source()); + out = in.mapIterator(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;put;;;Argument[0];MapKey of Argument[-1];value" + MultiValuedMap out = null; + Object in = source(); + out.put(in, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;put;;;Argument[1];Element of MapValue of Argument[-1];value" + MultiValuedMap out = null; + Object in = source(); + out.put(null, in); + sink(getElement(getMapValue(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value" + MultiValuedMap out = null; + Map in = newTreeMapWithMapKey((String)source()); + out.putAll(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;putAll;(Map);;MapValue of Argument[0];Element of MapValue of Argument[-1];value" + MultiValuedMap out = null; + Map in = newTreeMapWithMapValue((String)source()); + out.putAll(in); + sink(getElement(getMapValue(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;putAll;(MultiValuedMap);;Element of MapValue of Argument[0];Element of MapValue of Argument[-1];value" + MultiValuedMap out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out.putAll(in); + sink(getElement(getMapValue(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;putAll;(MultiValuedMap);;MapKey of Argument[0];MapKey of Argument[-1];value" + MultiValuedMap out = null; + MultiValuedMap in = newALVHMWithMapKey((String)source()); + out.putAll(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;putAll;(Object,Iterable);;Argument[0];MapKey of Argument[-1];value" + MultiValuedMap out = null; + Object in = source(); + out.putAll(in, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;putAll;(Object,Iterable);;Element of Argument[1];Element of MapValue of Argument[-1];value" + MultiValuedMap out = null; + Iterable in = newFluentIterableWithElement((String)source()); + out.putAll(null, in); + sink(getElement(getMapValue(out))); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;remove;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + Set out = null; + SetValuedMap in = newHSVHMWithMapValue((String)source()); + out = in.remove(null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;remove;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + List out = null; + ListValuedMap in = newALVHMWithMapValue((String)source()); + out = in.remove(null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;remove;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = in.remove(null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;MultiValuedMap;true;values;;;Element of MapValue of Argument[-1];Element of ReturnValue;value" + Collection out = null; + MultiValuedMap in = newALVHMWithMapValue((String)source()); + out = in.values(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;OrderedIterator;true;previous;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + OrderedMapIterator in = newOMIWithElement((String)source()); + out = in.previous(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;OrderedIterator;true;previous;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + OrderedIterator in = newOMIWithElement((String)source()); + out = in.previous(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;OrderedMap;true;firstKey;;;MapKey of Argument[-1];ReturnValue;value" + Object out = null; + OrderedMap in = newTreeBidiMapWithMapKey((String)source()); + out = in.firstKey(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;OrderedMap;true;lastKey;;;MapKey of Argument[-1];ReturnValue;value" + Object out = null; + OrderedMap in = newTreeBidiMapWithMapKey((String)source()); + out = in.lastKey(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;OrderedMap;true;nextKey;;;MapKey of Argument[-1];ReturnValue;value" + Object out = null; + OrderedMap in = newTreeBidiMapWithMapKey((String)source()); + out = in.nextKey(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;OrderedMap;true;previousKey;;;MapKey of Argument[-1];ReturnValue;value" + Object out = null; + OrderedMap in = newTreeBidiMapWithMapKey((String)source()); + out = in.previousKey(null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[0];MapKey of Argument[-1];value" + Put out = null; + Object in = source(); + out.put(in, null); + sink(getMapKeyFromPut(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[0];MapKey of Argument[-1];value" + MultiValueMap out = null; + Object in = source(); + out.put(in, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[0];MapKey of Argument[-1];value" + MultiMap out = null; + Object in = source(); + out.put(in, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[0];MapKey of Argument[-1];value" + BidiMap out = null; + Object in = source(); + out.put(in, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[0];MapKey of Argument[-1];value" + AbstractMapDecorator out = null; + Object in = source(); + out.put(in, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[1];MapValue of Argument[-1];value" + Put out = null; + Object in = source(); + out.put(null, in); + sink(getMapValueFromPut(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[1];MapValue of Argument[-1];value" + MultiValueMap out = null; + Object in = source(); + out.put(null, in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[1];MapValue of Argument[-1];value" + MultiMap out = null; + Object in = source(); + out.put(null, in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[1];MapValue of Argument[-1];value" + BidiMap out = null; + Object in = source(); + out.put(null, in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;Argument[1];MapValue of Argument[-1];value" + AbstractMapDecorator out = null; + Object in = source(); + out.put(null, in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + Put in = newHashedMapWithMapValue((String)source()); + out = in.put(null, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + MultiValueMap in = newMVMWithMapValue((String)source()); + out = in.put(null, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + MultiMap in = newMMWithMapValue((String)source()); + out = in.put(null, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + BidiMap in = newTreeBidiMapWithMapValue((String)source()); + out = in.put(null, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;put;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + AbstractMapDecorator in = newMVMWithMapValue((String)source()); + out = in.put(null, null); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value" + Put out = null; + Map in = newTreeMapWithMapKey((String)source()); + out.putAll(in); + sink(getMapKeyFromPut(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value" + MultiValueMap out = null; + Map in = newTreeMapWithMapKey((String)source()); + out.putAll(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value" + AbstractMapDecorator out = null; + Map in = newTreeMapWithMapKey((String)source()); + out.putAll(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value" + Put out = null; + Map in = newTreeMapWithMapValue((String)source()); + out.putAll(in); + sink(getMapValueFromPut(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value" + MultiValueMap out = null; + Map in = newTreeMapWithMapValue((String)source()); + out.putAll(in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Put;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value" + AbstractMapDecorator out = null; + Map in = newTreeMapWithMapValue((String)source()); + out.putAll(in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;QueueUtils;true;predicatedQueue;;;Element of Argument[0];Element of ReturnValue;value" + Queue out = null; + Queue in = newQueueWithElement((String)source()); + out = QueueUtils.predicatedQueue(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;QueueUtils;true;synchronizedQueue;;;Element of Argument[0];Element of ReturnValue;value" + Queue out = null; + Queue in = newQueueWithElement((String)source()); + out = QueueUtils.synchronizedQueue(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;QueueUtils;true;transformingQueue;;;Element of Argument[0];Element of ReturnValue;value" + Queue out = null; + Queue in = newQueueWithElement((String)source()); + out = QueueUtils.transformingQueue(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;QueueUtils;true;unmodifiableQueue;;;Element of Argument[0];Element of ReturnValue;value" + Queue out = null; + Queue in = newQueueWithElement((String)source()); + out = QueueUtils.unmodifiableQueue(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils$SetView;true;copyInto;;;Element of Argument[-1];Element of Argument[0];value" + Set out = null; + SetUtils.SetView in = newSetViewWithElement((String)source()); + in.copyInto(out); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils$SetView;true;createIterator;;;Element of Argument[-1];Element of ReturnValue;value" + Iterator out = null; + MySetView in = newSetViewWithElement((String)source()); + out = in.myCreateIterator(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils$SetView;true;toSet;;;Element of Argument[-1];Element of ReturnValue;value" + Set out = null; + MySetView in = newSetViewWithElement((String)source()); + out = in.toSet(); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;difference;;;Element of Argument[0];Element of ReturnValue;value" + SetUtils.SetView out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.difference(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;disjunction;;;Element of Argument[0];Element of ReturnValue;value" + SetUtils.SetView out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.disjunction(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;disjunction;;;Element of Argument[1];Element of ReturnValue;value" + SetUtils.SetView out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.disjunction(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value" + Set out = null; + Set in = (Set)source(); + out = SetUtils.emptyIfNull(in); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;hashSet;;;ArrayElement of Argument[0];Element of ReturnValue;value" + HashSet out = null; + Object in = source(); + out = SetUtils.hashSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;intersection;;;Element of Argument[0];Element of ReturnValue;value" + SetUtils.SetView out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.intersection(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;intersection;;;Element of Argument[1];Element of ReturnValue;value" + SetUtils.SetView out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.intersection(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;orderedSet;;;Element of Argument[0];Element of ReturnValue;value" + Set out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.orderedSet(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;predicatedNavigableSet;;;Element of Argument[0];Element of ReturnValue;value" + SortedSet out = null; + NavigableSet in = newTreeSetWithElement((String)source()); + out = SetUtils.predicatedNavigableSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;predicatedSet;;;Element of Argument[0];Element of ReturnValue;value" + Set out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.predicatedSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;predicatedSortedSet;;;Element of Argument[0];Element of ReturnValue;value" + SortedSet out = null; + SortedSet in = newTreeSetWithElement((String)source()); + out = SetUtils.predicatedSortedSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;synchronizedSet;;;Element of Argument[0];Element of ReturnValue;value" + Set out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.synchronizedSet(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;synchronizedSortedSet;;;Element of Argument[0];Element of ReturnValue;value" + SortedSet out = null; + SortedSet in = newTreeSetWithElement((String)source()); + out = SetUtils.synchronizedSortedSet(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;transformedNavigableSet;;;Element of Argument[0];Element of ReturnValue;value" + SortedSet out = null; + NavigableSet in = newTreeSetWithElement((String)source()); + out = SetUtils.transformedNavigableSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;transformedSet;;;Element of Argument[0];Element of ReturnValue;value" + Set out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.transformedSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;transformedSortedSet;;;Element of Argument[0];Element of ReturnValue;value" + SortedSet out = null; + SortedSet in = newTreeSetWithElement((String)source()); + out = SetUtils.transformedSortedSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;union;;;Element of Argument[0];Element of ReturnValue;value" + SetUtils.SetView out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.union(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;union;;;Element of Argument[1];Element of ReturnValue;value" + SetUtils.SetView out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.union(null, in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;unmodifiableNavigableSet;;;Element of Argument[0];Element of ReturnValue;value" + SortedSet out = null; + NavigableSet in = newTreeSetWithElement((String)source()); + out = SetUtils.unmodifiableNavigableSet(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;unmodifiableSet;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value" + Set out = null; + Object in = source(); + out = SetUtils.unmodifiableSet(in, null); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;unmodifiableSet;(Set);;Element of Argument[0];Element of ReturnValue;value" + Set out = null; + Set in = newTreeSetWithElement((String)source()); + out = SetUtils.unmodifiableSet(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SetUtils;true;unmodifiableSortedSet;;;Element of Argument[0];Element of ReturnValue;value" + SortedSet out = null; + SortedSet in = newTreeSetWithElement((String)source()); + out = SetUtils.unmodifiableSortedSet(in); + sink(getElement(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SortedBag;true;first;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + SortedBag in = newTreeBagWithElement((String)source()); + out = in.first(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SortedBag;true;last;;;Element of Argument[-1];ReturnValue;value" + Object out = null; + SortedBag in = newTreeBagWithElement((String)source()); + out = in.last(); + sink(out); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SplitMapUtils;true;readableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" + IterableMap out = null; + Get in = newHashedMapWithMapKey((String)source()); + out = SplitMapUtils.readableMap(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SplitMapUtils;true;readableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" + IterableMap out = null; + Get in = newHashedMapWithMapValue((String)source()); + out = SplitMapUtils.readableMap(in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SplitMapUtils;true;writableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value" + Map out = null; + Put in = newHashedMapWithMapKey((String)source()); + out = SplitMapUtils.writableMap(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;SplitMapUtils;true;writableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" + Map out = null; + Put in = newHashedMapWithMapValue((String)source()); + out = SplitMapUtils.writableMap(in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Trie;true;prefixMap;;;MapKey of Argument[-1];MapKey of ReturnValue;value" + SortedMap out = null; + Trie in = newTrieWithMapKey((String)source()); + out = in.prefixMap(null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;Trie;true;prefixMap;;;MapValue of Argument[-1];MapValue of ReturnValue;value" + SortedMap out = null; + Trie in = newTrieWithMapValue((String)source()); + out = in.prefixMap(null); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;TrieUtils;true;unmodifiableTrie;;;MapKey of Argument[0];MapKey of ReturnValue;value" + Trie out = null; + Trie in = newTrieWithMapKey((String)source()); + out = TrieUtils.unmodifiableTrie(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "org.apache.commons.collections4;TrieUtils;true;unmodifiableTrie;;;MapValue of Argument[0];MapValue of ReturnValue;value" + Trie out = null; + Trie in = newTrieWithMapValue((String)source()); + out = TrieUtils.unmodifiableTrie(in); + sink(getMapValue(out)); // $ hasValueFlow } } diff --git a/java/ql/test/library-tests/frameworks/apache-collections/test.ql b/java/ql/test/library-tests/frameworks/apache-collections/test.ql index 611fcd302ee..766606c0ba1 100644 --- a/java/ql/test/library-tests/frameworks/apache-collections/test.ql +++ b/java/ql/test/library-tests/frameworks/apache-collections/test.ql @@ -9,6 +9,8 @@ class SummaryModelTest extends SummaryModelCsv { row = [ //"package;type;overrides;name;signature;ext;inputspec;outputspec;kind", + // This is temporarily modelled for the helper function newEnumerationWithElement, until the relevant package is modelled + "org.apache.commons.collections4.iterators;IteratorEnumeration;true;IteratorEnumeration;;;Element of Argument[0];Element of Argument[-1];value", "generatedtest;Test;false;newRBWithMapValue;;;Argument[0];MapValue of ReturnValue;value", "generatedtest;Test;false;newRBWithMapKey;;;Argument[0];MapKey of ReturnValue;value" ] diff --git a/java/ql/test/library-tests/frameworks/guava/TestBase.java b/java/ql/test/library-tests/frameworks/guava/TestBase.java index 6fd6e4d910a..963b971235f 100644 --- a/java/ql/test/library-tests/frameworks/guava/TestBase.java +++ b/java/ql/test/library-tests/frameworks/guava/TestBase.java @@ -75,7 +75,7 @@ class TestBase { } void test6() { - sink(Suppliers.memoize(Suppliers.memoizeWithExpiration(Suppliers.synchronizedSupplier(Suppliers.ofInstance(taint())), 3, TimeUnit.HOURS))); // $numTaintFlow=1 + sink(Suppliers.memoize(Suppliers.memoizeWithExpiration(Suppliers.synchronizedSupplier(Suppliers.ofInstance(taint())), 3, TimeUnit.HOURS)).get()); // $numTaintFlow=1 } void test7() { diff --git a/java/ql/test/library-tests/frameworks/guava/TestIO.java b/java/ql/test/library-tests/frameworks/guava/TestIO.java index 9871b49ac0f..8d07256fd9f 100644 --- a/java/ql/test/library-tests/frameworks/guava/TestIO.java +++ b/java/ql/test/library-tests/frameworks/guava/TestIO.java @@ -8,7 +8,11 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.Closeable; +import java.nio.channels.FileChannel; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; import java.nio.file.Path; +import java.nio.file.Paths; import java.io.IOException; class TestIO { @@ -16,6 +20,7 @@ class TestIO { String staint(){ return (String) taint(); } byte[] btaint() { return (byte[]) taint(); } InputStream itaint() { return (InputStream) taint(); } + ReadableByteChannel rbctaint() { return (ReadableByteChannel) taint(); } Reader rtaint() { return new InputStreamReader(itaint()); } Path ptaint() { return (Path) taint(); } @@ -75,6 +80,16 @@ class TestIO { } void test3() throws IOException { + { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteStreams.copy(itaint(), out); + sink(out); // $numTaintFlow=1 + } + { + WritableByteChannel out = FileChannel.open(Paths.get("/tmp/xyz")); + ByteStreams.copy(rbctaint(), out); + sink(out); // $numTaintFlow=1 + } sink(ByteStreams.limit(itaint(), 1337)); // $numTaintFlow=1 sink(ByteStreams.newDataInput(btaint())); // $numTaintFlow=1 sink(ByteStreams.newDataInput(btaint(), 0)); // $numTaintFlow=1 diff --git a/java/ql/test/library-tests/frameworks/guava/generated/cache/Test.java b/java/ql/test/library-tests/frameworks/guava/generated/cache/Test.java new file mode 100644 index 00000000000..3df543dbd95 --- /dev/null +++ b/java/ql/test/library-tests/frameworks/guava/generated/cache/Test.java @@ -0,0 +1,181 @@ +package generatedtest; + +import com.google.common.cache.Cache; +import com.google.common.cache.LoadingCache; +import com.google.common.cache.CacheBuilder; +import com.google.common.collect.ImmutableMap; +import java.util.Map; +import java.util.concurrent.ConcurrentMap; +import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; + +// Test case generated by GenerateFlowTestCase.ql +public class Test { + + K getMapKey(Map container) { return container.keySet().iterator().next(); } + K getMapKey(Cache container) { return getMapKey(container.asMap()); } + V getMapValue(Map container) { return container.values().iterator().next(); } + V getMapValue(Cache container) { return getMapValue(container.asMap()); } + Iterable newWithElement(T element) { + List l = new ArrayList(); + l.add(element); + return l; + } + Map newMapWithMapKey(K element) { + Map m = new HashMap(); + m.put(element, null); + return m; + } + LoadingCache newCacheWithMapKey(K element) { + LoadingCache lc = CacheBuilder.newBuilder().build(null); + lc.put(element, null); + return lc; + } + Map newMapWithMapValue(V element) { + Map m = new HashMap(); + m.put(null, element); + return m; + } + LoadingCache newCacheWithMapValue(V element) { + LoadingCache lc = CacheBuilder.newBuilder().build(null); + lc.put(null, element); + return lc; + } + T source() { return null; } + void sink(Object o) { } + + public void test() throws Exception { + + { + // "com.google.common.cache;Cache;true;asMap;();;MapKey of Argument[-1];MapKey of ReturnValue;value" + ConcurrentMap out = null; + LoadingCache in = newCacheWithMapKey(source()); + out = in.asMap(); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;asMap;();;MapKey of Argument[-1];MapKey of ReturnValue;value" + ConcurrentMap out = null; + Cache in = newCacheWithMapKey(source()); + out = in.asMap(); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;asMap;();;MapValue of Argument[-1];MapValue of ReturnValue;value" + ConcurrentMap out = null; + LoadingCache in = newCacheWithMapValue(source()); + out = in.asMap(); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;asMap;();;MapValue of Argument[-1];MapValue of ReturnValue;value" + ConcurrentMap out = null; + Cache in = newCacheWithMapValue(source()); + out = in.asMap(); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;get;(Object,Callable);;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + Cache in = newCacheWithMapValue(source()); + out = in.get(null, null); + sink(out); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;Element of Argument[0];MapKey of ReturnValue;value" + ImmutableMap out = null; + Iterable in = newWithElement(source()); + Cache instance = null; + out = instance.getAllPresent(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;MapKey of Argument[-1];MapKey of ReturnValue;value" + ImmutableMap out = null; + Cache in = newCacheWithMapKey(source()); + out = in.getAllPresent(null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;getIfPresent;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + Cache in = newCacheWithMapValue(source()); + out = in.getIfPresent(null); + sink(out); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;put;(Object,Object);;Argument[0];MapKey of Argument[-1];value" + Cache out = null; + Object in = source(); + out.put(in, null); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;put;(Object,Object);;Argument[1];MapValue of Argument[-1];value" + Cache out = null; + Object in = source(); + out.put(null, in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value" + Cache out = null; + Map in = newMapWithMapKey(source()); + out.putAll(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;Cache;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value" + Cache out = null; + Map in = newMapWithMapValue(source()); + out.putAll(in); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;LoadingCache;true;apply;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + LoadingCache in = newCacheWithMapValue(source()); + out = in.apply(null); + sink(out); // $ hasValueFlow + } + { + // "com.google.common.cache;LoadingCache;true;get;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + LoadingCache in = newCacheWithMapValue(source()); + out = in.get(null); + sink(out); // $ hasValueFlow + } + { + // "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;Element of Argument[0];MapKey of Argument[-1];value" + LoadingCache out = null; + Iterable in = (Iterable)newWithElement(source()); + out.getAll(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;Element of Argument[0];MapKey of ReturnValue;value" + ImmutableMap out = null; + Iterable in = (Iterable)newWithElement(source()); + LoadingCache instance = null; + out = instance.getAll(in); + sink(getMapKey(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;MapValue of Argument[-1];MapValue of ReturnValue;value" + ImmutableMap out = null; + LoadingCache in = newCacheWithMapValue(source()); + out = in.getAll(null); + sink(getMapValue(out)); // $ hasValueFlow + } + { + // "com.google.common.cache;LoadingCache;true;getUnchecked;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + LoadingCache in = newCacheWithMapValue(source()); + out = in.getUnchecked(null); + sink(out); // $ hasValueFlow + } + + } + +} \ No newline at end of file diff --git a/java/ql/test/library-tests/frameworks/guava/generated/cache/options b/java/ql/test/library-tests/frameworks/guava/generated/cache/options new file mode 100644 index 00000000000..c894bb5413e --- /dev/null +++ b/java/ql/test/library-tests/frameworks/guava/generated/cache/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/guava-30.0 \ No newline at end of file diff --git a/java/ql/test/library-tests/frameworks/guava/generated/cache/test.expected b/java/ql/test/library-tests/frameworks/guava/generated/cache/test.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test/library-tests/frameworks/guava/generated/cache/test.ql b/java/ql/test/library-tests/frameworks/guava/generated/cache/test.ql new file mode 100644 index 00000000000..465161863cc --- /dev/null +++ b/java/ql/test/library-tests/frameworks/guava/generated/cache/test.ql @@ -0,0 +1,53 @@ +import java +import semmle.code.java.dataflow.DataFlow +import semmle.code.java.dataflow.ExternalFlow +import semmle.code.java.dataflow.TaintTracking +import TestUtilities.InlineExpectationsTest + +class ValueFlowConf extends DataFlow::Configuration { + ValueFlowConf() { this = "qltest:valueFlowConf" } + + override predicate isSource(DataFlow::Node n) { + n.asExpr().(MethodAccess).getMethod().hasName("source") + } + + override predicate isSink(DataFlow::Node n) { + n.asExpr().(Argument).getCall().getCallee().hasName("sink") + } +} + +class TaintFlowConf extends TaintTracking::Configuration { + TaintFlowConf() { this = "qltest:taintFlowConf" } + + override predicate isSource(DataFlow::Node n) { + n.asExpr().(MethodAccess).getMethod().hasName("source") + } + + override predicate isSink(DataFlow::Node n) { + n.asExpr().(Argument).getCall().getCallee().hasName("sink") + } +} + +class HasFlowTest extends InlineExpectationsTest { + HasFlowTest() { this = "HasFlowTest" } + + override string getARelevantTag() { result = ["hasValueFlow", "hasTaintFlow"] } + + override predicate hasActualResult(Location location, string element, string tag, string value) { + tag = "hasValueFlow" and + exists(DataFlow::Node src, DataFlow::Node sink, ValueFlowConf conf | conf.hasFlow(src, sink) | + sink.getLocation() = location and + element = sink.toString() and + value = "" + ) + or + tag = "hasTaintFlow" and + exists(DataFlow::Node src, DataFlow::Node sink, TaintFlowConf conf | + conf.hasFlow(src, sink) and not any(ValueFlowConf c).hasFlow(src, sink) + | + sink.getLocation() = location and + element = sink.toString() and + value = "" + ) + } +} diff --git a/java/ql/test/library-tests/frameworks/spring/webutil/Test.java b/java/ql/test/library-tests/frameworks/spring/webutil/Test.java new file mode 100644 index 00000000000..1e93454fbd7 --- /dev/null +++ b/java/ql/test/library-tests/frameworks/spring/webutil/Test.java @@ -0,0 +1,2663 @@ +package generatedtest; + +import java.io.InputStream; +import java.net.InetSocketAddress; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.http.HttpRequest; +import org.springframework.http.server.RequestPath; +import org.springframework.util.MultiValueMap; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.web.util.AbstractUriTemplateHandler; +import org.springframework.web.util.ContentCachingRequestWrapper; +import org.springframework.web.util.ContentCachingResponseWrapper; +import org.springframework.web.util.CookieGenerator; +import org.springframework.web.util.DefaultUriBuilderFactory; +import org.springframework.web.util.HtmlUtils; +import org.springframework.web.util.ServletContextPropertyUtils; +import org.springframework.web.util.ServletRequestPathUtils; +import org.springframework.web.util.UriBuilder; +import org.springframework.web.util.UriBuilderFactory; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.UriTemplate; +import org.springframework.web.util.UriTemplateHandler; +import org.springframework.web.util.UriUtils; +import org.springframework.web.util.UrlPathHelper; +import org.springframework.web.util.WebUtils; + +// Test case generated by GenerateFlowTestCase.ql +public class Test { + + class StubUriTemplateVariables extends HashMap implements UriComponents.UriTemplateVariables { + StubUriTemplateVariables(Map m) { super(m); } + + public Object getValue(String name) { return this.get(name); } + } + + Object getElement(Collection container) { return container.iterator().next(); } + T getMapKey(Map m) { return m.keySet().iterator().next(); } + T getMapValue(Map m) { return m.get(null); } + Map newMapWithKey(Object element) { return Map.of(element, null); } + Map newMapWithValue(Object element) { return Map.of(null, element); } + MultiValueMap newMultiValueMapWithKey(Object element) { return new LinkedMultiValueMap(Map.of(element, null)); } + MultiValueMap newMultiValueMapWithValue(Object element) { MultiValueMap m = new LinkedMultiValueMap(); m.put(null, element); return m; } + Object source() { return null; } + void sink(Object o) { } + + public void test() throws Exception { + + { + // "org.springframework.web.util;AbstractUriTemplateHandler;true;getBaseUrl;;;Argument[-1];ReturnValue;taint" + String out = null; + AbstractUriTemplateHandler in = (AbstractUriTemplateHandler)source(); + out = in.getBaseUrl(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;AbstractUriTemplateHandler;true;setBaseUrl;;;Argument[0];Argument[-1];taint" + AbstractUriTemplateHandler out = null; + String in = (String)source(); + out.setBaseUrl(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;AbstractUriTemplateHandler;true;setDefaultUriVariables;;;Argument[0];Argument[-1];taint" + AbstractUriTemplateHandler out = null; + Map in = (Map)source(); + out.setDefaultUriVariables(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ContentCachingRequestWrapper;false;ContentCachingRequestWrapper;;;Argument[0];Argument[-1];taint" + ContentCachingRequestWrapper out = null; + HttpServletRequest in = (HttpServletRequest)source(); + out = new ContentCachingRequestWrapper(in, 0); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ContentCachingRequestWrapper;false;ContentCachingRequestWrapper;;;Argument[0];Argument[-1];taint" + ContentCachingRequestWrapper out = null; + HttpServletRequest in = (HttpServletRequest)source(); + out = new ContentCachingRequestWrapper(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ContentCachingRequestWrapper;false;getContentAsByteArray;;;Argument[-1];ReturnValue;taint" + byte[] out = null; + ContentCachingRequestWrapper in = (ContentCachingRequestWrapper)source(); + out = in.getContentAsByteArray(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ContentCachingResponseWrapper;false;ContentCachingResponseWrapper;;;Argument[0];Argument[-1];taint" + ContentCachingResponseWrapper out = null; + HttpServletResponse in = (HttpServletResponse)source(); + out = new ContentCachingResponseWrapper(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ContentCachingResponseWrapper;false;getContentAsByteArray;;;Argument[-1];ReturnValue;taint" + byte[] out = null; + ContentCachingResponseWrapper in = (ContentCachingResponseWrapper)source(); + out = in.getContentAsByteArray(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ContentCachingResponseWrapper;false;getContentInputStream;;;Argument[-1];ReturnValue;taint" + InputStream out = null; + ContentCachingResponseWrapper in = (ContentCachingResponseWrapper)source(); + out = in.getContentInputStream(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;DefaultUriBuilderFactory;;;Argument[0];Argument[-1];taint" + DefaultUriBuilderFactory out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = new DefaultUriBuilderFactory(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;DefaultUriBuilderFactory;;;Argument[0];Argument[-1];taint" + DefaultUriBuilderFactory out = null; + String in = (String)source(); + out = new DefaultUriBuilderFactory(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;builder;;;Argument[-1];ReturnValue;taint" + UriBuilder out = null; + DefaultUriBuilderFactory in = (DefaultUriBuilderFactory)source(); + out = in.builder(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;expand;(String,Map);;MapValue of Argument[1];ReturnValue;taint" + URI out = null; + Map in = newMapWithValue(source()); + DefaultUriBuilderFactory instance = null; + out = instance.expand((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;expand;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + URI out = null; + Object[] in = new Object[]{source()}; + DefaultUriBuilderFactory instance = null; + out = instance.expand((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + String in = (String)source(); + DefaultUriBuilderFactory instance = null; + out = instance.expand(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + String in = (String)source(); + DefaultUriBuilderFactory instance = null; + out = instance.expand(in, (Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + DefaultUriBuilderFactory in = (DefaultUriBuilderFactory)source(); + out = in.expand((String)null, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + DefaultUriBuilderFactory in = (DefaultUriBuilderFactory)source(); + out = in.expand((String)null, (Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;getDefaultUriVariables;;;Argument[-1];MapValue of ReturnValue;taint" + Map out = null; + DefaultUriBuilderFactory in = (DefaultUriBuilderFactory)source(); + out = in.getDefaultUriVariables(); + sink(getMapValue(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;setDefaultUriVariables;;;MapValue of Argument[0];Argument[-1];taint" + DefaultUriBuilderFactory out = null; + Map in = Map.of(null, source()); + out.setDefaultUriVariables(in); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;DefaultUriBuilderFactory;false;uriString;;;Argument[-1];ReturnValue;taint" + UriBuilder out = null; + DefaultUriBuilderFactory in = (DefaultUriBuilderFactory)source(); + out = in.uriString(null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;HtmlUtils;false;htmlUnescape;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = HtmlUtils.htmlUnescape(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ServletContextPropertyUtils;false;resolvePlaceholders;;;Argument[0..1];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = ServletContextPropertyUtils.resolvePlaceholders(in, null, false); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ServletContextPropertyUtils;false;resolvePlaceholders;;;Argument[0..1];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = ServletContextPropertyUtils.resolvePlaceholders(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ServletContextPropertyUtils;false;resolvePlaceholders;;;Argument[0..1];ReturnValue;taint" + String out = null; + ServletContext in = (ServletContext)source(); + out = ServletContextPropertyUtils.resolvePlaceholders(null, in, false); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ServletContextPropertyUtils;false;resolvePlaceholders;;;Argument[0..1];ReturnValue;taint" + String out = null; + ServletContext in = (ServletContext)source(); + out = ServletContextPropertyUtils.resolvePlaceholders(null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ServletRequestPathUtils;false;getCachedPath;;;Argument[0];ReturnValue;taint" + Object out = null; + ServletRequest in = (ServletRequest)source(); + out = ServletRequestPathUtils.getCachedPath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ServletRequestPathUtils;false;getCachedPathValue;;;Argument[0];ReturnValue;taint" + String out = null; + ServletRequest in = (ServletRequest)source(); + out = ServletRequestPathUtils.getCachedPathValue(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ServletRequestPathUtils;false;getParsedRequestPath;;;Argument[0];ReturnValue;taint" + RequestPath out = null; + ServletRequest in = (ServletRequest)source(); + out = ServletRequestPathUtils.getParsedRequestPath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ServletRequestPathUtils;false;parseAndCache;;;Argument[0];ReturnValue;taint" + RequestPath out = null; + HttpServletRequest in = (HttpServletRequest)source(); + out = ServletRequestPathUtils.parseAndCache(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;ServletRequestPathUtils;false;setParsedRequestPath;;;Argument[0];Argument[1];taint" + ServletRequest out = null; + RequestPath in = (RequestPath)source(); + ServletRequestPathUtils.setParsedRequestPath(in, out); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;(Map);;MapValue of Argument[0];Argument[-1];taint" + UriBuilder out = null; + Map in = newMapWithValue(source()); + out.build(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;(Map);;MapValue of Argument[0];Argument[-1];taint" + UriBuilder out = null; + Map in = newMapWithValue(source()); + out.build(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;(Map);;MapValue of Argument[0];ReturnValue;taint" + URI out = null; + Map in = newMapWithValue(source()); + UriBuilder instance = null; + out = instance.build(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;(Map);;MapValue of Argument[0];ReturnValue;taint" + URI out = null; + Map in = newMapWithValue(source()); + UriBuilder instance = null; + out = instance.build(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;;;Argument[-1];ReturnValue;taint" + URI out = null; + UriBuilder in = (UriBuilder)source(); + out = in.build(false); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;;;Argument[-1];ReturnValue;taint" + URI out = null; + UriBuilder in = (UriBuilder)source(); + out = in.build(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;;;Argument[-1];ReturnValue;taint" + URI out = null; + UriBuilder in = (UriBuilder)source(); + out = in.build((Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;;;Argument[-1];ReturnValue;taint" + URI out = null; + UriBuilder in = (UriBuilder)source(); + out = in.build((Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;;;Argument[-1];ReturnValue;taint" + URI out = null; + UriBuilder in = (UriBuilder)source(); + out = in.build((Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;build;;;Argument[-1];ReturnValue;taint" + URI out = null; + UriBuilder in = (UriBuilder)source(); + out = in.build((Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.fragment(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.fragment(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.fragment(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.fragment(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.fragment(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.fragment(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;host;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.host(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;host;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.host(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;host;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.host(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;host;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.host(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;path;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.path(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;path;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.path(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;path;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.path(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;path;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.path(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;path;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.path(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;path;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.path(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;pathSegment;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.pathSegment((String[])null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;pathSegment;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.pathSegment((String[])null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;pathSegment;;;ArrayElement of Argument[0];Argument[-1];taint" + UriBuilder out = null; + String[] in = new String[]{(String)source()}; + out.pathSegment((String[])in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;pathSegment;;;ArrayElement of Argument[0];Argument[-1];taint" + UriBuilder out = null; + String[] in = new String[]{(String)source()}; + out.pathSegment((String[])in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;pathSegment;;;ArrayElement of Argument[0];ReturnValue;taint" + UriBuilder out = null; + String[] in = new String[]{(String)source()}; + UriBuilder instance = null; + out = instance.pathSegment((String[])in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;pathSegment;;;ArrayElement of Argument[0];ReturnValue;taint" + UriBuilder out = null; + String[] in = new String[]{(String)source()}; + UriBuilder instance = null; + out = instance.pathSegment((String[])in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;port;(java.lang.String);;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.port(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;port;(java.lang.String);;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.port(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;port;(java.lang.String);;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.port(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;port;(java.lang.String);;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.port(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;port;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.port(0); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;port;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.port((String)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;port;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.port(0); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;port;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.port((String)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;query;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.query(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;query;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.query(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;query;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.query(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;query;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.query(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;query;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.query(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;query;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.query(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;(String,Collection);;Element of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Collection in = List.of(source()); + out.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;(String,Collection);;Element of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Collection in = List.of(source()); + out.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;(String,Collection);;Element of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Collection in = List.of(source()); + UriBuilder instance = null; + out = instance.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;(String,Collection);;Element of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Collection in = List.of(source()); + UriBuilder instance = null; + out = instance.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;(String,Object[]);;ArrayElement of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Object[] in = new Object[]{source()}; + out.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;(String,Object[]);;ArrayElement of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Object[] in = new Object[]{source()}; + out.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Object[] in = new Object[]{source()}; + UriBuilder instance = null; + out = instance.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Object[] in = new Object[]{source()}; + UriBuilder instance = null; + out = instance.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.queryParam((String)null, (Object[])null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.queryParam((String)null, (Collection)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.queryParam((String)null, (Object[])null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.queryParam((String)null, (Collection)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.queryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.queryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.queryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.queryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.queryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.queryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.queryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.queryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.queryParamIfPresent(null, null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.queryParamIfPresent(null, null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.queryParamIfPresent(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.queryParamIfPresent(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.queryParamIfPresent(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.queryParamIfPresent(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Element of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Optional in = Optional.of(source()); + out.queryParamIfPresent(null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Element of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Optional in = Optional.of(source()); + out.queryParamIfPresent(null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Element of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Optional in = Optional.of(source()); + UriBuilder instance = null; + out = instance.queryParamIfPresent(null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Element of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Optional in = Optional.of(source()); + UriBuilder instance = null; + out = instance.queryParamIfPresent(null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.queryParams(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.queryParams(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;MapKey of Argument[0];Argument[-1];taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + out.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;MapKey of Argument[0];Argument[-1];taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + out.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;MapKey of Argument[0];ReturnValue;taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + UriBuilder instance = null; + out = instance.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;MapKey of Argument[0];ReturnValue;taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + UriBuilder instance = null; + out = instance.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;Element of MapValue of Argument[0];Argument[-1];taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + out.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;Element of MapValue of Argument[0];Argument[-1];taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + out.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;Element of MapValue of Argument[0];ReturnValue;taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + UriBuilder instance = null; + out = instance.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;queryParams;;;Element of MapValue of Argument[0];ReturnValue;taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + UriBuilder instance = null; + out = instance.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replacePath(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replacePath(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.replacePath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.replacePath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.replacePath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.replacePath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replaceQuery(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replaceQuery(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.replaceQuery(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.replaceQuery(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.replaceQuery(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.replaceQuery(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Collection);;Element of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Collection in = List.of(source()); + out.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Collection);;Element of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Collection in = List.of(source()); + out.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Collection);;Element of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Collection in = List.of(source()); + UriBuilder instance = null; + out = instance.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Collection);;Element of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Collection in = List.of(source()); + UriBuilder instance = null; + out = instance.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Object[]);;ArrayElement of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Object[] in = new Object[]{source()}; + out.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Object[]);;ArrayElement of Argument[1];Argument[-1];taint" + UriBuilder out = null; + Object[] in = new Object[]{source()}; + out.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Object[] in = new Object[]{source()}; + UriBuilder instance = null; + out = instance.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + UriBuilder out = null; + Object[] in = new Object[]{source()}; + UriBuilder instance = null; + out = instance.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replaceQueryParam((String)null, (Object[])null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replaceQueryParam((String)null, (Collection)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replaceQueryParam((String)null, (Object[])null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replaceQueryParam((String)null, (Collection)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.replaceQueryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.replaceQueryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.replaceQueryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.replaceQueryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.replaceQueryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.replaceQueryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.replaceQueryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.replaceQueryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replaceQueryParams(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.replaceQueryParams(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;MapKey of Argument[0];ReturnValue;taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + UriBuilder instance = null; + out = instance.replaceQueryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;MapKey of Argument[0];ReturnValue;taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + UriBuilder instance = null; + out = instance.replaceQueryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Element of MapValue of Argument[0];ReturnValue;taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + UriBuilder instance = null; + out = instance.replaceQueryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Element of MapValue of Argument[0];ReturnValue;taint" + UriBuilder out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + UriBuilder instance = null; + out = instance.replaceQueryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.scheme(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.scheme(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.scheme(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.scheme(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.scheme(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.scheme(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.userInfo(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[-1];ReturnValue;value" + UriBuilder out = null; + UriBuilder in = (UriBuilder)source(); + out = in.userInfo(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.userInfo(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[0];Argument[-1];taint" + UriBuilder out = null; + String in = (String)source(); + out.userInfo(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.userInfo(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilder instance = null; + out = instance.userInfo(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilderFactory;true;builder;;;Argument[-1];ReturnValue;taint" + UriBuilder out = null; + UriBuilderFactory in = (UriBuilderFactory)source(); + out = in.builder(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilderFactory;true;builder;;;Argument[-1];ReturnValue;taint" + UriBuilder out = null; + DefaultUriBuilderFactory in = (DefaultUriBuilderFactory)source(); + out = in.builder(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilderFactory;true;uriString;;;Argument[-1..0];ReturnValue;taint" + UriBuilder out = null; + UriBuilderFactory in = (UriBuilderFactory)source(); + out = in.uriString(null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilderFactory;true;uriString;;;Argument[-1..0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + UriBuilderFactory instance = null; + out = instance.uriString(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilderFactory;true;uriString;;;Argument[-1..0];ReturnValue;taint" + UriBuilder out = null; + String in = (String)source(); + DefaultUriBuilderFactory instance = null; + out = instance.uriString(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriBuilderFactory;true;uriString;;;Argument[-1..0];ReturnValue;taint" + UriBuilder out = null; + DefaultUriBuilderFactory in = (DefaultUriBuilderFactory)source(); + out = in.uriString(null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents$UriTemplateVariables;true;getValue;;;MapValue of Argument[-1];ReturnValue;value" + Object out = null; + UriComponents.UriTemplateVariables in = new StubUriTemplateVariables(Map.of(null, source())); + out = in.getValue(null); + sink(out); // $hasValueFlow + } + // { + // // "org.springframework.web.util;UriComponents;false;UriComponents;;;Argument[0..1];Argument[-1];taint" + // UriComponents out = null; + // String in = (String)source(); + // out = new UriComponents(null, in); + // sink(out); // $hasTaintFlow + // } + // { + // // "org.springframework.web.util;UriComponents;false;UriComponents;;;Argument[0..1];Argument[-1];taint" + // UriComponents out = null; + // String in = (String)source(); + // out = new UriComponents(in, null); + // sink(out); // $hasTaintFlow + // } + { + // "org.springframework.web.util;UriComponents;false;encode;;;Argument[-1];ReturnValue;taint" + UriComponents out = null; + UriComponents in = (UriComponents)source(); + out = in.encode(null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;encode;;;Argument[-1];ReturnValue;taint" + UriComponents out = null; + UriComponents in = (UriComponents)source(); + out = in.encode(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;expand;(Map);;MapValue of Argument[0];ReturnValue;taint" + UriComponents out = null; + Map in = newMapWithValue(source()); + UriComponents instance = null; + out = instance.expand(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;expand;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint" + UriComponents out = null; + Object[] in = new Object[]{source()}; + UriComponents instance = null; + out = instance.expand(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;expand;(UriTemplateVariables);;MapValue of Argument[0];ReturnValue;taint" + UriComponents out = null; + UriComponents.UriTemplateVariables in = new StubUriTemplateVariables(Map.of(null, source())); + UriComponents instance = null; + out = instance.expand(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getFragment;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponents in = (UriComponents)source(); + out = in.getFragment(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getHost;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponents in = (UriComponents)source(); + out = in.getHost(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getPath;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponents in = (UriComponents)source(); + out = in.getPath(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getPathSegments;;;Argument[-1];ReturnValue;taint" + List out = null; + UriComponents in = (UriComponents)source(); + out = in.getPathSegments(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getQuery;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponents in = (UriComponents)source(); + out = in.getQuery(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getQueryParams;;;Argument[-1];Element of MapValue of ReturnValue;taint" + MultiValueMap out = null; + UriComponents in = (UriComponents)source(); + out = in.getQueryParams(); + sink(getElement((List)getMapValue(out))); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getQueryParams;;;Argument[-1];MapKey of ReturnValue;taint" + MultiValueMap out = null; + UriComponents in = (UriComponents)source(); + out = in.getQueryParams(); + sink(getMapKey(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getScheme;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponents in = (UriComponents)source(); + out = in.getScheme(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getSchemeSpecificPart;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponents in = (UriComponents)source(); + out = in.getSchemeSpecificPart(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;getUserInfo;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponents in = (UriComponents)source(); + out = in.getUserInfo(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;toUri;;;Argument[-1];ReturnValue;taint" + URI out = null; + UriComponents in = (UriComponents)source(); + out = in.toUri(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;toUriString;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponents in = (UriComponents)source(); + out = in.toUriString(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;build;(Map);;MapValue of Argument[0];ReturnValue;taint" + URI out = null; + Map in = newMapWithValue(source()); + UriComponentsBuilder instance = null; + out = instance.build(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;build;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint" + URI out = null; + Object[] in = new Object[]{source()}; + UriComponentsBuilder instance = null; + out = instance.build(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;build;;;Argument[-1];ReturnValue;taint" + UriComponents out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.build(false); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;build;;;Argument[-1];ReturnValue;taint" + UriComponents out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.build(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;build;;;Argument[-1];ReturnValue;taint" + URI out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.build((Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;build;;;Argument[-1];ReturnValue;taint" + URI out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.build((Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;buildAndExpand;(Map);;MapValue of Argument[0];ReturnValue;taint" + UriComponents out = null; + Map in = newMapWithValue(source()); + UriComponentsBuilder instance = null; + out = instance.buildAndExpand(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;buildAndExpand;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint" + UriComponents out = null; + Object[] in = new Object[]{source()}; + UriComponentsBuilder instance = null; + out = instance.buildAndExpand(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;cloneBuilder;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.cloneBuilder(); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;encode;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.encode(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;encode;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.encode(); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;fragment;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.fragment(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;fragment;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.fragment(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;fromHttpRequest;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + HttpRequest in = (HttpRequest)source(); + out = UriComponentsBuilder.fromHttpRequest(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;fromHttpUrl;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + out = UriComponentsBuilder.fromHttpUrl(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;fromOriginHeader;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + out = UriComponentsBuilder.fromOriginHeader(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;fromPath;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + out = UriComponentsBuilder.fromPath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;fromUri;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + URI in = (URI)source(); + out = UriComponentsBuilder.fromUri(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;fromUriString;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + out = UriComponentsBuilder.fromUriString(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;host;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.host(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;host;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.host(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;parseForwardedFor;;;Argument[0..1];ReturnValue;taint" + InetSocketAddress out = null; + InetSocketAddress in = (InetSocketAddress)source(); + out = UriComponentsBuilder.parseForwardedFor(null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;parseForwardedFor;;;Argument[0..1];ReturnValue;taint" + InetSocketAddress out = null; + HttpRequest in = (HttpRequest)source(); + out = UriComponentsBuilder.parseForwardedFor(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;path;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.path(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;path;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.path(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;pathSegment;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.pathSegment((String[])null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;pathSegment;;;ArrayElement of Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String[] in = new String[]{(String)source()}; + UriComponentsBuilder instance = null; + out = instance.pathSegment(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;port;(String);;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.port(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;port;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.port(0); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;port;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.port((String)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;query;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.query(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;query;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.query(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParam;(String,Collection);;Element of Argument[1];ReturnValue;taint" + UriComponentsBuilder out = null; + Collection in = List.of(source()); + UriComponentsBuilder instance = null; + out = instance.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParam;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + UriComponentsBuilder out = null; + Object[] in = new Object[]{source()}; + UriComponentsBuilder instance = null; + out = instance.queryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParam;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.queryParam((String)null, (Object[])null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParam;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.queryParam((String)null, (Collection)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParam;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.queryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParam;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.queryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParamIfPresent;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.queryParamIfPresent(null, null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParamIfPresent;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.queryParamIfPresent(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParamIfPresent;;;Element of Argument[1];ReturnValue;taint" + UriComponentsBuilder out = null; + Optional in = Optional.of(source()); + UriComponentsBuilder instance = null; + out = instance.queryParamIfPresent(null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParams;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.queryParams(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParams;;;MapKey of Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + UriComponentsBuilder instance = null; + out = instance.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;queryParams;;;Element of MapValue of Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + UriComponentsBuilder instance = null; + out = instance.queryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replacePath;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.replacePath(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replacePath;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.replacePath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQuery;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.replaceQuery(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQuery;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.replaceQuery(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQueryParam;(String,Collection);;Element of Argument[1];ReturnValue;taint" + UriComponentsBuilder out = null; + Collection in = List.of(source()); + UriComponentsBuilder instance = null; + out = instance.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQueryParam;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + UriComponentsBuilder out = null; + Object[] in = new Object[]{source()}; + UriComponentsBuilder instance = null; + out = instance.replaceQueryParam((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQueryParam;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.replaceQueryParam((String)null, (Object[])null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQueryParam;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.replaceQueryParam((String)null, (Collection)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQueryParam;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.replaceQueryParam(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQueryParam;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.replaceQueryParam(in, (Collection)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQueryParams;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.replaceQueryParams(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQueryParams;;;MapKey of Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + UriComponentsBuilder instance = null; + out = instance.replaceQueryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;replaceQueryParams;;;Element of MapValue of Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + UriComponentsBuilder instance = null; + out = instance.replaceQueryParams(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;scheme;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.scheme(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;scheme;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.scheme(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;schemeSpecificPart;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.schemeSpecificPart(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;schemeSpecificPart;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.schemeSpecificPart(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;toUriString;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.toUriString(); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;uri;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.uri(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;uri;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + URI in = (URI)source(); + UriComponentsBuilder instance = null; + out = instance.uri(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;uriComponents;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.uriComponents(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;uriComponents;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + UriComponents in = (UriComponents)source(); + UriComponentsBuilder instance = null; + out = instance.uriComponents(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;uriVariables;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.uriVariables(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;uriVariables;;;MapValue of Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + Map in = newMapWithValue(source()); + UriComponentsBuilder instance = null; + out = instance.uriVariables(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;userInfo;;;Argument[-1];ReturnValue;value" + UriComponentsBuilder out = null; + UriComponentsBuilder in = (UriComponentsBuilder)source(); + out = in.userInfo(null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;UriComponentsBuilder;false;userInfo;;;Argument[0];ReturnValue;taint" + UriComponentsBuilder out = null; + String in = (String)source(); + UriComponentsBuilder instance = null; + out = instance.userInfo(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplate;false;expand;(Map);;MapValue of Argument[0];ReturnValue;taint" + URI out = null; + Map in = newMapWithValue(source()); + UriTemplate instance = null; + out = instance.expand(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplate;false;expand;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint" + URI out = null; + Object[] in = new Object[]{source()}; + UriTemplate instance = null; + out = instance.expand(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplate;false;getVariableNames;;;Argument[-1];Element of ReturnValue;taint" + List out = null; + UriTemplate in = (UriTemplate)source(); + out = in.getVariableNames(); + sink(getElement(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplate;false;match;;;Argument[0];MapValue of ReturnValue;taint" + Map out = null; + String in = (String)source(); + UriTemplate instance = null; + out = instance.match(in); + sink(getMapValue(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Map);;MapValue of Argument[1];ReturnValue;taint" + URI out = null; + Map in = newMapWithValue(source()); + UriTemplateHandler instance = null; + out = instance.expand((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Map);;MapValue of Argument[1];ReturnValue;taint" + URI out = null; + Map in = newMapWithValue(source()); + DefaultUriBuilderFactory instance = null; + out = instance.expand((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Map);;MapValue of Argument[1];ReturnValue;taint" + URI out = null; + Map in = newMapWithValue(source()); + AbstractUriTemplateHandler instance = null; + out = instance.expand((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + URI out = null; + Object[] in = new Object[]{source()}; + UriTemplateHandler instance = null; + out = instance.expand((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + URI out = null; + Object[] in = new Object[]{source()}; + DefaultUriBuilderFactory instance = null; + out = instance.expand((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint" + URI out = null; + Object[] in = new Object[]{source()}; + AbstractUriTemplateHandler instance = null; + out = instance.expand((String)null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + UriTemplateHandler in = (UriTemplateHandler)source(); + out = in.expand((String)null, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + UriTemplateHandler in = (UriTemplateHandler)source(); + out = in.expand((String)null, (Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + String in = (String)source(); + UriTemplateHandler instance = null; + out = instance.expand(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + String in = (String)source(); + UriTemplateHandler instance = null; + out = instance.expand(in, (Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + String in = (String)source(); + DefaultUriBuilderFactory instance = null; + out = instance.expand(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + String in = (String)source(); + DefaultUriBuilderFactory instance = null; + out = instance.expand(in, (Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + String in = (String)source(); + AbstractUriTemplateHandler instance = null; + out = instance.expand(in, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + String in = (String)source(); + AbstractUriTemplateHandler instance = null; + out = instance.expand(in, (Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + DefaultUriBuilderFactory in = (DefaultUriBuilderFactory)source(); + out = in.expand((String)null, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + DefaultUriBuilderFactory in = (DefaultUriBuilderFactory)source(); + out = in.expand((String)null, (Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + AbstractUriTemplateHandler in = (AbstractUriTemplateHandler)source(); + out = in.expand((String)null, (Object[])null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint" + URI out = null; + AbstractUriTemplateHandler in = (AbstractUriTemplateHandler)source(); + out = in.expand((String)null, (Map)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;decode;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.decode(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;decode;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.decode(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encode;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encode(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encode;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encode(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeAuthority;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeAuthority(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeAuthority;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeAuthority(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeFragment;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeFragment(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeFragment;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeFragment(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeHost;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeHost(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeHost;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeHost(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodePath;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodePath(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodePath;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodePath(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodePathSegment;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodePathSegment(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodePathSegment;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodePathSegment(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodePort;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodePort(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodePort;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodePort(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeQuery;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeQuery(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeQuery;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeQuery(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeQueryParam;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeQueryParam(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeQueryParam;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeQueryParam(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeQueryParams;;;MapKey of Argument[0];MapKey of ReturnValue;taint" + MultiValueMap out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + out = UriUtils.encodeQueryParams(in); + sink(getMapKey(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeQueryParams;;;MapValue of Argument[0];MapValue of ReturnValue;taint" + MultiValueMap out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + out = UriUtils.encodeQueryParams(in); + sink(getMapValue(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeScheme;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeScheme(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeScheme;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeScheme(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Map);;MapKey of Argument[0];MapKey of ReturnValue;taint" + Map out = null; + Map in = newMapWithKey(source()); + out = UriUtils.encodeUriVariables(in); + sink(getMapKey(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Map);;MapValue of Argument[0];MapValue of ReturnValue;taint" + Map out = null; + Map in = newMapWithValue(source()); + out = UriUtils.encodeUriVariables(in); + sink(getMapValue(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Object[]);;ArrayElement of Argument[0];ArrayElement of ReturnValue;taint" + Object[] out = null; + Object[] in = new Object[]{source()}; + out = UriUtils.encodeUriVariables(in); + sink(out[0]); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeUserInfo;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeUserInfo(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;encodeUserInfo;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.encodeUserInfo(in, (Charset)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UriUtils;false;extractFileExtension;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = UriUtils.extractFileExtension(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;decodeMatrixVariables;;;MapKey of Argument[1];MapKey of ReturnValue;value" + MultiValueMap out = null; + MultiValueMap in = newMultiValueMapWithKey(source()); + UrlPathHelper instance = null; + out = instance.decodeMatrixVariables(null, in); + sink(getMapKey(out)); // $hasValueFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;decodeMatrixVariables;;;MapValue of Argument[1];MapValue of ReturnValue;taint" + MultiValueMap out = null; + MultiValueMap in = newMultiValueMapWithValue(source()); + UrlPathHelper instance = null; + out = instance.decodeMatrixVariables(null, in); + sink(getMapValue(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;decodePathVariables;;;MapKey of Argument[1];MapKey of ReturnValue;value" + Map out = null; + Map in = newMapWithKey(source()); + UrlPathHelper instance = null; + out = instance.decodePathVariables(null, in); + sink(getMapKey(out)); // $hasValueFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;decodePathVariables;;;MapValue of Argument[1];MapValue of ReturnValue;taint" + Map out = null; + Map in = newMapWithValue(source()); + UrlPathHelper instance = null; + out = instance.decodePathVariables(null, in); + sink(getMapValue(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;decodeRequestString;;;Argument[1];ReturnValue;taint" + String out = null; + String in = (String)source(); + UrlPathHelper instance = null; + out = instance.decodeRequestString(null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;getContextPath;;;Argument[0];ReturnValue;taint" + String out = null; + HttpServletRequest in = (HttpServletRequest)source(); + UrlPathHelper instance = null; + out = instance.getContextPath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;getOriginatingContextPath;;;Argument[0];ReturnValue;taint" + String out = null; + HttpServletRequest in = (HttpServletRequest)source(); + UrlPathHelper instance = null; + out = instance.getOriginatingContextPath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;getOriginatingQueryString;;;Argument[0];ReturnValue;taint" + String out = null; + HttpServletRequest in = (HttpServletRequest)source(); + UrlPathHelper instance = null; + out = instance.getOriginatingQueryString(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;getOriginatingRequestUri;;;Argument[0];ReturnValue;taint" + String out = null; + HttpServletRequest in = (HttpServletRequest)source(); + UrlPathHelper instance = null; + out = instance.getOriginatingRequestUri(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;getRequestUri;;;Argument[0];ReturnValue;taint" + String out = null; + HttpServletRequest in = (HttpServletRequest)source(); + UrlPathHelper instance = null; + out = instance.getRequestUri(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;getResolvedLookupPath;;;Argument[0];ReturnValue;taint" + String out = null; + ServletRequest in = (ServletRequest)source(); + out = UrlPathHelper.getResolvedLookupPath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;getServletPath;;;Argument[0];ReturnValue;taint" + String out = null; + HttpServletRequest in = (HttpServletRequest)source(); + UrlPathHelper instance = null; + out = instance.getServletPath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;removeSemicolonContent;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + UrlPathHelper instance = null; + out = instance.removeSemicolonContent(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;resolveAndCacheLookupPath;;;Argument[0];ReturnValue;taint" + String out = null; + HttpServletRequest in = (HttpServletRequest)source(); + UrlPathHelper instance = null; + out = instance.resolveAndCacheLookupPath(in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;findParameterValue;(Map,String);;MapValue of Argument[0];ReturnValue;value" + String out = null; + Map in = newMapWithValue(source()); + out = WebUtils.findParameterValue(in, (String)null); + sink(out); // $hasValueFlow + } + { + // "org.springframework.web.util;WebUtils;false;findParameterValue;(ServletRequest,String);;Argument[0];ReturnValue;taint" + String out = null; + ServletRequest in = (ServletRequest)source(); + out = WebUtils.findParameterValue(in, (String)null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;getCookie;;;Argument[0];ReturnValue;taint" + Cookie out = null; + HttpServletRequest in = (HttpServletRequest)source(); + out = WebUtils.getCookie(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;getNativeRequest;;;Argument[0];ReturnValue;taint" + Object out = null; + ServletRequest in = (ServletRequest)source(); + out = WebUtils.getNativeRequest(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;getNativeResponse;;;Argument[0];ReturnValue;taint" + Object out = null; + ServletResponse in = (ServletResponse)source(); + out = WebUtils.getNativeResponse(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;getParametersStartingWith;;;Argument[0];MapKey of ReturnValue;taint" + Map out = null; + ServletRequest in = (ServletRequest)source(); + out = WebUtils.getParametersStartingWith(in, null); + sink(getMapKey(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;getParametersStartingWith;;;Argument[0];MapValue of ReturnValue;taint" + Map out = null; + ServletRequest in = (ServletRequest)source(); + out = WebUtils.getParametersStartingWith(in, null); + sink(getMapValue(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;getRealPath;;;Argument[0..1];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = WebUtils.getRealPath(null, in); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;getRealPath;;;Argument[0..1];ReturnValue;taint" + String out = null; + ServletContext in = (ServletContext)source(); + out = WebUtils.getRealPath(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;getRequiredSessionAttribute;;;Argument[0];ReturnValue;taint" + Object out = null; + HttpServletRequest in = (HttpServletRequest)source(); + out = WebUtils.getRequiredSessionAttribute(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;getSessionAttribute;;;Argument[0];ReturnValue;taint" + Object out = null; + HttpServletRequest in = (HttpServletRequest)source(); + out = WebUtils.getSessionAttribute(in, null); + sink(out); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;parseMatrixVariables;;;Argument[0];MapKey of ReturnValue;taint" + MultiValueMap out = null; + String in = (String)source(); + out = WebUtils.parseMatrixVariables(in); + sink(getMapKey(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;parseMatrixVariables;;;Argument[0];MapValue of ReturnValue;taint" + MultiValueMap out = null; + String in = (String)source(); + out = WebUtils.parseMatrixVariables(in); + sink(getMapValue(out)); // $hasTaintFlow + } + { + // "org.springframework.web.util;HtmlUtils;false;htmlEscape;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = HtmlUtils.htmlEscape(in, null); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;HtmlUtils;false;htmlEscape;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = HtmlUtils.htmlEscape(in); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;HtmlUtils;false;htmlEscapeDecimal;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = HtmlUtils.htmlEscapeDecimal(in, null); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;HtmlUtils;false;htmlEscapeDecimal;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = HtmlUtils.htmlEscapeDecimal(in); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;HtmlUtils;false;htmlEscapeHex;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = HtmlUtils.htmlEscapeHex(in, null); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;HtmlUtils;false;htmlEscapeHex;;;Argument[0];ReturnValue;taint" + String out = null; + String in = (String)source(); + out = HtmlUtils.htmlEscapeHex(in); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;normalize;;;Argument[-1];ReturnValue;taint" + UriComponents out = null; + UriComponents in = (UriComponents)source(); + out = in.normalize(); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;UriComponents;false;toString;;;Argument[-1];ReturnValue;taint" + String out = null; + UriComponents in = (UriComponents)source(); + out = in.toString(); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;UriTemplate;false;toString;;;Argument[-1];ReturnValue;taint" + String out = null; + UriTemplate in = (UriTemplate)source(); + out = in.toString(); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;getPathWithinApplication;;;Argument[0];ReturnValue;taint" + String out = null; + HttpServletRequest in = (HttpServletRequest)source(); + UrlPathHelper instance = null; + out = instance.getPathWithinApplication(in); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;UrlPathHelper;false;getPathWithinServletMapping;;;Argument[0];ReturnValue;taint" + String out = null; + HttpServletRequest in = (HttpServletRequest)source(); + UrlPathHelper instance = null; + out = instance.getPathWithinServletMapping(in); + sink(out); // $ hasTaintFlow + } + { + // "org.springframework.web.util;WebUtils;false;setSessionAttribute;;;Argument[2];Argument[0];taint" + HttpServletRequest out = null; + Object in = (Object)source(); + WebUtils.setSessionAttribute(out, null, in); + sink(out); // $ hasTaintFlow + } + + } + +} diff --git a/java/ql/test/library-tests/frameworks/spring/webutil/options b/java/ql/test/library-tests/frameworks/spring/webutil/options new file mode 100644 index 00000000000..6dc26155d1d --- /dev/null +++ b/java/ql/test/library-tests/frameworks/spring/webutil/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/springframework-5.3.8:${testdir}/../../../../stubs/javax-servlet-2.5:${testdir}/../../../../stubs/apache-commons-logging-1.2 diff --git a/java/ql/test/library-tests/frameworks/spring/webutil/test.expected b/java/ql/test/library-tests/frameworks/spring/webutil/test.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test/library-tests/frameworks/spring/webutil/test.ql b/java/ql/test/library-tests/frameworks/spring/webutil/test.ql new file mode 100644 index 00000000000..6158159e1e5 --- /dev/null +++ b/java/ql/test/library-tests/frameworks/spring/webutil/test.ql @@ -0,0 +1,52 @@ +import java +import semmle.code.java.dataflow.DataFlow +import semmle.code.java.dataflow.TaintTracking +import TestUtilities.InlineExpectationsTest + +class ValueFlowConf extends DataFlow::Configuration { + ValueFlowConf() { this = "qltest:valueFlowConf" } + + override predicate isSource(DataFlow::Node n) { + n.asExpr().(MethodAccess).getMethod().hasName("source") + } + + override predicate isSink(DataFlow::Node n) { + n.asExpr().(Argument).getCall().getCallee().hasName("sink") + } +} + +class TaintFlowConf extends TaintTracking::Configuration { + TaintFlowConf() { this = "qltest:taintFlowConf" } + + override predicate isSource(DataFlow::Node n) { + n.asExpr().(MethodAccess).getMethod().hasName("source") + } + + override predicate isSink(DataFlow::Node n) { + n.asExpr().(Argument).getCall().getCallee().hasName("sink") + } +} + +class HasFlowTest extends InlineExpectationsTest { + HasFlowTest() { this = "HasFlowTest" } + + override string getARelevantTag() { result = ["hasValueFlow", "hasTaintFlow"] } + + override predicate hasActualResult(Location location, string element, string tag, string value) { + tag = "hasValueFlow" and + exists(DataFlow::Node src, DataFlow::Node sink, ValueFlowConf conf | conf.hasFlow(src, sink) | + sink.getLocation() = location and + element = sink.toString() and + value = "" + ) + or + tag = "hasTaintFlow" and + exists(DataFlow::Node src, DataFlow::Node sink, TaintFlowConf conf | + conf.hasFlow(src, sink) and not any(ValueFlowConf c).hasFlow(src, sink) + | + sink.getLocation() = location and + element = sink.toString() and + value = "" + ) + } +} diff --git a/java/ql/test/library-tests/record-classes/MyFinalRecord.java b/java/ql/test/library-tests/record-classes/MyFinalRecord.java new file mode 100644 index 00000000000..08edac786c9 --- /dev/null +++ b/java/ql/test/library-tests/record-classes/MyFinalRecord.java @@ -0,0 +1 @@ +final record MyFinalRecord() { } diff --git a/java/ql/test/library-tests/record-classes/MyRecord.java b/java/ql/test/library-tests/record-classes/MyRecord.java new file mode 100644 index 00000000000..f3ccd8f3cea --- /dev/null +++ b/java/ql/test/library-tests/record-classes/MyRecord.java @@ -0,0 +1,2 @@ +// Records are implicitly final +record MyRecord() { } diff --git a/java/ql/test/library-tests/record-classes/RecordClasses.expected b/java/ql/test/library-tests/record-classes/RecordClasses.expected new file mode 100644 index 00000000000..d1c49d62066 --- /dev/null +++ b/java/ql/test/library-tests/record-classes/RecordClasses.expected @@ -0,0 +1,6 @@ +| MyFinalRecord.java:1:14:1:26 | MyFinalRecord | final=true | static=false | Record | +| MyRecord.java:2:8:2:15 | MyRecord | final=true | static=false | Record | +| Test.java:3:12:3:13 | R1 | final=true | static=true | Record | +| Test.java:4:25:4:26 | R2 | final=true | static=true | Record | +| Test.java:8:12:8:13 | R3 | final=true | static=true | Record,SuperInterface | +| Test.java:12:16:12:26 | LocalRecord | final=true | static=true | Record | diff --git a/java/ql/test/library-tests/record-classes/RecordClasses.ql b/java/ql/test/library-tests/record-classes/RecordClasses.ql new file mode 100644 index 00000000000..ecc9f5e957c --- /dev/null +++ b/java/ql/test/library-tests/record-classes/RecordClasses.ql @@ -0,0 +1,8 @@ +import java + +from Record r, boolean isFinal, boolean isStatic, string superTypes +where + (if r.isFinal() then isFinal = true else isFinal = false) and + (if r.isStatic() then isStatic = true else isStatic = false) and + superTypes = concat(RefType superType | superType = r.getASupertype() | superType.toString(), ",") +select r, "final=" + isFinal, "static=" + isStatic, superTypes diff --git a/java/ql/test/library-tests/record-classes/Test.java b/java/ql/test/library-tests/record-classes/Test.java new file mode 100644 index 00000000000..bdf3029ce8b --- /dev/null +++ b/java/ql/test/library-tests/record-classes/Test.java @@ -0,0 +1,14 @@ +class Test { + // Nested records are implicitly static + record R1() { } + static final record R2() { } + + interface SuperInterface { } + + record R3() implements SuperInterface { } + + void test() { + // Nested records are implicitly static + record LocalRecord() { } + } +} diff --git a/java/ql/test/library-tests/record-classes/options b/java/ql/test/library-tests/record-classes/options new file mode 100644 index 00000000000..fc57fe025b9 --- /dev/null +++ b/java/ql/test/library-tests/record-classes/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -source 16 -target 16 diff --git a/java/ql/test/qlpack.lock.yml b/java/ql/test/qlpack.lock.yml new file mode 100644 index 00000000000..06dd07fc7dc --- /dev/null +++ b/java/ql/test/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/java/ql/test/qlpack.yml b/java/ql/test/qlpack.yml index 1db4e776c00..b3b242c8d50 100644 --- a/java/ql/test/qlpack.yml +++ b/java/ql/test/qlpack.yml @@ -1,5 +1,7 @@ -name: codeql-java-tests +name: codeql/java-tests version: 0.0.0 -libraryPathDependencies: codeql-java +dependencies: + codeql/java-all: ^0.0.1 + codeql/java-queries: ^0.0.1 extractor: java tests: . diff --git a/java/ql/test/query-tests/security/CWE-079/semmle/tests/SpringXSS.java b/java/ql/test/query-tests/security/CWE-079/semmle/tests/SpringXSS.java index 959125caa4c..744fe853b67 100644 --- a/java/ql/test/query-tests/security/CWE-079/semmle/tests/SpringXSS.java +++ b/java/ql/test/query-tests/security/CWE-079/semmle/tests/SpringXSS.java @@ -5,6 +5,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.util.HtmlUtils; import java.util.Optional; @@ -157,4 +158,9 @@ public class SpringXSS { return userControlled; // $xss } -} \ No newline at end of file + @GetMapping(value = "/abc") + public static String sanitizedString(String userControlled) { + return HtmlUtils.htmlEscape(userControlled); + } + +} diff --git a/java/ql/test/query-tests/security/CWE-502/JoddJsonServlet.java b/java/ql/test/query-tests/security/CWE-502/JoddJsonServlet.java new file mode 100644 index 00000000000..c10bfbc46b9 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-502/JoddJsonServlet.java @@ -0,0 +1,102 @@ +import java.io.IOException; +import java.io.Reader; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import jodd.json.JsonParser; + +import com.example.User; +import com.thirdparty.Person; + +public class JoddJsonServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + // GOOD: class type specified (despite a dangerous configuration) + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String json = req.getParameter("json"); + String clazz = req.getParameter("class"); + + JsonParser parser = new JsonParser(); + parser.setClassMetadataName("class"); + Person person = parser.parse(json, Person.class); + } + + @Override + // BAD: dangerously configured parser with no class restriction passed to `parse`, + // using a few different possible call sequences. + public void doHead(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String json = req.getParameter("json"); + String clazz = req.getParameter("class"); + int callOrder; + try { + callOrder = Integer.parseInt(req.getParameter("callOrder")); + } + catch(NumberFormatException e) { + throw new RuntimeException(e); + } + + JsonParser parser = new JsonParser(); + if(callOrder == 0) { + parser.setClassMetadataName("class"); + User obj = parser.parse(json, null); // $unsafeDeserialization + } else if(callOrder == 1) { + parser.setClassMetadataName("class").parse(json, null); // $unsafeDeserialization + } else if(callOrder == 2) { + parser.setClassMetadataName("class").lazy(true).parse(json, null); // $unsafeDeserialization + } else if(callOrder == 3) { + parser.withClassMetadata(true).lazy(true).parse(json, null); // $unsafeDeserialization + } + } + + @Override + // BAD: allow class name to be controlled by remote source + public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String json = req.getParameter("json"); + String clazz = req.getParameter("class"); + + try { + JsonParser parser = new JsonParser(); + Object obj = parser.parse(json, Class.forName(clazz)); // $unsafeDeserialization + } catch (ClassNotFoundException cne) { + throw new IOException(cne.getMessage()); + } + } + + @Override + // GOOD: dangerously configured parser is ameliorated by setting a list of allowed classes, using various call orders, + // or by explicitly disabling the class metadata option. + public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException { + String json = req.getParameter("json"); + String clazz = req.getParameter("class"); + int callOrder; + try { + callOrder = Integer.parseInt(req.getParameter("callOrder")); + } + catch(NumberFormatException e) { + throw new RuntimeException(e); + } + + JsonParser parser = new JsonParser(); + if(callOrder == 0) { + parser.setClassMetadataName("class"); + parser.allowClass("example.Class"); + User obj = parser.parse(json, null); + } else if(callOrder == 1) { + parser.allowClass("example.Class"); + parser.setClassMetadataName("class"); + User obj = parser.parse(json, null); + } else if(callOrder == 2) { + parser.setClassMetadataName("class").allowClass("example.Class").parse(json, null); + } else if(callOrder == 3) { + parser.allowClass("example.Class").setClassMetadataName("class").parse(json, null); + } else if(callOrder == 4) { + parser.setClassMetadataName("class").withClassMetadata(false).parse(json, null); + } else if(callOrder == 5) { + parser.withClassMetadata(true).setClassMetadataName(null).parse(json, null); + } + } +} \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-502/options b/java/ql/test/query-tests/security/CWE-502/options index e3f830b52fc..79476eded38 100644 --- a/java/ql/test/query-tests/security/CWE-502/options +++ b/java/ql/test/query-tests/security/CWE-502/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/snakeyaml-1.21:${testdir}/../../../stubs/xstream-1.4.10:${testdir}/../../../stubs/kryo-4.0.2:${testdir}/../../../stubs/jsr311-api-1.1.1:${testdir}/../../../stubs/fastjson-1.2.74:${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/servlet-api-2.4:${testdir}/../../../stubs/jyaml-1.3:${testdir}/../../../stubs/json-io-4.10.0:${testdir}/../../../stubs/yamlbeans-1.09:${testdir}/../../../stubs/hessian-4.0.38:${testdir}/../../../stubs/castor-1.4.1:${testdir}/../../../stubs/jackson-databind-2.12:${testdir}/../../../stubs/jackson-core-2.12:${testdir}/../../../stubs/jabsorb-1.3.2:${testdir}/../../../stubs/json-java-20210307 +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/snakeyaml-1.21:${testdir}/../../../stubs/xstream-1.4.10:${testdir}/../../../stubs/kryo-4.0.2:${testdir}/../../../stubs/jsr311-api-1.1.1:${testdir}/../../../stubs/fastjson-1.2.74:${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/servlet-api-2.4:${testdir}/../../../stubs/jyaml-1.3:${testdir}/../../../stubs/json-io-4.10.0:${testdir}/../../../stubs/yamlbeans-1.09:${testdir}/../../../stubs/hessian-4.0.38:${testdir}/../../../stubs/castor-1.4.1:${testdir}/../../../stubs/jackson-databind-2.12:${testdir}/../../../stubs/jackson-core-2.12:${testdir}/../../../stubs/jabsorb-1.3.2:${testdir}/../../../stubs/json-java-20210307:${testdir}/../../../stubs/joddjson-6.0.3 diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ArrayStack.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ArrayStack.java new file mode 100644 index 00000000000..19c2e065588 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ArrayStack.java @@ -0,0 +1,17 @@ +// Generated automatically from org.apache.commons.collections4.ArrayStack for testing purposes + +package org.apache.commons.collections4; + +import java.util.ArrayList; + +public class ArrayStack extends ArrayList +{ + public ArrayStack(){} + public ArrayStack(int p0){} + public E peek(){ return null; } + public E peek(int p0){ return null; } + public E pop(){ return null; } + public E push(E p0){ return null; } + public boolean empty(){ return false; } + public int search(Object p0){ return 0; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Bag.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Bag.java new file mode 100644 index 00000000000..da4f3970959 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Bag.java @@ -0,0 +1,22 @@ +// Generated automatically from org.apache.commons.collections4.Bag for testing purposes + +package org.apache.commons.collections4; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; + +public interface Bag extends Collection +{ + Iterator iterator(); + Set uniqueSet(); + boolean add(E p0); + boolean add(E p0, int p1); + boolean containsAll(Collection p0); + boolean remove(Object p0); + boolean remove(Object p0, int p1); + boolean removeAll(Collection p0); + boolean retainAll(Collection p0); + int getCount(Object p0); + int size(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/BagUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/BagUtils.java new file mode 100644 index 00000000000..054fe450c6e --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/BagUtils.java @@ -0,0 +1,26 @@ +// Generated automatically from org.apache.commons.collections4.BagUtils for testing purposes + +package org.apache.commons.collections4; + +import org.apache.commons.collections4.Bag; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.SortedBag; +import org.apache.commons.collections4.Transformer; + +public class BagUtils +{ + protected BagUtils() {} + public static Bag collectionBag(Bag p0){ return null; } + public static Bag emptyBag(){ return null; } + public static Bag predicatedBag(Bag p0, Predicate p1){ return null; } + public static Bag synchronizedBag(Bag p0){ return null; } + public static Bag transformingBag(Bag p0, Transformer p1){ return null; } + public static Bag unmodifiableBag(Bag p0){ return null; } + public static SortedBag emptySortedBag(){ return null; } + public static SortedBag predicatedSortedBag(SortedBag p0, Predicate p1){ return null; } + public static SortedBag synchronizedSortedBag(SortedBag p0){ return null; } + public static SortedBag transformingSortedBag(SortedBag p0, Transformer p1){ return null; } + public static SortedBag unmodifiableSortedBag(SortedBag p0){ return null; } + public static Bag EMPTY_BAG = null; + public static Bag EMPTY_SORTED_BAG = null; +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/BidiMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/BidiMap.java new file mode 100644 index 00000000000..95e4e806ac4 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/BidiMap.java @@ -0,0 +1,15 @@ +// Generated automatically from org.apache.commons.collections4.BidiMap for testing purposes + +package org.apache.commons.collections4; + +import java.util.Set; +import org.apache.commons.collections4.IterableMap; + +public interface BidiMap extends IterableMap +{ + BidiMap inverseBidiMap(); + K getKey(Object p0); + K removeValue(Object p0); + Set values(); + V put(K p0, V p1); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Closure.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Closure.java new file mode 100644 index 00000000000..d84efcf2870 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Closure.java @@ -0,0 +1,9 @@ +// Generated automatically from org.apache.commons.collections4.Closure for testing purposes + +package org.apache.commons.collections4; + + +public interface Closure +{ + void execute(T p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/CollectionUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/CollectionUtils.java new file mode 100644 index 00000000000..c3d799375a9 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/CollectionUtils.java @@ -0,0 +1,87 @@ +// Generated automatically from org.apache.commons.collections4.CollectionUtils for testing purposes + +package org.apache.commons.collections4; + +import java.util.Collection; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import org.apache.commons.collections4.Closure; +import org.apache.commons.collections4.Equator; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; + +public class CollectionUtils +{ + protected CollectionUtils() {} + public static Collection predicatedCollection(Collection p0, Predicate p1){ return null; } + public static Collection retainAll(Collection p0, Collection p1){ return null; } + public static Collection synchronizedCollection(Collection p0){ return null; } + public static Collection unmodifiableCollection(Collection p0){ return null; } + public static boolean addAll(Collection p0, C... p1){ return false; } + public static boolean addAll(Collection p0, Enumeration p1){ return false; } + public static boolean addAll(Collection p0, Iterable p1){ return false; } + public static boolean addAll(Collection p0, Iterator p1){ return false; } + public static boolean exists(Iterable p0, Predicate p1){ return false; } + public static boolean matchesAll(Iterable p0, Predicate p1){ return false; } + public static int countMatches(Iterable p0, Predicate p1){ return 0; } + public static void transform(Collection p0, Transformer p1){} + public static Collection removeAll(Collection p0, Collection p1){ return null; } + public static Collection removeAll(Iterable p0, Iterable p1, Equator p2){ return null; } + public static Collection retainAll(Iterable p0, Iterable p1, Equator p2){ return null; } + public static Collection transformingCollection(Collection p0, Transformer p1){ return null; } + public static Collection> permutations(Collection p0){ return null; } + public static E extractSingleton(Collection p0){ return null; } + public static boolean isEqualCollection(Collection p0, Collection p1, Equator p2){ return false; } + public static > R collect(Iterable p0, Transformer p1, R p2){ return null; } + public static > R collect(Iterator p0, Transformer p1, R p2){ return null; } + public static Collection collect(Iterable p0, Transformer p1){ return null; } + public static Collection collect(Iterator p0, Transformer p1){ return null; } + public static Map.Entry get(Map p0, int p1){ return null; } + public static > List collate(Iterable p0, Iterable p1){ return null; } + public static > List collate(Iterable p0, Iterable p1, boolean p2){ return null; } + public static > R select(Iterable p0, Predicate p1, R p2){ return null; } + public static > R select(Iterable p0, Predicate p1, R p2, R p3){ return null; } + public static > R selectRejected(Iterable p0, Predicate p1, R p2){ return null; } + public static Collection disjunction(Iterable p0, Iterable p1){ return null; } + public static Collection intersection(Iterable p0, Iterable p1){ return null; } + public static Collection select(Iterable p0, Predicate p1){ return null; } + public static Collection selectRejected(Iterable p0, Predicate p1){ return null; } + public static Collection subtract(Iterable p0, Iterable p1){ return null; } + public static Collection subtract(Iterable p0, Iterable p1, Predicate p2){ return null; } + public static Collection union(Iterable p0, Iterable p1){ return null; } + public static List collate(Iterable p0, Iterable p1, Comparator p2){ return null; } + public static List collate(Iterable p0, Iterable p1, Comparator p2, boolean p3){ return null; } + public static Map getCardinalityMap(Iterable p0){ return null; } + public static int cardinality(O p0, Iterable p1){ return 0; } + public static > C forAllDo(Iterable p0, C p1){ return null; } + public static > C forAllDo(Iterator p0, C p1){ return null; } + public static > T forAllButLastDo(Iterable p0, C p1){ return null; } + public static > T forAllButLastDo(Iterator p0, C p1){ return null; } + public static Collection emptyCollection(){ return null; } + public static Collection emptyIfNull(Collection p0){ return null; } + public static T find(Iterable p0, Predicate p1){ return null; } + public static T get(Iterable p0, int p1){ return null; } + public static T get(Iterator p0, int p1){ return null; } + public static boolean addIgnoreNull(Collection p0, T p1){ return false; } + public static boolean containsAny(Collection p0, T... p1){ return false; } + public static boolean filter(Iterable p0, Predicate p1){ return false; } + public static boolean filterInverse(Iterable p0, Predicate p1){ return false; } + public static Collection EMPTY_COLLECTION = null; + public static Object get(Object p0, int p1){ return null; } + public static boolean containsAll(Collection p0, Collection p1){ return false; } + public static boolean containsAny(Collection p0, Collection p1){ return false; } + public static boolean isEmpty(Collection p0){ return false; } + public static boolean isEqualCollection(Collection p0, Collection p1){ return false; } + public static boolean isFull(Collection p0){ return false; } + public static boolean isNotEmpty(Collection p0){ return false; } + public static boolean isProperSubCollection(Collection p0, Collection p1){ return false; } + public static boolean isSubCollection(Collection p0, Collection p1){ return false; } + public static boolean sizeIsEmpty(Object p0){ return false; } + public static int maxSize(Collection p0){ return 0; } + public static int size(Object p0){ return 0; } + public static void reverseArray(Object[] p0){} + static void checkIndexBounds(int p0){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/EnumerationUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/EnumerationUtils.java new file mode 100644 index 00000000000..5aa0ef01826 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/EnumerationUtils.java @@ -0,0 +1,15 @@ +// Generated automatically from org.apache.commons.collections4.EnumerationUtils for testing purposes + +package org.apache.commons.collections4; + +import java.util.Enumeration; +import java.util.List; +import java.util.StringTokenizer; + +public class EnumerationUtils +{ + protected EnumerationUtils() {} + public static List toList(Enumeration p0){ return null; } + public static T get(Enumeration p0, int p1){ return null; } + public static List toList(StringTokenizer p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Equator.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Equator.java new file mode 100644 index 00000000000..fed02e03367 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Equator.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.commons.collections4.Equator for testing purposes + +package org.apache.commons.collections4; + + +public interface Equator +{ + boolean equate(T p0, T p1); + int hash(T p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/FluentIterable.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/FluentIterable.java new file mode 100644 index 00000000000..4eeed765238 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/FluentIterable.java @@ -0,0 +1,49 @@ +// Generated automatically from org.apache.commons.collections4.FluentIterable for testing purposes + +package org.apache.commons.collections4; + +import java.util.Collection; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import org.apache.commons.collections4.Closure; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; + +public class FluentIterable implements Iterable +{ + FluentIterable(){} + public FluentIterable transform(Transformer p0){ return null; } + public E get(int p0){ return null; } + public E[] toArray(Class p0){ return null; } + public Enumeration asEnumeration(){ return null; } + public FluentIterable append(E... p0){ return null; } + public FluentIterable append(Iterable p0){ return null; } + public FluentIterable collate(Iterable p0){ return null; } + public FluentIterable collate(Iterable p0, Comparator p1){ return null; } + public FluentIterable eval(){ return null; } + public FluentIterable filter(Predicate p0){ return null; } + public FluentIterable limit(long p0){ return null; } + public FluentIterable loop(){ return null; } + public FluentIterable reverse(){ return null; } + public FluentIterable skip(long p0){ return null; } + public FluentIterable unique(){ return null; } + public FluentIterable unmodifiable(){ return null; } + public FluentIterable zip(Iterable p0){ return null; } + public FluentIterable zip(Iterable... p0){ return null; } + public Iterator iterator(){ return null; } + public List toList(){ return null; } + public String toString(){ return null; } + public boolean allMatch(Predicate p0){ return false; } + public boolean anyMatch(Predicate p0){ return false; } + public boolean contains(Object p0){ return false; } + public boolean isEmpty(){ return false; } + public int size(){ return 0; } + public static FluentIterable empty(){ return null; } + public static FluentIterable of(Iterable p0){ return null; } + public static FluentIterable of(T p0){ return null; } + public static FluentIterable of(T... p0){ return null; } + public void copyInto(Collection p0){} + public void forEach(Closure p0){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/IterableUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/IterableUtils.java new file mode 100644 index 00000000000..5df2cb09966 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/IterableUtils.java @@ -0,0 +1,60 @@ +// Generated automatically from org.apache.commons.collections4.IterableUtils for testing purposes + +package org.apache.commons.collections4; + +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import org.apache.commons.collections4.Closure; +import org.apache.commons.collections4.Equator; +import org.apache.commons.collections4.Factory; +import org.apache.commons.collections4.FluentIterable; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; + +public class IterableUtils +{ + public IterableUtils(){} + public static int frequency(Iterable p0, T p1){ return 0; } + public static E find(Iterable p0, Predicate p1){ return null; } + public static E forEachButLast(Iterable p0, Closure p1){ return null; } + public static Iterable boundedIterable(Iterable p0, long p1){ return null; } + public static Iterable chainedIterable(Iterable p0, Iterable p1){ return null; } + public static Iterable chainedIterable(Iterable p0, Iterable p1, Iterable p2){ return null; } + public static Iterable chainedIterable(Iterable p0, Iterable p1, Iterable p2, Iterable p3){ return null; } + public static Iterable chainedIterable(Iterable... p0){ return null; } + public static Iterable collatedIterable(Comparator p0, Iterable p1, Iterable p2){ return null; } + public static Iterable collatedIterable(Iterable p0, Iterable p1){ return null; } + public static Iterable emptyIfNull(Iterable p0){ return null; } + public static Iterable emptyIterable(){ return null; } + public static Iterable filteredIterable(Iterable p0, Predicate p1){ return null; } + public static Iterable loopingIterable(Iterable p0){ return null; } + public static Iterable reversedIterable(Iterable p0){ return null; } + public static Iterable skippingIterable(Iterable p0, long p1){ return null; } + public static Iterable uniqueIterable(Iterable p0){ return null; } + public static Iterable unmodifiableIterable(Iterable p0){ return null; } + public static Iterable zippingIterable(Iterable p0, Iterable p1){ return null; } + public static Iterable zippingIterable(Iterable p0, Iterable... p1){ return null; } + public static List toList(Iterable p0){ return null; } + public static String toString(Iterable p0){ return null; } + public static String toString(Iterable p0, Transformer p1){ return null; } + public static String toString(Iterable p0, Transformer p1, String p2, String p3, String p4){ return null; } + public static boolean contains(Iterable p0, E p1, Equator p2){ return false; } + public static boolean contains(Iterable p0, Object p1){ return false; } + public static boolean matchesAll(Iterable p0, Predicate p1){ return false; } + public static boolean matchesAny(Iterable p0, Predicate p1){ return false; } + public static int indexOf(Iterable p0, Predicate p1){ return 0; } + public static long countMatches(Iterable p0, Predicate p1){ return 0; } + public static void forEach(Iterable p0, Closure p1){} + public static Iterable transformedIterable(Iterable p0, Transformer p1){ return null; } + public static > List partition(Iterable p0, Factory p1, Predicate... p2){ return null; } + public static List> partition(Iterable p0, Predicate p1){ return null; } + public static List> partition(Iterable p0, Predicate... p1){ return null; } + public static T first(Iterable p0){ return null; } + public static T get(Iterable p0, int p1){ return null; } + public static boolean isEmpty(Iterable p0){ return false; } + public static int size(Iterable p0){ return 0; } + static FluentIterable EMPTY_ITERABLE = null; + static void checkNotNull(Iterable p0){} + static void checkNotNull(Iterable... p0){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/IteratorUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/IteratorUtils.java new file mode 100644 index 00000000000..35798256866 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/IteratorUtils.java @@ -0,0 +1,103 @@ +// Generated automatically from org.apache.commons.collections4.IteratorUtils for testing purposes + +package org.apache.commons.collections4; + +import java.util.Collection; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import org.apache.commons.collections4.Closure; +import org.apache.commons.collections4.MapIterator; +import org.apache.commons.collections4.OrderedIterator; +import org.apache.commons.collections4.OrderedMapIterator; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.ResettableIterator; +import org.apache.commons.collections4.ResettableListIterator; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.iterators.BoundedIterator; +import org.apache.commons.collections4.iterators.NodeListIterator; +import org.apache.commons.collections4.iterators.SkippingIterator; +import org.apache.commons.collections4.iterators.ZippingIterator; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class IteratorUtils +{ + protected IteratorUtils() {} + public static BoundedIterator boundedIterator(Iterator p0, long p1){ return null; } + public static BoundedIterator boundedIterator(Iterator p0, long p1, long p2){ return null; } + public static E find(Iterator p0, Predicate p1){ return null; } + public static E first(Iterator p0){ return null; } + public static E forEachButLast(Iterator p0, Closure p1){ return null; } + public static E get(Iterator p0, int p1){ return null; } + public static E[] toArray(Iterator p0, Class p1){ return null; } + public static Enumeration asEnumeration(Iterator p0){ return null; } + public static Iterable asIterable(Iterator p0){ return null; } + public static Iterable asMultipleUseIterable(Iterator p0){ return null; } + public static Iterator asIterator(Enumeration p0){ return null; } + public static Iterator asIterator(Enumeration p0, Collection p1){ return null; } + public static Iterator chainedIterator(Collection> p0){ return null; } + public static Iterator chainedIterator(Iterator p0, Iterator p1){ return null; } + public static Iterator chainedIterator(Iterator... p0){ return null; } + public static Iterator collatedIterator(Comparator p0, Collection> p1){ return null; } + public static Iterator collatedIterator(Comparator p0, Iterator p1, Iterator p2){ return null; } + public static Iterator collatedIterator(Comparator p0, Iterator... p1){ return null; } + public static Iterator filteredIterator(Iterator p0, Predicate p1){ return null; } + public static Iterator objectGraphIterator(E p0, Transformer p1){ return null; } + public static Iterator peekingIterator(Iterator p0){ return null; } + public static Iterator pushbackIterator(Iterator p0){ return null; } + public static Iterator unmodifiableIterator(Iterator p0){ return null; } + public static List toList(Iterator p0){ return null; } + public static List toList(Iterator p0, int p1){ return null; } + public static ListIterator filteredListIterator(ListIterator p0, Predicate p1){ return null; } + public static ListIterator singletonListIterator(E p0){ return null; } + public static ListIterator toListIterator(Iterator p0){ return null; } + public static ListIterator unmodifiableListIterator(ListIterator p0){ return null; } + public static OrderedIterator emptyOrderedIterator(){ return null; } + public static ResettableIterator arrayIterator(E... p0){ return null; } + public static ResettableIterator arrayIterator(E[] p0, int p1){ return null; } + public static ResettableIterator arrayIterator(E[] p0, int p1, int p2){ return null; } + public static ResettableIterator arrayIterator(Object p0){ return null; } + public static ResettableIterator arrayIterator(Object p0, int p1){ return null; } + public static ResettableIterator arrayIterator(Object p0, int p1, int p2){ return null; } + public static ResettableIterator emptyIterator(){ return null; } + public static ResettableIterator loopingIterator(Collection p0){ return null; } + public static ResettableIterator singletonIterator(E p0){ return null; } + public static ResettableListIterator arrayListIterator(E... p0){ return null; } + public static ResettableListIterator arrayListIterator(E[] p0, int p1){ return null; } + public static ResettableListIterator arrayListIterator(E[] p0, int p1, int p2){ return null; } + public static ResettableListIterator arrayListIterator(Object p0){ return null; } + public static ResettableListIterator arrayListIterator(Object p0, int p1){ return null; } + public static ResettableListIterator arrayListIterator(Object p0, int p1, int p2){ return null; } + public static ResettableListIterator emptyListIterator(){ return null; } + public static ResettableListIterator loopingListIterator(List p0){ return null; } + public static SkippingIterator skippingIterator(Iterator p0, long p1){ return null; } + public static String toString(Iterator p0){ return null; } + public static String toString(Iterator p0, Transformer p1){ return null; } + public static String toString(Iterator p0, Transformer p1, String p2, String p3, String p4){ return null; } + public static ZippingIterator zippingIterator(Iterator p0, Iterator p1){ return null; } + public static ZippingIterator zippingIterator(Iterator p0, Iterator p1, Iterator p2){ return null; } + public static ZippingIterator zippingIterator(Iterator... p0){ return null; } + public static boolean contains(Iterator p0, Object p1){ return false; } + public static boolean matchesAll(Iterator p0, Predicate p1){ return false; } + public static boolean matchesAny(Iterator p0, Predicate p1){ return false; } + public static int indexOf(Iterator p0, Predicate p1){ return 0; } + public static void forEach(Iterator p0, Closure p1){} + public static Iterator transformedIterator(Iterator p0, Transformer p1){ return null; } + public static MapIterator emptyMapIterator(){ return null; } + public static MapIterator unmodifiableMapIterator(MapIterator p0){ return null; } + public static OrderedMapIterator emptyOrderedMapIterator(){ return null; } + public static Iterator getIterator(Object p0){ return null; } + public static MapIterator EMPTY_MAP_ITERATOR = null; + public static NodeListIterator nodeListIterator(Node p0){ return null; } + public static NodeListIterator nodeListIterator(NodeList p0){ return null; } + public static Object[] toArray(Iterator p0){ return null; } + public static OrderedIterator EMPTY_ORDERED_ITERATOR = null; + public static OrderedMapIterator EMPTY_ORDERED_MAP_ITERATOR = null; + public static ResettableIterator EMPTY_ITERATOR = null; + public static ResettableListIterator EMPTY_LIST_ITERATOR = null; + public static boolean isEmpty(Iterator p0){ return false; } + public static int size(Iterator p0){ return 0; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ListUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ListUtils.java new file mode 100644 index 00000000000..66aa4a6567f --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ListUtils.java @@ -0,0 +1,39 @@ +// Generated automatically from org.apache.commons.collections4.ListUtils for testing purposes + +package org.apache.commons.collections4; + +import java.util.Collection; +import java.util.List; +import org.apache.commons.collections4.Equator; +import org.apache.commons.collections4.Factory; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; + +public class ListUtils +{ + protected ListUtils() {} + public static List fixedSizeList(List p0){ return null; } + public static List intersection(List p0, List p1){ return null; } + public static List lazyList(List p0, Factory p1){ return null; } + public static List lazyList(List p0, Transformer p1){ return null; } + public static List longestCommonSubsequence(List p0, List p1){ return null; } + public static List longestCommonSubsequence(List p0, List p1, Equator p2){ return null; } + public static List predicatedList(List p0, Predicate p1){ return null; } + public static List removeAll(Collection p0, Collection p1){ return null; } + public static List retainAll(Collection p0, Collection p1){ return null; } + public static List select(Collection p0, Predicate p1){ return null; } + public static List selectRejected(Collection p0, Predicate p1){ return null; } + public static List subtract(List p0, List p1){ return null; } + public static List sum(List p0, List p1){ return null; } + public static List synchronizedList(List p0){ return null; } + public static List transformedList(List p0, Transformer p1){ return null; } + public static List union(List p0, List p1){ return null; } + public static List unmodifiableList(List p0){ return null; } + public static int indexOf(List p0, Predicate p1){ return 0; } + public static List> partition(List p0, int p1){ return null; } + public static List defaultIfNull(List p0, List p1){ return null; } + public static List emptyIfNull(List p0){ return null; } + public static String longestCommonSubsequence(CharSequence p0, CharSequence p1){ return null; } + public static boolean isEqualList(Collection p0, Collection p1){ return false; } + public static int hashCodeForList(Collection p0){ return 0; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ListValuedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ListValuedMap.java new file mode 100644 index 00000000000..55db7cd09e1 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ListValuedMap.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.commons.collections4.ListValuedMap for testing purposes + +package org.apache.commons.collections4; + +import java.util.List; +import org.apache.commons.collections4.MultiValuedMap; + +public interface ListValuedMap extends MultiValuedMap +{ + List get(K p0); + List remove(Object p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MapUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MapUtils.java index 1ec008c0caa..7d31108b681 100644 --- a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MapUtils.java +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MapUtils.java @@ -20,76 +20,76 @@ import org.apache.commons.collections4.map.MultiValueMap; public class MapUtils { protected MapUtils() {} - public static MultiValueMap multiValueMap(Map p0, Class p1){ return null; } - public static MultiValueMap multiValueMap(Map p0, Factory p1){ return null; } - public static void populateMap(Map p0, Iterable p1, Transformer p2, Transformer p3){} - public static void populateMap(MultiMap p0, Iterable p1, Transformer p2, Transformer p3){} - public static IterableMap fixedSizeMap(Map p0){ return null; } - public static IterableMap iterableMap(Map p0){ return null; } - public static IterableMap lazyMap(Map p0, Factory p1){ return null; } - public static IterableMap lazyMap(Map p0, Transformer p1){ return null; } - public static IterableMap predicatedMap(Map p0, Predicate p1, Predicate p2){ return null; } - public static IterableMap transformedMap(Map p0, Transformer p1, Transformer p2){ return null; } - public static IterableSortedMap iterableSortedMap(SortedMap p0){ return null; } - public static Map emptyIfNull(Map p0){ return null; } - public static Map putAll(Map p0, Object[] p1){ return null; } - public static Map synchronizedMap(Map p0){ return null; } - public static Map unmodifiableMap(Map p0){ return null; } - public static Map invertMap(Map p0){ return null; } - public static MultiValueMap multiValueMap(Map> p0){ return null; } - public static OrderedMap orderedMap(Map p0){ return null; } - public static Properties toProperties(Map p0){ return null; } - public static SortedMap fixedSizeSortedMap(SortedMap p0){ return null; } - public static SortedMap lazySortedMap(SortedMap p0, Factory p1){ return null; } - public static SortedMap lazySortedMap(SortedMap p0, Transformer p1){ return null; } - public static SortedMap predicatedSortedMap(SortedMap p0, Predicate p1, Predicate p2){ return null; } - public static SortedMap synchronizedSortedMap(SortedMap p0){ return null; } - public static SortedMap transformedSortedMap(SortedMap p0, Transformer p1, Transformer p2){ return null; } - public static SortedMap unmodifiableSortedMap(SortedMap p0){ return null; } - public static V getObject(Map p0, K p1){ return null; } - public static V getObject(Map p0, K p1, V p2){ return null; } - public static void populateMap(Map p0, Iterable p1, Transformer p2){} - public static void populateMap(MultiMap p0, Iterable p1, Transformer p2){} - public static Boolean getBoolean(Map p0, K p1){ return null; } - public static Boolean getBoolean(Map p0, K p1, Boolean p2){ return null; } - public static Byte getByte(Map p0, K p1){ return null; } - public static Byte getByte(Map p0, K p1, Byte p2){ return null; } - public static Double getDouble(Map p0, K p1){ return null; } - public static Double getDouble(Map p0, K p1, Double p2){ return null; } - public static Float getFloat(Map p0, K p1){ return null; } - public static Float getFloat(Map p0, K p1, Float p2){ return null; } - public static Integer getInteger(Map p0, K p1){ return null; } - public static Integer getInteger(Map p0, K p1, Integer p2){ return null; } - public static Long getLong(Map p0, K p1){ return null; } - public static Long getLong(Map p0, K p1, Long p2){ return null; } - public static Map getMap(Map p0, K p1){ return null; } - public static Map getMap(Map p0, K p1, Map p2){ return null; } - public static Number getNumber(Map p0, K p1){ return null; } - public static Number getNumber(Map p0, K p1, Number p2){ return null; } - public static Short getShort(Map p0, K p1){ return null; } - public static Short getShort(Map p0, K p1, Short p2){ return null; } - public static String getString(Map p0, K p1){ return null; } - public static String getString(Map p0, K p1, String p2){ return null; } - public static boolean getBooleanValue(Map p0, K p1){ return false; } - public static boolean getBooleanValue(Map p0, K p1, boolean p2){ return false; } - public static byte getByteValue(Map p0, K p1){ return 0; } - public static byte getByteValue(Map p0, K p1, byte p2){ return 0; } - public static double getDoubleValue(Map p0, K p1){ return 0; } - public static double getDoubleValue(Map p0, K p1, double p2){ return 0; } - public static float getFloatValue(Map p0, K p1){ return 0; } - public static float getFloatValue(Map p0, K p1, float p2){ return 0; } - public static int getIntValue(Map p0, K p1){ return 0; } - public static int getIntValue(Map p0, K p1, int p2){ return 0; } - public static long getLongValue(Map p0, K p1){ return 0; } - public static long getLongValue(Map p0, K p1, long p2){ return 0; } - public static short getShortValue(Map p0, K p1){ return 0; } - public static short getShortValue(Map p0, K p1, short p2){ return 0; } - public static void safeAddToMap(Map p0, K p1, Object p2){} + public static > MultiValueMap multiValueMap(Map p0, Class p1){ return null; } + public static > MultiValueMap multiValueMap(Map p0, Factory p1){ return null; } + public static void populateMap(Map p0, Iterable p1, Transformer p2, Transformer p3){} + public static void populateMap(MultiMap p0, Iterable p1, Transformer p2, Transformer p3){} + public static IterableMap fixedSizeMap(Map p0){ return null; } + public static IterableMap iterableMap(Map p0){ return null; } + public static IterableMap lazyMap(Map p0, Factory p1){ return null; } + public static IterableMap lazyMap(Map p0, Transformer p1){ return null; } + public static IterableMap predicatedMap(Map p0, Predicate p1, Predicate p2){ return null; } + public static IterableMap transformedMap(Map p0, Transformer p1, Transformer p2){ return null; } + public static IterableSortedMap iterableSortedMap(SortedMap p0){ return null; } + public static Map emptyIfNull(Map p0){ return null; } + public static Map putAll(Map p0, Object[] p1){ return null; } + public static Map synchronizedMap(Map p0){ return null; } + public static Map unmodifiableMap(Map p0){ return null; } + public static Map invertMap(Map p0){ return null; } + public static MultiValueMap multiValueMap(Map> p0){ return null; } + public static OrderedMap orderedMap(Map p0){ return null; } + public static Properties toProperties(Map p0){ return null; } + public static SortedMap fixedSizeSortedMap(SortedMap p0){ return null; } + public static SortedMap lazySortedMap(SortedMap p0, Factory p1){ return null; } + public static SortedMap lazySortedMap(SortedMap p0, Transformer p1){ return null; } + public static SortedMap predicatedSortedMap(SortedMap p0, Predicate p1, Predicate p2){ return null; } + public static SortedMap synchronizedSortedMap(SortedMap p0){ return null; } + public static SortedMap transformedSortedMap(SortedMap p0, Transformer p1, Transformer p2){ return null; } + public static SortedMap unmodifiableSortedMap(SortedMap p0){ return null; } + public static V getObject(Map p0, K p1){ return null; } + public static V getObject(Map p0, K p1, V p2){ return null; } + public static void populateMap(Map p0, Iterable p1, Transformer p2){} + public static void populateMap(MultiMap p0, Iterable p1, Transformer p2){} + public static Boolean getBoolean(Map p0, K p1){ return null; } + public static Boolean getBoolean(Map p0, K p1, Boolean p2){ return null; } + public static Byte getByte(Map p0, K p1){ return null; } + public static Byte getByte(Map p0, K p1, Byte p2){ return null; } + public static Double getDouble(Map p0, K p1){ return null; } + public static Double getDouble(Map p0, K p1, Double p2){ return null; } + public static Float getFloat(Map p0, K p1){ return null; } + public static Float getFloat(Map p0, K p1, Float p2){ return null; } + public static Integer getInteger(Map p0, K p1){ return null; } + public static Integer getInteger(Map p0, K p1, Integer p2){ return null; } + public static Long getLong(Map p0, K p1){ return null; } + public static Long getLong(Map p0, K p1, Long p2){ return null; } + public static Map getMap(Map p0, K p1){ return null; } + public static Map getMap(Map p0, K p1, Map p2){ return null; } + public static Number getNumber(Map p0, K p1){ return null; } + public static Number getNumber(Map p0, K p1, Number p2){ return null; } + public static Short getShort(Map p0, K p1){ return null; } + public static Short getShort(Map p0, K p1, Short p2){ return null; } + public static String getString(Map p0, K p1){ return null; } + public static String getString(Map p0, K p1, String p2){ return null; } + public static boolean getBooleanValue(Map p0, K p1){ return false; } + public static boolean getBooleanValue(Map p0, K p1, boolean p2){ return false; } + public static byte getByteValue(Map p0, K p1){ return 0; } + public static byte getByteValue(Map p0, K p1, byte p2){ return 0; } + public static double getDoubleValue(Map p0, K p1){ return 0; } + public static double getDoubleValue(Map p0, K p1, double p2){ return 0; } + public static float getFloatValue(Map p0, K p1){ return 0; } + public static float getFloatValue(Map p0, K p1, float p2){ return 0; } + public static int getIntValue(Map p0, K p1){ return 0; } + public static int getIntValue(Map p0, K p1, int p2){ return 0; } + public static long getLongValue(Map p0, K p1){ return 0; } + public static long getLongValue(Map p0, K p1, long p2){ return 0; } + public static short getShortValue(Map p0, K p1){ return 0; } + public static short getShortValue(Map p0, K p1, short p2){ return 0; } + public static void safeAddToMap(Map p0, K p1, Object p2){} public static Map toMap(ResourceBundle p0){ return null; } public static SortedMap EMPTY_SORTED_MAP = null; - public static boolean isEmpty(Map p0){ return false; } - public static boolean isNotEmpty(Map p0){ return false; } - public static int size(Map p0){ return 0; } - public static void debugPrint(PrintStream p0, Object p1, Map p2){} - public static void verbosePrint(PrintStream p0, Object p1, Map p2){} + public static boolean isEmpty(Map p0){ return false; } + public static boolean isNotEmpty(Map p0){ return false; } + public static int size(Map p0){ return 0; } + public static void debugPrint(PrintStream p0, Object p1, Map p2){} + public static void verbosePrint(PrintStream p0, Object p1, Map p2){} } diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiMapUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiMapUtils.java new file mode 100644 index 00000000000..4b1c20bbd72 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiMapUtils.java @@ -0,0 +1,29 @@ +// Generated automatically from org.apache.commons.collections4.MultiMapUtils for testing purposes + +package org.apache.commons.collections4; + +import java.util.Collection; +import java.util.List; +import java.util.Set; +import org.apache.commons.collections4.Bag; +import org.apache.commons.collections4.ListValuedMap; +import org.apache.commons.collections4.MultiValuedMap; +import org.apache.commons.collections4.SetValuedMap; +import org.apache.commons.collections4.Transformer; + +public class MultiMapUtils +{ + protected MultiMapUtils() {} + public static Bag getValuesAsBag(MultiValuedMap p0, K p1){ return null; } + public static Collection getCollection(MultiValuedMap p0, K p1){ return null; } + public static List getValuesAsList(MultiValuedMap p0, K p1){ return null; } + public static ListValuedMap newListValuedHashMap(){ return null; } + public static MultiValuedMap emptyIfNull(MultiValuedMap p0){ return null; } + public static MultiValuedMap emptyMultiValuedMap(){ return null; } + public static MultiValuedMap transformedMultiValuedMap(MultiValuedMap p0, Transformer p1, Transformer p2){ return null; } + public static MultiValuedMap unmodifiableMultiValuedMap(MultiValuedMap p0){ return null; } + public static Set getValuesAsSet(MultiValuedMap p0, K p1){ return null; } + public static SetValuedMap newSetValuedHashMap(){ return null; } + public static MultiValuedMap EMPTY_MULTI_VALUED_MAP = null; + public static boolean isEmpty(MultiValuedMap p0){ return false; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiSet.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiSet.java new file mode 100644 index 00000000000..fc5adc644f3 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiSet.java @@ -0,0 +1,33 @@ +// Generated automatically from org.apache.commons.collections4.MultiSet for testing purposes + +package org.apache.commons.collections4; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; + +public interface MultiSet extends Collection +{ + Iterator iterator(); + Set uniqueSet(); + Set> entrySet(); + boolean add(E p0); + boolean containsAll(Collection p0); + boolean equals(Object p0); + boolean remove(Object p0); + boolean removeAll(Collection p0); + boolean retainAll(Collection p0); + int add(E p0, int p1); + int getCount(Object p0); + int hashCode(); + int remove(Object p0, int p1); + int setCount(E p0, int p1); + int size(); + static public interface Entry + { + E getElement(); + boolean equals(Object p0); + int getCount(); + int hashCode(); + } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiSetUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiSetUtils.java new file mode 100644 index 00000000000..2e996f92065 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiSetUtils.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.commons.collections4.MultiSetUtils for testing purposes + +package org.apache.commons.collections4; + +import org.apache.commons.collections4.MultiSet; +import org.apache.commons.collections4.Predicate; + +public class MultiSetUtils +{ + protected MultiSetUtils() {} + public static MultiSet emptyMultiSet(){ return null; } + public static MultiSet predicatedMultiSet(MultiSet p0, Predicate p1){ return null; } + public static MultiSet synchronizedMultiSet(MultiSet p0){ return null; } + public static MultiSet unmodifiableMultiSet(MultiSet p0){ return null; } + public static MultiSet EMPTY_MULTISET = null; +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiValuedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiValuedMap.java new file mode 100644 index 00000000000..a247d8a4258 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/MultiValuedMap.java @@ -0,0 +1,32 @@ +// Generated automatically from org.apache.commons.collections4.MultiValuedMap for testing purposes + +package org.apache.commons.collections4; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import org.apache.commons.collections4.MapIterator; +import org.apache.commons.collections4.MultiSet; + +public interface MultiValuedMap +{ + Collection> entries(); + Collection get(K p0); + Collection remove(Object p0); + Collection values(); + Map> asMap(); + MapIterator mapIterator(); + MultiSet keys(); + Set keySet(); + boolean containsKey(Object p0); + boolean containsMapping(Object p0, Object p1); + boolean containsValue(Object p0); + boolean isEmpty(); + boolean put(K p0, V p1); + boolean putAll(K p0, Iterable p1); + boolean putAll(Map p0); + boolean putAll(MultiValuedMap p0); + boolean removeMapping(Object p0, Object p1); + int size(); + void clear(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/OrderedBidiMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/OrderedBidiMap.java new file mode 100644 index 00000000000..953c13ed8f0 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/OrderedBidiMap.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.commons.collections4.OrderedBidiMap for testing purposes + +package org.apache.commons.collections4; + +import org.apache.commons.collections4.BidiMap; +import org.apache.commons.collections4.OrderedMap; + +public interface OrderedBidiMap extends BidiMap, OrderedMap +{ + OrderedBidiMap inverseBidiMap(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/QueueUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/QueueUtils.java new file mode 100644 index 00000000000..21cdad6cb09 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/QueueUtils.java @@ -0,0 +1,18 @@ +// Generated automatically from org.apache.commons.collections4.QueueUtils for testing purposes + +package org.apache.commons.collections4; + +import java.util.Queue; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; + +public class QueueUtils +{ + protected QueueUtils() {} + public static Queue emptyQueue(){ return null; } + public static Queue predicatedQueue(Queue p0, Predicate p1){ return null; } + public static Queue synchronizedQueue(Queue p0){ return null; } + public static Queue transformingQueue(Queue p0, Transformer p1){ return null; } + public static Queue unmodifiableQueue(Queue p0){ return null; } + public static Queue EMPTY_QUEUE = null; +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ResettableIterator.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ResettableIterator.java new file mode 100644 index 00000000000..6d46db71e0b --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ResettableIterator.java @@ -0,0 +1,10 @@ +// Generated automatically from org.apache.commons.collections4.ResettableIterator for testing purposes + +package org.apache.commons.collections4; + +import java.util.Iterator; + +public interface ResettableIterator extends Iterator +{ + void reset(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ResettableListIterator.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ResettableListIterator.java new file mode 100644 index 00000000000..98ea868abde --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/ResettableListIterator.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.commons.collections4.ResettableListIterator for testing purposes + +package org.apache.commons.collections4; + +import java.util.ListIterator; +import org.apache.commons.collections4.OrderedIterator; +import org.apache.commons.collections4.ResettableIterator; + +public interface ResettableListIterator extends ListIterator, OrderedIterator, ResettableIterator +{ +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SetUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SetUtils.java new file mode 100644 index 00000000000..9e32be9547a --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SetUtils.java @@ -0,0 +1,52 @@ +// Generated automatically from org.apache.commons.collections4.SetUtils for testing purposes + +package org.apache.commons.collections4; + +import java.util.AbstractSet; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.NavigableSet; +import java.util.Set; +import java.util.SortedSet; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; + +public class SetUtils +{ + protected SetUtils() {} + abstract static public class SetView extends AbstractSet + { + protected abstract Iterator createIterator(); + public > void copyInto(S p0){} + public Iterator iterator(){ return null; } + public Set toSet(){ return null; } + public SetView(){} + public int size(){ return 0; } + } + public static HashSet hashSet(E... p0){ return null; } + public static Set emptySet(){ return null; } + public static Set newIdentityHashSet(){ return null; } + public static Set orderedSet(Set p0){ return null; } + public static Set predicatedSet(Set p0, Predicate p1){ return null; } + public static Set synchronizedSet(Set p0){ return null; } + public static Set transformedSet(Set p0, Transformer p1){ return null; } + public static Set unmodifiableSet(E... p0){ return null; } + public static Set unmodifiableSet(Set p0){ return null; } + public static SetUtils.SetView difference(Set p0, Set p1){ return null; } + public static SetUtils.SetView disjunction(Set p0, Set p1){ return null; } + public static SetUtils.SetView intersection(Set p0, Set p1){ return null; } + public static SetUtils.SetView union(Set p0, Set p1){ return null; } + public static SortedSet emptySortedSet(){ return null; } + public static SortedSet predicatedNavigableSet(NavigableSet p0, Predicate p1){ return null; } + public static SortedSet predicatedSortedSet(SortedSet p0, Predicate p1){ return null; } + public static SortedSet synchronizedSortedSet(SortedSet p0){ return null; } + public static SortedSet transformedNavigableSet(NavigableSet p0, Transformer p1){ return null; } + public static SortedSet transformedSortedSet(SortedSet p0, Transformer p1){ return null; } + public static SortedSet unmodifiableNavigableSet(NavigableSet p0){ return null; } + public static SortedSet unmodifiableSortedSet(SortedSet p0){ return null; } + public static Set emptyIfNull(Set p0){ return null; } + public static int hashCodeForSet(Collection p0){ return 0; } + public static SortedSet EMPTY_SORTED_SET = null; + public static boolean isEqualSet(Collection p0, Collection p1){ return false; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SetValuedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SetValuedMap.java new file mode 100644 index 00000000000..e46c86afc16 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SetValuedMap.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.commons.collections4.SetValuedMap for testing purposes + +package org.apache.commons.collections4; + +import java.util.Set; +import org.apache.commons.collections4.MultiValuedMap; + +public interface SetValuedMap extends MultiValuedMap +{ + Set get(K p0); + Set remove(Object p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SortedBag.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SortedBag.java new file mode 100644 index 00000000000..5d8ee43a7e9 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SortedBag.java @@ -0,0 +1,13 @@ +// Generated automatically from org.apache.commons.collections4.SortedBag for testing purposes + +package org.apache.commons.collections4; + +import java.util.Comparator; +import org.apache.commons.collections4.Bag; + +public interface SortedBag extends Bag +{ + Comparator comparator(); + E first(); + E last(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SplitMapUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SplitMapUtils.java new file mode 100644 index 00000000000..4274ec4e950 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/SplitMapUtils.java @@ -0,0 +1,15 @@ +// Generated automatically from org.apache.commons.collections4.SplitMapUtils for testing purposes + +package org.apache.commons.collections4; + +import java.util.Map; +import org.apache.commons.collections4.Get; +import org.apache.commons.collections4.IterableMap; +import org.apache.commons.collections4.Put; + +public class SplitMapUtils +{ + protected SplitMapUtils() {} + public static IterableMap readableMap(Get p0){ return null; } + public static Map writableMap(Put p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Trie.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Trie.java new file mode 100644 index 00000000000..cfd130d054f --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/Trie.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.commons.collections4.Trie for testing purposes + +package org.apache.commons.collections4; + +import java.util.SortedMap; +import org.apache.commons.collections4.IterableSortedMap; + +public interface Trie extends IterableSortedMap +{ + SortedMap prefixMap(K p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/TrieUtils.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/TrieUtils.java new file mode 100644 index 00000000000..ee8cfe40a85 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/TrieUtils.java @@ -0,0 +1,11 @@ +// Generated automatically from org.apache.commons.collections4.TrieUtils for testing purposes + +package org.apache.commons.collections4; + +import org.apache.commons.collections4.Trie; + +public class TrieUtils +{ + protected TrieUtils() {} + public static Trie unmodifiableTrie(Trie p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/bag/AbstractMapBag.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/bag/AbstractMapBag.java new file mode 100644 index 00000000000..78374820036 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/bag/AbstractMapBag.java @@ -0,0 +1,50 @@ +// Generated automatically from org.apache.commons.collections4.bag.AbstractMapBag for testing purposes + +package org.apache.commons.collections4.bag; + +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import org.apache.commons.collections4.Bag; + +abstract public class AbstractMapBag implements Bag +{ + boolean containsAll(Bag p0){ return false; } + boolean retainAll(Bag p0){ return false; } + protected AbstractMapBag(){} + protected AbstractMapBag(Map p0){} + protected Map getMap(){ return null; } + protected void doReadObject(Map p0, ObjectInputStream p1){} + protected void doWriteObject(ObjectOutputStream p0){} + public T[] toArray(T[] p0){ return null; } + public Iterator iterator(){ return null; } + public Object[] toArray(){ return null; } + public Set uniqueSet(){ return null; } + public String toString(){ return null; } + public boolean add(E p0){ return false; } + public boolean add(E p0, int p1){ return false; } + public boolean addAll(Collection p0){ return false; } + public boolean contains(Object p0){ return false; } + public boolean containsAll(Collection p0){ return false; } + public boolean equals(Object p0){ return false; } + public boolean isEmpty(){ return false; } + public boolean remove(Object p0){ return false; } + public boolean remove(Object p0, int p1){ return false; } + public boolean removeAll(Collection p0){ return false; } + public boolean retainAll(Collection p0){ return false; } + public int getCount(Object p0){ return 0; } + public int hashCode(){ return 0; } + public int size(){ return 0; } + public void clear(){} + static class MutableInteger + { + protected MutableInteger() {} + MutableInteger(int p0){} + protected int value = 0; + public boolean equals(Object p0){ return false; } + public int hashCode(){ return 0; } + } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/bag/TreeBag.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/bag/TreeBag.java new file mode 100644 index 00000000000..3dbe40b6776 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/bag/TreeBag.java @@ -0,0 +1,22 @@ +// Generated automatically from org.apache.commons.collections4.bag.TreeBag for testing purposes + +package org.apache.commons.collections4.bag; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Comparator; +import java.util.SortedMap; +import org.apache.commons.collections4.SortedBag; +import org.apache.commons.collections4.bag.AbstractMapBag; + +public class TreeBag extends AbstractMapBag implements Serializable, SortedBag +{ + protected SortedMap getMap(){ return null; } + public Comparator comparator(){ return null; } + public E first(){ return null; } + public E last(){ return null; } + public TreeBag(){} + public TreeBag(Collection p0){} + public TreeBag(Comparator p0){} + public boolean add(E p0){ return false; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/bidimap/TreeBidiMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/bidimap/TreeBidiMap.java new file mode 100644 index 00000000000..3850478cef0 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/bidimap/TreeBidiMap.java @@ -0,0 +1,38 @@ +// Generated automatically from org.apache.commons.collections4.bidimap.TreeBidiMap for testing purposes + +package org.apache.commons.collections4.bidimap; + +import java.io.Serializable; +import java.util.Map; +import java.util.Set; +import org.apache.commons.collections4.OrderedBidiMap; +import org.apache.commons.collections4.OrderedMapIterator; + +public class TreeBidiMap, V extends Comparable> implements OrderedBidiMap, Serializable +{ + public K firstKey(){ return null; } + public K getKey(Object p0){ return null; } + public K lastKey(){ return null; } + public K nextKey(K p0){ return null; } + public K previousKey(K p0){ return null; } + public K removeValue(Object p0){ return null; } + public OrderedBidiMap inverseBidiMap(){ return null; } + public OrderedMapIterator mapIterator(){ return null; } + public Set keySet(){ return null; } + public Set> entrySet(){ return null; } + public Set values(){ return null; } + public String toString(){ return null; } + public TreeBidiMap(){} + public TreeBidiMap(Map p0){} + public V get(Object p0){ return null; } + public V put(K p0, V p1){ return null; } + public V remove(Object p0){ return null; } + public boolean containsKey(Object p0){ return false; } + public boolean containsValue(Object p0){ return false; } + public boolean equals(Object p0){ return false; } + public boolean isEmpty(){ return false; } + public int hashCode(){ return 0; } + public int size(){ return 0; } + public void clear(){} + public void putAll(Map p0){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/AbstractIteratorDecorator.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/AbstractIteratorDecorator.java new file mode 100644 index 00000000000..01491338b7a --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/AbstractIteratorDecorator.java @@ -0,0 +1,13 @@ +// Generated automatically from org.apache.commons.collections4.iterators.AbstractIteratorDecorator for testing purposes + +package org.apache.commons.collections4.iterators; + +import java.util.Iterator; +import org.apache.commons.collections4.iterators.AbstractUntypedIteratorDecorator; + +abstract public class AbstractIteratorDecorator extends AbstractUntypedIteratorDecorator +{ + protected AbstractIteratorDecorator() {} + protected AbstractIteratorDecorator(Iterator p0){} + public E next(){ return null; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/AbstractUntypedIteratorDecorator.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/AbstractUntypedIteratorDecorator.java new file mode 100644 index 00000000000..a29981467bd --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/AbstractUntypedIteratorDecorator.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.commons.collections4.iterators.AbstractUntypedIteratorDecorator for testing purposes + +package org.apache.commons.collections4.iterators; + +import java.util.Iterator; + +abstract public class AbstractUntypedIteratorDecorator implements Iterator +{ + protected AbstractUntypedIteratorDecorator() {} + protected AbstractUntypedIteratorDecorator(Iterator p0){} + protected Iterator getIterator(){ return null; } + public boolean hasNext(){ return false; } + public void remove(){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/BoundedIterator.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/BoundedIterator.java new file mode 100644 index 00000000000..d45ff0f7564 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/BoundedIterator.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.commons.collections4.iterators.BoundedIterator for testing purposes + +package org.apache.commons.collections4.iterators; + +import java.util.Iterator; + +public class BoundedIterator implements Iterator +{ + protected BoundedIterator() {} + public BoundedIterator(Iterator p0, long p1, long p2){} + public E next(){ return null; } + public boolean hasNext(){ return false; } + public void remove(){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/IteratorEnumeration.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/IteratorEnumeration.java new file mode 100644 index 00000000000..13b1ca42ace --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/IteratorEnumeration.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.commons.collections4.iterators.IteratorEnumeration for testing purposes + +package org.apache.commons.collections4.iterators; + +import java.util.Enumeration; +import java.util.Iterator; + +public class IteratorEnumeration implements Enumeration +{ + public E nextElement(){ return null; } + public Iterator getIterator(){ return null; } + public IteratorEnumeration(){} + public IteratorEnumeration(Iterator p0){} + public boolean hasMoreElements(){ return false; } + public void setIterator(Iterator p0){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/NodeListIterator.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/NodeListIterator.java new file mode 100644 index 00000000000..6431ab905a5 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/NodeListIterator.java @@ -0,0 +1,17 @@ +// Generated automatically from org.apache.commons.collections4.iterators.NodeListIterator for testing purposes + +package org.apache.commons.collections4.iterators; + +import java.util.Iterator; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class NodeListIterator implements Iterator +{ + protected NodeListIterator() {} + public Node next(){ return null; } + public NodeListIterator(Node p0){} + public NodeListIterator(NodeList p0){} + public boolean hasNext(){ return false; } + public void remove(){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/SkippingIterator.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/SkippingIterator.java new file mode 100644 index 00000000000..b83e97b23e1 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/SkippingIterator.java @@ -0,0 +1,14 @@ +// Generated automatically from org.apache.commons.collections4.iterators.SkippingIterator for testing purposes + +package org.apache.commons.collections4.iterators; + +import java.util.Iterator; +import org.apache.commons.collections4.iterators.AbstractIteratorDecorator; + +public class SkippingIterator extends AbstractIteratorDecorator +{ + protected SkippingIterator() {} + public E next(){ return null; } + public SkippingIterator(Iterator p0, long p1){} + public void remove(){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/ZippingIterator.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/ZippingIterator.java new file mode 100644 index 00000000000..2d722327f70 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/iterators/ZippingIterator.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.commons.collections4.iterators.ZippingIterator for testing purposes + +package org.apache.commons.collections4.iterators; + +import java.util.Iterator; + +public class ZippingIterator implements Iterator +{ + protected ZippingIterator() {} + public E next(){ return null; } + public ZippingIterator(Iterator p0, Iterator p1){} + public ZippingIterator(Iterator p0, Iterator p1, Iterator p2){} + public ZippingIterator(Iterator... p0){} + public boolean hasNext(){ return false; } + public void remove(){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/keyvalue/DefaultMapEntry.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/keyvalue/DefaultMapEntry.java index 5fd732d592f..e05f7698a9a 100644 --- a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/keyvalue/DefaultMapEntry.java +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/keyvalue/DefaultMapEntry.java @@ -12,6 +12,4 @@ public class DefaultMapEntry extends AbstractMapEntry public DefaultMapEntry(K p0, V p1){} public DefaultMapEntry(KeyValue p0){} public DefaultMapEntry(Map.Entry p0){} - public V getValue(){ return null; } - public K getKey(){ return null; } } diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/keyvalue/UnmodifiableMapEntry.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/keyvalue/UnmodifiableMapEntry.java index 2db2edab16f..20bd8a0880d 100644 --- a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/keyvalue/UnmodifiableMapEntry.java +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/keyvalue/UnmodifiableMapEntry.java @@ -14,6 +14,4 @@ public class UnmodifiableMapEntry extends AbstractMapEntry implement public UnmodifiableMapEntry(KeyValue p0){} public UnmodifiableMapEntry(Map.Entry p0){} public V setValue(V p0){ return null; } - public V getValue(){ return null; } - public K getKey(){ return null; } } diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/AbstractHashedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/AbstractHashedMap.java new file mode 100644 index 00000000000..f79236e4f10 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/AbstractHashedMap.java @@ -0,0 +1,133 @@ +// Generated automatically from org.apache.commons.collections4.map.AbstractHashedMap for testing purposes + +package org.apache.commons.collections4.map; + +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.AbstractCollection; +import java.util.AbstractMap; +import java.util.AbstractSet; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import org.apache.commons.collections4.IterableMap; +import org.apache.commons.collections4.KeyValue; +import org.apache.commons.collections4.MapIterator; + +public class AbstractHashedMap extends AbstractMap implements IterableMap +{ + AbstractHashedMap.EntrySet entrySet = null; + AbstractHashedMap.HashEntry[] data = null; + AbstractHashedMap.KeySet keySet = null; + AbstractHashedMap.Values values = null; + float loadFactor = 0; + int modCount = 0; + int size = 0; + int threshold = 0; + protected AbstractHashedMap(){} + protected AbstractHashedMap(Map p0){} + protected AbstractHashedMap(int p0){} + protected AbstractHashedMap(int p0, float p1){} + protected AbstractHashedMap(int p0, float p1, int p2){} + protected AbstractHashedMap.HashEntry createEntry(AbstractHashedMap.HashEntry p0, int p1, K p2, V p3){ return null; } + protected AbstractHashedMap.HashEntry entryNext(AbstractHashedMap.HashEntry p0){ return null; } + protected AbstractHashedMap.HashEntry getEntry(Object p0){ return null; } + protected AbstractHashedMap clone(){ return null; } + protected Iterator createKeySetIterator(){ return null; } + protected Iterator> createEntrySetIterator(){ return null; } + protected Iterator createValuesIterator(){ return null; } + protected K entryKey(AbstractHashedMap.HashEntry p0){ return null; } + protected Object convertKey(Object p0){ return null; } + protected V entryValue(AbstractHashedMap.HashEntry p0){ return null; } + protected boolean isEqualKey(Object p0, Object p1){ return false; } + protected boolean isEqualValue(Object p0, Object p1){ return false; } + protected int calculateNewCapacity(int p0){ return 0; } + protected int calculateThreshold(int p0, float p1){ return 0; } + protected int entryHashCode(AbstractHashedMap.HashEntry p0){ return 0; } + protected int hash(Object p0){ return 0; } + protected int hashIndex(int p0, int p1){ return 0; } + protected static Object NULL = null; + protected static String GETKEY_INVALID = null; + protected static String GETVALUE_INVALID = null; + protected static String NO_NEXT_ENTRY = null; + protected static String NO_PREVIOUS_ENTRY = null; + protected static String REMOVE_INVALID = null; + protected static String SETVALUE_INVALID = null; + protected static float DEFAULT_LOAD_FACTOR = 0; + protected static int DEFAULT_CAPACITY = 0; + protected static int DEFAULT_THRESHOLD = 0; + protected static int MAXIMUM_CAPACITY = 0; + protected void addEntry(AbstractHashedMap.HashEntry p0, int p1){} + protected void addMapping(int p0, int p1, K p2, V p3){} + protected void checkCapacity(){} + protected void destroyEntry(AbstractHashedMap.HashEntry p0){} + protected void doReadObject(ObjectInputStream p0){} + protected void doWriteObject(ObjectOutputStream p0){} + protected void ensureCapacity(int p0){} + protected void init(){} + protected void removeEntry(AbstractHashedMap.HashEntry p0, int p1, AbstractHashedMap.HashEntry p2){} + protected void removeMapping(AbstractHashedMap.HashEntry p0, int p1, AbstractHashedMap.HashEntry p2){} + protected void reuseEntry(AbstractHashedMap.HashEntry p0, int p1, int p2, K p3, V p4){} + protected void updateEntry(AbstractHashedMap.HashEntry p0, V p1){} + public Collection values(){ return null; } + public MapIterator mapIterator(){ return null; } + public Set keySet(){ return null; } + public Set> entrySet(){ return null; } + public String toString(){ return null; } + public V get(Object p0){ return null; } + public V put(K p0, V p1){ return null; } + public V remove(Object p0){ return null; } + public boolean containsKey(Object p0){ return false; } + public boolean containsValue(Object p0){ return false; } + public boolean equals(Object p0){ return false; } + public boolean isEmpty(){ return false; } + public int hashCode(){ return 0; } + public int size(){ return 0; } + public void clear(){} + public void putAll(Map p0){} + static class EntrySet extends AbstractSet> + { + protected EntrySet() {} + protected EntrySet(AbstractHashedMap p0){} + public Iterator> iterator(){ return null; } + public boolean contains(Object p0){ return false; } + public boolean remove(Object p0){ return false; } + public int size(){ return 0; } + public void clear(){} + } + static class HashEntry implements KeyValue, Map.Entry + { + protected HashEntry() {} + protected AbstractHashedMap.HashEntry next = null; + protected HashEntry(AbstractHashedMap.HashEntry p0, int p1, Object p2, V p3){} + protected Object key = null; + protected Object value = null; + protected int hashCode = 0; + public K getKey(){ return null; } + public String toString(){ return null; } + public V getValue(){ return null; } + public V setValue(V p0){ return null; } + public boolean equals(Object p0){ return false; } + public int hashCode(){ return 0; } + } + static class KeySet extends AbstractSet + { + protected KeySet() {} + protected KeySet(AbstractHashedMap p0){} + public Iterator iterator(){ return null; } + public boolean contains(Object p0){ return false; } + public boolean remove(Object p0){ return false; } + public int size(){ return 0; } + public void clear(){} + } + static class Values extends AbstractCollection + { + protected Values() {} + protected Values(AbstractHashedMap p0){} + public Iterator iterator(){ return null; } + public boolean contains(Object p0){ return false; } + public int size(){ return 0; } + public void clear(){} + } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/AbstractLinkedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/AbstractLinkedMap.java new file mode 100644 index 00000000000..b96404dd5b9 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/AbstractLinkedMap.java @@ -0,0 +1,44 @@ +// Generated automatically from org.apache.commons.collections4.map.AbstractLinkedMap for testing purposes + +package org.apache.commons.collections4.map; + +import java.util.Iterator; +import java.util.Map; +import org.apache.commons.collections4.OrderedMap; +import org.apache.commons.collections4.OrderedMapIterator; +import org.apache.commons.collections4.map.AbstractHashedMap; + +abstract public class AbstractLinkedMap extends AbstractHashedMap implements OrderedMap +{ + AbstractLinkedMap.LinkEntry header = null; + protected AbstractLinkedMap(){} + protected AbstractLinkedMap(Map p0){} + protected AbstractLinkedMap(int p0){} + protected AbstractLinkedMap(int p0, float p1){} + protected AbstractLinkedMap(int p0, float p1, int p2){} + protected AbstractLinkedMap.LinkEntry createEntry(AbstractHashedMap.HashEntry p0, int p1, K p2, V p3){ return null; } + protected AbstractLinkedMap.LinkEntry entryAfter(AbstractLinkedMap.LinkEntry p0){ return null; } + protected AbstractLinkedMap.LinkEntry entryBefore(AbstractLinkedMap.LinkEntry p0){ return null; } + protected AbstractLinkedMap.LinkEntry getEntry(Object p0){ return null; } + protected AbstractLinkedMap.LinkEntry getEntry(int p0){ return null; } + protected Iterator createKeySetIterator(){ return null; } + protected Iterator> createEntrySetIterator(){ return null; } + protected Iterator createValuesIterator(){ return null; } + protected void addEntry(AbstractHashedMap.HashEntry p0, int p1){} + protected void init(){} + protected void removeEntry(AbstractHashedMap.HashEntry p0, int p1, AbstractHashedMap.HashEntry p2){} + public K firstKey(){ return null; } + public K lastKey(){ return null; } + public K nextKey(Object p0){ return null; } + public K previousKey(Object p0){ return null; } + public OrderedMapIterator mapIterator(){ return null; } + public boolean containsValue(Object p0){ return false; } + public void clear(){} + static class LinkEntry extends AbstractHashedMap.HashEntry + { + protected LinkEntry() {} + protected AbstractLinkedMap.LinkEntry after = null; + protected AbstractLinkedMap.LinkEntry before = null; + protected LinkEntry(AbstractHashedMap.HashEntry p0, int p1, Object p2, V p3){} + } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/HashedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/HashedMap.java new file mode 100644 index 00000000000..c2e71aa2da7 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/HashedMap.java @@ -0,0 +1,16 @@ +// Generated automatically from org.apache.commons.collections4.map.HashedMap for testing purposes + +package org.apache.commons.collections4.map; + +import java.io.Serializable; +import java.util.Map; +import org.apache.commons.collections4.map.AbstractHashedMap; + +public class HashedMap extends AbstractHashedMap implements Cloneable, Serializable +{ + public HashedMap(){} + public HashedMap(Map p0){} + public HashedMap(int p0){} + public HashedMap(int p0, float p1){} + public HashedMap clone(){ return null; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/LinkedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/LinkedMap.java new file mode 100644 index 00000000000..51740715e05 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/LinkedMap.java @@ -0,0 +1,22 @@ +// Generated automatically from org.apache.commons.collections4.map.LinkedMap for testing purposes + +package org.apache.commons.collections4.map; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import org.apache.commons.collections4.map.AbstractLinkedMap; + +public class LinkedMap extends AbstractLinkedMap implements Cloneable, Serializable +{ + public K get(int p0){ return null; } + public LinkedMap(){} + public LinkedMap(Map p0){} + public LinkedMap(int p0){} + public LinkedMap(int p0, float p1){} + public LinkedMap clone(){ return null; } + public List asList(){ return null; } + public V getValue(int p0){ return null; } + public V remove(int p0){ return null; } + public int indexOf(Object p0){ return 0; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/MultiValueMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/MultiValueMap.java index b09b192b942..5a99e41f9b5 100644 --- a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/MultiValueMap.java +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/map/MultiValueMap.java @@ -13,8 +13,8 @@ import org.apache.commons.collections4.map.AbstractMapDecorator; public class MultiValueMap extends AbstractMapDecorator implements MultiMap, Serializable { + protected > MultiValueMap(Map p0, Factory p1){} protected Collection createCollection(int p0){ return null; } - protected MultiValueMap(Map p0, Factory p1){} public Collection values(){ return null; } public Collection getCollection(Object p0){ return null; } public Iterator> iterator(){ return null; } @@ -28,13 +28,9 @@ public class MultiValueMap extends AbstractMapDecorator impleme public boolean removeMapping(Object p0, Object p1){ return false; } public int size(Object p0){ return 0; } public int totalSize(){ return 0; } - public static MultiValueMap multiValueMap(Map p0, Class p1){ return null; } - public static MultiValueMap multiValueMap(Map p0, Factory p1){ return null; } - public static MultiValueMap multiValueMap(Map> p0){ return null; } + public static > MultiValueMap multiValueMap(Map p0, Class p1){ return null; } + public static > MultiValueMap multiValueMap(Map p0, Factory p1){ return null; } + public static MultiValueMap multiValueMap(Map> p0){ return null; } public void clear(){} - public void putAll(Map p0){} - public int size(){ return 0; } - public Object remove(Object key){ return null; } - public Object get(Object key){ return null; } - public boolean isEmpty(){ return false; } + public void putAll(Map p0){} } diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/AbstractListValuedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/AbstractListValuedMap.java new file mode 100644 index 00000000000..599411c5a87 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/AbstractListValuedMap.java @@ -0,0 +1,19 @@ +// Generated automatically from org.apache.commons.collections4.multimap.AbstractListValuedMap for testing purposes + +package org.apache.commons.collections4.multimap; + +import java.util.List; +import java.util.Map; +import org.apache.commons.collections4.ListValuedMap; +import org.apache.commons.collections4.multimap.AbstractMultiValuedMap; + +abstract public class AbstractListValuedMap extends AbstractMultiValuedMap implements ListValuedMap +{ + List wrappedCollection(K p0){ return null; } + protected AbstractListValuedMap(){} + protected AbstractListValuedMap(Map> p0){} + protected Map> getMap(){ return null; } + protected abstract List createCollection(); + public List get(K p0){ return null; } + public List remove(Object p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/AbstractMultiValuedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/AbstractMultiValuedMap.java new file mode 100644 index 00000000000..b86762b580f --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/AbstractMultiValuedMap.java @@ -0,0 +1,46 @@ +// Generated automatically from org.apache.commons.collections4.multimap.AbstractMultiValuedMap for testing purposes + +package org.apache.commons.collections4.multimap; + +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import org.apache.commons.collections4.MapIterator; +import org.apache.commons.collections4.MultiSet; +import org.apache.commons.collections4.MultiValuedMap; + +abstract public class AbstractMultiValuedMap implements MultiValuedMap +{ + Collection wrappedCollection(K p0){ return null; } + protected AbstractMultiValuedMap(){} + protected AbstractMultiValuedMap(Map> p0){} + protected Map> getMap(){ return null; } + protected abstract Collection createCollection(); + protected void doReadObject(ObjectInputStream p0){} + protected void doWriteObject(ObjectOutputStream p0){} + protected void setMap(Map> p0){} + public Collection> entries(){ return null; } + public Collection get(K p0){ return null; } + public Collection remove(Object p0){ return null; } + public Collection values(){ return null; } + public Map> asMap(){ return null; } + public MapIterator mapIterator(){ return null; } + public MultiSet keys(){ return null; } + public Set keySet(){ return null; } + public String toString(){ return null; } + public boolean containsKey(Object p0){ return false; } + public boolean containsMapping(Object p0, Object p1){ return false; } + public boolean containsValue(Object p0){ return false; } + public boolean equals(Object p0){ return false; } + public boolean isEmpty(){ return false; } + public boolean put(K p0, V p1){ return false; } + public boolean putAll(K p0, Iterable p1){ return false; } + public boolean putAll(Map p0){ return false; } + public boolean putAll(MultiValuedMap p0){ return false; } + public boolean removeMapping(Object p0, Object p1){ return false; } + public int hashCode(){ return 0; } + public int size(){ return 0; } + public void clear(){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/AbstractSetValuedMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/AbstractSetValuedMap.java new file mode 100644 index 00000000000..feae9379a4e --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/AbstractSetValuedMap.java @@ -0,0 +1,19 @@ +// Generated automatically from org.apache.commons.collections4.multimap.AbstractSetValuedMap for testing purposes + +package org.apache.commons.collections4.multimap; + +import java.util.Map; +import java.util.Set; +import org.apache.commons.collections4.SetValuedMap; +import org.apache.commons.collections4.multimap.AbstractMultiValuedMap; + +abstract public class AbstractSetValuedMap extends AbstractMultiValuedMap implements SetValuedMap +{ + Set wrappedCollection(K p0){ return null; } + protected AbstractSetValuedMap(){} + protected AbstractSetValuedMap(Map> p0){} + protected Map> getMap(){ return null; } + protected abstract Set createCollection(); + public Set get(K p0){ return null; } + public Set remove(Object p0){ return null; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/ArrayListValuedHashMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/ArrayListValuedHashMap.java new file mode 100644 index 00000000000..d02ec3a711e --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/ArrayListValuedHashMap.java @@ -0,0 +1,20 @@ +// Generated automatically from org.apache.commons.collections4.multimap.ArrayListValuedHashMap for testing purposes + +package org.apache.commons.collections4.multimap; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Map; +import org.apache.commons.collections4.MultiValuedMap; +import org.apache.commons.collections4.multimap.AbstractListValuedMap; + +public class ArrayListValuedHashMap extends AbstractListValuedMap implements Serializable +{ + protected ArrayList createCollection(){ return null; } + public ArrayListValuedHashMap(){} + public ArrayListValuedHashMap(Map p0){} + public ArrayListValuedHashMap(MultiValuedMap p0){} + public ArrayListValuedHashMap(int p0){} + public ArrayListValuedHashMap(int p0, int p1){} + public void trimToSize(){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/HashSetValuedHashMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/HashSetValuedHashMap.java new file mode 100644 index 00000000000..c7ae3ab48de --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multimap/HashSetValuedHashMap.java @@ -0,0 +1,19 @@ +// Generated automatically from org.apache.commons.collections4.multimap.HashSetValuedHashMap for testing purposes + +package org.apache.commons.collections4.multimap; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Map; +import org.apache.commons.collections4.MultiValuedMap; +import org.apache.commons.collections4.multimap.AbstractSetValuedMap; + +public class HashSetValuedHashMap extends AbstractSetValuedMap implements Serializable +{ + protected HashSet createCollection(){ return null; } + public HashSetValuedHashMap(){} + public HashSetValuedHashMap(Map p0){} + public HashSetValuedHashMap(MultiValuedMap p0){} + public HashSetValuedHashMap(int p0){} + public HashSetValuedHashMap(int p0, int p1){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java new file mode 100644 index 00000000000..922994f94f5 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multiset/AbstractMapMultiSet.java @@ -0,0 +1,43 @@ +// Generated automatically from org.apache.commons.collections4.multiset.AbstractMapMultiSet for testing purposes + +package org.apache.commons.collections4.multiset; + +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Iterator; +import java.util.Map; +import org.apache.commons.collections4.MultiSet; +import org.apache.commons.collections4.multiset.AbstractMultiSet; + +abstract public class AbstractMapMultiSet extends AbstractMultiSet +{ + protected AbstractMapMultiSet(){} + protected AbstractMapMultiSet(Map p0){} + protected Iterator createUniqueSetIterator(){ return null; } + protected Iterator> createEntrySetIterator(){ return null; } + protected Map getMap(){ return null; } + protected int uniqueElements(){ return 0; } + protected void doReadObject(ObjectInputStream p0){} + protected void doWriteObject(ObjectOutputStream p0){} + protected void setMap(Map p0){} + public T[] toArray(T[] p0){ return null; } + public Iterator iterator(){ return null; } + public Object[] toArray(){ return null; } + public boolean contains(Object p0){ return false; } + public boolean equals(Object p0){ return false; } + public boolean isEmpty(){ return false; } + public int add(E p0, int p1){ return 0; } + public int getCount(Object p0){ return 0; } + public int hashCode(){ return 0; } + public int remove(Object p0, int p1){ return 0; } + public int size(){ return 0; } + public void clear(){} + static class MutableInteger + { + protected MutableInteger() {} + MutableInteger(int p0){} + protected int value = 0; + public boolean equals(Object p0){ return false; } + public int hashCode(){ return 0; } + } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multiset/AbstractMultiSet.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multiset/AbstractMultiSet.java new file mode 100644 index 00000000000..9c6b816532e --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multiset/AbstractMultiSet.java @@ -0,0 +1,39 @@ +// Generated automatically from org.apache.commons.collections4.multiset.AbstractMultiSet for testing purposes + +package org.apache.commons.collections4.multiset; + +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.AbstractCollection; +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; +import org.apache.commons.collections4.MultiSet; + +abstract public class AbstractMultiSet extends AbstractCollection implements MultiSet +{ + protected AbstractMultiSet(){} + protected Iterator createUniqueSetIterator(){ return null; } + protected Set createUniqueSet(){ return null; } + protected Set> createEntrySet(){ return null; } + protected abstract Iterator> createEntrySetIterator(); + protected abstract int uniqueElements(); + protected void doReadObject(ObjectInputStream p0){} + protected void doWriteObject(ObjectOutputStream p0){} + public Iterator iterator(){ return null; } + public Set uniqueSet(){ return null; } + public Set> entrySet(){ return null; } + public String toString(){ return null; } + public boolean add(E p0){ return false; } + public boolean contains(Object p0){ return false; } + public boolean equals(Object p0){ return false; } + public boolean remove(Object p0){ return false; } + public boolean removeAll(Collection p0){ return false; } + public int add(E p0, int p1){ return 0; } + public int getCount(Object p0){ return 0; } + public int hashCode(){ return 0; } + public int remove(Object p0, int p1){ return 0; } + public int setCount(E p0, int p1){ return 0; } + public int size(){ return 0; } + public void clear(){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multiset/HashMultiSet.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multiset/HashMultiSet.java new file mode 100644 index 00000000000..9337a372adb --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/multiset/HashMultiSet.java @@ -0,0 +1,13 @@ +// Generated automatically from org.apache.commons.collections4.multiset.HashMultiSet for testing purposes + +package org.apache.commons.collections4.multiset; + +import java.io.Serializable; +import java.util.Collection; +import org.apache.commons.collections4.multiset.AbstractMapMultiSet; + +public class HashMultiSet extends AbstractMapMultiSet implements Serializable +{ + public HashMultiSet(){} + public HashMultiSet(Collection p0){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/AbstractBitwiseTrie.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/AbstractBitwiseTrie.java new file mode 100644 index 00000000000..5ed4dfda241 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/AbstractBitwiseTrie.java @@ -0,0 +1,39 @@ +// Generated automatically from org.apache.commons.collections4.trie.AbstractBitwiseTrie for testing purposes + +package org.apache.commons.collections4.trie; + +import java.io.Serializable; +import java.util.AbstractMap; +import java.util.Map; +import org.apache.commons.collections4.Trie; +import org.apache.commons.collections4.trie.KeyAnalyzer; + +abstract public class AbstractBitwiseTrie extends AbstractMap implements Serializable, Trie +{ + protected AbstractBitwiseTrie() {} + abstract static class BasicEntry implements Map.Entry, Serializable + { + protected BasicEntry() {} + protected K key = null; + protected V value = null; + public BasicEntry(K p0){} + public BasicEntry(K p0, V p1){} + public K getKey(){ return null; } + public String toString(){ return null; } + public V getValue(){ return null; } + public V setKeyValue(K p0, V p1){ return null; } + public V setValue(V p0){ return null; } + public boolean equals(Object p0){ return false; } + public int hashCode(){ return 0; } + } + final K castKey(Object p0){ return null; } + final boolean compareKeys(K p0, K p1){ return false; } + final boolean isBitSet(K p0, int p1, int p2){ return false; } + final int bitIndex(K p0, K p1){ return 0; } + final int bitsPerElement(){ return 0; } + final int lengthInBits(K p0){ return 0; } + protected AbstractBitwiseTrie(KeyAnalyzer p0){} + protected KeyAnalyzer getKeyAnalyzer(){ return null; } + public String toString(){ return null; } + static boolean compare(Object p0, Object p1){ return false; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/AbstractPatriciaTrie.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/AbstractPatriciaTrie.java new file mode 100644 index 00000000000..a37ea503009 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/AbstractPatriciaTrie.java @@ -0,0 +1,76 @@ +// Generated automatically from org.apache.commons.collections4.trie.AbstractPatriciaTrie for testing purposes + +package org.apache.commons.collections4.trie; + +import java.util.Collection; +import java.util.Comparator; +import java.util.Map; +import java.util.Set; +import java.util.SortedMap; +import org.apache.commons.collections4.OrderedMapIterator; +import org.apache.commons.collections4.trie.AbstractBitwiseTrie; +import org.apache.commons.collections4.trie.KeyAnalyzer; + +abstract class AbstractPatriciaTrie extends AbstractBitwiseTrie +{ + protected AbstractPatriciaTrie() {} + AbstractPatriciaTrie.TrieEntry addEntry(AbstractPatriciaTrie.TrieEntry p0, int p1){ return null; } + AbstractPatriciaTrie.TrieEntry ceilingEntry(K p0){ return null; } + AbstractPatriciaTrie.TrieEntry firstEntry(){ return null; } + AbstractPatriciaTrie.TrieEntry floorEntry(K p0){ return null; } + AbstractPatriciaTrie.TrieEntry followLeft(AbstractPatriciaTrie.TrieEntry p0){ return null; } + AbstractPatriciaTrie.TrieEntry followRight(AbstractPatriciaTrie.TrieEntry p0){ return null; } + AbstractPatriciaTrie.TrieEntry getEntry(Object p0){ return null; } + AbstractPatriciaTrie.TrieEntry getNearestEntryForKey(K p0, int p1){ return null; } + AbstractPatriciaTrie.TrieEntry higherEntry(K p0){ return null; } + AbstractPatriciaTrie.TrieEntry lastEntry(){ return null; } + AbstractPatriciaTrie.TrieEntry lowerEntry(K p0){ return null; } + AbstractPatriciaTrie.TrieEntry nextEntry(AbstractPatriciaTrie.TrieEntry p0){ return null; } + AbstractPatriciaTrie.TrieEntry nextEntryImpl(AbstractPatriciaTrie.TrieEntry p0, AbstractPatriciaTrie.TrieEntry p1, AbstractPatriciaTrie.TrieEntry p2){ return null; } + AbstractPatriciaTrie.TrieEntry nextEntryInSubtree(AbstractPatriciaTrie.TrieEntry p0, AbstractPatriciaTrie.TrieEntry p1){ return null; } + AbstractPatriciaTrie.TrieEntry previousEntry(AbstractPatriciaTrie.TrieEntry p0){ return null; } + AbstractPatriciaTrie.TrieEntry subtree(K p0, int p1, int p2){ return null; } + V removeEntry(AbstractPatriciaTrie.TrieEntry p0){ return null; } + protected AbstractPatriciaTrie(KeyAnalyzer p0){} + protected AbstractPatriciaTrie(KeyAnalyzer p0, Map p1){} + protected int modCount = 0; + public Collection values(){ return null; } + public Comparator comparator(){ return null; } + public K firstKey(){ return null; } + public K lastKey(){ return null; } + public K nextKey(K p0){ return null; } + public K previousKey(K p0){ return null; } + public K selectKey(K p0){ return null; } + public Map.Entry select(K p0){ return null; } + public OrderedMapIterator mapIterator(){ return null; } + public Set keySet(){ return null; } + public Set> entrySet(){ return null; } + public SortedMap headMap(K p0){ return null; } + public SortedMap prefixMap(K p0){ return null; } + public SortedMap subMap(K p0, K p1){ return null; } + public SortedMap tailMap(K p0){ return null; } + public V get(Object p0){ return null; } + public V put(K p0, V p1){ return null; } + public V remove(Object p0){ return null; } + public V selectValue(K p0){ return null; } + public boolean containsKey(Object p0){ return false; } + public int size(){ return 0; } + public void clear(){} + static boolean isValidUplink(AbstractPatriciaTrie.TrieEntry p0, AbstractPatriciaTrie.TrieEntry p1){ return false; } + static class TrieEntry extends AbstractBitwiseTrie.BasicEntry + { + protected TrieEntry() {} + protected AbstractPatriciaTrie.TrieEntry left = null; + protected AbstractPatriciaTrie.TrieEntry parent = null; + protected AbstractPatriciaTrie.TrieEntry predecessor = null; + protected AbstractPatriciaTrie.TrieEntry right = null; + protected int bitIndex = 0; + public String toString(){ return null; } + public TrieEntry(K p0, V p1, int p2){} + public boolean isEmpty(){ return false; } + public boolean isExternalNode(){ return false; } + public boolean isInternalNode(){ return false; } + } + void decrementSize(){} + void incrementSize(){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/KeyAnalyzer.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/KeyAnalyzer.java new file mode 100644 index 00000000000..e5d1024f1f1 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/KeyAnalyzer.java @@ -0,0 +1,24 @@ +// Generated automatically from org.apache.commons.collections4.trie.KeyAnalyzer for testing purposes + +package org.apache.commons.collections4.trie; + +import java.io.Serializable; +import java.util.Comparator; + +abstract public class KeyAnalyzer implements Comparator, Serializable +{ + public KeyAnalyzer(){} + public abstract boolean isBitSet(K p0, int p1, int p2); + public abstract boolean isPrefix(K p0, int p1, int p2, K p3); + public abstract int bitIndex(K p0, int p1, int p2, K p3, int p4, int p5); + public abstract int bitsPerElement(); + public abstract int lengthInBits(K p0); + public int compare(K p0, K p1){ return 0; } + public static int EQUAL_BIT_KEY = 0; + public static int NULL_BIT_KEY = 0; + public static int OUT_OF_BOUNDS_BIT_KEY = 0; + static boolean isEqualBitKey(int p0){ return false; } + static boolean isNullBitKey(int p0){ return false; } + static boolean isOutOfBoundsIndex(int p0){ return false; } + static boolean isValidBitIndex(int p0){ return false; } +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/PatriciaTrie.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/PatriciaTrie.java new file mode 100644 index 00000000000..e5f2dfaef2a --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/apache/commons/collections4/trie/PatriciaTrie.java @@ -0,0 +1,12 @@ +// Generated automatically from org.apache.commons.collections4.trie.PatriciaTrie for testing purposes + +package org.apache.commons.collections4.trie; + +import java.util.Map; +import org.apache.commons.collections4.trie.AbstractPatriciaTrie; + +public class PatriciaTrie extends AbstractPatriciaTrie +{ + public PatriciaTrie(){} + public PatriciaTrie(Map p0){} +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Attr.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Attr.java new file mode 100644 index 00000000000..51608242ec8 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Attr.java @@ -0,0 +1,18 @@ +// Generated automatically from org.w3c.dom.Attr for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.TypeInfo; + +public interface Attr extends Node +{ + Element getOwnerElement(); + String getName(); + String getValue(); + TypeInfo getSchemaTypeInfo(); + boolean getSpecified(); + boolean isId(); + void setValue(String p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/CDATASection.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/CDATASection.java new file mode 100644 index 00000000000..5285b245069 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/CDATASection.java @@ -0,0 +1,9 @@ +// Generated automatically from org.w3c.dom.CDATASection for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Text; + +public interface CDATASection extends Text +{ +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/CharacterData.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/CharacterData.java new file mode 100644 index 00000000000..01eecd31912 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/CharacterData.java @@ -0,0 +1,17 @@ +// Generated automatically from org.w3c.dom.CharacterData for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Node; + +public interface CharacterData extends Node +{ + String getData(); + String substringData(int p0, int p1); + int getLength(); + void appendData(String p0); + void deleteData(int p0, int p1); + void insertData(int p0, String p1); + void replaceData(int p0, int p1, String p2); + void setData(String p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Comment.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Comment.java new file mode 100644 index 00000000000..c1c206ce782 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Comment.java @@ -0,0 +1,9 @@ +// Generated automatically from org.w3c.dom.Comment for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.CharacterData; + +public interface Comment extends CharacterData +{ +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DOMConfiguration.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DOMConfiguration.java new file mode 100644 index 00000000000..a1025af725b --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DOMConfiguration.java @@ -0,0 +1,13 @@ +// Generated automatically from org.w3c.dom.DOMConfiguration for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.DOMStringList; + +public interface DOMConfiguration +{ + DOMStringList getParameterNames(); + Object getParameter(String p0); + boolean canSetParameter(String p0, Object p1); + void setParameter(String p0, Object p1); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DOMImplementation.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DOMImplementation.java new file mode 100644 index 00000000000..398c29bdc6a --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DOMImplementation.java @@ -0,0 +1,14 @@ +// Generated automatically from org.w3c.dom.DOMImplementation for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Document; +import org.w3c.dom.DocumentType; + +public interface DOMImplementation +{ + Document createDocument(String p0, String p1, DocumentType p2); + DocumentType createDocumentType(String p0, String p1, String p2); + Object getFeature(String p0, String p1); + boolean hasFeature(String p0, String p1); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DOMStringList.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DOMStringList.java new file mode 100644 index 00000000000..ddedb943a62 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DOMStringList.java @@ -0,0 +1,11 @@ +// Generated automatically from org.w3c.dom.DOMStringList for testing purposes + +package org.w3c.dom; + + +public interface DOMStringList +{ + String item(int p0); + boolean contains(String p0); + int getLength(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Document.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Document.java new file mode 100644 index 00000000000..ce831fbdaba --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Document.java @@ -0,0 +1,52 @@ +// Generated automatically from org.w3c.dom.Document for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Attr; +import org.w3c.dom.CDATASection; +import org.w3c.dom.Comment; +import org.w3c.dom.DOMConfiguration; +import org.w3c.dom.DOMImplementation; +import org.w3c.dom.DocumentFragment; +import org.w3c.dom.DocumentType; +import org.w3c.dom.Element; +import org.w3c.dom.EntityReference; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.ProcessingInstruction; +import org.w3c.dom.Text; + +public interface Document extends Node +{ + Attr createAttribute(String p0); + Attr createAttributeNS(String p0, String p1); + CDATASection createCDATASection(String p0); + Comment createComment(String p0); + DOMConfiguration getDomConfig(); + DOMImplementation getImplementation(); + DocumentFragment createDocumentFragment(); + DocumentType getDoctype(); + Element createElement(String p0); + Element createElementNS(String p0, String p1); + Element getDocumentElement(); + Element getElementById(String p0); + EntityReference createEntityReference(String p0); + Node adoptNode(Node p0); + Node importNode(Node p0, boolean p1); + Node renameNode(Node p0, String p1, String p2); + NodeList getElementsByTagName(String p0); + NodeList getElementsByTagNameNS(String p0, String p1); + ProcessingInstruction createProcessingInstruction(String p0, String p1); + String getDocumentURI(); + String getInputEncoding(); + String getXmlEncoding(); + String getXmlVersion(); + Text createTextNode(String p0); + boolean getStrictErrorChecking(); + boolean getXmlStandalone(); + void normalizeDocument(); + void setDocumentURI(String p0); + void setStrictErrorChecking(boolean p0); + void setXmlStandalone(boolean p0); + void setXmlVersion(String p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DocumentFragment.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DocumentFragment.java new file mode 100644 index 00000000000..326bfccbf15 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DocumentFragment.java @@ -0,0 +1,9 @@ +// Generated automatically from org.w3c.dom.DocumentFragment for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Node; + +public interface DocumentFragment extends Node +{ +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DocumentType.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DocumentType.java new file mode 100644 index 00000000000..18b57c70ab3 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/DocumentType.java @@ -0,0 +1,16 @@ +// Generated automatically from org.w3c.dom.DocumentType for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; + +public interface DocumentType extends Node +{ + NamedNodeMap getEntities(); + NamedNodeMap getNotations(); + String getInternalSubset(); + String getName(); + String getPublicId(); + String getSystemId(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Element.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Element.java new file mode 100644 index 00000000000..e6e1f9afa21 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Element.java @@ -0,0 +1,32 @@ +// Generated automatically from org.w3c.dom.Element for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Attr; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.TypeInfo; + +public interface Element extends Node +{ + Attr getAttributeNode(String p0); + Attr getAttributeNodeNS(String p0, String p1); + Attr removeAttributeNode(Attr p0); + Attr setAttributeNode(Attr p0); + Attr setAttributeNodeNS(Attr p0); + NodeList getElementsByTagName(String p0); + NodeList getElementsByTagNameNS(String p0, String p1); + String getAttribute(String p0); + String getAttributeNS(String p0, String p1); + String getTagName(); + TypeInfo getSchemaTypeInfo(); + boolean hasAttribute(String p0); + boolean hasAttributeNS(String p0, String p1); + void removeAttribute(String p0); + void removeAttributeNS(String p0, String p1); + void setAttribute(String p0, String p1); + void setAttributeNS(String p0, String p1, String p2); + void setIdAttribute(String p0, boolean p1); + void setIdAttributeNS(String p0, String p1, boolean p2); + void setIdAttributeNode(Attr p0, boolean p1); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/EntityReference.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/EntityReference.java new file mode 100644 index 00000000000..c4d733c519a --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/EntityReference.java @@ -0,0 +1,9 @@ +// Generated automatically from org.w3c.dom.EntityReference for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Node; + +public interface EntityReference extends Node +{ +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/NamedNodeMap.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/NamedNodeMap.java new file mode 100644 index 00000000000..d1f3f1fd5b6 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/NamedNodeMap.java @@ -0,0 +1,17 @@ +// Generated automatically from org.w3c.dom.NamedNodeMap for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Node; + +public interface NamedNodeMap +{ + Node getNamedItem(String p0); + Node getNamedItemNS(String p0, String p1); + Node item(int p0); + Node removeNamedItem(String p0); + Node removeNamedItemNS(String p0, String p1); + Node setNamedItem(Node p0); + Node setNamedItemNS(Node p0); + int getLength(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Node.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Node.java new file mode 100644 index 00000000000..42dc60a85c9 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Node.java @@ -0,0 +1,67 @@ +// Generated automatically from org.w3c.dom.Node for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.NodeList; +import org.w3c.dom.UserDataHandler; + +public interface Node +{ + Document getOwnerDocument(); + NamedNodeMap getAttributes(); + Node appendChild(Node p0); + Node cloneNode(boolean p0); + Node getFirstChild(); + Node getLastChild(); + Node getNextSibling(); + Node getParentNode(); + Node getPreviousSibling(); + Node insertBefore(Node p0, Node p1); + Node removeChild(Node p0); + Node replaceChild(Node p0, Node p1); + NodeList getChildNodes(); + Object getFeature(String p0, String p1); + Object getUserData(String p0); + Object setUserData(String p0, Object p1, UserDataHandler p2); + String getBaseURI(); + String getLocalName(); + String getNamespaceURI(); + String getNodeName(); + String getNodeValue(); + String getPrefix(); + String getTextContent(); + String lookupNamespaceURI(String p0); + String lookupPrefix(String p0); + boolean hasAttributes(); + boolean hasChildNodes(); + boolean isDefaultNamespace(String p0); + boolean isEqualNode(Node p0); + boolean isSameNode(Node p0); + boolean isSupported(String p0, String p1); + short compareDocumentPosition(Node p0); + short getNodeType(); + static short ATTRIBUTE_NODE = 0; + static short CDATA_SECTION_NODE = 0; + static short COMMENT_NODE = 0; + static short DOCUMENT_FRAGMENT_NODE = 0; + static short DOCUMENT_NODE = 0; + static short DOCUMENT_POSITION_CONTAINED_BY = 0; + static short DOCUMENT_POSITION_CONTAINS = 0; + static short DOCUMENT_POSITION_DISCONNECTED = 0; + static short DOCUMENT_POSITION_FOLLOWING = 0; + static short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0; + static short DOCUMENT_POSITION_PRECEDING = 0; + static short DOCUMENT_TYPE_NODE = 0; + static short ELEMENT_NODE = 0; + static short ENTITY_NODE = 0; + static short ENTITY_REFERENCE_NODE = 0; + static short NOTATION_NODE = 0; + static short PROCESSING_INSTRUCTION_NODE = 0; + static short TEXT_NODE = 0; + void normalize(); + void setNodeValue(String p0); + void setPrefix(String p0); + void setTextContent(String p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/NodeList.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/NodeList.java new file mode 100644 index 00000000000..63018fe44ae --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/NodeList.java @@ -0,0 +1,11 @@ +// Generated automatically from org.w3c.dom.NodeList for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Node; + +public interface NodeList +{ + Node item(int p0); + int getLength(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/ProcessingInstruction.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/ProcessingInstruction.java new file mode 100644 index 00000000000..57a0ca87b83 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/ProcessingInstruction.java @@ -0,0 +1,12 @@ +// Generated automatically from org.w3c.dom.ProcessingInstruction for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Node; + +public interface ProcessingInstruction extends Node +{ + String getData(); + String getTarget(); + void setData(String p0); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Text.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Text.java new file mode 100644 index 00000000000..cb715f47e7c --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/Text.java @@ -0,0 +1,13 @@ +// Generated automatically from org.w3c.dom.Text for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.CharacterData; + +public interface Text extends CharacterData +{ + String getWholeText(); + Text replaceWholeText(String p0); + Text splitText(int p0); + boolean isElementContentWhitespace(); +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/TypeInfo.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/TypeInfo.java new file mode 100644 index 00000000000..c62e923a64e --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/TypeInfo.java @@ -0,0 +1,15 @@ +// Generated automatically from org.w3c.dom.TypeInfo for testing purposes + +package org.w3c.dom; + + +public interface TypeInfo +{ + String getTypeName(); + String getTypeNamespace(); + boolean isDerivedFrom(String p0, String p1, int p2); + static int DERIVATION_EXTENSION = 0; + static int DERIVATION_LIST = 0; + static int DERIVATION_RESTRICTION = 0; + static int DERIVATION_UNION = 0; +} diff --git a/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/UserDataHandler.java b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/UserDataHandler.java new file mode 100644 index 00000000000..edf20472b06 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-collections4-4.4/org/w3c/dom/UserDataHandler.java @@ -0,0 +1,15 @@ +// Generated automatically from org.w3c.dom.UserDataHandler for testing purposes + +package org.w3c.dom; + +import org.w3c.dom.Node; + +public interface UserDataHandler +{ + static short NODE_ADOPTED = 0; + static short NODE_CLONED = 0; + static short NODE_DELETED = 0; + static short NODE_IMPORTED = 0; + static short NODE_RENAMED = 0; + void handle(short p0, String p1, Object p2, Node p3, Node p4); +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/base/Function.java b/java/ql/test/stubs/guava-30.0/com/google/common/base/Function.java index 75acf7f8a54..b5d12261264 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/base/Function.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/base/Function.java @@ -1,25 +1,9 @@ -/* - * Copyright (C) 2007 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ +// Generated automatically from com.google.common.base.Function for testing purposes, and adjusted manually package com.google.common.base; -import org.checkerframework.checker.nullness.qual.Nullable; - -public interface Function extends java.util.function.Function { - @Override - T apply(@Nullable F input); - - @Override - boolean equals(@Nullable Object object); +public interface Function extends java.util.function.Function +{ + T apply(F p0); + boolean equals(Object p0); } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/base/Predicate.java b/java/ql/test/stubs/guava-30.0/com/google/common/base/Predicate.java index 1adc6a1caed..ae2e1a9944f 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/base/Predicate.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/base/Predicate.java @@ -1,29 +1,10 @@ -/* - * Copyright (C) 2007 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ +// Generated automatically from com.google.common.base.Predicate for testing purposes, and adjusted manually. package com.google.common.base; -import org.checkerframework.checker.nullness.qual.Nullable; - -public interface Predicate extends java.util.function.Predicate { - boolean apply(@Nullable T input); - - @Override - boolean equals(@Nullable Object object); - - @Override - default boolean test(@Nullable T input) { - return false; - } +public interface Predicate extends java.util.function.Predicate +{ + boolean apply(T p0); + boolean equals(Object p0); + default boolean test(T p0){ return false; } } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/base/Supplier.java b/java/ql/test/stubs/guava-30.0/com/google/common/base/Supplier.java index a9be9855c8c..0ebb8e4ea8d 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/base/Supplier.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/base/Supplier.java @@ -1,21 +1,8 @@ -/* - * Copyright (C) 2007 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ +// Generated automatically from com.google.common.base.Supplier for testing purposes, and adjusted manually package com.google.common.base; -public interface Supplier extends java.util.function.Supplier { - @Override - T get(); - +public interface Supplier extends java.util.function.Supplier +{ + T get(); } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/base/Ticker.java b/java/ql/test/stubs/guava-30.0/com/google/common/base/Ticker.java new file mode 100644 index 00000000000..d36ff7dfd14 --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/base/Ticker.java @@ -0,0 +1,11 @@ +// Generated automatically from com.google.common.base.Ticker for testing purposes + +package com.google.common.base; + + +abstract public class Ticker +{ + protected Ticker(){} + public abstract long read(); + public static Ticker systemTicker(){ return null; } +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/AbstractCache.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/AbstractCache.java new file mode 100644 index 00000000000..c10c6af195f --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/AbstractCache.java @@ -0,0 +1,35 @@ +// Generated automatically from com.google.common.cache.AbstractCache for testing purposes + +package com.google.common.cache; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheStats; +import com.google.common.collect.ImmutableMap; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentMap; + +abstract public class AbstractCache implements Cache +{ + protected AbstractCache(){} + public CacheStats stats(){ return null; } + public ConcurrentMap asMap(){ return null; } + public ImmutableMap getAllPresent(Iterable p0){ return null; } + public V get(K p0, Callable p1){ return null; } + public long size(){ return 0; } + public void cleanUp(){} + public void invalidate(Object p0){} + public void invalidateAll(){} + public void invalidateAll(Iterable p0){} + public void put(K p0, V p1){} + public void putAll(Map p0){} + static public interface StatsCounter + { + CacheStats snapshot(); + void recordEviction(); + void recordHits(int p0); + void recordLoadException(long p0); + void recordLoadSuccess(long p0); + void recordMisses(int p0); + } +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/Cache.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/Cache.java new file mode 100644 index 00000000000..e509bbc8b97 --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/Cache.java @@ -0,0 +1,25 @@ +// Generated automatically from com.google.common.cache.Cache for testing purposes + +package com.google.common.cache; + +import com.google.common.cache.CacheStats; +import com.google.common.collect.ImmutableMap; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentMap; + +public interface Cache +{ + CacheStats stats(); + ConcurrentMap asMap(); + ImmutableMap getAllPresent(Iterable p0); + V get(K p0, Callable p1); + V getIfPresent(Object p0); + long size(); + void cleanUp(); + void invalidate(Object p0); + void invalidateAll(); + void invalidateAll(Iterable p0); + void put(K p0, V p1); + void putAll(Map p0); +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheBuilder.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheBuilder.java new file mode 100644 index 00000000000..19fe8330ca6 --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheBuilder.java @@ -0,0 +1,41 @@ +// Generated automatically from com.google.common.cache.CacheBuilder for testing purposes + +package com.google.common.cache; + +import com.google.common.base.Ticker; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilderSpec; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.cache.RemovalListener; +import com.google.common.cache.Weigher; +import java.time.Duration; +import java.util.concurrent.TimeUnit; + +public class CacheBuilder +{ + protected CacheBuilder() {} + public Cache build(){ return null; } + public CacheBuilder removalListener(RemovalListener p0){ return null; } + public CacheBuilder weigher(Weigher p0){ return null; } + public LoadingCache build(CacheLoader p0){ return null; } + public CacheBuilder concurrencyLevel(int p0){ return null; } + public CacheBuilder expireAfterAccess(Duration p0){ return null; } + public CacheBuilder expireAfterAccess(long p0, TimeUnit p1){ return null; } + public CacheBuilder expireAfterWrite(Duration p0){ return null; } + public CacheBuilder expireAfterWrite(long p0, TimeUnit p1){ return null; } + public CacheBuilder initialCapacity(int p0){ return null; } + public CacheBuilder maximumSize(long p0){ return null; } + public CacheBuilder maximumWeight(long p0){ return null; } + public CacheBuilder recordStats(){ return null; } + public CacheBuilder refreshAfterWrite(Duration p0){ return null; } + public CacheBuilder refreshAfterWrite(long p0, TimeUnit p1){ return null; } + public CacheBuilder softValues(){ return null; } + public CacheBuilder ticker(Ticker p0){ return null; } + public CacheBuilder weakKeys(){ return null; } + public CacheBuilder weakValues(){ return null; } + public String toString(){ return null; } + public static CacheBuilder from(CacheBuilderSpec p0){ return null; } + public static CacheBuilder from(String p0){ return null; } + public static CacheBuilder newBuilder(){ return null; } +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheBuilderSpec.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheBuilderSpec.java new file mode 100644 index 00000000000..120026f761e --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheBuilderSpec.java @@ -0,0 +1,15 @@ +// Generated automatically from com.google.common.cache.CacheBuilderSpec for testing purposes + +package com.google.common.cache; + + +public class CacheBuilderSpec +{ + protected CacheBuilderSpec() {} + public String toParsableString(){ return null; } + public String toString(){ return null; } + public boolean equals(Object p0){ return false; } + public int hashCode(){ return 0; } + public static CacheBuilderSpec disableCaching(){ return null; } + public static CacheBuilderSpec parse(String p0){ return null; } +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheLoader.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheLoader.java new file mode 100644 index 00000000000..00b9bfaad7d --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheLoader.java @@ -0,0 +1,20 @@ +// Generated automatically from com.google.common.cache.CacheLoader for testing purposes + +package com.google.common.cache; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.util.concurrent.ListenableFuture; +import java.util.Map; +import java.util.concurrent.Executor; + +abstract public class CacheLoader +{ + protected CacheLoader(){} + public ListenableFuture reload(K p0, V p1){ return null; } + public Map loadAll(Iterable p0){ return null; } + public abstract V load(K p0); + public static CacheLoader asyncReloading(CacheLoader p0, Executor p1){ return null; } + public static CacheLoader from(Function p0){ return null; } + public static CacheLoader from(Supplier p0){ return null; } +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheStats.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheStats.java new file mode 100644 index 00000000000..fbd5ba9656a --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/CacheStats.java @@ -0,0 +1,27 @@ +// Generated automatically from com.google.common.cache.CacheStats for testing purposes + +package com.google.common.cache; + + +public class CacheStats +{ + protected CacheStats() {} + public CacheStats minus(CacheStats p0){ return null; } + public CacheStats plus(CacheStats p0){ return null; } + public CacheStats(long p0, long p1, long p2, long p3, long p4, long p5){} + public String toString(){ return null; } + public boolean equals(Object p0){ return false; } + public double averageLoadPenalty(){ return 0; } + public double hitRate(){ return 0; } + public double loadExceptionRate(){ return 0; } + public double missRate(){ return 0; } + public int hashCode(){ return 0; } + public long evictionCount(){ return 0; } + public long hitCount(){ return 0; } + public long loadCount(){ return 0; } + public long loadExceptionCount(){ return 0; } + public long loadSuccessCount(){ return 0; } + public long missCount(){ return 0; } + public long requestCount(){ return 0; } + public long totalLoadTime(){ return 0; } +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/LoadingCache.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/LoadingCache.java new file mode 100644 index 00000000000..3918ace190d --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/LoadingCache.java @@ -0,0 +1,18 @@ +// Generated automatically from com.google.common.cache.LoadingCache for testing purposes + +package com.google.common.cache; + +import com.google.common.base.Function; +import com.google.common.cache.Cache; +import com.google.common.collect.ImmutableMap; +import java.util.concurrent.ConcurrentMap; + +public interface LoadingCache extends Cache, Function +{ + ConcurrentMap asMap(); + ImmutableMap getAll(Iterable p0); + V apply(K p0); + V get(K p0); + V getUnchecked(K p0); + void refresh(K p0); +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/RemovalCause.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/RemovalCause.java new file mode 100644 index 00000000000..e179e876b04 --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/RemovalCause.java @@ -0,0 +1,10 @@ +// Generated automatically from com.google.common.cache.RemovalCause for testing purposes, and adjusted manually + +package com.google.common.cache; + + +public enum RemovalCause +{ + COLLECTED, EXPIRED, EXPLICIT, REPLACED, SIZE; + private RemovalCause() {} +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/RemovalListener.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/RemovalListener.java new file mode 100644 index 00000000000..5c2dd0fe6e2 --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/RemovalListener.java @@ -0,0 +1,10 @@ +// Generated automatically from com.google.common.cache.RemovalListener for testing purposes + +package com.google.common.cache; + +import com.google.common.cache.RemovalNotification; + +public interface RemovalListener +{ + void onRemoval(RemovalNotification p0); +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/RemovalNotification.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/RemovalNotification.java new file mode 100644 index 00000000000..f3ff204aec3 --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/RemovalNotification.java @@ -0,0 +1,14 @@ +// Generated automatically from com.google.common.cache.RemovalNotification for testing purposes, and adjusted manually + +package com.google.common.cache; + +import com.google.common.cache.RemovalCause; +import java.util.AbstractMap; + +public class RemovalNotification extends AbstractMap.SimpleImmutableEntry +{ + protected RemovalNotification(K k, V v) { super(k,v); } + public RemovalCause getCause(){ return null; } + public boolean wasEvicted(){ return false; } + public static RemovalNotification create(K p0, V p1, RemovalCause p2){ return null; } +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/cache/Weigher.java b/java/ql/test/stubs/guava-30.0/com/google/common/cache/Weigher.java new file mode 100644 index 00000000000..3e6e0d61e22 --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/cache/Weigher.java @@ -0,0 +1,9 @@ +// Generated automatically from com.google.common.cache.Weigher for testing purposes + +package com.google.common.cache; + + +public interface Weigher +{ + int weigh(K p0, V p1); +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/AbstractMultimap.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/AbstractMultimap.java index 0b9120bfd8b..ce39e44126c 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/collect/AbstractMultimap.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/AbstractMultimap.java @@ -1,90 +1,29 @@ -/* - * Copyright (C) 2012 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Generated automatically from com.google.common.collect.AbstractMultimap for testing purposes package com.google.common.collect; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multiset; import java.util.Collection; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; -abstract class AbstractMultimap implements Multimap { - @Override - public boolean isEmpty() { - return false; - } - - @Override - public boolean containsValue(Object value) { - return false; - } - - @Override - public boolean containsEntry(Object key, Object value) { - return false; - } - - @Override - public boolean remove(Object key, Object value) { - return false; - } - - @Override - public boolean put(K key, V value) { - return false; - } - - @Override - public boolean putAll(K key, Iterable values) { - return false; - } - - @Override - public boolean putAll(Multimap multimap) { - return false; - } - - @Override - public Collection replaceValues(K key, Iterable values) { - return null; - } - - @Override - public Collection> entries() { - return null; - } - - @Override - public Set keySet() { - return null; - } - - @Override - public Multiset keys() { - return null; - } - - @Override - public Collection values() { - return null; - } - - @Override - public Map> asMap() { - return null; - } - +abstract class AbstractMultimap implements Multimap +{ + public Collection> entries(){ return null; } + public Collection replaceValues(K p0, Iterable p1){ return null; } + public Collection values(){ return null; } + public Map> asMap(){ return null; } + public Multiset keys(){ return null; } + public Set keySet(){ return null; } + public String toString(){ return null; } + public boolean containsEntry(Object p0, Object p1){ return false; } + public boolean containsValue(Object p0){ return false; } + public boolean equals(Object p0){ return false; } + public boolean isEmpty(){ return false; } + public boolean put(K p0, V p1){ return false; } + public boolean putAll(K p0, Iterable p1){ return false; } + public boolean putAll(Multimap p0){ return false; } + public boolean remove(Object p0, Object p1){ return false; } + public int hashCode(){ return 0; } } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/BaseImmutableMultimap.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/BaseImmutableMultimap.java new file mode 100644 index 00000000000..9dd8e0b6bfe --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/BaseImmutableMultimap.java @@ -0,0 +1,9 @@ +// Generated automatically from com.google.common.collect.BaseImmutableMultimap for testing purposes + +package com.google.common.collect; + +import com.google.common.collect.AbstractMultimap; + +abstract class BaseImmutableMultimap extends AbstractMultimap +{ +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableCollection.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableCollection.java index 670016cdab6..5bafe704112 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableCollection.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableCollection.java @@ -1,50 +1,37 @@ -/* - * Copyright (C) 2008 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Generated automatically from com.google.common.collect.ImmutableCollection for testing purposes package com.google.common.collect; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.UnmodifiableIterator; import java.io.Serializable; import java.util.AbstractCollection; import java.util.Collection; import java.util.Iterator; +import java.util.Spliterator; +import java.util.function.Predicate; -public abstract class ImmutableCollection extends AbstractCollection implements Serializable { - ImmutableCollection() {} - - public ImmutableList asList() { - return null; - } - - public abstract static class Builder { - Builder() {} - - public abstract Builder add(E element); - - public Builder add(E... elements) { - return null; +abstract public class ImmutableCollection extends AbstractCollection implements Serializable +{ + abstract static public class Builder + { + public ImmutableCollection.Builder add(E... p0){ return null; } + public ImmutableCollection.Builder addAll(Iterable p0){ return null; } + public ImmutableCollection.Builder addAll(Iterator p0){ return null; } + public abstract ImmutableCollection.Builder add(E p0); + public abstract ImmutableCollection build(); } - - public Builder addAll(Iterable elements) { - return null; - } - - public Builder addAll(Iterator elements) { - return null; - } - - public abstract ImmutableCollection build(); - } + public ImmutableList asList(){ return null; } + public Spliterator spliterator(){ return null; } + public abstract UnmodifiableIterator iterator(); + public abstract boolean contains(Object p0); + public final T[] toArray(T[] p0){ return null; } + public final Object[] toArray(){ return null; } + public final boolean add(E p0){ return false; } + public final boolean addAll(Collection p0){ return false; } + public final boolean remove(Object p0){ return false; } + public final boolean removeAll(Collection p0){ return false; } + public final boolean removeIf(Predicate p0){ return false; } + public final boolean retainAll(Collection p0){ return false; } + public final void clear(){} } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableList.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableList.java index 3e4fcf39d0a..5046e1fd2af 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableList.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableList.java @@ -1,101 +1,70 @@ -/* - * Copyright (C) 2007 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Generated automatically from com.google.common.collect.ImmutableList for testing purposes package com.google.common.collect; -import java.util.Arrays; +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.UnmodifiableIterator; +import com.google.common.collect.UnmodifiableListIterator; import java.util.Collection; -import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; +import java.util.RandomAccess; +import java.util.Spliterator; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; +import java.util.stream.Collector; -public abstract class ImmutableList extends ImmutableCollection - implements List{ - - public static ImmutableList of() { - return null; - } - - public static ImmutableList of(E element) { - return null; - } - - public static ImmutableList of(E e1, E e2) { - return null; - } - - public static ImmutableList of(E e1, E e2, E e3) { - return null; - } - - public static ImmutableList of(E e1, E e2, E e3, E e4) { - return null; - } - - public static ImmutableList of( - E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10, E e11, E e12, E... others) { - return null; - } - - public static ImmutableList copyOf(Iterable elements) { - return null; - } - - public static ImmutableList copyOf(Collection elements) { - return null; - } - - public static ImmutableList copyOf(Iterator elements) { - return null; - } - - public static ImmutableList copyOf(E[] elements) { - return null; - } - - public static > ImmutableList sortedCopyOf( - Iterable elements) { - return null; - } - - public static ImmutableList sortedCopyOf( - Comparator comparator, Iterable elements) { - return null; - } - - ImmutableList() {} - - public ImmutableList reverse() { - return null; - } - - public static Builder builder() { - return null; - } - - public static final class Builder extends ImmutableCollection.Builder { - @Override - public Builder add(E element) { - return null; +abstract public class ImmutableList extends ImmutableCollection implements List, RandomAccess +{ + public ImmutableList reverse(){ return null; } + public ImmutableList subList(int p0, int p1){ return null; } + public Spliterator spliterator(){ return null; } + public UnmodifiableIterator iterator(){ return null; } + public UnmodifiableListIterator listIterator(){ return null; } + public UnmodifiableListIterator listIterator(int p0){ return null; } + public boolean contains(Object p0){ return false; } + public boolean equals(Object p0){ return false; } + public final E remove(int p0){ return null; } + public final E set(int p0, E p1){ return null; } + public final ImmutableList asList(){ return null; } + public final boolean addAll(int p0, Collection p1){ return false; } + public final void add(int p0, E p1){} + public final void replaceAll(UnaryOperator p0){} + public final void sort(Comparator p0){} + public int hashCode(){ return 0; } + public int indexOf(Object p0){ return 0; } + public int lastIndexOf(Object p0){ return 0; } + public static > ImmutableList sortedCopyOf(Iterable p0){ return null; } + public static Collector> toImmutableList(){ return null; } + public static ImmutableList.Builder builder(){ return null; } + public static ImmutableList.Builder builderWithExpectedSize(int p0){ return null; } + public static ImmutableList copyOf(Collection p0){ return null; } + public static ImmutableList copyOf(E[] p0){ return null; } + public static ImmutableList copyOf(Iterable p0){ return null; } + public static ImmutableList copyOf(Iterator p0){ return null; } + public static ImmutableList of(){ return null; } + public static ImmutableList of(E p0){ return null; } + public static ImmutableList of(E p0, E p1){ return null; } + public static ImmutableList of(E p0, E p1, E p2){ return null; } + public static ImmutableList of(E p0, E p1, E p2, E p3){ return null; } + public static ImmutableList of(E p0, E p1, E p2, E p3, E p4){ return null; } + public static ImmutableList of(E p0, E p1, E p2, E p3, E p4, E p5){ return null; } + public static ImmutableList of(E p0, E p1, E p2, E p3, E p4, E p5, E p6){ return null; } + public static ImmutableList of(E p0, E p1, E p2, E p3, E p4, E p5, E p6, E p7){ return null; } + public static ImmutableList of(E p0, E p1, E p2, E p3, E p4, E p5, E p6, E p7, E p8){ return null; } + public static ImmutableList of(E p0, E p1, E p2, E p3, E p4, E p5, E p6, E p7, E p8, E p9){ return null; } + public static ImmutableList of(E p0, E p1, E p2, E p3, E p4, E p5, E p6, E p7, E p8, E p9, E p10){ return null; } + public static ImmutableList of(E p0, E p1, E p2, E p3, E p4, E p5, E p6, E p7, E p8, E p9, E p10, E p11, E... p12){ return null; } + public static ImmutableList sortedCopyOf(Comparator p0, Iterable p1){ return null; } + public void forEach(Consumer p0){} + static public class Builder extends ImmutableCollection.Builder + { + public Builder(){} + public ImmutableList.Builder add(E p0){ return null; } + public ImmutableList.Builder add(E... p0){ return null; } + public ImmutableList.Builder addAll(Iterable p0){ return null; } + public ImmutableList.Builder addAll(Iterator p0){ return null; } + public ImmutableList build(){ return null; } } - - @Override - public ImmutableList build() { - return null; - } - } } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMap.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMap.java index 631d25768fb..b4617bb5d1c 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMap.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMap.java @@ -1,149 +1,65 @@ -/* - * Copyright (C) 2008 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Generated automatically from com.google.common.collect.ImmutableMap for testing purposes package com.google.common.collect; -import java.util.Collection; +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSetMultimap; +import java.io.Serializable; import java.util.Comparator; import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.stream.Collector; -public abstract class ImmutableMap implements Map { - public static ImmutableMap of() { - return null; - } - - public static ImmutableMap of(K k1, V v1) { - return null; - } - - public static ImmutableMap of(K k1, V v1, K k2, V v2) { - return null; - } - - public static ImmutableMap of(K k1, V v1, K k2, V v2, K k3, V v3) { - return null; - } - - public static ImmutableMap of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { - return null; - } - - public static ImmutableMap of( - K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { - return null; - } - - public static Builder builder() { - return null; - } - - public static Builder builderWithExpectedSize(int expectedSize) { - return null; - } - - public static class Builder { - public Builder() { +abstract public class ImmutableMap implements Map, Serializable +{ + public ImmutableCollection values(){ return null; } + public ImmutableSet keySet(){ return null; } + public ImmutableSet> entrySet(){ return null; } + public ImmutableSetMultimap asMultimap(){ return null; } + public String toString(){ return null; } + public abstract V get(Object p0); + public boolean containsKey(Object p0){ return false; } + public boolean containsValue(Object p0){ return false; } + public boolean equals(Object p0){ return false; } + public boolean isEmpty(){ return false; } + public final V compute(K p0, BiFunction p1){ return null; } + public final V computeIfAbsent(K p0, Function p1){ return null; } + public final V computeIfPresent(K p0, BiFunction p1){ return null; } + public final V getOrDefault(Object p0, V p1){ return null; } + public final V merge(K p0, V p1, BiFunction p2){ return null; } + public final V put(K p0, V p1){ return null; } + public final V putIfAbsent(K p0, V p1){ return null; } + public final V remove(Object p0){ return null; } + public final V replace(K p0, V p1){ return null; } + public final boolean remove(Object p0, Object p1){ return false; } + public final boolean replace(K p0, V p1, V p2){ return false; } + public final void clear(){} + public final void putAll(Map p0){} + public final void replaceAll(BiFunction p0){} + public int hashCode(){ return 0; } + public static ImmutableMap.Builder builder(){ return null; } + public static ImmutableMap.Builder builderWithExpectedSize(int p0){ return null; } + public static ImmutableMap copyOf(Iterable> p0){ return null; } + public static ImmutableMap copyOf(Map p0){ return null; } + public static ImmutableMap of(){ return null; } + public static ImmutableMap of(K p0, V p1){ return null; } + public static ImmutableMap of(K p0, V p1, K p2, V p3){ return null; } + public static ImmutableMap of(K p0, V p1, K p2, V p3, K p4, V p5){ return null; } + public static ImmutableMap of(K p0, V p1, K p2, V p3, K p4, V p5, K p6, V p7){ return null; } + public static ImmutableMap of(K p0, V p1, K p2, V p3, K p4, V p5, K p6, V p7, K p8, V p9){ return null; } + public static Collector> toImmutableMap(Function p0, Function p1){ return null; } + public static Collector> toImmutableMap(Function p0, Function p1, BinaryOperator p2){ return null; } + static public class Builder + { + public Builder(){} + public ImmutableMap.Builder orderEntriesByValue(Comparator p0){ return null; } + public ImmutableMap.Builder put(K p0, V p1){ return null; } + public ImmutableMap.Builder put(Map.Entry p0){ return null; } + public ImmutableMap.Builder putAll(Iterable> p0){ return null; } + public ImmutableMap.Builder putAll(Map p0){ return null; } + public ImmutableMap build(){ return null; } } - - public Builder put(K key, V value) { - return null; - } - - public Builder put(Entry entry) { - return null; - } - - public Builder putAll(Map map) { - return null; - } - - public Builder putAll(Iterable> entries) { - return null; - } - - public Builder orderEntriesByValue(Comparator valueComparator) { - return null; - } - - public ImmutableMap build() { - return null; - } - - } - public static ImmutableMap copyOf(Map map) { - return null; - } - - public static ImmutableMap copyOf( - Iterable> entries) { - return null; - } - - @Override - public final V put(K k, V v) { - return null; - } - - @Override - public final void putAll(Map map) { - } - - @Override - public final V remove(Object o) { - return null; - } - - @Override - public final void clear() { - } - - @Override - public boolean isEmpty() { - return false; - } - - @Override - public boolean containsKey(Object key) { - return false; - } - - @Override - public boolean containsValue(Object value) { - return false; - } - - @Override - public abstract V get(Object key); - - @Override - public ImmutableSet> entrySet() { - return null; - } - - @Override - public ImmutableSet keySet() { - return null; - } - - @Override - public ImmutableCollection values() { - return null; - } - - // public ImmutableSetMultimap asMultimap() { - // return null; - // } } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultimap.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultimap.java index c1345f72f3f..2eaed07d598 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultimap.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultimap.java @@ -1,128 +1,60 @@ -/* - * Copyright (C) 2008 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Generated automatically from com.google.common.collect.ImmutableMultimap for testing purposes package com.google.common.collect; +import com.google.common.collect.BaseImmutableMultimap; +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultiset; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Multimap; +import java.io.Serializable; import java.util.Collection; import java.util.Comparator; import java.util.Map; -import java.util.Map.Entry; +import java.util.function.BiConsumer; -public abstract class ImmutableMultimap extends AbstractMultimap { - public static ImmutableMultimap of() { - return null; - } - - public static ImmutableMultimap of(K k1, V v1) { - return null; - } - - public static ImmutableMultimap of(K k1, V v1, K k2, V v2) { - return null; - } - - public static ImmutableMultimap of(K k1, V v1, K k2, V v2, K k3, V v3) { - return null; - } - - public static ImmutableMultimap of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { - return null; - } - - public static ImmutableMultimap of( - K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { - return null; - } - - public static Builder builder() { - return null; - } - - public static class Builder { - public Builder() { +abstract public class ImmutableMultimap extends BaseImmutableMultimap implements Serializable +{ + protected ImmutableMultimap() {} + public ImmutableCollection> entries(){ return null; } + public ImmutableCollection removeAll(Object p0){ return null; } + public ImmutableCollection replaceValues(K p0, Iterable p1){ return null; } + public ImmutableCollection values(){ return null; } + public ImmutableMap> asMap(){ return null; } + public ImmutableMultiset keys(){ return null; } + public ImmutableSet keySet(){ return null; } + public abstract ImmutableCollection get(K p0); + public abstract ImmutableMultimap inverse(); + public boolean containsKey(Object p0){ return false; } + public boolean containsValue(Object p0){ return false; } + public boolean put(K p0, V p1){ return false; } + public boolean putAll(K p0, Iterable p1){ return false; } + public boolean putAll(Multimap p0){ return false; } + public boolean remove(Object p0, Object p1){ return false; } + public int size(){ return 0; } + public static ImmutableMultimap.Builder builder(){ return null; } + public static ImmutableMultimap copyOf(Iterable> p0){ return null; } + public static ImmutableMultimap copyOf(Multimap p0){ return null; } + public static ImmutableMultimap of(){ return null; } + public static ImmutableMultimap of(K p0, V p1){ return null; } + public static ImmutableMultimap of(K p0, V p1, K p2, V p3){ return null; } + public static ImmutableMultimap of(K p0, V p1, K p2, V p3, K p4, V p5){ return null; } + public static ImmutableMultimap of(K p0, V p1, K p2, V p3, K p4, V p5, K p6, V p7){ return null; } + public static ImmutableMultimap of(K p0, V p1, K p2, V p3, K p4, V p5, K p6, V p7, K p8, V p9){ return null; } + public void clear(){} + public void forEach(BiConsumer p0){} + static public class Builder + { + public Builder(){} + public ImmutableMultimap.Builder orderKeysBy(Comparator p0){ return null; } + public ImmutableMultimap.Builder orderValuesBy(Comparator p0){ return null; } + public ImmutableMultimap.Builder put(K p0, V p1){ return null; } + public ImmutableMultimap.Builder put(Map.Entry p0){ return null; } + public ImmutableMultimap.Builder putAll(Iterable> p0){ return null; } + public ImmutableMultimap.Builder putAll(K p0, Iterable p1){ return null; } + public ImmutableMultimap.Builder putAll(K p0, V... p1){ return null; } + public ImmutableMultimap.Builder putAll(Multimap p0){ return null; } + public ImmutableMultimap build(){ return null; } } - - public Builder put(K key, V value) { - return null; - } - - public Builder put(Entry entry) { - return null; - } - - public Builder putAll(Iterable> entries) { - return null; - } - - public Builder putAll(K key, Iterable values) { - return null; - } - - public Builder putAll(K key, V... values) { - return null; - } - - public Builder putAll(Multimap multimap) { - return null; - } - - public Builder orderKeysBy(Comparator keyComparator) { - return null; - } - - public Builder orderValuesBy(Comparator valueComparator) { - return null; - } - - public ImmutableMultimap build() { - return null; - } - - } - public static ImmutableMultimap copyOf(Multimap multimap) { - return null; - } - - public static ImmutableMultimap copyOf( - Iterable> entries) { - return null; - } - - @Override - public ImmutableCollection removeAll(Object key) { - return null; - } - - @Override - public void clear() { - } - - @Override - public abstract ImmutableCollection get(K key); - - public abstract ImmutableMultimap inverse(); - - @Override - public boolean containsKey(Object key) { - return false; - } - - @Override - public int size() { - return 0; - } - } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultiset.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultiset.java index 0fb82a18c80..cb6d7422c0b 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultiset.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultiset.java @@ -1,125 +1,54 @@ -/* - * Copyright (C) 2008 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Generated automatically from com.google.common.collect.ImmutableMultiset for testing purposes package com.google.common.collect; -import java.util.Collection; +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMultisetGwtSerializationDependencies; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Multiset; +import com.google.common.collect.UnmodifiableIterator; import java.util.Iterator; +import java.util.function.Function; +import java.util.function.ToIntFunction; +import java.util.stream.Collector; -public abstract class ImmutableMultiset extends ImmutableCollection - implements Multiset { - - public static ImmutableMultiset of() { - return null; - } - - public static ImmutableMultiset of(E element) { - return null; - } - - public static ImmutableMultiset of(E e1, E e2) { - return null; - } - - public static ImmutableMultiset of(E e1, E e2, E e3) { - return null; - } - - public static ImmutableMultiset of(E e1, E e2, E e3, E e4) { - return null; - } - - public static ImmutableMultiset of(E e1, E e2, E e3, E e4, E e5) { - return null; - } - - public static ImmutableMultiset of(E e1, E e2, E e3, E e4, E e5, E e6, E... others) { - return null; - } - - public static ImmutableMultiset copyOf(E[] elements) { - return null; - } - - public static ImmutableMultiset copyOf(Iterable elements) { - return null; - } - - public static ImmutableMultiset copyOf(Iterator elements) { - return null; - } - - @Override - public boolean contains(Object object) { - return false; - } - - @Override - public final int add(E element, int occurrences) { - return 0; - } - - @Override - public final int remove(Object element, int occurrences) { - return 0; - } - - @Override - public final int setCount(E element, int count) { - return 0; - } - - @Override - public final boolean setCount(E element, int oldCount, int newCount) { - return false; - } - - @Override - public abstract ImmutableSet elementSet(); - - @Override - public ImmutableSet> entrySet() { - return null; - } - - public static Builder builder() { - return null; - } - - public static class Builder extends ImmutableCollection.Builder { - public Builder() { +abstract public class ImmutableMultiset extends ImmutableMultisetGwtSerializationDependencies implements Multiset +{ + public ImmutableList asList(){ return null; } + public ImmutableSet> entrySet(){ return null; } + public String toString(){ return null; } + public UnmodifiableIterator iterator(){ return null; } + public abstract ImmutableSet elementSet(); + public boolean contains(Object p0){ return false; } + public boolean equals(Object p0){ return false; } + public final boolean setCount(E p0, int p1, int p2){ return false; } + public final int add(E p0, int p1){ return 0; } + public final int remove(Object p0, int p1){ return 0; } + public final int setCount(E p0, int p1){ return 0; } + public int hashCode(){ return 0; } + public static Collector> toImmutableMultiset(){ return null; } + public static ImmutableMultiset.Builder builder(){ return null; } + public static ImmutableMultiset copyOf(E[] p0){ return null; } + public static ImmutableMultiset copyOf(Iterable p0){ return null; } + public static ImmutableMultiset copyOf(Iterator p0){ return null; } + public static ImmutableMultiset of(){ return null; } + public static ImmutableMultiset of(E p0){ return null; } + public static ImmutableMultiset of(E p0, E p1){ return null; } + public static ImmutableMultiset of(E p0, E p1, E p2){ return null; } + public static ImmutableMultiset of(E p0, E p1, E p2, E p3){ return null; } + public static ImmutableMultiset of(E p0, E p1, E p2, E p3, E p4){ return null; } + public static ImmutableMultiset of(E p0, E p1, E p2, E p3, E p4, E p5, E... p6){ return null; } + public static Collector> toImmutableMultiset(Function p0, ToIntFunction p1){ return null; } + static public class Builder extends ImmutableCollection.Builder + { + public Builder(){} + public ImmutableMultiset.Builder add(E p0){ return null; } + public ImmutableMultiset.Builder add(E... p0){ return null; } + public ImmutableMultiset.Builder addAll(Iterable p0){ return null; } + public ImmutableMultiset.Builder addAll(Iterator p0){ return null; } + public ImmutableMultiset.Builder addCopies(E p0, int p1){ return null; } + public ImmutableMultiset.Builder setCount(E p0, int p1){ return null; } + public ImmutableMultiset build(){ return null; } } - - @Override - public Builder add(E element) { - return null; - } - - public Builder addCopies(E element, int occurrences) { - return null; - } - - public Builder setCount(E element, int count) { - return null; - } - - @Override - public ImmutableMultiset build() { - return null; - } - - } } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java new file mode 100644 index 00000000000..5f1c6da591a --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java @@ -0,0 +1,9 @@ +// Generated automatically from com.google.common.collect.ImmutableMultisetGwtSerializationDependencies for testing purposes + +package com.google.common.collect; + +import com.google.common.collect.ImmutableCollection; + +abstract class ImmutableMultisetGwtSerializationDependencies extends ImmutableCollection +{ +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableSet.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableSet.java index 938b5aedf59..9f1301f595a 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableSet.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableSet.java @@ -1,86 +1,42 @@ -/* - * Copyright (C) 2007 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Generated automatically from com.google.common.collect.ImmutableSet for testing purposes package com.google.common.collect; +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.UnmodifiableIterator; import java.util.Collection; import java.util.Iterator; import java.util.Set; +import java.util.stream.Collector; -public abstract class ImmutableSet extends ImmutableCollection implements Set { - public static ImmutableSet of() { - return null; - } - - public static ImmutableSet of(E element) { - return null; - } - - public static ImmutableSet of(E e1, E e2) { - return null; - } - - public static ImmutableSet of(E e1, E e2, E e3) { - return null; - } - - public static ImmutableSet of(E e1, E e2, E e3, E e4) { - return null; - } - - public static ImmutableSet of(E e1, E e2, E e3, E e4, E e5) { - return null; - } - - public static ImmutableSet of(E e1, E e2, E e3, E e4, E e5, E e6, E... others) { - return null; - } - - public static ImmutableSet copyOf(Collection elements) { - return null; - } - - public static ImmutableSet copyOf(Iterable elements) { - return null; - } - - public static ImmutableSet copyOf(Iterator elements) { - return null; - } - - public static ImmutableSet copyOf(E[] elements) { - return null; - } - - ImmutableSet() {} - - public static Builder builder() { - return null; - } - - public static class Builder extends ImmutableCollection.Builder { - public Builder() { +abstract public class ImmutableSet extends ImmutableCollection implements Set +{ + public ImmutableList asList(){ return null; } + public abstract UnmodifiableIterator iterator(); + public boolean equals(Object p0){ return false; } + public int hashCode(){ return 0; } + public static Collector> toImmutableSet(){ return null; } + public static ImmutableSet.Builder builder(){ return null; } + public static ImmutableSet.Builder builderWithExpectedSize(int p0){ return null; } + public static ImmutableSet copyOf(Collection p0){ return null; } + public static ImmutableSet copyOf(E[] p0){ return null; } + public static ImmutableSet copyOf(Iterable p0){ return null; } + public static ImmutableSet copyOf(Iterator p0){ return null; } + public static ImmutableSet of(){ return null; } + public static ImmutableSet of(E p0){ return null; } + public static ImmutableSet of(E p0, E p1){ return null; } + public static ImmutableSet of(E p0, E p1, E p2){ return null; } + public static ImmutableSet of(E p0, E p1, E p2, E p3){ return null; } + public static ImmutableSet of(E p0, E p1, E p2, E p3, E p4){ return null; } + public static ImmutableSet of(E p0, E p1, E p2, E p3, E p4, E p5, E... p6){ return null; } + static public class Builder extends ImmutableCollection.Builder + { + public Builder(){} + public ImmutableSet.Builder add(E p0){ return null; } + public ImmutableSet.Builder add(E... p0){ return null; } + public ImmutableSet.Builder addAll(Iterable p0){ return null; } + public ImmutableSet.Builder addAll(Iterator p0){ return null; } + public ImmutableSet build(){ return null; } } - - public Builder add(E element) { - return null; - } - - public ImmutableSet build() { - return null; - } - } } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableSetMultimap.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableSetMultimap.java new file mode 100644 index 00000000000..a9b72d12a21 --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/ImmutableSetMultimap.java @@ -0,0 +1,47 @@ +// Generated automatically from com.google.common.collect.ImmutableSetMultimap for testing purposes + +package com.google.common.collect; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Multimap; +import com.google.common.collect.SetMultimap; +import java.util.Comparator; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collector; +import java.util.stream.Stream; + +public class ImmutableSetMultimap extends ImmutableMultimap implements SetMultimap +{ + protected ImmutableSetMultimap() {} + public ImmutableSet> entries(){ return null; } + public ImmutableSet get(K p0){ return null; } + public ImmutableSetMultimap inverse(){ return null; } + public final ImmutableSet removeAll(Object p0){ return null; } + public final ImmutableSet replaceValues(K p0, Iterable p1){ return null; } + public static ImmutableSetMultimap.Builder builder(){ return null; } + public static ImmutableSetMultimap copyOf(Iterable> p0){ return null; } + public static ImmutableSetMultimap copyOf(Multimap p0){ return null; } + public static ImmutableSetMultimap of(){ return null; } + public static ImmutableSetMultimap of(K p0, V p1){ return null; } + public static ImmutableSetMultimap of(K p0, V p1, K p2, V p3){ return null; } + public static ImmutableSetMultimap of(K p0, V p1, K p2, V p3, K p4, V p5){ return null; } + public static ImmutableSetMultimap of(K p0, V p1, K p2, V p3, K p4, V p5, K p6, V p7){ return null; } + public static ImmutableSetMultimap of(K p0, V p1, K p2, V p3, K p4, V p5, K p6, V p7, K p8, V p9){ return null; } + public static Collector> flatteningToImmutableSetMultimap(Function p0, Function> p1){ return null; } + public static Collector> toImmutableSetMultimap(Function p0, Function p1){ return null; } + static public class Builder extends ImmutableMultimap.Builder + { + public Builder(){} + public ImmutableSetMultimap.Builder orderKeysBy(Comparator p0){ return null; } + public ImmutableSetMultimap.Builder orderValuesBy(Comparator p0){ return null; } + public ImmutableSetMultimap.Builder put(K p0, V p1){ return null; } + public ImmutableSetMultimap.Builder put(Map.Entry p0){ return null; } + public ImmutableSetMultimap.Builder putAll(Iterable> p0){ return null; } + public ImmutableSetMultimap.Builder putAll(K p0, Iterable p1){ return null; } + public ImmutableSetMultimap.Builder putAll(K p0, V... p1){ return null; } + public ImmutableSetMultimap.Builder putAll(Multimap p0){ return null; } + public ImmutableSetMultimap build(){ return null; } + } +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/Multimap.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/Multimap.java index 80223a450c9..9cdec55e59c 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/collect/Multimap.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/Multimap.java @@ -1,65 +1,34 @@ -/* - * Copyright (C) 2007 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Generated automatically from com.google.common.collect.Multimap for testing purposes package com.google.common.collect; - +import com.google.common.collect.Multiset; import java.util.Collection; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.function.BiConsumer; -public interface Multimap { - int size(); - - boolean isEmpty(); - - boolean containsKey(Object key); - - boolean containsValue(Object value); - - boolean containsEntry(Object key, Object value); - - boolean put(K key, V value); - - boolean remove(Object key, Object value); - - boolean putAll(K key, Iterable values); - - boolean putAll(Multimap multimap); - - Collection replaceValues(K key, Iterable values); - - Collection removeAll(Object key); - - void clear(); - - Collection get(K key); - - Set keySet(); - - Multiset keys(); - - Collection values(); - - Collection> entries(); - - default void forEach(BiConsumer action) { - } - - Map> asMap(); +public interface Multimap +{ + Collection> entries(); + Collection get(K p0); + Collection removeAll(Object p0); + Collection replaceValues(K p0, Iterable p1); + Collection values(); + Map> asMap(); + Multiset keys(); + Set keySet(); + boolean containsEntry(Object p0, Object p1); + boolean containsKey(Object p0); + boolean containsValue(Object p0); + boolean equals(Object p0); + boolean isEmpty(); + boolean put(K p0, V p1); + boolean putAll(K p0, Iterable p1); + boolean putAll(Multimap p0); + boolean remove(Object p0, Object p1); + default void forEach(BiConsumer p0){} + int hashCode(); + int size(); + void clear(); } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/Multiset.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/Multiset.java index c67f63e79a0..9c6f000078c 100644 --- a/java/ql/test/stubs/guava-30.0/com/google/common/collect/Multiset.java +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/Multiset.java @@ -1,49 +1,43 @@ -/* - * Copyright (C) 2007 The Guava Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Generated automatically from com.google.common.collect.Multiset for testing purposes package com.google.common.collect; - import java.util.Collection; +import java.util.Iterator; import java.util.Set; +import java.util.Spliterator; +import java.util.function.Consumer; import java.util.function.ObjIntConsumer; -public interface Multiset extends Collection { - int count(Object element); - - int add(E element, int occurrences); - - int remove(Object element, int occurrences); - - int setCount(E element, int count); - - boolean setCount(E element, int oldCount, int newCount); - - Set elementSet(); - - Set> entrySet(); - - default void forEachEntry(ObjIntConsumer action) { - } - - boolean equals(Object object); - - interface Entry { - E getElement(); - - int getCount(); - } +public interface Multiset extends Collection +{ + Iterator iterator(); + Set elementSet(); + Set> entrySet(); + String toString(); + boolean add(E p0); + boolean contains(Object p0); + boolean containsAll(Collection p0); + boolean equals(Object p0); + boolean remove(Object p0); + boolean removeAll(Collection p0); + boolean retainAll(Collection p0); + boolean setCount(E p0, int p1, int p2); + default Spliterator spliterator(){ return null; } + default void forEach(Consumer p0){} + default void forEachEntry(ObjIntConsumer p0){} + int add(E p0, int p1); + int count(Object p0); + int hashCode(); + int remove(Object p0, int p1); + int setCount(E p0, int p1); + int size(); + static public interface Entry + { + E getElement(); + String toString(); + boolean equals(Object p0); + int getCount(); + int hashCode(); + } } diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/SetMultimap.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/SetMultimap.java new file mode 100644 index 00000000000..07dd464de7b --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/SetMultimap.java @@ -0,0 +1,18 @@ +// Generated automatically from com.google.common.collect.SetMultimap for testing purposes + +package com.google.common.collect; + +import com.google.common.collect.Multimap; +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +public interface SetMultimap extends Multimap +{ + Map> asMap(); + Set> entries(); + Set get(K p0); + Set removeAll(Object p0); + Set replaceValues(K p0, Iterable p1); + boolean equals(Object p0); +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/UnmodifiableIterator.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/UnmodifiableIterator.java new file mode 100644 index 00000000000..4f6106eaea7 --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/UnmodifiableIterator.java @@ -0,0 +1,11 @@ +// Generated automatically from com.google.common.collect.UnmodifiableIterator for testing purposes + +package com.google.common.collect; + +import java.util.Iterator; + +abstract public class UnmodifiableIterator implements Iterator +{ + protected UnmodifiableIterator(){} + public final void remove(){} +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/collect/UnmodifiableListIterator.java b/java/ql/test/stubs/guava-30.0/com/google/common/collect/UnmodifiableListIterator.java new file mode 100644 index 00000000000..24bb873d35d --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/collect/UnmodifiableListIterator.java @@ -0,0 +1,13 @@ +// Generated automatically from com.google.common.collect.UnmodifiableListIterator for testing purposes + +package com.google.common.collect; + +import com.google.common.collect.UnmodifiableIterator; +import java.util.ListIterator; + +abstract public class UnmodifiableListIterator extends UnmodifiableIterator implements ListIterator +{ + protected UnmodifiableListIterator(){} + public final void add(E p0){} + public final void set(E p0){} +} diff --git a/java/ql/test/stubs/guava-30.0/com/google/common/util/concurrent/ListenableFuture.java b/java/ql/test/stubs/guava-30.0/com/google/common/util/concurrent/ListenableFuture.java new file mode 100644 index 00000000000..3b7844a8a0e --- /dev/null +++ b/java/ql/test/stubs/guava-30.0/com/google/common/util/concurrent/ListenableFuture.java @@ -0,0 +1,11 @@ +// Generated automatically from com.google.common.util.concurrent.ListenableFuture for testing purposes + +package com.google.common.util.concurrent; + +import java.util.concurrent.Executor; +import java.util.concurrent.Future; + +public interface ListenableFuture extends Future +{ + void addListener(Runnable p0, Executor p1); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/AsyncContext.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/AsyncContext.java new file mode 100644 index 00000000000..1f50fb06303 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/AsyncContext.java @@ -0,0 +1,31 @@ +// Generated automatically from javax.servlet.AsyncContext for testing purposes + +package javax.servlet; + +import javax.servlet.AsyncListener; +import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +public interface AsyncContext +{ + T createListener(Class p0); + ServletRequest getRequest(); + ServletResponse getResponse(); + boolean hasOriginalRequestAndResponse(); + long getTimeout(); + static String ASYNC_CONTEXT_PATH = null; + static String ASYNC_MAPPING = null; + static String ASYNC_PATH_INFO = null; + static String ASYNC_QUERY_STRING = null; + static String ASYNC_REQUEST_URI = null; + static String ASYNC_SERVLET_PATH = null; + void addListener(AsyncListener p0); + void addListener(AsyncListener p0, ServletRequest p1, ServletResponse p2); + void complete(); + void dispatch(); + void dispatch(ServletContext p0, String p1); + void dispatch(String p0); + void setTimeout(long p0); + void start(Runnable p0); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/AsyncEvent.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/AsyncEvent.java new file mode 100644 index 00000000000..d7cb9c2b175 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/AsyncEvent.java @@ -0,0 +1,20 @@ +// Generated automatically from javax.servlet.AsyncEvent for testing purposes + +package javax.servlet; + +import javax.servlet.AsyncContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +public class AsyncEvent +{ + protected AsyncEvent() {} + public AsyncContext getAsyncContext(){ return null; } + public AsyncEvent(AsyncContext p0){} + public AsyncEvent(AsyncContext p0, ServletRequest p1, ServletResponse p2){} + public AsyncEvent(AsyncContext p0, ServletRequest p1, ServletResponse p2, Throwable p3){} + public AsyncEvent(AsyncContext p0, Throwable p1){} + public ServletRequest getSuppliedRequest(){ return null; } + public ServletResponse getSuppliedResponse(){ return null; } + public Throwable getThrowable(){ return null; } +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/AsyncListener.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/AsyncListener.java new file mode 100644 index 00000000000..2723482f668 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/AsyncListener.java @@ -0,0 +1,14 @@ +// Generated automatically from javax.servlet.AsyncListener for testing purposes + +package javax.servlet; + +import java.util.EventListener; +import javax.servlet.AsyncEvent; + +public interface AsyncListener extends EventListener +{ + void onComplete(AsyncEvent p0); + void onError(AsyncEvent p0); + void onStartAsync(AsyncEvent p0); + void onTimeout(AsyncEvent p0); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/DispatcherType.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/DispatcherType.java new file mode 100644 index 00000000000..2b7b44f328d --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/DispatcherType.java @@ -0,0 +1,10 @@ +// Generated automatically from javax.servlet.DispatcherType for testing purposes + +package javax.servlet; + + +public enum DispatcherType +{ + ASYNC, ERROR, FORWARD, INCLUDE, REQUEST; + private DispatcherType() {} +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/Filter.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/Filter.java new file mode 100644 index 00000000000..64b9f9d73a8 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/Filter.java @@ -0,0 +1,15 @@ +// Generated automatically from javax.servlet.Filter for testing purposes + +package javax.servlet; + +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +public interface Filter +{ + default void destroy(){} + default void init(FilterConfig p0){} + void doFilter(ServletRequest p0, ServletResponse p1, FilterChain p2); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/FilterChain.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/FilterChain.java new file mode 100644 index 00000000000..f64ab722684 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/FilterChain.java @@ -0,0 +1,11 @@ +// Generated automatically from javax.servlet.FilterChain for testing purposes + +package javax.servlet; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +public interface FilterChain +{ + void doFilter(ServletRequest p0, ServletResponse p1); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/FilterConfig.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/FilterConfig.java new file mode 100644 index 00000000000..0e140c6680c --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/FilterConfig.java @@ -0,0 +1,14 @@ +// Generated automatically from javax.servlet.FilterConfig for testing purposes + +package javax.servlet; + +import java.util.Enumeration; +import javax.servlet.ServletContext; + +public interface FilterConfig +{ + Enumeration getInitParameterNames(); + ServletContext getServletContext(); + String getFilterName(); + String getInitParameter(String p0); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/FilterRegistration.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/FilterRegistration.java new file mode 100644 index 00000000000..6ad0739ceb6 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/FilterRegistration.java @@ -0,0 +1,19 @@ +// Generated automatically from javax.servlet.FilterRegistration for testing purposes + +package javax.servlet; + +import java.util.Collection; +import java.util.EnumSet; +import javax.servlet.DispatcherType; +import javax.servlet.Registration; + +public interface FilterRegistration extends Registration +{ + Collection getServletNameMappings(); + Collection getUrlPatternMappings(); + static public interface Dynamic extends FilterRegistration, Registration.Dynamic + { + } + void addMappingForServletNames(EnumSet p0, boolean p1, String... p2); + void addMappingForUrlPatterns(EnumSet p0, boolean p1, String... p2); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/HttpConstraintElement.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/HttpConstraintElement.java new file mode 100644 index 00000000000..6598aa47cc5 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/HttpConstraintElement.java @@ -0,0 +1,16 @@ +// Generated automatically from javax.servlet.HttpConstraintElement for testing purposes + +package javax.servlet; + +import javax.servlet.annotation.ServletSecurity; + +public class HttpConstraintElement +{ + public HttpConstraintElement(){} + public HttpConstraintElement(ServletSecurity.EmptyRoleSemantic p0){} + public HttpConstraintElement(ServletSecurity.EmptyRoleSemantic p0, ServletSecurity.TransportGuarantee p1, String... p2){} + public HttpConstraintElement(ServletSecurity.TransportGuarantee p0, String... p1){} + public ServletSecurity.EmptyRoleSemantic getEmptyRoleSemantic(){ return null; } + public ServletSecurity.TransportGuarantee getTransportGuarantee(){ return null; } + public String[] getRolesAllowed(){ return null; } +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/HttpMethodConstraintElement.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/HttpMethodConstraintElement.java new file mode 100644 index 00000000000..ddb52527004 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/HttpMethodConstraintElement.java @@ -0,0 +1,13 @@ +// Generated automatically from javax.servlet.HttpMethodConstraintElement for testing purposes + +package javax.servlet; + +import javax.servlet.HttpConstraintElement; + +public class HttpMethodConstraintElement extends HttpConstraintElement +{ + protected HttpMethodConstraintElement() {} + public HttpMethodConstraintElement(String p0){} + public HttpMethodConstraintElement(String p0, HttpConstraintElement p1){} + public String getMethodName(){ return null; } +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/MultipartConfigElement.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/MultipartConfigElement.java new file mode 100644 index 00000000000..8470d9a5317 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/MultipartConfigElement.java @@ -0,0 +1,17 @@ +// Generated automatically from javax.servlet.MultipartConfigElement for testing purposes + +package javax.servlet; + +import javax.servlet.annotation.MultipartConfig; + +public class MultipartConfigElement +{ + protected MultipartConfigElement() {} + public MultipartConfigElement(MultipartConfig p0){} + public MultipartConfigElement(String p0){} + public MultipartConfigElement(String p0, long p1, long p2, int p3){} + public String getLocation(){ return null; } + public int getFileSizeThreshold(){ return 0; } + public long getMaxFileSize(){ return 0; } + public long getMaxRequestSize(){ return 0; } +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ReadListener.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ReadListener.java new file mode 100644 index 00000000000..367594ef7da --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ReadListener.java @@ -0,0 +1,12 @@ +// Generated automatically from javax.servlet.ReadListener for testing purposes + +package javax.servlet; + +import java.util.EventListener; + +public interface ReadListener extends EventListener +{ + void onAllDataRead(); + void onDataAvailable(); + void onError(Throwable p0); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/Registration.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/Registration.java new file mode 100644 index 00000000000..5d4095813ef --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/Registration.java @@ -0,0 +1,20 @@ +// Generated automatically from javax.servlet.Registration for testing purposes + +package javax.servlet; + +import java.util.Map; +import java.util.Set; + +public interface Registration +{ + Map getInitParameters(); + Set setInitParameters(Map p0); + String getClassName(); + String getInitParameter(String p0); + String getName(); + boolean setInitParameter(String p0, String p1); + static public interface Dynamic extends Registration + { + void setAsyncSupported(boolean p0); + } +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/RequestDispatcher.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/RequestDispatcher.java index 287dc4452a8..ad017e4f501 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/RequestDispatcher.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/RequestDispatcher.java @@ -7,6 +7,24 @@ import javax.servlet.ServletResponse; public interface RequestDispatcher { + static String ERROR_EXCEPTION = null; + static String ERROR_EXCEPTION_TYPE = null; + static String ERROR_MESSAGE = null; + static String ERROR_REQUEST_URI = null; + static String ERROR_SERVLET_NAME = null; + static String ERROR_STATUS_CODE = null; + static String FORWARD_CONTEXT_PATH = null; + static String FORWARD_MAPPING = null; + static String FORWARD_PATH_INFO = null; + static String FORWARD_QUERY_STRING = null; + static String FORWARD_REQUEST_URI = null; + static String FORWARD_SERVLET_PATH = null; + static String INCLUDE_CONTEXT_PATH = null; + static String INCLUDE_MAPPING = null; + static String INCLUDE_PATH_INFO = null; + static String INCLUDE_QUERY_STRING = null; + static String INCLUDE_REQUEST_URI = null; + static String INCLUDE_SERVLET_PATH = null; void forward(ServletRequest p0, ServletResponse p1); void include(ServletRequest p0, ServletResponse p1); } diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletConfig.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletConfig.java index 09d75acb268..c483c16ac4e 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletConfig.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletConfig.java @@ -7,7 +7,7 @@ import javax.servlet.ServletContext; public interface ServletConfig { - Enumeration getInitParameterNames(); + Enumeration getInitParameterNames(); ServletContext getServletContext(); String getInitParameter(String p0); String getServletName(); diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletContext.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletContext.java index c9c3cc1112f..5ce42a40282 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletContext.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletContext.java @@ -5,35 +5,79 @@ package javax.servlet; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; +import java.util.EventListener; +import java.util.Map; import java.util.Set; +import javax.servlet.Filter; +import javax.servlet.FilterRegistration; import javax.servlet.RequestDispatcher; import javax.servlet.Servlet; +import javax.servlet.ServletRegistration; +import javax.servlet.SessionCookieConfig; +import javax.servlet.SessionTrackingMode; +import javax.servlet.descriptor.JspConfigDescriptor; public interface ServletContext { - Enumeration getAttributeNames(); - Enumeration getInitParameterNames(); - Enumeration getServletNames(); - Enumeration getServlets(); + T createListener(Class p0); + void addListener(T p0); + T createFilter(Class p0); + T createServlet(Class p0); + ClassLoader getClassLoader(); + Enumeration getServlets(); + Enumeration getAttributeNames(); + Enumeration getInitParameterNames(); + Enumeration getServletNames(); + FilterRegistration getFilterRegistration(String p0); + FilterRegistration.Dynamic addFilter(String p0, Class p1); + FilterRegistration.Dynamic addFilter(String p0, Filter p1); + FilterRegistration.Dynamic addFilter(String p0, String p1); InputStream getResourceAsStream(String p0); + JspConfigDescriptor getJspConfigDescriptor(); + Map getFilterRegistrations(); + Map getServletRegistrations(); Object getAttribute(String p0); RequestDispatcher getNamedDispatcher(String p0); RequestDispatcher getRequestDispatcher(String p0); Servlet getServlet(String p0); ServletContext getContext(String p0); - Set getResourcePaths(String p0); + ServletRegistration getServletRegistration(String p0); + ServletRegistration.Dynamic addJspFile(String p0, String p1); + ServletRegistration.Dynamic addServlet(String p0, Class p1); + ServletRegistration.Dynamic addServlet(String p0, Servlet p1); + ServletRegistration.Dynamic addServlet(String p0, String p1); + SessionCookieConfig getSessionCookieConfig(); + Set getDefaultSessionTrackingModes(); + Set getEffectiveSessionTrackingModes(); + Set getResourcePaths(String p0); String getContextPath(); String getInitParameter(String p0); String getMimeType(String p0); String getRealPath(String p0); + String getRequestCharacterEncoding(); + String getResponseCharacterEncoding(); String getServerInfo(); String getServletContextName(); + String getVirtualServerName(); URL getResource(String p0); + boolean setInitParameter(String p0, String p1); + int getEffectiveMajorVersion(); + int getEffectiveMinorVersion(); int getMajorVersion(); int getMinorVersion(); + int getSessionTimeout(); + static String ORDERED_LIBS = null; + static String TEMPDIR = null; + void addListener(Class p0); + void addListener(String p0); + void declareRoles(String... p0); void log(Exception p0, String p1); void log(String p0); void log(String p0, Throwable p1); void removeAttribute(String p0); void setAttribute(String p0, Object p1); + void setRequestCharacterEncoding(String p0); + void setResponseCharacterEncoding(String p0); + void setSessionTimeout(int p0); + void setSessionTrackingModes(Set p0); } diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletInputStream.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletInputStream.java index ddaf28ba36a..31034066970 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletInputStream.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletInputStream.java @@ -3,9 +3,13 @@ package javax.servlet; import java.io.InputStream; +import javax.servlet.ReadListener; abstract public class ServletInputStream extends InputStream { protected ServletInputStream(){} + public abstract boolean isFinished(); + public abstract boolean isReady(); + public abstract void setReadListener(ReadListener p0); public int readLine(byte[] p0, int p1, int p2){ return 0; } } diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletOutputStream.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletOutputStream.java index 18f93cc0ec3..52a2162c9eb 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletOutputStream.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletOutputStream.java @@ -3,10 +3,13 @@ package javax.servlet; import java.io.OutputStream; +import javax.servlet.WriteListener; abstract public class ServletOutputStream extends OutputStream { protected ServletOutputStream(){} + public abstract boolean isReady(); + public abstract void setWriteListener(WriteListener p0); public void print(String p0){} public void print(boolean p0){} public void print(char p0){} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRegistration.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRegistration.java new file mode 100644 index 00000000000..a1cc66f2d19 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRegistration.java @@ -0,0 +1,23 @@ +// Generated automatically from javax.servlet.ServletRegistration for testing purposes + +package javax.servlet; + +import java.util.Collection; +import java.util.Set; +import javax.servlet.MultipartConfigElement; +import javax.servlet.Registration; +import javax.servlet.ServletSecurityElement; + +public interface ServletRegistration extends Registration +{ + Collection getMappings(); + Set addMapping(String... p0); + String getRunAsRole(); + static public interface Dynamic extends Registration.Dynamic, ServletRegistration + { + Set setServletSecurity(ServletSecurityElement p0); + void setLoadOnStartup(int p0); + void setMultipartConfig(MultipartConfigElement p0); + void setRunAsRole(String p0); + } +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRequest.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRequest.java index d4f4343b70c..fc0db462cc0 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRequest.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRequest.java @@ -6,19 +6,28 @@ import java.io.BufferedReader; import java.util.Enumeration; import java.util.Locale; import java.util.Map; +import javax.servlet.AsyncContext; +import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; import javax.servlet.ServletInputStream; +import javax.servlet.ServletResponse; public interface ServletRequest { + AsyncContext getAsyncContext(); + AsyncContext startAsync(); + AsyncContext startAsync(ServletRequest p0, ServletResponse p1); BufferedReader getReader(); - Enumeration getAttributeNames(); - Enumeration getLocales(); - Enumeration getParameterNames(); + DispatcherType getDispatcherType(); + Enumeration getLocales(); + Enumeration getAttributeNames(); + Enumeration getParameterNames(); Locale getLocale(); - Map getParameterMap(); + Map getParameterMap(); Object getAttribute(String p0); RequestDispatcher getRequestDispatcher(String p0); + ServletContext getServletContext(); ServletInputStream getInputStream(); String getCharacterEncoding(); String getContentType(); @@ -32,11 +41,14 @@ public interface ServletRequest String getScheme(); String getServerName(); String[] getParameterValues(String p0); + boolean isAsyncStarted(); + boolean isAsyncSupported(); boolean isSecure(); int getContentLength(); int getLocalPort(); int getRemotePort(); int getServerPort(); + long getContentLengthLong(); void removeAttribute(String p0); void setAttribute(String p0, Object p1); void setCharacterEncoding(String p0); diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRequestWrapper.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRequestWrapper.java new file mode 100644 index 00000000000..df7c719c44a --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletRequestWrapper.java @@ -0,0 +1,62 @@ +// Generated automatically from javax.servlet.ServletRequestWrapper for testing purposes + +package javax.servlet; + +import java.io.BufferedReader; +import java.util.Enumeration; +import java.util.Locale; +import java.util.Map; +import javax.servlet.AsyncContext; +import javax.servlet.DispatcherType; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +public class ServletRequestWrapper implements ServletRequest +{ + protected ServletRequestWrapper() {} + public AsyncContext getAsyncContext(){ return null; } + public AsyncContext startAsync(){ return null; } + public AsyncContext startAsync(ServletRequest p0, ServletResponse p1){ return null; } + public BufferedReader getReader(){ return null; } + public DispatcherType getDispatcherType(){ return null; } + public Enumeration getLocales(){ return null; } + public Enumeration getAttributeNames(){ return null; } + public Enumeration getParameterNames(){ return null; } + public Locale getLocale(){ return null; } + public Map getParameterMap(){ return null; } + public Object getAttribute(String p0){ return null; } + public RequestDispatcher getRequestDispatcher(String p0){ return null; } + public ServletContext getServletContext(){ return null; } + public ServletInputStream getInputStream(){ return null; } + public ServletRequest getRequest(){ return null; } + public ServletRequestWrapper(ServletRequest p0){} + public String getCharacterEncoding(){ return null; } + public String getContentType(){ return null; } + public String getLocalAddr(){ return null; } + public String getLocalName(){ return null; } + public String getParameter(String p0){ return null; } + public String getProtocol(){ return null; } + public String getRealPath(String p0){ return null; } + public String getRemoteAddr(){ return null; } + public String getRemoteHost(){ return null; } + public String getScheme(){ return null; } + public String getServerName(){ return null; } + public String[] getParameterValues(String p0){ return null; } + public boolean isAsyncStarted(){ return false; } + public boolean isAsyncSupported(){ return false; } + public boolean isSecure(){ return false; } + public boolean isWrapperFor(Class p0){ return false; } + public boolean isWrapperFor(ServletRequest p0){ return false; } + public int getContentLength(){ return 0; } + public int getLocalPort(){ return 0; } + public int getRemotePort(){ return 0; } + public int getServerPort(){ return 0; } + public long getContentLengthLong(){ return 0; } + public void removeAttribute(String p0){} + public void setAttribute(String p0, Object p1){} + public void setCharacterEncoding(String p0){} + public void setRequest(ServletRequest p0){} +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletResponse.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletResponse.java index 38659f14516..db6610bc15d 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletResponse.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletResponse.java @@ -21,6 +21,7 @@ public interface ServletResponse void setBufferSize(int p0); void setCharacterEncoding(String p0); void setContentLength(int p0); + void setContentLengthLong(long p0); void setContentType(String p0); void setLocale(Locale p0); } diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletResponseWrapper.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletResponseWrapper.java new file mode 100644 index 00000000000..c8105f36ce9 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletResponseWrapper.java @@ -0,0 +1,34 @@ +// Generated automatically from javax.servlet.ServletResponseWrapper for testing purposes + +package javax.servlet; + +import java.io.PrintWriter; +import java.util.Locale; +import javax.servlet.ServletOutputStream; +import javax.servlet.ServletResponse; + +public class ServletResponseWrapper implements ServletResponse +{ + protected ServletResponseWrapper() {} + public Locale getLocale(){ return null; } + public PrintWriter getWriter(){ return null; } + public ServletOutputStream getOutputStream(){ return null; } + public ServletResponse getResponse(){ return null; } + public ServletResponseWrapper(ServletResponse p0){} + public String getCharacterEncoding(){ return null; } + public String getContentType(){ return null; } + public boolean isCommitted(){ return false; } + public boolean isWrapperFor(Class p0){ return false; } + public boolean isWrapperFor(ServletResponse p0){ return false; } + public int getBufferSize(){ return 0; } + public void flushBuffer(){} + public void reset(){} + public void resetBuffer(){} + public void setBufferSize(int p0){} + public void setCharacterEncoding(String p0){} + public void setContentLength(int p0){} + public void setContentLengthLong(long p0){} + public void setContentType(String p0){} + public void setLocale(Locale p0){} + public void setResponse(ServletResponse p0){} +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletSecurityElement.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletSecurityElement.java new file mode 100644 index 00000000000..def47937391 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/ServletSecurityElement.java @@ -0,0 +1,19 @@ +// Generated automatically from javax.servlet.ServletSecurityElement for testing purposes + +package javax.servlet; + +import java.util.Collection; +import javax.servlet.HttpConstraintElement; +import javax.servlet.HttpMethodConstraintElement; +import javax.servlet.annotation.ServletSecurity; + +public class ServletSecurityElement extends HttpConstraintElement +{ + public Collection getHttpMethodConstraints(){ return null; } + public Collection getMethodNames(){ return null; } + public ServletSecurityElement(){} + public ServletSecurityElement(Collection p0){} + public ServletSecurityElement(HttpConstraintElement p0){} + public ServletSecurityElement(HttpConstraintElement p0, Collection p1){} + public ServletSecurityElement(ServletSecurity p0){} +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/SessionCookieConfig.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/SessionCookieConfig.java new file mode 100644 index 00000000000..4cae9a11f30 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/SessionCookieConfig.java @@ -0,0 +1,22 @@ +// Generated automatically from javax.servlet.SessionCookieConfig for testing purposes + +package javax.servlet; + + +public interface SessionCookieConfig +{ + String getComment(); + String getDomain(); + String getName(); + String getPath(); + boolean isHttpOnly(); + boolean isSecure(); + int getMaxAge(); + void setComment(String p0); + void setDomain(String p0); + void setHttpOnly(boolean p0); + void setMaxAge(int p0); + void setName(String p0); + void setPath(String p0); + void setSecure(boolean p0); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/SessionTrackingMode.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/SessionTrackingMode.java new file mode 100644 index 00000000000..684ac40c56f --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/SessionTrackingMode.java @@ -0,0 +1,10 @@ +// Generated automatically from javax.servlet.SessionTrackingMode for testing purposes + +package javax.servlet; + + +public enum SessionTrackingMode +{ + COOKIE, SSL, URL; + private SessionTrackingMode() {} +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/WriteListener.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/WriteListener.java new file mode 100644 index 00000000000..24fe504271c --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/WriteListener.java @@ -0,0 +1,11 @@ +// Generated automatically from javax.servlet.WriteListener for testing purposes + +package javax.servlet; + +import java.util.EventListener; + +public interface WriteListener extends EventListener +{ + void onError(Throwable p0); + void onWritePossible(); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/annotation/HttpConstraint.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/annotation/HttpConstraint.java new file mode 100644 index 00000000000..ef2a244342c --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/annotation/HttpConstraint.java @@ -0,0 +1,13 @@ +// Generated automatically from javax.servlet.annotation.HttpConstraint for testing purposes + +package javax.servlet.annotation; + +import java.lang.annotation.Annotation; +import javax.servlet.annotation.ServletSecurity; + +public interface HttpConstraint extends Annotation +{ + ServletSecurity.EmptyRoleSemantic value(); + ServletSecurity.TransportGuarantee transportGuarantee(); + String[] rolesAllowed(); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/annotation/MultipartConfig.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/annotation/MultipartConfig.java new file mode 100644 index 00000000000..6b41173f6fa --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/annotation/MultipartConfig.java @@ -0,0 +1,13 @@ +// Generated automatically from javax.servlet.annotation.MultipartConfig for testing purposes + +package javax.servlet.annotation; + +import java.lang.annotation.Annotation; + +public interface MultipartConfig extends Annotation +{ + String location(); + int fileSizeThreshold(); + long maxFileSize(); + long maxRequestSize(); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/annotation/ServletSecurity.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/annotation/ServletSecurity.java new file mode 100644 index 00000000000..34e181ad6da --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/annotation/ServletSecurity.java @@ -0,0 +1,21 @@ +// Generated automatically from javax.servlet.annotation.ServletSecurity for testing purposes + +package javax.servlet.annotation; + +import java.lang.annotation.Annotation; +import javax.servlet.annotation.HttpConstraint; + +public interface ServletSecurity extends Annotation +{ + HttpConstraint value(); + static public enum EmptyRoleSemantic + { + DENY, PERMIT; + private EmptyRoleSemantic() {} + } + static public enum TransportGuarantee + { + CONFIDENTIAL, NONE; + private TransportGuarantee() {} + } +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/descriptor/JspConfigDescriptor.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/descriptor/JspConfigDescriptor.java new file mode 100644 index 00000000000..8d93a4318d7 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/descriptor/JspConfigDescriptor.java @@ -0,0 +1,13 @@ +// Generated automatically from javax.servlet.descriptor.JspConfigDescriptor for testing purposes + +package javax.servlet.descriptor; + +import java.util.Collection; +import javax.servlet.descriptor.JspPropertyGroupDescriptor; +import javax.servlet.descriptor.TaglibDescriptor; + +public interface JspConfigDescriptor +{ + Collection getJspPropertyGroups(); + Collection getTaglibs(); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/descriptor/JspPropertyGroupDescriptor.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/descriptor/JspPropertyGroupDescriptor.java new file mode 100644 index 00000000000..dd852fa1088 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/descriptor/JspPropertyGroupDescriptor.java @@ -0,0 +1,21 @@ +// Generated automatically from javax.servlet.descriptor.JspPropertyGroupDescriptor for testing purposes + +package javax.servlet.descriptor; + +import java.util.Collection; + +public interface JspPropertyGroupDescriptor +{ + Collection getIncludeCodas(); + Collection getIncludePreludes(); + Collection getUrlPatterns(); + String getBuffer(); + String getDefaultContentType(); + String getDeferredSyntaxAllowedAsLiteral(); + String getElIgnored(); + String getErrorOnUndeclaredNamespace(); + String getIsXml(); + String getPageEncoding(); + String getScriptingInvalid(); + String getTrimDirectiveWhitespaces(); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/descriptor/TaglibDescriptor.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/descriptor/TaglibDescriptor.java new file mode 100644 index 00000000000..c3dd5c10473 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/descriptor/TaglibDescriptor.java @@ -0,0 +1,10 @@ +// Generated automatically from javax.servlet.descriptor.TaglibDescriptor for testing purposes + +package javax.servlet.descriptor; + + +public interface TaglibDescriptor +{ + String getTaglibLocation(); + String getTaglibURI(); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/Cookie.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/Cookie.java index 2033a9fd936..b5a180029be 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/Cookie.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/Cookie.java @@ -2,8 +2,9 @@ package javax.servlet.http; +import java.io.Serializable; -public class Cookie implements Cloneable +public class Cookie implements Cloneable, Serializable { protected Cookie() {} public Cookie(String p0, String p1){} @@ -14,10 +15,12 @@ public class Cookie implements Cloneable public String getPath(){ return null; } public String getValue(){ return null; } public boolean getSecure(){ return false; } + public boolean isHttpOnly(){ return false; } public int getMaxAge(){ return 0; } public int getVersion(){ return 0; } public void setComment(String p0){} public void setDomain(String p0){} + public void setHttpOnly(boolean p0){} public void setMaxAge(int p0){} public void setPath(String p0){} public void setSecure(boolean p0){} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletMapping.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletMapping.java new file mode 100644 index 00000000000..1b597f27773 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletMapping.java @@ -0,0 +1,13 @@ +// Generated automatically from javax.servlet.http.HttpServletMapping for testing purposes + +package javax.servlet.http; + +import javax.servlet.http.MappingMatch; + +public interface HttpServletMapping +{ + MappingMatch getMappingMatch(); + String getMatchValue(); + String getPattern(); + String getServletName(); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletRequest.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletRequest.java index 53f6fc8a9db..9667967473a 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletRequest.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletRequest.java @@ -3,19 +3,28 @@ package javax.servlet.http; import java.security.Principal; +import java.util.Collection; import java.util.Enumeration; +import java.util.Map; import javax.servlet.ServletRequest; import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletMapping; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import javax.servlet.http.Part; +import javax.servlet.http.PushBuilder; public interface HttpServletRequest extends ServletRequest { + Collection getParts(); Cookie[] getCookies(); - Enumeration getHeaderNames(); - Enumeration getHeaders(String p0); + Enumeration getHeaderNames(); + Enumeration getHeaders(String p0); HttpSession getSession(); HttpSession getSession(boolean p0); + Part getPart(String p0); Principal getUserPrincipal(); + String changeSessionId(); String getAuthType(); String getContextPath(); String getHeader(String p0); @@ -28,15 +37,22 @@ public interface HttpServletRequest extends ServletRequest String getRequestedSessionId(); String getServletPath(); StringBuffer getRequestURL(); + boolean authenticate(HttpServletResponse p0); boolean isRequestedSessionIdFromCookie(); boolean isRequestedSessionIdFromURL(); boolean isRequestedSessionIdFromUrl(); boolean isRequestedSessionIdValid(); boolean isUserInRole(String p0); + default HttpServletMapping getHttpServletMapping(){ return null; } + default Map getTrailerFields(){ return null; } + default PushBuilder newPushBuilder(){ return null; } + default boolean isTrailerFieldsReady(){ return false; } int getIntHeader(String p0); long getDateHeader(String p0); static String BASIC_AUTH = null; static String CLIENT_CERT_AUTH = null; static String DIGEST_AUTH = null; static String FORM_AUTH = null; + void login(String p0, String p1); + void logout(); } diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletRequestWrapper.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletRequestWrapper.java new file mode 100644 index 00000000000..17ade0faf3a --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletRequestWrapper.java @@ -0,0 +1,57 @@ +// Generated automatically from javax.servlet.http.HttpServletRequestWrapper for testing purposes + +package javax.servlet.http; + +import java.security.Principal; +import java.util.Collection; +import java.util.Enumeration; +import java.util.Map; +import javax.servlet.ServletRequestWrapper; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletMapping; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.servlet.http.Part; +import javax.servlet.http.PushBuilder; + +public class HttpServletRequestWrapper extends ServletRequestWrapper implements HttpServletRequest +{ + protected HttpServletRequestWrapper() {} + public Collection getParts(){ return null; } + public Cookie[] getCookies(){ return null; } + public Enumeration getHeaderNames(){ return null; } + public Enumeration getHeaders(String p0){ return null; } + public HttpServletMapping getHttpServletMapping(){ return null; } + public HttpServletRequestWrapper(HttpServletRequest p0){} + public HttpSession getSession(){ return null; } + public HttpSession getSession(boolean p0){ return null; } + public Map getTrailerFields(){ return null; } + public Part getPart(String p0){ return null; } + public Principal getUserPrincipal(){ return null; } + public PushBuilder newPushBuilder(){ return null; } + public String changeSessionId(){ return null; } + public String getAuthType(){ return null; } + public String getContextPath(){ return null; } + public String getHeader(String p0){ return null; } + public String getMethod(){ return null; } + public String getPathInfo(){ return null; } + public String getPathTranslated(){ return null; } + public String getQueryString(){ return null; } + public String getRemoteUser(){ return null; } + public String getRequestURI(){ return null; } + public String getRequestedSessionId(){ return null; } + public String getServletPath(){ return null; } + public StringBuffer getRequestURL(){ return null; } + public boolean authenticate(HttpServletResponse p0){ return false; } + public boolean isRequestedSessionIdFromCookie(){ return false; } + public boolean isRequestedSessionIdFromURL(){ return false; } + public boolean isRequestedSessionIdFromUrl(){ return false; } + public boolean isRequestedSessionIdValid(){ return false; } + public boolean isTrailerFieldsReady(){ return false; } + public boolean isUserInRole(String p0){ return false; } + public int getIntHeader(String p0){ return 0; } + public long getDateHeader(String p0){ return 0; } + public void login(String p0, String p1){} + public void logout(){} +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletResponse.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletResponse.java new file mode 100644 index 00000000000..da902dbf30c --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletResponse.java @@ -0,0 +1,77 @@ +// Generated automatically from javax.servlet.http.HttpServletResponse for testing purposes + +package javax.servlet.http; + +import java.util.Collection; +import java.util.Map; +import java.util.function.Supplier; +import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; + +public interface HttpServletResponse extends ServletResponse +{ + Collection getHeaderNames(); + Collection getHeaders(String p0); + String encodeRedirectURL(String p0); + String encodeRedirectUrl(String p0); + String encodeURL(String p0); + String encodeUrl(String p0); + String getHeader(String p0); + boolean containsHeader(String p0); + default Supplier> getTrailerFields(){ return null; } + default void setTrailerFields(Supplier> p0){} + int getStatus(); + static int SC_ACCEPTED = 0; + static int SC_BAD_GATEWAY = 0; + static int SC_BAD_REQUEST = 0; + static int SC_CONFLICT = 0; + static int SC_CONTINUE = 0; + static int SC_CREATED = 0; + static int SC_EXPECTATION_FAILED = 0; + static int SC_FORBIDDEN = 0; + static int SC_FOUND = 0; + static int SC_GATEWAY_TIMEOUT = 0; + static int SC_GONE = 0; + static int SC_HTTP_VERSION_NOT_SUPPORTED = 0; + static int SC_INTERNAL_SERVER_ERROR = 0; + static int SC_LENGTH_REQUIRED = 0; + static int SC_METHOD_NOT_ALLOWED = 0; + static int SC_MOVED_PERMANENTLY = 0; + static int SC_MOVED_TEMPORARILY = 0; + static int SC_MULTIPLE_CHOICES = 0; + static int SC_NON_AUTHORITATIVE_INFORMATION = 0; + static int SC_NOT_ACCEPTABLE = 0; + static int SC_NOT_FOUND = 0; + static int SC_NOT_IMPLEMENTED = 0; + static int SC_NOT_MODIFIED = 0; + static int SC_NO_CONTENT = 0; + static int SC_OK = 0; + static int SC_PARTIAL_CONTENT = 0; + static int SC_PAYMENT_REQUIRED = 0; + static int SC_PRECONDITION_FAILED = 0; + static int SC_PROXY_AUTHENTICATION_REQUIRED = 0; + static int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 0; + static int SC_REQUEST_ENTITY_TOO_LARGE = 0; + static int SC_REQUEST_TIMEOUT = 0; + static int SC_REQUEST_URI_TOO_LONG = 0; + static int SC_RESET_CONTENT = 0; + static int SC_SEE_OTHER = 0; + static int SC_SERVICE_UNAVAILABLE = 0; + static int SC_SWITCHING_PROTOCOLS = 0; + static int SC_TEMPORARY_REDIRECT = 0; + static int SC_UNAUTHORIZED = 0; + static int SC_UNSUPPORTED_MEDIA_TYPE = 0; + static int SC_USE_PROXY = 0; + void addCookie(Cookie p0); + void addDateHeader(String p0, long p1); + void addHeader(String p0, String p1); + void addIntHeader(String p0, int p1); + void sendError(int p0); + void sendError(int p0, String p1); + void sendRedirect(String p0); + void setDateHeader(String p0, long p1); + void setHeader(String p0, String p1); + void setIntHeader(String p0, int p1); + void setStatus(int p0); + void setStatus(int p0, String p1); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletResponseWrapper.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletResponseWrapper.java new file mode 100644 index 00000000000..01f33f73794 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpServletResponseWrapper.java @@ -0,0 +1,39 @@ +// Generated automatically from javax.servlet.http.HttpServletResponseWrapper for testing purposes + +package javax.servlet.http; + +import java.util.Collection; +import java.util.Map; +import java.util.function.Supplier; +import javax.servlet.ServletResponseWrapper; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; + +public class HttpServletResponseWrapper extends ServletResponseWrapper implements HttpServletResponse +{ + protected HttpServletResponseWrapper() {} + public Collection getHeaderNames(){ return null; } + public Collection getHeaders(String p0){ return null; } + public HttpServletResponseWrapper(HttpServletResponse p0){} + public String encodeRedirectURL(String p0){ return null; } + public String encodeRedirectUrl(String p0){ return null; } + public String encodeURL(String p0){ return null; } + public String encodeUrl(String p0){ return null; } + public String getHeader(String p0){ return null; } + public Supplier> getTrailerFields(){ return null; } + public boolean containsHeader(String p0){ return false; } + public int getStatus(){ return 0; } + public void addCookie(Cookie p0){} + public void addDateHeader(String p0, long p1){} + public void addHeader(String p0, String p1){} + public void addIntHeader(String p0, int p1){} + public void sendError(int p0){} + public void sendError(int p0, String p1){} + public void sendRedirect(String p0){} + public void setDateHeader(String p0, long p1){} + public void setHeader(String p0, String p1){} + public void setIntHeader(String p0, int p1){} + public void setStatus(int p0){} + public void setStatus(int p0, String p1){} + public void setTrailerFields(Supplier> p0){} +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpSession.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpSession.java index c1153ae8aac..f8f455b1423 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpSession.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpSession.java @@ -8,7 +8,7 @@ import javax.servlet.http.HttpSessionContext; public interface HttpSession { - Enumeration getAttributeNames(); + Enumeration getAttributeNames(); HttpSessionContext getSessionContext(); Object getAttribute(String p0); Object getValue(String p0); diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpSessionContext.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpSessionContext.java index 321cd23e5be..97a77b48358 100644 --- a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpSessionContext.java +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/HttpSessionContext.java @@ -7,6 +7,6 @@ import javax.servlet.http.HttpSession; public interface HttpSessionContext { - Enumeration getIds(); + Enumeration getIds(); HttpSession getSession(String p0); } diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/MappingMatch.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/MappingMatch.java new file mode 100644 index 00000000000..0432fd2ef7d --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/MappingMatch.java @@ -0,0 +1,10 @@ +// Generated automatically from javax.servlet.http.MappingMatch for testing purposes + +package javax.servlet.http; + + +public enum MappingMatch +{ + CONTEXT_ROOT, DEFAULT, EXACT, EXTENSION, PATH; + private MappingMatch() {} +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/Part.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/Part.java new file mode 100644 index 00000000000..a4e599748a5 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/Part.java @@ -0,0 +1,20 @@ +// Generated automatically from javax.servlet.http.Part for testing purposes + +package javax.servlet.http; + +import java.io.InputStream; +import java.util.Collection; + +public interface Part +{ + Collection getHeaderNames(); + Collection getHeaders(String p0); + InputStream getInputStream(); + String getContentType(); + String getHeader(String p0); + String getName(); + String getSubmittedFileName(); + long getSize(); + void delete(); + void write(String p0); +} diff --git a/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/PushBuilder.java b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/PushBuilder.java new file mode 100644 index 00000000000..195e2426a83 --- /dev/null +++ b/java/ql/test/stubs/javax-servlet-2.5/javax/servlet/http/PushBuilder.java @@ -0,0 +1,23 @@ +// Generated automatically from javax.servlet.http.PushBuilder for testing purposes + +package javax.servlet.http; + +import java.util.Set; + +public interface PushBuilder +{ + PushBuilder addHeader(String p0, String p1); + PushBuilder method(String p0); + PushBuilder path(String p0); + PushBuilder queryString(String p0); + PushBuilder removeHeader(String p0); + PushBuilder sessionId(String p0); + PushBuilder setHeader(String p0, String p1); + Set getHeaderNames(); + String getHeader(String p0); + String getMethod(); + String getPath(); + String getQueryString(); + String getSessionId(); + void push(); +} diff --git a/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonArray.java b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonArray.java new file mode 100644 index 00000000000..e86747fc8c5 --- /dev/null +++ b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonArray.java @@ -0,0 +1,293 @@ +// Copyright (c) 2003-present, Jodd Team (http://jodd.org) +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +package jodd.json; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * Representation of JSON array. + * @see JsonObject + */ +public class JsonArray implements Iterable { + + /** + * Creates an empty instance. + */ + public JsonArray() { + } + + /** + * Creates an instance from a List. The List is not copied. + */ + public JsonArray(final List list) { + } + + // ---------------------------------------------------------------- get + + /** + * Returns the string at position {@code pos} in the array. + */ + public String getString(final int pos) { + return null; + } + + /** + * Returns the integer at position {@code pos} in the array. + */ + public Integer getInteger(final int pos) { + return null; + } + + /** + * Returns the long at position {@code pos} in the array. + */ + public Long getLong(final int pos) { + return null; + } + + /** + * Returns the double at position {@code pos} in the array. + */ + public Double getDouble(final int pos) { + return null; + } + + /** + * Returns the Float at position {@code pos} in the array. + */ + public Float getFloat(final int pos) { + return null; + } + + /** + * Returns the boolean at position {@code pos} in the array. + */ + public Boolean getBoolean(final int pos) { + return null; + } + + /** + * Returns the JsonObject at position {@code pos} in the array. + */ + public JsonObject getJsonObject(final int pos) { + return null; + } + + /** + * Returns the JsonArray at position {@code pos} in the array. + */ + public JsonArray getJsonArray(final int pos) { + return null; + } + + /** + * Returns the byte[] at position {@code pos} in the array. + *

    + * JSON itself has no notion of a binary, so this method assumes there is a String value and + * it contains a Base64 encoded binary, which it decodes if found and returns. + */ + public byte[] getBinary(final int pos) { + return null; + } + + /** + * Returns the object value at position {@code pos} in the array. + */ + public Object getValue(final int pos) { + return null; + } + + /** + * Returns {@code true} if there is a {@code null} value at given index. + */ + public boolean hasNull(final int pos) { + return false; + } + + /** + * Adds an enum to the JSON array. + *

    + * JSON has no concept of encoding Enums, so the Enum will be converted to a String using the {@link java.lang.Enum#name} + * method and the value added as a String. + */ + public JsonArray add(final Enum value) { + return null; + } + + /** + * Adds a {@code CharSequence} to the JSON array. + */ + public JsonArray add(final CharSequence value) { + return null; + } + + /** + * Adds a string to the JSON array. + */ + public JsonArray add(final String value) { + return null; + } + + /** + * Adds an integer to the JSON array. + */ + public JsonArray add(final Integer value) { + return null; + } + + /** + * Adds a long to the JSON array. + */ + public JsonArray add(final Long value) { + return null; + } + + /** + * Adds a double to the JSON array. + */ + public JsonArray add(final Double value) { + return null; + } + + /** + * Adds a float to the JSON array. + */ + public JsonArray add(final Float value) { + return null; + } + + /** + * Adds a boolean to the JSON array. + */ + public JsonArray add(final Boolean value) { + return null; + } + + /** + * Adds a {@code null} value to the JSON array. + */ + public JsonArray addNull() { + return null; + } + + /** + * Adds a JSON object to the JSON array. + */ + public JsonArray add(final JsonObject value) { + return null; + } + + /** + * Adds another JSON array to the JSON array. + */ + public JsonArray add(final JsonArray value) { + return null; + } + + /** + * Adds a binary value to the JSON array. + *

    + * JSON has no notion of binary so the binary will be base64 encoded to a String, and the String added. + */ + public JsonArray add(final byte[] value) { + return null; + } + + /** + * Adds an object to the JSON array. + */ + public JsonArray add(Object value) { + return null; + } + + /** + * Appends all of the elements in the specified array to the end of this JSON array. + */ + public JsonArray addAll(final JsonArray array) { + return null; + } + + // ---------------------------------------------------------------- misc + + /** + * Returns {@code true} if given value exist. + */ + public boolean contains(final Object value) { + return false; + } + + /** + * Removes the specified value from the JSON array. + */ + public boolean remove(final Object value) { + return false; + } + + /** + * Removes the value at the specified position in the JSON array. + */ + public Object remove(final int pos) { + return null; + } + + /** + * Returns the number of values in this JSON array. + */ + public int size() { + return -1; + } + + /** + * Returns {@code true} if JSON array is empty. + */ + public boolean isEmpty() { + return false; + } + + /** + * Returns the underlying list. + */ + public List list() { + return null; + } + + /** + * Removes all entries from the JSON array. + */ + public JsonArray clear() { + return null; + } + + /** + * Returns an iterator over the values in the JSON array. + */ + @Override + public Iterator iterator() { + return null; + } +} diff --git a/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonObject.java b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonObject.java new file mode 100644 index 00000000000..c2a76bb59ff --- /dev/null +++ b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonObject.java @@ -0,0 +1,385 @@ +// Copyright (c) 2003-present, Jodd Team (http://jodd.org) +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +package jodd.json; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Representation of JSON object. + * @see JsonArray + */ +public class JsonObject implements Iterable> { + + /** + * Create a new, empty instance. + */ + public JsonObject() { + } + + /** + * Create an instance from a Map. The Map is not copied. + */ + public JsonObject(final Map map) { + } + + /** + * Returns the string value with the specified key. + */ + public String getString(final String key) { + return null; + } + + /** + * returns the integer value with the specified key. + */ + public Integer getInteger(final String key) { + return null; + } + + /** + * Returns the long value with the specified key. + */ + public Long getLong(final String key) { + return null; + } + + /** + * Returns the double value with the specified key. + */ + public Double getDouble(final String key) { + return null; + } + + /** + * Returns the float value with the specified key. + */ + public Float getFloat(final String key) { + return null; + } + + /** + * Returns the boolean value with the specified key. + */ + public Boolean getBoolean(final String key) { + return false; + } + + /** + * Returns the {@code JsonObject} value with the specified key. + */ + public JsonObject getJsonObject(final String key) { + return null; + } + + /** + * Returns the {@link JsonArray} value with the specified key + */ + public JsonArray getJsonArray(final String key) { + return null; + } + + /** + * Returns the binary value with the specified key. + *

    + * JSON itself has no notion of a binary. This extension complies to the RFC-7493. + * THe byte array is Base64 encoded binary. + */ + public byte[] getBinary(final String key) { + return null; + } + + /** + * Returns the value with the specified key, as an object. + */ + @SuppressWarnings("unchecked") + public T getValue(final String key) { + return null; + } + + /** + * Like {@link #getString(String)} but specifies a default value to return if there is no entry. + */ + public String getString(final String key, final String def) { + return null; + } + + /** + * Like {@link #getInteger(String)} but specifies a default value to return if there is no entry. + */ + public Integer getInteger(final String key, final Integer def) { + return null; + } + + /** + * Like {@link #getLong(String)} but specifies a default value to return if there is no entry. + */ + public Long getLong(final String key, final Long def) { + return null; + } + + /** + * Like {@link #getDouble(String)} but specifies a default value to return if there is no entry. + */ + public Double getDouble(final String key, final Double def) { + return null; + } + + /** + * Like {@link #getFloat(String)} but specifies a default value to return if there is no entry. + */ + public Float getFloat(final String key, final Float def) { + return null; + } + + /** + * Like {@link #getBoolean(String)} but specifies a default value to return if there is no entry. + */ + public Boolean getBoolean(final String key, final Boolean def) { + return null; + } + + /** + * Like {@link #getJsonObject(String)} but specifies a default value to return if there is no entry. + */ + public JsonObject getJsonObject(final String key, final JsonObject def) { + return null; + } + + /** + * Like {@link #getJsonArray(String)} but specifies a default value to return if there is no entry. + */ + public JsonArray getJsonArray(final String key, final JsonArray def) { + return null; + } + + /** + * Like {@link #getBinary(String)} but specifies a default value to return if there is no entry. + */ + public byte[] getBinary(final String key, final byte[] def) { + return null; + } + + /** + * Like {@link #getValue(String)} but specifies a default value to return if there is no entry. + */ + public T getValue(final String key, final T def) { + return null; + } + + /** + * Returns {@code true} if the JSON object contain the specified key. + */ + public boolean containsKey(final String key) { + return false; + } + + /** + * Return the set of field names in the JSON objects. + */ + public Set fieldNames() { + return null; + } + + // ---------------------------------------------------------------- put + + /** + * Puts an Enum into the JSON object with the specified key. + *

    + * JSON has no concept of encoding Enums, so the Enum will be converted to a String using the {@code java.lang.Enum#name} + * method and the value put as a String. + */ + public JsonObject put(final String key, final Enum value) { + return null; + } + + /** + * Puts an {@code CharSequence} into the JSON object with the specified key. + */ + public JsonObject put(final String key, final CharSequence value) { + return null; + } + + /** + * Puts a string into the JSON object with the specified key. + */ + public JsonObject put(final String key, final String value) { + return null; + } + + /** + * Puts an integer into the JSON object with the specified key. + */ + public JsonObject put(final String key, final Integer value) { + return null; + } + + /** + * Puts a long into the JSON object with the specified key. + */ + public JsonObject put(final String key, final Long value) { + return null; + } + + /** + * Puts a double into the JSON object with the specified key. + */ + public JsonObject put(final String key, final Double value) { + return null; + } + + /** + * Puts a float into the JSON object with the specified key. + */ + public JsonObject put(final String key, final Float value) { + return null; + } + + /** + * Puts a boolean into the JSON object with the specified key. + */ + public JsonObject put(final String key, final Boolean value) { + return null; + } + + /** + * Puts a {@code null} value into the JSON object with the specified key. + */ + public JsonObject putNull(final String key) { + return null; + } + + /** + * Puts another JSON object into the JSON object with the specified key. + */ + public JsonObject put(final String key, final JsonObject value) { + return null; + } + + /** + * Puts a {@link JsonArray} into the JSON object with the specified key. + */ + public JsonObject put(final String key, final JsonArray value) { + return null; + } + + /** + * Puts a {@code byte[]} into the JSON object with the specified key. + *

    + * Follows JSON extension RFC7493, where binary will first be Base64 + * encoded before being put as a String. + */ + public JsonObject put(final String key, final byte[] value) { + return null; + } + + /** + * Puts an object into the JSON object with the specified key. + */ + public JsonObject put(final String key, Object value) { + return null; + } + + @SuppressWarnings("StatementWithEmptyBody") + static Object resolveValue(Object value) { + return null; + } + + + /** + * Removes an entry from this object. + */ + public Object remove(final String key) { + return null; + } + + /** + * Merges in another JSON object. + *

    + * This is the equivalent of putting all the entries of the other JSON object into this object. This is not a deep + * merge, entries containing (sub) JSON objects will be replaced entirely. + */ + public JsonObject mergeIn(final JsonObject other) { + return null; + } + + /** + * Merges in another JSON object. + * A deep merge (recursive) matches (sub) JSON objects in the existing tree and replaces all + * matching entries. JsonArrays are treated like any other entry, i.e. replaced entirely. + */ + public JsonObject mergeInDeep(final JsonObject other) { + return null; + } + + /** + * Merges in another JSON object. + * The merge is deep (recursive) to the specified level. If depth is 0, no merge is performed, + * if depth is greater than the depth of one of the objects, a full deep merge is performed. + */ + @SuppressWarnings("unchecked") + public JsonObject mergeIn(final JsonObject other, final int depth) { + return null; + } + + /** + * Returns the underlying {@code Map} as is. + */ + public Map map() { + return null; + } + + /** + * Returns an iterator of the entries in the JSON object. + */ + @Override + public Iterator> iterator() { + return null; + } + + /** + * Returns the number of entries in the JSON object. + */ + public int size() { + return -1; + } + + /** + * Removes all the entries in this JSON object. + */ + public JsonObject clear() { + return null; + } + + /** + * Returns {@code true} if JSON object is empty. + */ + public boolean isEmpty() { + return false; + } +} diff --git a/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonParser.java b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonParser.java new file mode 100644 index 00000000000..8055209540c --- /dev/null +++ b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonParser.java @@ -0,0 +1,218 @@ +// Copyright (c) 2003-present, Jodd Team (http://jodd.org) +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +package jodd.json; + +import java.util.List; +import java.util.Map; + +/** + * Simple, developer-friendly JSON parser. It focuses on easy usage + * and type mappings. Uses Jodd's type converters, so it is natural + * companion for Jodd projects. + *

    + * This JSON parser also works in {@link #lazy(boolean)} mode. This + * mode is for top performance usage: parsing is done very, very lazy. + * While you can use all the mappings and other tools, for best performance + * the lazy mode should be used only with maps and lists (no special mappings). + * Also, the performance has it's price: more memory consumption, because the + * original input is hold until the result is in use. + *

    + * See: http://www.ietf.org/rfc/rfc4627.txt + */ +public class JsonParser extends JsonParserBase { + + /** + * Static ctor. + */ + public static JsonParser create() { + return null; + } + + /** + * Creates a lazy implementation of the JSON parser. + */ + public static JsonParser createLazyOne() { + return null; + } + + public JsonParser() { + super(false); + } + + /** + * Enables 'loose' mode for parsing. When 'loose' mode is enabled, + * JSON parsers swallows also invalid JSONs: + *

      + *
    • invalid escape character sequence is simply added to the output
    • + *
    • strings can be quoted with single-quotes
    • + *
    • strings can be unquoted, but may not contain escapes
    • + *
    + */ + public JsonParser looseMode(final boolean looseMode) { + return null; + } + + /** + * Defines if type conversion is strict. If not, all exceptions will be + * caught and replaced with {@code null}. + */ + public JsonParser strictTypes(final boolean strictTypes) { + return null; + } + + /** + * Defines how JSON parser works. In non-lazy mode, the whole JSON is parsed as it is. + * In the lazy mode, not everything is parsed, but some things are left lazy. + * This way we gain performance, especially on partial usage of the whole JSON. + * However, be aware that parser holds the input memory until the returned + * objects are disposed. + */ + public JsonParser lazy(final boolean lazy) { + return null; + } + + /** + * Maps a class to JSONs root. + */ + public JsonParser map(final Class target) { + return null; + } + + /** + * Maps a class to given path. For arrays, append values + * to the path to specify component type (if not specified by + * generics). + */ + public JsonParser map(final String path, final Class target) { + return null; + } + + /** + * Replaces type with mapped type for current path. + */ + protected Class replaceWithMappedTypeForPath(final Class target) { + return null; + } + + /** + * Sets local class meta-data name. + *

    + * Note that by using the class meta-data name you may expose a security hole in case untrusted source + * manages to specify a class that is accessible through class loader and exposes set of methods and/or fields, + * access of which opens an actual security hole. Such classes are known as deserialization gadgets. + * + * Because of this, use of "default typing" is not encouraged in general, and in particular is recommended against + * if the source of content is not trusted. Conversely, default typing may be used for processing content in + * cases where both ends (sender and receiver) are controlled by same entity. + */ + public JsonParser setClassMetadataName(final String name) { + return null; + } + + /** + * Sets usage of default class meta-data name. + * Using it may introduce a security hole, see {@link #setClassMetadataName(String)} for more details. + * @see #setClassMetadataName(String) + */ + public JsonParser withClassMetadata(final boolean useMetadata) { + return null; + } + + /** + * Adds a {@link jodd.util.Wildcard wildcard} pattern for white-listing classes. + * @see #setClassMetadataName(String) + */ + public JsonParser allowClass(final String classPattern) { + return null; + } + + /** + * Removes the whitelist of allowed classes. + * @see #setClassMetadataName(String) + */ + public JsonParser allowAllClasses() { + return null; + } + + /** + * Parses input JSON as given type. + */ + @SuppressWarnings("unchecked") + public T parse(final String input, final Class targetType) { + return null; + } + + /** + * Parses input JSON to {@link JsonObject}, special case of {@link #parse(String, Class)}. + */ + public JsonObject parseAsJsonObject(final String input) { + return null; + } + + /** + * Parses input JSON to {@link JsonArray}, special case of parsing. + */ + public JsonArray parseAsJsonArray(final String input) { + return null; + } + + /** + * Parses input JSON to a list with specified component type. + */ + public List parseAsList(final String string, final Class componentType) { + return null; + } + + /** + * Parses input JSON to a list with specified key and value types. + */ + public Map parseAsMap( + final String string, final Class keyType, final Class valueType) { + return null; + } + + /** + * Parses input JSON string. + */ + public T parse(final String input) { + return null; + } + + /** + * Parses input JSON as given type. + */ + @SuppressWarnings("unchecked") + public T parse(final char[] input, final Class targetType) { + return null; + } + + /** + * Parses input JSON char array. + */ + public T parse(final char[] input) { + return null; + } +} diff --git a/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonParserBase.java b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonParserBase.java new file mode 100644 index 00000000000..c4ba9194211 --- /dev/null +++ b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/JsonParserBase.java @@ -0,0 +1,68 @@ +// Copyright (c) 2003-present, Jodd Team (http://jodd.org) +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +package jodd.json; + +import java.util.Collection; + +/** + * Just a base class of {@link jodd.json.JsonParser} that contains + * various utilities, to reduce the size of a parser. + */ +public abstract class JsonParserBase { + public JsonParserBase(final boolean strictTypes) { + } + + /** + * Creates new instance of {@link jodd.json.MapToBean}. + */ + protected MapToBean createMapToBean(final String classMetadataName) { + return null; + } + + /** + * Creates new type for JSON array objects. + * It returns a collection. + * Later, the collection will be converted into the target type. + */ + @SuppressWarnings("unchecked") + protected Collection newArrayInstance(final Class targetType) { + return null; + } + + /** + * Creates new object or a HashMap if type is not specified. + */ + protected Object newObjectInstance(final Class targetType) { + return null; + } + + /** + * Converts type of the given value. + */ + protected Object convertType(final Object value, final Class targetType) { + return null; + } +} diff --git a/java/ql/test/stubs/joddjson-6.0.3/jodd/json/MapToBean.java b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/MapToBean.java new file mode 100644 index 00000000000..f48b69d0fe8 --- /dev/null +++ b/java/ql/test/stubs/joddjson-6.0.3/jodd/json/MapToBean.java @@ -0,0 +1,45 @@ +// Copyright (c) 2003-present, Jodd Team (http://jodd.org) +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +package jodd.json; + +import java.util.Map; + +/** + * Map to bean converter. + * Used when parsing with class metadata enabled. + */ +public class MapToBean { + + public MapToBean(final JsonParserBase jsonParser, final String classMetadataName) { + } + + /** + * Converts map to target type. + */ + public Object map2bean(final Map map, Class targetType) { + return null; + } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/HttpMessage.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/HttpMessage.java new file mode 100644 index 00000000000..a7a3645e0d4 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/HttpMessage.java @@ -0,0 +1,10 @@ +// Generated automatically from org.springframework.http.HttpMessage for testing purposes + +package org.springframework.http; + +import org.springframework.http.HttpHeaders; + +public interface HttpMessage +{ + HttpHeaders getHeaders(); +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/HttpRequest.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/HttpRequest.java new file mode 100644 index 00000000000..f781391d9ca --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/HttpRequest.java @@ -0,0 +1,14 @@ +// Generated automatically from org.springframework.http.HttpRequest for testing purposes + +package org.springframework.http; + +import java.net.URI; +import org.springframework.http.HttpMessage; +import org.springframework.http.HttpMethod; + +public interface HttpRequest extends HttpMessage +{ + String getMethodValue(); + URI getURI(); + default HttpMethod getMethod(){ return null; } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/server/PathContainer.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/server/PathContainer.java new file mode 100644 index 00000000000..fc2b6f0725f --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/server/PathContainer.java @@ -0,0 +1,28 @@ +// Generated automatically from org.springframework.http.server.PathContainer for testing purposes + +package org.springframework.http.server; + +import java.util.List; + +public interface PathContainer +{ + List elements(); + String value(); + default PathContainer subPath(int p0){ return null; } + default PathContainer subPath(int p0, int p1){ return null; } + static PathContainer parsePath(String p0){ return null; } + static PathContainer parsePath(String p0, PathContainer.Options p1){ return null; } + static public class Options + { + protected Options() {} + public boolean shouldDecodeAndParseSegments(){ return false; } + public char separator(){ return '0'; } + public static PathContainer.Options HTTP_PATH = null; + public static PathContainer.Options MESSAGE_ROUTE = null; + public static PathContainer.Options create(char p0, boolean p1){ return null; } + } + static public interface Element + { + String value(); + } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/server/RequestPath.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/server/RequestPath.java new file mode 100644 index 00000000000..7cae24a3ced --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/http/server/RequestPath.java @@ -0,0 +1,15 @@ +// Generated automatically from org.springframework.http.server.RequestPath for testing purposes + +package org.springframework.http.server; + +import java.net.URI; +import org.springframework.http.server.PathContainer; + +public interface RequestPath extends PathContainer +{ + PathContainer contextPath(); + PathContainer pathWithinApplication(); + RequestPath modifyContextPath(String p0); + static RequestPath parse(String p0, String p1){ return null; } + static RequestPath parse(URI p0, String p1){ return null; } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/AbstractUriTemplateHandler.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/AbstractUriTemplateHandler.java new file mode 100644 index 00000000000..d4c1da33c56 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/AbstractUriTemplateHandler.java @@ -0,0 +1,20 @@ +// Generated automatically from org.springframework.web.util.AbstractUriTemplateHandler for testing purposes + +package org.springframework.web.util; + +import java.net.URI; +import java.util.Map; +import org.springframework.web.util.UriTemplateHandler; + +abstract public class AbstractUriTemplateHandler implements UriTemplateHandler +{ + protected abstract URI expandInternal(String p0, Map p1); + protected abstract URI expandInternal(String p0, Object... p1); + public AbstractUriTemplateHandler(){} + public Map getDefaultUriVariables(){ return null; } + public String getBaseUrl(){ return null; } + public URI expand(String p0, Map p1){ return null; } + public URI expand(String p0, Object... p1){ return null; } + public void setBaseUrl(String p0){} + public void setDefaultUriVariables(Map p0){} +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ContentCachingRequestWrapper.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ContentCachingRequestWrapper.java new file mode 100644 index 00000000000..40ca55d7d0b --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ContentCachingRequestWrapper.java @@ -0,0 +1,26 @@ +// Generated automatically from org.springframework.web.util.ContentCachingRequestWrapper for testing purposes + +package org.springframework.web.util; + +import java.io.BufferedReader; +import java.util.Enumeration; +import java.util.Map; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +public class ContentCachingRequestWrapper extends HttpServletRequestWrapper +{ + protected ContentCachingRequestWrapper() {} + protected void handleContentOverflow(int p0){} + public BufferedReader getReader(){ return null; } + public ContentCachingRequestWrapper(HttpServletRequest p0){} + public ContentCachingRequestWrapper(HttpServletRequest p0, int p1){} + public Enumeration getParameterNames(){ return null; } + public Map getParameterMap(){ return null; } + public ServletInputStream getInputStream(){ return null; } + public String getCharacterEncoding(){ return null; } + public String getParameter(String p0){ return null; } + public String[] getParameterValues(String p0){ return null; } + public byte[] getContentAsByteArray(){ return null; } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ContentCachingResponseWrapper.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ContentCachingResponseWrapper.java new file mode 100644 index 00000000000..e83a09001c4 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ContentCachingResponseWrapper.java @@ -0,0 +1,32 @@ +// Generated automatically from org.springframework.web.util.ContentCachingResponseWrapper for testing purposes + +package org.springframework.web.util; + +import java.io.InputStream; +import java.io.PrintWriter; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +public class ContentCachingResponseWrapper extends HttpServletResponseWrapper +{ + protected ContentCachingResponseWrapper() {} + protected void copyBodyToResponse(boolean p0){} + public ContentCachingResponseWrapper(HttpServletResponse p0){} + public InputStream getContentInputStream(){ return null; } + public PrintWriter getWriter(){ return null; } + public ServletOutputStream getOutputStream(){ return null; } + public byte[] getContentAsByteArray(){ return null; } + public int getContentSize(){ return 0; } + public int getStatusCode(){ return 0; } + public void copyBodyToResponse(){} + public void flushBuffer(){} + public void reset(){} + public void resetBuffer(){} + public void sendError(int p0){} + public void sendError(int p0, String p1){} + public void sendRedirect(String p0){} + public void setBufferSize(int p0){} + public void setContentLength(int p0){} + public void setContentLengthLong(long p0){} +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/CookieGenerator.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/CookieGenerator.java new file mode 100644 index 00000000000..7c376c3dff6 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/CookieGenerator.java @@ -0,0 +1,29 @@ +// Generated automatically from org.springframework.web.util.CookieGenerator for testing purposes + +package org.springframework.web.util; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.logging.Log; + +public class CookieGenerator +{ + protected Cookie createCookie(String p0){ return null; } + protected final Log logger = null; + public CookieGenerator(){} + public Integer getCookieMaxAge(){ return null; } + public String getCookieDomain(){ return null; } + public String getCookieName(){ return null; } + public String getCookiePath(){ return null; } + public boolean isCookieHttpOnly(){ return false; } + public boolean isCookieSecure(){ return false; } + public static String DEFAULT_COOKIE_PATH = null; + public void addCookie(HttpServletResponse p0, String p1){} + public void removeCookie(HttpServletResponse p0){} + public void setCookieDomain(String p0){} + public void setCookieHttpOnly(boolean p0){} + public void setCookieMaxAge(Integer p0){} + public void setCookieName(String p0){} + public void setCookiePath(String p0){} + public void setCookieSecure(boolean p0){} +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/DefaultUriBuilderFactory.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/DefaultUriBuilderFactory.java new file mode 100644 index 00000000000..5665186245e --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/DefaultUriBuilderFactory.java @@ -0,0 +1,31 @@ +// Generated automatically from org.springframework.web.util.DefaultUriBuilderFactory for testing purposes + +package org.springframework.web.util; + +import java.net.URI; +import java.util.Map; +import org.springframework.web.util.UriBuilder; +import org.springframework.web.util.UriBuilderFactory; +import org.springframework.web.util.UriComponentsBuilder; + +public class DefaultUriBuilderFactory implements UriBuilderFactory +{ + public DefaultUriBuilderFactory(){} + public DefaultUriBuilderFactory(String p0){} + public DefaultUriBuilderFactory(UriComponentsBuilder p0){} + public DefaultUriBuilderFactory.EncodingMode getEncodingMode(){ return null; } + public Map getDefaultUriVariables(){ return null; } + public URI expand(String p0, Map p1){ return null; } + public URI expand(String p0, Object... p1){ return null; } + public UriBuilder builder(){ return null; } + public UriBuilder uriString(String p0){ return null; } + public boolean shouldParsePath(){ return false; } + public void setDefaultUriVariables(Map p0){} + public void setEncodingMode(DefaultUriBuilderFactory.EncodingMode p0){} + public void setParsePath(boolean p0){} + static public enum EncodingMode + { + NONE, TEMPLATE_AND_VALUES, URI_COMPONENT, VALUES_ONLY; + private EncodingMode() {} + } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/HtmlUtils.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/HtmlUtils.java new file mode 100644 index 00000000000..54a9f626825 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/HtmlUtils.java @@ -0,0 +1,16 @@ +// Generated automatically from org.springframework.web.util.HtmlUtils for testing purposes + +package org.springframework.web.util; + + +abstract public class HtmlUtils +{ + public HtmlUtils(){} + public static String htmlEscape(String p0){ return null; } + public static String htmlEscape(String p0, String p1){ return null; } + public static String htmlEscapeDecimal(String p0){ return null; } + public static String htmlEscapeDecimal(String p0, String p1){ return null; } + public static String htmlEscapeHex(String p0){ return null; } + public static String htmlEscapeHex(String p0, String p1){ return null; } + public static String htmlUnescape(String p0){ return null; } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ServletContextPropertyUtils.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ServletContextPropertyUtils.java new file mode 100644 index 00000000000..5bbd8972485 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ServletContextPropertyUtils.java @@ -0,0 +1,12 @@ +// Generated automatically from org.springframework.web.util.ServletContextPropertyUtils for testing purposes + +package org.springframework.web.util; + +import javax.servlet.ServletContext; + +abstract public class ServletContextPropertyUtils +{ + public ServletContextPropertyUtils(){} + public static String resolvePlaceholders(String p0, ServletContext p1){ return null; } + public static String resolvePlaceholders(String p0, ServletContext p1, boolean p2){ return null; } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ServletRequestPathUtils.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ServletRequestPathUtils.java new file mode 100644 index 00000000000..01b8ed6138d --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/ServletRequestPathUtils.java @@ -0,0 +1,21 @@ +// Generated automatically from org.springframework.web.util.ServletRequestPathUtils for testing purposes + +package org.springframework.web.util; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import org.springframework.http.server.RequestPath; + +abstract public class ServletRequestPathUtils +{ + public ServletRequestPathUtils(){} + public static Object getCachedPath(ServletRequest p0){ return null; } + public static RequestPath getParsedRequestPath(ServletRequest p0){ return null; } + public static RequestPath parseAndCache(HttpServletRequest p0){ return null; } + public static String PATH_ATTRIBUTE = null; + public static String getCachedPathValue(ServletRequest p0){ return null; } + public static boolean hasCachedPath(ServletRequest p0){ return false; } + public static boolean hasParsedRequestPath(ServletRequest p0){ return false; } + public static void clearParsedRequestPath(ServletRequest p0){} + public static void setParsedRequestPath(RequestPath p0, ServletRequest p1){} +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriBuilder.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriBuilder.java new file mode 100644 index 00000000000..f241d137257 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriBuilder.java @@ -0,0 +1,33 @@ +// Generated automatically from org.springframework.web.util.UriBuilder for testing purposes + +package org.springframework.web.util; + +import java.net.URI; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import org.springframework.util.MultiValueMap; + +public interface UriBuilder +{ + URI build(Map p0); + URI build(Object... p0); + UriBuilder fragment(String p0); + UriBuilder host(String p0); + UriBuilder path(String p0); + UriBuilder pathSegment(String... p0); + UriBuilder port(String p0); + UriBuilder port(int p0); + UriBuilder query(String p0); + UriBuilder queryParam(String p0, Collection p1); + UriBuilder queryParam(String p0, Object... p1); + UriBuilder queryParamIfPresent(String p0, Optional p1); + UriBuilder queryParams(MultiValueMap p0); + UriBuilder replacePath(String p0); + UriBuilder replaceQuery(String p0); + UriBuilder replaceQueryParam(String p0, Collection p1); + UriBuilder replaceQueryParam(String p0, Object... p1); + UriBuilder replaceQueryParams(MultiValueMap p0); + UriBuilder scheme(String p0); + UriBuilder userInfo(String p0); +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriBuilderFactory.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriBuilderFactory.java new file mode 100644 index 00000000000..e886e5148e8 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriBuilderFactory.java @@ -0,0 +1,12 @@ +// Generated automatically from org.springframework.web.util.UriBuilderFactory for testing purposes + +package org.springframework.web.util; + +import org.springframework.web.util.UriBuilder; +import org.springframework.web.util.UriTemplateHandler; + +public interface UriBuilderFactory extends UriTemplateHandler +{ + UriBuilder builder(); + UriBuilder uriString(String p0); +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriComponents.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriComponents.java new file mode 100644 index 00000000000..b049020ab4b --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriComponents.java @@ -0,0 +1,46 @@ +// Generated automatically from org.springframework.web.util.UriComponents for testing purposes + +package org.springframework.web.util; + +import java.io.Serializable; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.List; +import java.util.Map; +import java.util.function.UnaryOperator; +import org.springframework.util.MultiValueMap; +import org.springframework.web.util.UriComponentsBuilder; + +abstract public class UriComponents implements Serializable +{ + protected UriComponents() {} + abstract UriComponents expandInternal(UriComponents.UriTemplateVariables p0); + protected UriComponents(String p0, String p1){} + protected abstract void copyToUriComponentsBuilder(UriComponentsBuilder p0); + public abstract List getPathSegments(); + public abstract MultiValueMap getQueryParams(); + public abstract String getHost(); + public abstract String getPath(); + public abstract String getQuery(); + public abstract String getSchemeSpecificPart(); + public abstract String getUserInfo(); + public abstract String toUriString(); + public abstract URI toUri(); + public abstract UriComponents encode(Charset p0); + public abstract UriComponents normalize(); + public abstract int getPort(); + public final String getFragment(){ return null; } + public final String getScheme(){ return null; } + public final String toString(){ return null; } + public final UriComponents encode(){ return null; } + public final UriComponents expand(Map p0){ return null; } + public final UriComponents expand(Object... p0){ return null; } + public final UriComponents expand(UriComponents.UriTemplateVariables p0){ return null; } + static String expandUriComponent(String p0, UriComponents.UriTemplateVariables p1){ return null; } + static String expandUriComponent(String p0, UriComponents.UriTemplateVariables p1, UnaryOperator p2){ return null; } + static public interface UriTemplateVariables + { + Object getValue(String p0); + static Object SKIP_VALUE = null; + } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriComponentsBuilder.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriComponentsBuilder.java new file mode 100644 index 00000000000..e0d1caef9e6 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriComponentsBuilder.java @@ -0,0 +1,63 @@ +// Generated automatically from org.springframework.web.util.UriComponentsBuilder for testing purposes + +package org.springframework.web.util; + +import java.net.InetSocketAddress; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; +import org.springframework.util.MultiValueMap; +import org.springframework.web.util.UriBuilder; +import org.springframework.web.util.UriComponents; + +public class UriComponentsBuilder implements Cloneable, UriBuilder +{ + UriComponentsBuilder adaptFromForwardedHeaders(HttpHeaders p0){ return null; } + protected UriComponentsBuilder(){} + protected UriComponentsBuilder(UriComponentsBuilder p0){} + public Object clone(){ return null; } + public String toUriString(){ return null; } + public URI build(Map p0){ return null; } + public URI build(Object... p0){ return null; } + public UriComponents build(){ return null; } + public UriComponents build(boolean p0){ return null; } + public UriComponents buildAndExpand(Map p0){ return null; } + public UriComponents buildAndExpand(Object... p0){ return null; } + public UriComponentsBuilder cloneBuilder(){ return null; } + public UriComponentsBuilder encode(Charset p0){ return null; } + public UriComponentsBuilder fragment(String p0){ return null; } + public UriComponentsBuilder host(String p0){ return null; } + public UriComponentsBuilder path(String p0){ return null; } + public UriComponentsBuilder pathSegment(String... p0){ return null; } + public UriComponentsBuilder port(String p0){ return null; } + public UriComponentsBuilder port(int p0){ return null; } + public UriComponentsBuilder query(String p0){ return null; } + public UriComponentsBuilder queryParam(String p0, Collection p1){ return null; } + public UriComponentsBuilder queryParam(String p0, Object... p1){ return null; } + public UriComponentsBuilder queryParamIfPresent(String p0, Optional p1){ return null; } + public UriComponentsBuilder queryParams(MultiValueMap p0){ return null; } + public UriComponentsBuilder replacePath(String p0){ return null; } + public UriComponentsBuilder replaceQuery(String p0){ return null; } + public UriComponentsBuilder replaceQueryParam(String p0, Collection p1){ return null; } + public UriComponentsBuilder replaceQueryParam(String p0, Object... p1){ return null; } + public UriComponentsBuilder replaceQueryParams(MultiValueMap p0){ return null; } + public UriComponentsBuilder scheme(String p0){ return null; } + public UriComponentsBuilder schemeSpecificPart(String p0){ return null; } + public UriComponentsBuilder uri(URI p0){ return null; } + public UriComponentsBuilder uriComponents(UriComponents p0){ return null; } + public UriComponentsBuilder uriVariables(Map p0){ return null; } + public UriComponentsBuilder userInfo(String p0){ return null; } + public final UriComponentsBuilder encode(){ return null; } + public static InetSocketAddress parseForwardedFor(HttpRequest p0, InetSocketAddress p1){ return null; } + public static UriComponentsBuilder fromHttpRequest(HttpRequest p0){ return null; } + public static UriComponentsBuilder fromHttpUrl(String p0){ return null; } + public static UriComponentsBuilder fromOriginHeader(String p0){ return null; } + public static UriComponentsBuilder fromPath(String p0){ return null; } + public static UriComponentsBuilder fromUri(URI p0){ return null; } + public static UriComponentsBuilder fromUriString(String p0){ return null; } + public static UriComponentsBuilder newInstance(){ return null; } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriTemplate.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriTemplate.java new file mode 100644 index 00000000000..9c4ffacaa93 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriTemplate.java @@ -0,0 +1,20 @@ +// Generated automatically from org.springframework.web.util.UriTemplate for testing purposes + +package org.springframework.web.util; + +import java.io.Serializable; +import java.net.URI; +import java.util.List; +import java.util.Map; + +public class UriTemplate implements Serializable +{ + protected UriTemplate() {} + public List getVariableNames(){ return null; } + public Map match(String p0){ return null; } + public String toString(){ return null; } + public URI expand(Map p0){ return null; } + public URI expand(Object... p0){ return null; } + public UriTemplate(String p0){} + public boolean matches(String p0){ return false; } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriTemplateHandler.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriTemplateHandler.java new file mode 100644 index 00000000000..a09368ba3cb --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriTemplateHandler.java @@ -0,0 +1,12 @@ +// Generated automatically from org.springframework.web.util.UriTemplateHandler for testing purposes + +package org.springframework.web.util; + +import java.net.URI; +import java.util.Map; + +public interface UriTemplateHandler +{ + URI expand(String p0, Map p1); + URI expand(String p0, Object... p1); +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriUtils.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriUtils.java new file mode 100644 index 00000000000..691c8e45e1a --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UriUtils.java @@ -0,0 +1,40 @@ +// Generated automatically from org.springframework.web.util.UriUtils for testing purposes + +package org.springframework.web.util; + +import java.nio.charset.Charset; +import java.util.Map; +import org.springframework.util.MultiValueMap; + +abstract public class UriUtils +{ + public UriUtils(){} + public static Map encodeUriVariables(Map p0){ return null; } + public static MultiValueMap encodeQueryParams(MultiValueMap p0){ return null; } + public static Object[] encodeUriVariables(Object... p0){ return null; } + public static String decode(String p0, Charset p1){ return null; } + public static String decode(String p0, String p1){ return null; } + public static String encode(String p0, Charset p1){ return null; } + public static String encode(String p0, String p1){ return null; } + public static String encodeAuthority(String p0, Charset p1){ return null; } + public static String encodeAuthority(String p0, String p1){ return null; } + public static String encodeFragment(String p0, Charset p1){ return null; } + public static String encodeFragment(String p0, String p1){ return null; } + public static String encodeHost(String p0, Charset p1){ return null; } + public static String encodeHost(String p0, String p1){ return null; } + public static String encodePath(String p0, Charset p1){ return null; } + public static String encodePath(String p0, String p1){ return null; } + public static String encodePathSegment(String p0, Charset p1){ return null; } + public static String encodePathSegment(String p0, String p1){ return null; } + public static String encodePort(String p0, Charset p1){ return null; } + public static String encodePort(String p0, String p1){ return null; } + public static String encodeQuery(String p0, Charset p1){ return null; } + public static String encodeQuery(String p0, String p1){ return null; } + public static String encodeQueryParam(String p0, Charset p1){ return null; } + public static String encodeQueryParam(String p0, String p1){ return null; } + public static String encodeScheme(String p0, Charset p1){ return null; } + public static String encodeScheme(String p0, String p1){ return null; } + public static String encodeUserInfo(String p0, Charset p1){ return null; } + public static String encodeUserInfo(String p0, String p1){ return null; } + public static String extractFileExtension(String p0){ return null; } +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UrlPathHelper.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UrlPathHelper.java new file mode 100644 index 00000000000..acabbbb7de7 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/UrlPathHelper.java @@ -0,0 +1,44 @@ +// Generated automatically from org.springframework.web.util.UrlPathHelper for testing purposes + +package org.springframework.web.util; + +import java.util.Map; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import org.springframework.util.MultiValueMap; + +public class UrlPathHelper +{ + protected String determineEncoding(HttpServletRequest p0){ return null; } + protected String getDefaultEncoding(){ return null; } + protected String getPathWithinServletMapping(HttpServletRequest p0, String p1){ return null; } + public Map decodePathVariables(HttpServletRequest p0, Map p1){ return null; } + public MultiValueMap decodeMatrixVariables(HttpServletRequest p0, MultiValueMap p1){ return null; } + public String decodeRequestString(HttpServletRequest p0, String p1){ return null; } + public String getContextPath(HttpServletRequest p0){ return null; } + public String getLookupPathForRequest(HttpServletRequest p0){ return null; } + public String getLookupPathForRequest(HttpServletRequest p0, String p1){ return null; } + public String getOriginatingContextPath(HttpServletRequest p0){ return null; } + public String getOriginatingQueryString(HttpServletRequest p0){ return null; } + public String getOriginatingRequestUri(HttpServletRequest p0){ return null; } + public String getOriginatingServletPath(HttpServletRequest p0){ return null; } + public String getPathWithinApplication(HttpServletRequest p0){ return null; } + public String getPathWithinServletMapping(HttpServletRequest p0){ return null; } + public String getRequestUri(HttpServletRequest p0){ return null; } + public String getServletPath(HttpServletRequest p0){ return null; } + public String removeSemicolonContent(String p0){ return null; } + public String resolveAndCacheLookupPath(HttpServletRequest p0){ return null; } + public UrlPathHelper(){} + public boolean isUrlDecode(){ return false; } + public boolean shouldRemoveSemicolonContent(){ return false; } + public static String PATH_ATTRIBUTE = null; + public static String getResolvedLookupPath(ServletRequest p0){ return null; } + public static UrlPathHelper defaultInstance = null; + public static UrlPathHelper rawPathInstance = null; + public void setAlwaysUseFullPath(boolean p0){} + public void setDefaultEncoding(String p0){} + public void setRemoveSemicolonContent(boolean p0){} + public void setUrlDecode(boolean p0){} + static Boolean websphereComplianceFlag = null; + static boolean servlet4Present = false; +} diff --git a/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/WebUtils.java b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/WebUtils.java new file mode 100644 index 00000000000..84138bcea47 --- /dev/null +++ b/java/ql/test/stubs/springframework-5.3.8/org/springframework/web/util/WebUtils.java @@ -0,0 +1,69 @@ +// Generated automatically from org.springframework.web.util.WebUtils for testing purposes + +package org.springframework.web.util; + +import java.io.File; +import java.util.Collection; +import java.util.Map; +import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import org.springframework.http.HttpRequest; +import org.springframework.util.MultiValueMap; + +abstract public class WebUtils +{ + public WebUtils(){} + public static T getNativeRequest(ServletRequest p0, Class p1){ return null; } + public static T getNativeResponse(ServletResponse p0, Class p1){ return null; } + public static Boolean getDefaultHtmlEscape(ServletContext p0){ return null; } + public static Boolean getResponseEncodedHtmlEscape(ServletContext p0){ return null; } + public static Cookie getCookie(HttpServletRequest p0, String p1){ return null; } + public static File getTempDir(ServletContext p0){ return null; } + public static Map getParametersStartingWith(ServletRequest p0, String p1){ return null; } + public static MultiValueMap parseMatrixVariables(String p0){ return null; } + public static Object getRequiredSessionAttribute(HttpServletRequest p0, String p1){ return null; } + public static Object getSessionAttribute(HttpServletRequest p0, String p1){ return null; } + public static Object getSessionMutex(HttpSession p0){ return null; } + public static String CONTENT_TYPE_CHARSET_PREFIX = null; + public static String DEFAULT_CHARACTER_ENCODING = null; + public static String DEFAULT_WEB_APP_ROOT_KEY = null; + public static String ERROR_EXCEPTION_ATTRIBUTE = null; + public static String ERROR_EXCEPTION_TYPE_ATTRIBUTE = null; + public static String ERROR_MESSAGE_ATTRIBUTE = null; + public static String ERROR_REQUEST_URI_ATTRIBUTE = null; + public static String ERROR_SERVLET_NAME_ATTRIBUTE = null; + public static String ERROR_STATUS_CODE_ATTRIBUTE = null; + public static String FORWARD_CONTEXT_PATH_ATTRIBUTE = null; + public static String FORWARD_PATH_INFO_ATTRIBUTE = null; + public static String FORWARD_QUERY_STRING_ATTRIBUTE = null; + public static String FORWARD_REQUEST_URI_ATTRIBUTE = null; + public static String FORWARD_SERVLET_PATH_ATTRIBUTE = null; + public static String HTML_ESCAPE_CONTEXT_PARAM = null; + public static String INCLUDE_CONTEXT_PATH_ATTRIBUTE = null; + public static String INCLUDE_PATH_INFO_ATTRIBUTE = null; + public static String INCLUDE_QUERY_STRING_ATTRIBUTE = null; + public static String INCLUDE_REQUEST_URI_ATTRIBUTE = null; + public static String INCLUDE_SERVLET_PATH_ATTRIBUTE = null; + public static String RESPONSE_ENCODED_HTML_ESCAPE_CONTEXT_PARAM = null; + public static String SESSION_MUTEX_ATTRIBUTE = null; + public static String TEMP_DIR_CONTEXT_ATTRIBUTE = null; + public static String WEB_APP_ROOT_KEY_PARAM = null; + public static String findParameterValue(Map p0, String p1){ return null; } + public static String findParameterValue(ServletRequest p0, String p1){ return null; } + public static String getRealPath(ServletContext p0, String p1){ return null; } + public static String getSessionId(HttpServletRequest p0){ return null; } + public static String[] SUBMIT_IMAGE_SUFFIXES = null; + public static boolean hasSubmitParameter(ServletRequest p0, String p1){ return false; } + public static boolean isIncludeRequest(ServletRequest p0){ return false; } + public static boolean isSameOrigin(HttpRequest p0){ return false; } + public static boolean isValidOrigin(HttpRequest p0, Collection p1){ return false; } + public static void clearErrorRequestAttributes(HttpServletRequest p0){} + public static void exposeErrorRequestAttributes(HttpServletRequest p0, Throwable p1, String p2){} + public static void removeWebAppRootSystemProperty(ServletContext p0){} + public static void setSessionAttribute(HttpServletRequest p0, String p1, Object p2){} + public static void setWebAppRootSystemProperty(ServletContext p0){} +} diff --git a/java/ql/src/config/semmlecode.dbscheme b/java/upgrades/b4e689c90426b017ad550e30a439cab2763ff424/old.dbscheme similarity index 100% rename from java/ql/src/config/semmlecode.dbscheme rename to java/upgrades/b4e689c90426b017ad550e30a439cab2763ff424/old.dbscheme diff --git a/java/upgrades/b4e689c90426b017ad550e30a439cab2763ff424/semmlecode.dbscheme b/java/upgrades/b4e689c90426b017ad550e30a439cab2763ff424/semmlecode.dbscheme new file mode 100755 index 00000000000..8ab354e68e8 --- /dev/null +++ b/java/upgrades/b4e689c90426b017ad550e30a439cab2763ff424/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/upgrades/b4e689c90426b017ad550e30a439cab2763ff424/upgrade.properties b/java/upgrades/b4e689c90426b017ad550e30a439cab2763ff424/upgrade.properties new file mode 100644 index 00000000000..459f9588323 --- /dev/null +++ b/java/upgrades/b4e689c90426b017ad550e30a439cab2763ff424/upgrade.properties @@ -0,0 +1,4 @@ +description: Java 16: allow local interfaces +compatibility: backwards +isLocalClassOrInterface.rel: reorder isLocalClass.rel(int id, int parent) id parent +isLocalClass.rel: delete diff --git a/java/upgrades/qlpack.lock.yml b/java/upgrades/qlpack.lock.yml new file mode 100644 index 00000000000..06dd07fc7dc --- /dev/null +++ b/java/upgrades/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/java/upgrades/qlpack.yml b/java/upgrades/qlpack.yml index aee4ed51c3e..fde82dcada2 100644 --- a/java/upgrades/qlpack.yml +++ b/java/upgrades/qlpack.yml @@ -1,2 +1,4 @@ -name: codeql-java-upgrades +name: codeql/java-upgrades upgrades: . +library: true +version: 0.0.2 diff --git a/javascript/change-notes/2021-08-02-handlebars-extraction.md b/javascript/change-notes/2021-08-02-handlebars-extraction.md new file mode 100644 index 00000000000..881542e123a --- /dev/null +++ b/javascript/change-notes/2021-08-02-handlebars-extraction.md @@ -0,0 +1,6 @@ +lgtm,codescanning +* Added support for more templating languages. + - EJS, Mustache, Handlebars, Nunjucks, Hogan, and Swig are now supported. + - Template tags from the above dialects are now recognized as sinks + when not escaped safely for the context, leading to additional results for `js/xss` and `js/code-injection`. + - Files with the extension `.ejs`, `.hbs`, or `.njk` are now extracted and analyzed. diff --git a/javascript/change-notes/2021-08-16-query-suffix-convention2.md b/javascript/change-notes/2021-08-16-query-suffix-convention2.md new file mode 100644 index 00000000000..35e344e6303 --- /dev/null +++ b/javascript/change-notes/2021-08-16-query-suffix-convention2.md @@ -0,0 +1,6 @@ +lgtm,codescanning +* Some library files have been deprecated, which may affect custom queries. + Queries importing a data-flow configuration from `semmle.javascript.security.dataflow` should + ensure that the imported file ends with `Query`, and only import its top-level module. + For example, a query that imported `DomBasedXss::DomBasedXss` should from now on import `DomBasedXssQuery` + instead. diff --git a/javascript/change-notes/2021-08-17-incomplete-multi-char-sanitization.md b/javascript/change-notes/2021-08-17-incomplete-multi-char-sanitization.md new file mode 100644 index 00000000000..b8eff185ffa --- /dev/null +++ b/javascript/change-notes/2021-08-17-incomplete-multi-char-sanitization.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The `js/incomplete-multi-character-sanitization` query now flags more regular expressions that can result in bad sanitization. diff --git a/javascript/change-notes/2021-08-17-vue-component-renaming.md b/javascript/change-notes/2021-08-17-vue-component-renaming.md new file mode 100644 index 00000000000..b40dc17a5b6 --- /dev/null +++ b/javascript/change-notes/2021-08-17-vue-component-renaming.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The class `Vue::Instance` has been renamed to `Vue::Component`. diff --git a/javascript/change-notes/2021-08-23-getPrimaryQlClasses.md b/javascript/change-notes/2021-08-23-getPrimaryQlClasses.md new file mode 100644 index 00000000000..c733328f1bd --- /dev/null +++ b/javascript/change-notes/2021-08-23-getPrimaryQlClasses.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* Added `Locatable.getPrimaryQlClasses()` predicate, which gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs. diff --git a/javascript/change-notes/2021-08-24-tainted-path-cwd.md b/javascript/change-notes/2021-08-24-tainted-path-cwd.md new file mode 100644 index 00000000000..5d4a8f0c68f --- /dev/null +++ b/javascript/change-notes/2021-08-24-tainted-path-cwd.md @@ -0,0 +1,2 @@ +lgtm,codescanning +* The `js/tainted-path` query now recognizes the `cwd` option to shell invocations as a sink. diff --git a/javascript/change-notes/2021-08-30-live-server.md b/javascript/change-notes/2021-08-30-live-server.md new file mode 100644 index 00000000000..4518dad451e --- /dev/null +++ b/javascript/change-notes/2021-08-30-live-server.md @@ -0,0 +1,6 @@ +lgtm,codescanning +* The dataflow libraries now model sources and sinks from the `live-server` library. + The model for `connect` has improved to recognize more sources and sinks. + Affected packages are + [live-server](https://www.npmjs.com/package/live-server), + [connect](https://www.npmjs.com/package/connect) \ No newline at end of file diff --git a/javascript/extractor/src/com/semmle/jcorn/Options.java b/javascript/extractor/src/com/semmle/jcorn/Options.java index d40998331a0..2a25b2045ad 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Options.java +++ b/javascript/extractor/src/com/semmle/jcorn/Options.java @@ -39,7 +39,7 @@ public class Options { Position endLoc); } - private boolean allowHashBang, allowReturnOutsideFunction, allowImportExportEverywhere; + private boolean allowHashBang, allowReturnOutsideFunction, allowImportExportEverywhere, allowGeneratedCodeExprs; private boolean preserveParens, mozExtensions, jscript, esnext, v8Extensions, e4x; private int ecmaVersion; private AllowReserved allowReserved; @@ -58,6 +58,7 @@ public class Options { this.allowReserved = AllowReserved.YES; this.allowReturnOutsideFunction = false; this.allowImportExportEverywhere = false; + this.allowGeneratedCodeExprs = true; this.allowHashBang = false; this.onToken = null; this.onComment = null; @@ -75,6 +76,7 @@ public class Options { this.allowHashBang = that.allowHashBang; this.allowReturnOutsideFunction = that.allowReturnOutsideFunction; this.allowImportExportEverywhere = that.allowImportExportEverywhere; + this.allowGeneratedCodeExprs = that.allowGeneratedCodeExprs; this.preserveParens = that.preserveParens; this.mozExtensions = that.mozExtensions; this.jscript = that.jscript; @@ -104,6 +106,10 @@ public class Options { return allowImportExportEverywhere; } + public boolean allowGeneratedCodeExprs() { + return allowGeneratedCodeExprs; + } + public boolean preserveParens() { return preserveParens; } diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index 827b6d4ec03..5f7383813c6 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -52,6 +52,7 @@ import com.semmle.js.ast.ForOfStatement; import com.semmle.js.ast.ForStatement; import com.semmle.js.ast.FunctionDeclaration; import com.semmle.js.ast.FunctionExpression; +import com.semmle.js.ast.GeneratedCodeExpr; import com.semmle.js.ast.IFunction; import com.semmle.js.ast.INode; import com.semmle.js.ast.IPattern; @@ -537,7 +538,7 @@ public class Parser { } return this.finishOp(TokenType.questionquestion, 2); } - + } return this.finishOp(TokenType.question, 1); } @@ -617,6 +618,15 @@ public class Parser { this.skipSpace(); return this.nextToken(); } + if (next == '%' && code == '<' && this.options.allowGeneratedCodeExprs()) { + // `<%`, the beginning of an EJS-style template tag + size = 2; + int nextNext = charAt(this.pos + 2); + if (nextNext == '=' || nextNext == '-') { + ++size; + } + return this.finishOp(TokenType.generatedCodeDelimiterEJS, size); + } if (next == 61) size = 2; return this.finishOp(TokenType.relational, size); } @@ -1688,6 +1698,9 @@ public class Parser { return this.parseNew(); } else if (this.type == TokenType.backQuote) { return this.parseTemplate(false); + } else if (this.type == TokenType.generatedCodeDelimiterEJS) { + String openingDelimiter = (String) this.value; + return this.parseGeneratedCodeExpr(this.startLoc, openingDelimiter, "%>"); } else { this.unexpected(); return null; @@ -1929,10 +1942,16 @@ public class Parser { // Parse an object literal or binding pattern. protected Expression parseObj(boolean isPattern, DestructuringErrors refDestructuringErrors) { Position startLoc = this.startLoc; + if (!isPattern && options.allowGeneratedCodeExprs() && charAt(pos) == '{') { + // Parse mustache-style placeholder expression: {{ ... }} or {{{ ... }}} + return charAt(pos + 1) == '{' + ? parseGeneratedCodeExpr(startLoc, "{{{", "}}}") + : parseGeneratedCodeExpr(startLoc, "{{", "}}"); + } boolean first = true; Map propHash = new LinkedHashMap<>(); List properties = new ArrayList(); - this.next(); + this.next(); // skip '{' while (!this.eat(TokenType.braceR)) { if (!first) { this.expect(TokenType.comma); @@ -1949,6 +1968,42 @@ public class Parser { return this.finishNode(node); } + /** Emit a token ranging from the current position until endOfToken. */ + private Token generateTokenEndingAt(int endOfToken, TokenType tokenType) { + this.lastTokEnd = this.end; + this.lastTokStart = this.start; + this.lastTokEndLoc = this.endLoc; + this.lastTokStartLoc = this.startLoc; + this.start = this.pos; + this.startLoc = this.curPosition(); + this.pos = endOfToken; + return finishToken(tokenType); + } + + /** Parse a generated expression. The current token refers to the opening delimiter. */ + protected Expression parseGeneratedCodeExpr(Position startLoc, String openingDelimiter, String closingDelimiter) { + // Emit a token for what's left of the opening delimiter, if there are any remaining characters + int startOfBody = startLoc.getOffset() + openingDelimiter.length(); + if (this.pos != startOfBody) { + this.generateTokenEndingAt(startOfBody, TokenType.generatedCodeDelimiter); + } + + // Emit a token for the generated code body + int endOfBody = this.input.indexOf(closingDelimiter, startOfBody); + if (endOfBody == -1) { + this.unexpected(startLoc); + } + Token bodyToken = this.generateTokenEndingAt(endOfBody, TokenType.generatedCodeExpr); + + // Emit a token for the closing delimiter + this.generateTokenEndingAt(endOfBody + closingDelimiter.length(), TokenType.generatedCodeDelimiter); + + this.next(); // produce lookahead token + + return finishNode(new GeneratedCodeExpr(new SourceLocation(startLoc), openingDelimiter, closingDelimiter, + bodyToken.getValue())); + } + protected Property parseProperty( boolean isPattern, DestructuringErrors refDestructuringErrors, diff --git a/javascript/extractor/src/com/semmle/jcorn/TokenType.java b/javascript/extractor/src/com/semmle/jcorn/TokenType.java index e3c005c1b6a..a0e06bdd3eb 100644 --- a/javascript/extractor/src/com/semmle/jcorn/TokenType.java +++ b/javascript/extractor/src/com/semmle/jcorn/TokenType.java @@ -1,9 +1,10 @@ package com.semmle.jcorn; -import com.semmle.jcorn.Parser.TokContext; import java.util.LinkedHashMap; import java.util.Map; +import com.semmle.jcorn.Parser.TokContext; + /// tokentype.js // ## Token types @@ -89,6 +90,9 @@ public class TokenType { arrow = new TokenType(new Properties("=>").beforeExpr()), template = new TokenType(new Properties("template")), invalidTemplate = new TokenType(new Properties("invalidTemplate")), + generatedCodeExpr = new TokenType(new Properties("generatedCodeExpr")), + generatedCodeDelimiter = new TokenType(new Properties("generatedCodeDelimiter")), + generatedCodeDelimiterEJS = new TokenType(new Properties("<%/%>")), ellipsis = new TokenType(new Properties("...").beforeExpr()), backQuote = new TokenType(new Properties("`").startsExpr()) { diff --git a/javascript/extractor/src/com/semmle/jcorn/jsx/JSXParser.java b/javascript/extractor/src/com/semmle/jcorn/jsx/JSXParser.java index ee5ef3dc29f..6deec72809c 100644 --- a/javascript/extractor/src/com/semmle/jcorn/jsx/JSXParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/jsx/JSXParser.java @@ -420,8 +420,9 @@ public class JSXParser extends Parser { && code == 60 && this.exprAllowed && - // avoid getting confused on HTML comments - this.charAt(this.pos + 1) != '!') { + // avoid getting confused on HTML comments or EJS-style template tags + this.charAt(this.pos + 1) != '!' && + this.charAt(this.pos + 1) != '%') { ++this.pos; return this.finishToken(jsxTagStart); } diff --git a/javascript/extractor/src/com/semmle/js/ast/DefaultVisitor.java b/javascript/extractor/src/com/semmle/js/ast/DefaultVisitor.java index 4db7dbc400f..995f580edd2 100644 --- a/javascript/extractor/src/com/semmle/js/ast/DefaultVisitor.java +++ b/javascript/extractor/src/com/semmle/js/ast/DefaultVisitor.java @@ -777,4 +777,9 @@ public class DefaultVisitor implements Visitor { public R visit(XMLDotDotExpression nd, C c) { return visit((Expression) nd, c); } + + @Override + public R visit(GeneratedCodeExpr nd, C c) { + return visit((Expression) nd, c); + } } diff --git a/javascript/extractor/src/com/semmle/js/ast/GeneratedCodeExpr.java b/javascript/extractor/src/com/semmle/js/ast/GeneratedCodeExpr.java new file mode 100644 index 00000000000..ec158fdd393 --- /dev/null +++ b/javascript/extractor/src/com/semmle/js/ast/GeneratedCodeExpr.java @@ -0,0 +1,45 @@ +package com.semmle.js.ast; + +/** + * A placeholder for generated code, speculatively parsed as a primary expression. + * + *

    For example, in this snippet, + * + *

    + * let data = {{user_data}};
    + * 
    + * + * the expression {{user_data}} is assumed to be filled in by a templating engine so + * that it can be parsed as an expression, and a GeneratedCodeExpr is thus created to + * represent it. + */ +public class GeneratedCodeExpr extends Expression { + private String openingDelimiter; + private String closingDelimiter; + private String body; + + public GeneratedCodeExpr( + SourceLocation loc, String openingDelimiter, String closingDelimiter, String body) { + super("GeneratedCodeExpr", loc); + this.openingDelimiter = openingDelimiter; + this.closingDelimiter = closingDelimiter; + this.body = body; + } + + public String getOpeningDelimiter() { + return openingDelimiter; + } + + public String getClosingDelimiter() { + return closingDelimiter; + } + + public String getBody() { + return body; + } + + @Override + public R accept(Visitor v, C c) { + return v.visit(this, c); + } +} diff --git a/javascript/extractor/src/com/semmle/js/ast/NodeCopier.java b/javascript/extractor/src/com/semmle/js/ast/NodeCopier.java index 0a0895d6598..02fd40b12d8 100644 --- a/javascript/extractor/src/com/semmle/js/ast/NodeCopier.java +++ b/javascript/extractor/src/com/semmle/js/ast/NodeCopier.java @@ -894,4 +894,9 @@ public class NodeCopier implements Visitor { public INode visit(XMLDotDotExpression nd, Void c) { return new XMLDotDotExpression(visit(nd.getLoc()), copy(nd.getLeft()), copy(nd.getRight())); } + + @Override + public INode visit(GeneratedCodeExpr nd, Void c) { + return new GeneratedCodeExpr(visit(nd.getLoc()), nd.getOpeningDelimiter(), nd.getClosingDelimiter(), nd.getBody()); + } } diff --git a/javascript/extractor/src/com/semmle/js/ast/Visitor.java b/javascript/extractor/src/com/semmle/js/ast/Visitor.java index f2a65c83620..f7dfbd4e3aa 100644 --- a/javascript/extractor/src/com/semmle/js/ast/Visitor.java +++ b/javascript/extractor/src/com/semmle/js/ast/Visitor.java @@ -313,4 +313,6 @@ public interface Visitor { public R visit(XMLQualifiedIdentifier nd, C c); public R visit(XMLDotDotExpression nd, C c); + + public R visit(GeneratedCodeExpr generatedCodeExpr, C c); } diff --git a/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java b/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java index bb270353869..6796f262fef 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java +++ b/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; import java.util.Stack; +import java.util.regex.Matcher; import com.semmle.js.ast.AClass; import com.semmle.js.ast.AFunction; @@ -45,6 +46,7 @@ import com.semmle.js.ast.ForOfStatement; import com.semmle.js.ast.ForStatement; import com.semmle.js.ast.FunctionDeclaration; import com.semmle.js.ast.FunctionExpression; +import com.semmle.js.ast.GeneratedCodeExpr; import com.semmle.js.ast.IFunction; import com.semmle.js.ast.INode; import com.semmle.js.ast.IPattern; @@ -172,7 +174,8 @@ public class ASTExtractor { private final RegExpExtractor regexpExtractor; private final ExtractorConfig config; - public ASTExtractor(ExtractorConfig config, LexicalExtractor lexicalExtractor, ScopeManager scopeManager) { + public ASTExtractor( + ExtractorConfig config, LexicalExtractor lexicalExtractor, ScopeManager scopeManager) { this.config = config; this.trapwriter = lexicalExtractor.getTrapwriter(); this.locationManager = lexicalExtractor.getLocationManager(); @@ -180,22 +183,22 @@ public class ASTExtractor { this.scopeManager = scopeManager; this.lexicalExtractor = lexicalExtractor; this.regexpExtractor = new RegExpExtractor(trapwriter, locationManager); - this.toplevelLabel = makeTopLevelLabel(trapwriter, locationManager.getFileLabel(), locationManager.getStartLine(), locationManager.getStartColumn()); + this.toplevelLabel = + makeTopLevelLabel( + trapwriter, + locationManager.getFileLabel(), + locationManager.getStartLine(), + locationManager.getStartColumn()); } /** * Returns the label for the top-level starting at the given location. - *

    - * May be used to refer to the top-level before it has been extracted. + * + *

    May be used to refer to the top-level before it has been extracted. */ - public static Label makeTopLevelLabel(TrapWriter trapWriter, Label fileLabel, int startLine, int startColumn) { - return trapWriter.globalID( - "script;{" - + fileLabel - + "}," - + startLine - + ',' - + startColumn); + public static Label makeTopLevelLabel( + TrapWriter trapWriter, Label fileLabel, int startLine, int startColumn) { + return trapWriter.globalID("script;{" + fileLabel + "}," + startLine + ',' + startColumn); } public TrapWriter getTrapwriter() { @@ -252,8 +255,8 @@ public class ASTExtractor { TYPE_LABEL, /** - * An identifier that refers to a variable from inside a type, i.e. the operand to a - * typeof type or left operand to an is type. + * An identifier that refers to a variable from inside a type, i.e. the operand to a + * typeof type or left operand to an is type. * *

    This is generally treated as a type, except a variable binding will be emitted for it. */ @@ -271,16 +274,16 @@ public class ASTExtractor { /** * An identifier that occurs in a type-only import. * - * These may declare a type and/or a namespace, but for compatibility with our AST, - * must be emitted as a VarDecl (with no variable binding). + *

    These may declare a type and/or a namespace, but for compatibility with our AST, must be + * emitted as a VarDecl (with no variable binding). */ TYPE_ONLY_IMPORT, /** * An identifier that occurs in a type-only export. * - * These may refer to a type and/or a namespace, but for compatibility with our AST, - * must be emitted as an ExportVarAccess (with no variable binding). + *

    These may refer to a type and/or a namespace, but for compatibility with our AST, must be + * emitted as an ExportVarAccess (with no variable binding). */ TYPE_ONLY_EXPORT, @@ -300,8 +303,8 @@ public class ASTExtractor { EXPORT, /** - * An identifier that occurs as a qualified name in a default export expression, such as - * A in export default A.B. + * An identifier that occurs as a qualified name in a default export expression, such as A + * in export default A.B. * *

    This acts like {@link #EXPORT}, except it cannot refer to a type (i.e. it must be a * variable and/or a namespace). @@ -312,8 +315,8 @@ public class ASTExtractor { * True if this occurs as part of a type annotation, i.e. it is {@link #TYPE_BIND} or {@link * #TYPE_DECL}, {@link #TYPE_LABEL}, {@link #VAR_IN_TYPE_BIND}, or {@link #NAMESPACE_BIND}. * - *

    Does not hold for {@link #VAR_AND_TYPE_DECL}, {@link #TYPE_ONLY_IMPORT}, or @{link {@link #TYPE_ONLY_EXPORT} - * as these do not occur in type annotations. + *

    Does not hold for {@link #VAR_AND_TYPE_DECL}, {@link #TYPE_ONLY_IMPORT}, or @{link {@link + * #TYPE_ONLY_EXPORT} as these do not occur in type annotations. */ public boolean isInsideType() { return this == TYPE_BIND @@ -569,6 +572,18 @@ public class ASTExtractor { regexpExtractor.extract(source.substring(1, source.lastIndexOf('/')), offsets, nd, false); } else if (nd.isStringLiteral() && !c.isInsideType() && nd.getRaw().length() < 1000) { regexpExtractor.extract(valueString, makeStringLiteralOffsets(nd.getRaw()), nd, true); + + // Scan the string for template tags, if we're in a context where such tags are relevant. + if (scopeManager.isInTemplateFile()) { + Matcher m = TemplateEngines.TEMPLATE_TAGS.matcher(nd.getRaw()); + int offset = nd.getLoc().getStart().getOffset(); + while (m.find()) { + Label locationLbl = + TemplateEngines.makeLocation( + lexicalExtractor.getTextualExtractor(), offset + m.start(), offset + m.end()); + trapwriter.addTuple("expr_contains_template_tag_location", key, locationLbl); + } + } } return key; } @@ -704,7 +719,8 @@ public class ASTExtractor { + locationManager.getStartLine() + "," + locationManager.getStartColumn()); - Scope moduleScope = scopeManager.enterScope(ScopeKind.MODULE, moduleScopeKey, toplevelLabel); + Scope moduleScope = + scopeManager.enterScope(ScopeKind.MODULE, moduleScopeKey, toplevelLabel); if (sourceType.hasNoGlobalScope()) { scopeManager.setImplicitVariableScope(moduleScope); } @@ -732,7 +748,10 @@ public class ASTExtractor { visitAll(nd.getBody(), toplevelLabel); // Leave the local scope again. - if (sourceType.hasLocalScope()) scopeManager.leaveScope(); + if (sourceType.hasLocalScope()) { + scopeManager.leaveScope(); + scopeManager.resetImplicitVariableScope(); + } contextManager.leaveContainer(); @@ -1159,13 +1178,11 @@ public class ASTExtractor { if (!nd.isComputed() && "template".equals(tryGetIdentifierName(nd.getKey()))) { extractStringValueAsHtml(nd.getValue(), valueLabel); } - + return propkey; } - /** - * Extracts the string value of expr as an HTML snippet. - */ + /** Extracts the string value of expr as an HTML snippet. */ private void extractStringValueAsHtml(Expression expr, Label exprLabel) { TextualExtractor textualExtractor = lexicalExtractor.getTextualExtractor(); if (textualExtractor.isSnippet()) { @@ -1178,16 +1195,21 @@ public class ASTExtractor { String source = sourceAndOffset.fst(); SourceLocation loc = expr.getLoc(); Path originalFile = textualExtractor.getExtractedFile().toPath(); - Path vfile = originalFile.resolveSibling(originalFile.getFileName().toString() + "." + loc.getStart().getLine() + "." + loc.getStart().getColumn() + ".html"); - SourceMap sourceMap = textualExtractor.getSourceMap().offsetBy(loc.getStart().getOffset(), sourceAndOffset.snd()); - TextualExtractor innerTextualExtractor = new TextualExtractor( - trapwriter, - locationManager, - source, - false, - getMetrics(), - vfile.toFile(), - sourceMap); + Path vfile = + originalFile.resolveSibling( + originalFile.getFileName().toString() + + "." + + loc.getStart().getLine() + + "." + + loc.getStart().getColumn() + + ".html"); + SourceMap sourceMap = + textualExtractor + .getSourceMap() + .offsetBy(loc.getStart().getOffset(), sourceAndOffset.snd()); + TextualExtractor innerTextualExtractor = + new TextualExtractor( + trapwriter, locationManager, source, false, getMetrics(), vfile.toFile(), sourceMap); HTMLExtractor html = HTMLExtractor.forEmbeddedHtml(config); List

    + Passing user-controlled sources into NoSQL queries can result in a NoSQL injection flaw. + This tainted NoSQL query containing a user-controlled source can then execute a malicious query in a NoSQL database such as MongoDB. + In order for the user-controlled source to taint the NoSQL query, the user-controller source must be converted into a Python object using something like json.loads or xmltodict.parse. +

    +

    + Because a user-controlled source is passed into the query, the malicious user can have complete control over the query itself. + When the tainted query is executed, the malicious user can commit malicious actions such as bypassing role restrictions or accessing and modifying restricted data in the NoSQL database. +

    + + + +

    + NoSQL injections can be prevented by escaping user-input's special characters that are passed into the NoSQL query from the user-supplied source. + Alternatively, using a sanitize library such as MongoSanitizer will ensure that user-supplied sources can not act as a malicious query. +

    +
    + + +

    In the example below, the user-supplied source is passed to a MongoDB function that queries the MongoDB database.

    + +

    This can be fixed by using a sanitizer library like MongoSanitizer as shown in this annotated code version below.

    + +
    + + +
  • Mongoengine: Documentation.
  • +
  • Flask-Mongoengine: Documentation.
  • +
  • PyMongo: Documentation.
  • +
  • Flask-PyMongo: Documentation.
  • +
  • OWASP: NoSQL Injection.
  • +
  • Security Stack Exchange Discussion: Question 83231.
  • +
    + diff --git a/python/ql/src/experimental/Security/CWE-943/NoSQLInjection.ql b/python/ql/src/experimental/Security/CWE-943/NoSQLInjection.ql new file mode 100644 index 00000000000..cd3909494f3 --- /dev/null +++ b/python/ql/src/experimental/Security/CWE-943/NoSQLInjection.ql @@ -0,0 +1,19 @@ +/** + * @name NoSQL Injection + * @description Building a NoSQL query from user-controlled sources is vulnerable to insertion of + * malicious NoSQL code by the user. + * @kind path-problem + * @problem.severity error + * @id py/nosql-injection + * @tags experimental + * security + * external/cwe/cwe-943 + */ + +import python +import experimental.semmle.python.security.injection.NoSQLInjection + +from CustomPathNode source, CustomPathNode sink +where noSQLInjectionFlow(source, sink) +select sink, source, sink, "$@ NoSQL query contains an unsanitized $@", sink, "This", source, + "user-provided value" diff --git a/python/ql/src/experimental/Security/CWE-943/examples/NoSQLInjection-bad.py b/python/ql/src/experimental/Security/CWE-943/examples/NoSQLInjection-bad.py new file mode 100644 index 00000000000..f0071201969 --- /dev/null +++ b/python/ql/src/experimental/Security/CWE-943/examples/NoSQLInjection-bad.py @@ -0,0 +1,13 @@ +from flask import Flask, request +from flask_pymongo import PyMongo +import json + +mongo = PyMongo(app) + + +@app.route("/") +def home_page(): + unsanitized_search = request.args['search'] + json_search = json.loads(unsanitized_search) + + result = mongo.db.user.find({'name': json_search}) diff --git a/python/ql/src/experimental/Security/CWE-943/examples/NoSQLInjection-good.py b/python/ql/src/experimental/Security/CWE-943/examples/NoSQLInjection-good.py new file mode 100644 index 00000000000..8aed7386f8e --- /dev/null +++ b/python/ql/src/experimental/Security/CWE-943/examples/NoSQLInjection-good.py @@ -0,0 +1,15 @@ +from flask import Flask, request +from flask_pymongo import PyMongo +from mongosanitizer.sanitizer import sanitize +import json + +mongo = PyMongo(app) + + +@app.route("/") +def home_page(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + safe_search = sanitize(unsanitized_search) + + result = client.db.collection.find_one({'data': safe_search}) diff --git a/python/ql/src/experimental/semmle/python/Concepts.qll b/python/ql/src/experimental/semmle/python/Concepts.qll index 21c202851f1..f87caa88497 100644 --- a/python/ql/src/experimental/semmle/python/Concepts.qll +++ b/python/ql/src/experimental/semmle/python/Concepts.qll @@ -209,3 +209,61 @@ class SQLEscape extends DataFlow::Node { */ DataFlow::Node getAnInput() { result = range.getAnInput() } } + +/** Provides a class for modeling NoSQL execution APIs. */ +module NoSQLQuery { + /** + * A data-flow node that executes NoSQL queries. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `NoSQLQuery` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets the argument that specifies the NoSQL query to be executed. */ + abstract DataFlow::Node getQuery(); + } +} + +/** + * A data-flow node that executes NoSQL queries. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `NoSQLQuery::Range` instead. + */ +class NoSQLQuery extends DataFlow::Node { + NoSQLQuery::Range range; + + NoSQLQuery() { this = range } + + /** Gets the argument that specifies the NoSQL query to be executed. */ + DataFlow::Node getQuery() { result = range.getQuery() } +} + +/** Provides classes for modeling NoSQL sanitization-related APIs. */ +module NoSQLSanitizer { + /** + * A data-flow node that collects functions sanitizing NoSQL queries. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `NoSQLSanitizer` instead. + */ + abstract class Range extends DataFlow::Node { + /** Gets the argument that specifies the NoSQL query to be sanitized. */ + abstract DataFlow::Node getAnInput(); + } +} + +/** + * A data-flow node that collects functions sanitizing NoSQL queries. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `NoSQLSanitizer::Range` instead. + */ +class NoSQLSanitizer extends DataFlow::Node { + NoSQLSanitizer::Range range; + + NoSQLSanitizer() { this = range } + + /** Gets the argument that specifies the NoSQL query to be sanitized. */ + DataFlow::Node getAnInput() { result = range.getAnInput() } +} diff --git a/python/ql/src/experimental/semmle/python/Frameworks.qll b/python/ql/src/experimental/semmle/python/Frameworks.qll index 5a77fc63a7d..e8467383824 100644 --- a/python/ql/src/experimental/semmle/python/Frameworks.qll +++ b/python/ql/src/experimental/semmle/python/Frameworks.qll @@ -4,3 +4,4 @@ private import experimental.semmle.python.frameworks.Stdlib private import experimental.semmle.python.frameworks.LDAP +private import experimental.semmle.python.frameworks.NoSQL diff --git a/python/ql/src/experimental/semmle/python/frameworks/NoSQL.qll b/python/ql/src/experimental/semmle/python/frameworks/NoSQL.qll new file mode 100644 index 00000000000..545a7e9d6a5 --- /dev/null +++ b/python/ql/src/experimental/semmle/python/frameworks/NoSQL.qll @@ -0,0 +1,215 @@ +/** + * Provides classes modeling security-relevant aspects of the standard libraries. + * Note: some modeling is done internally in the dataflow/taint tracking implementation. + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.dataflow.new.TaintTracking +private import semmle.python.dataflow.new.RemoteFlowSources +private import experimental.semmle.python.Concepts +private import semmle.python.ApiGraphs + +private module NoSQL { + // API Nodes returning `Mongo` instances. + /** Gets a reference to `pymongo.MongoClient` */ + private API::Node pyMongo() { + result = API::moduleImport("pymongo").getMember("MongoClient").getReturn() + } + + /** Gets a reference to `flask_pymongo.PyMongo` */ + private API::Node flask_PyMongo() { + result = API::moduleImport("flask_pymongo").getMember("PyMongo").getReturn() + } + + /** Gets a reference to `mongoengine` */ + private API::Node mongoEngine() { result = API::moduleImport("mongoengine") } + + /** Gets a reference to `flask_mongoengine.MongoEngine` */ + private API::Node flask_MongoEngine() { + result = API::moduleImport("flask_mongoengine").getMember("MongoEngine").getReturn() + } + + /** + * Gets a reference to an initialized `Mongo` instance. + * See `pyMongo()`, `flask_PyMongo()` + */ + private API::Node mongoInstance() { + result = pyMongo() or + result = flask_PyMongo() + } + + /** + * Gets a reference to an initialized `Mongo` DB instance. + * See `mongoEngine()`, `flask_MongoEngine()` + */ + private API::Node mongoDBInstance() { + result = mongoEngine().getMember(["get_db", "connect"]).getReturn() or + result = mongoEngine().getMember("connection").getMember(["get_db", "connect"]).getReturn() or + result = flask_MongoEngine().getMember("get_db").getReturn() + } + + /** + * Gets a reference to a `Mongo` DB use. + * + * See `mongoInstance()`, `mongoDBInstance()`. + */ + private DataFlow::LocalSourceNode mongoDB(DataFlow::TypeTracker t) { + t.start() and + ( + exists(SubscriptNode subscript | + subscript.getObject() = mongoInstance().getAUse().asCfgNode() and + result.asCfgNode() = subscript + ) + or + result.(DataFlow::AttrRead).getObject() = mongoInstance().getAUse() + or + result = mongoDBInstance().getAUse() + ) + or + exists(DataFlow::TypeTracker t2 | result = mongoDB(t2).track(t2, t)) + } + + /** + * Gets a reference to a `Mongo` DB use. + * + * ```py + * from flask_pymongo import PyMongo + * mongo = PyMongo(app) + * mongo.db.user.find({'name': safe_search}) + * ``` + * + * `mongo.db` would be a use of a `Mongo` instance, and so the result. + */ + private DataFlow::Node mongoDB() { mongoDB(DataFlow::TypeTracker::end()).flowsTo(result) } + + /** + * Gets a reference to a `Mongo` collection use. + * + * See `mongoDB()`. + */ + private DataFlow::LocalSourceNode mongoCollection(DataFlow::TypeTracker t) { + t.start() and + ( + exists(SubscriptNode subscript | result.asCfgNode() = subscript | + subscript.getObject() = mongoDB().asCfgNode() + ) + or + result.(DataFlow::AttrRead).getObject() = mongoDB() + ) + or + exists(DataFlow::TypeTracker t2 | result = mongoCollection(t2).track(t2, t)) + } + + /** + * Gets a reference to a `Mongo` collection use. + * + * ```py + * from flask_pymongo import PyMongo + * mongo = PyMongo(app) + * mongo.db.user.find({'name': safe_search}) + * ``` + * + * `mongo.db.user` would be a use of a `Mongo` collection, and so the result. + */ + private DataFlow::Node mongoCollection() { + mongoCollection(DataFlow::TypeTracker::end()).flowsTo(result) + } + + /** This class represents names of find_* relevant `Mongo` collection-level operation methods. */ + private class MongoCollectionMethodNames extends string { + MongoCollectionMethodNames() { + this in [ + "find", "find_raw_batches", "find_one", "find_one_and_delete", "find_and_modify", + "find_one_and_replace", "find_one_and_update", "find_one_or_404" + ] + } + } + + /** + * Gets a reference to a `Mongo` collection method. + * + * ```py + * from flask_pymongo import PyMongo + * mongo = PyMongo(app) + * mongo.db.user.find({'name': safe_search}) + * ``` + * + * `mongo.db.user.find` would be a collection method, and so the result. + */ + private DataFlow::Node mongoCollectionMethod() { + mongoCollection() = result.(DataFlow::AttrRead).getObject() and + result.(DataFlow::AttrRead).getAttributeName() instanceof MongoCollectionMethodNames + } + + /** + * Gets a reference to a `Mongo` collection method call + * + * ```py + * from flask_pymongo import PyMongo + * mongo = PyMongo(app) + * mongo.db.user.find({'name': safe_search}) + * ``` + * + * `mongo.db.user.find({'name': safe_search})` would be a collection method call, and so the result. + */ + private class MongoCollectionCall extends DataFlow::CallCfgNode, NoSQLQuery::Range { + MongoCollectionCall() { this.getFunction() = mongoCollectionMethod() } + + override DataFlow::Node getQuery() { result = this.getArg(0) } + } + + /** + * Gets a reference to a call from a class whose base is a reference to `mongoEngine()` or `flask_MongoEngine()`'s + * `Document` or `EmbeddedDocument` objects and its attribute is `objects`. + * + * ```py + * from flask_mongoengine import MongoEngine + * db = MongoEngine(app) + * class Movie(db.Document): + * title = db.StringField(required=True) + * + * Movie.objects(__raw__=json_search) + * ``` + * + * `Movie.objects(__raw__=json_search)` would be the result. + */ + private class MongoEngineObjectsCall extends DataFlow::CallCfgNode, NoSQLQuery::Range { + MongoEngineObjectsCall() { + this = + [mongoEngine(), flask_MongoEngine()] + .getMember(["Document", "EmbeddedDocument"]) + .getASubclass() + .getMember("objects") + .getACall() + } + + override DataFlow::Node getQuery() { result = this.getArgByName(_) } + } + + /** Gets a reference to `mongosanitizer.sanitizer.sanitize` */ + private class MongoSanitizerCall extends DataFlow::CallCfgNode, NoSQLSanitizer::Range { + MongoSanitizerCall() { + this = + API::moduleImport("mongosanitizer").getMember("sanitizer").getMember("sanitize").getACall() + } + + override DataFlow::Node getAnInput() { result = this.getArg(0) } + } + + /** + * ObjectId returns a string representing an id. + * If at any time ObjectId can't parse it's input (like when a tainted dict in passed in), + * then ObjectId will throw an error preventing the query from running. + */ + private class BsonObjectIdCall extends DataFlow::CallCfgNode, NoSQLSanitizer::Range { + BsonObjectIdCall() { + this = + API::moduleImport(["bson", "bson.objectid", "bson.json_util"]) + .getMember("ObjectId") + .getACall() + } + + override DataFlow::Node getAnInput() { result = this.getArg(0) } + } +} diff --git a/python/ql/src/experimental/semmle/python/frameworks/Xmltodict.qll b/python/ql/src/experimental/semmle/python/frameworks/Xmltodict.qll new file mode 100644 index 00000000000..353130fdc9c --- /dev/null +++ b/python/ql/src/experimental/semmle/python/frameworks/Xmltodict.qll @@ -0,0 +1,34 @@ +/** + * Provides classes modeling security-relevant aspects of the `xmltodict` PyPI package. + * See https://pypi.org/project/xmltodict/ + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.Concepts +private import semmle.python.ApiGraphs + +/** + * Provides models for the `xmltodict` PyPI package. + * See https://pypi.org/project/xmltodict/ + */ +private module XmlToDictModel { + /** Gets a reference to the `xmltodict` module. */ + API::Node xmltodict() { result = API::moduleImport("xmltodict") } + + /** + * A call to `xmltodict.parse` + * See https://github.com/martinblech/xmltodict/blob/ae19c452ca000bf243bfc16274c060bf3bf7cf51/xmltodict.py#L198 + */ + private class XmlToDictParseCall extends Decoding::Range, DataFlow::CallCfgNode { + XmlToDictParseCall() { this = xmltodict().getMember("parse").getACall() } + + override predicate mayExecuteInput() { none() } + + override DataFlow::Node getAnInput() { result = this.getArg(0) } + + override DataFlow::Node getOutput() { result = this } + + override string getFormat() { result = "XML" } + } +} diff --git a/python/ql/src/experimental/semmle/python/security/injection/NoSQLInjection.qll b/python/ql/src/experimental/semmle/python/security/injection/NoSQLInjection.qll new file mode 100644 index 00000000000..fb3890d2f7e --- /dev/null +++ b/python/ql/src/experimental/semmle/python/security/injection/NoSQLInjection.qll @@ -0,0 +1,57 @@ +import python +import semmle.python.dataflow.new.DataFlow +import semmle.python.dataflow.new.DataFlow2 +import semmle.python.dataflow.new.TaintTracking +import semmle.python.dataflow.new.TaintTracking2 +import semmle.python.dataflow.new.RemoteFlowSources +import semmle.python.security.dataflow.ChainedConfigs12 +import experimental.semmle.python.Concepts +import semmle.python.Concepts + +/** + * A taint-tracking configuration for detecting string-to-dict conversions. + */ +class RFSToDictConfig extends TaintTracking::Configuration { + RFSToDictConfig() { this = "RFSToDictConfig" } + + override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + + override predicate isSink(DataFlow::Node sink) { + exists(Decoding decoding | decoding.getFormat() = "JSON" and sink = decoding.getOutput()) + } + + override predicate isSanitizer(DataFlow::Node sanitizer) { + sanitizer = any(NoSQLSanitizer noSQLSanitizer).getAnInput() + } +} + +/** + * A taint-tracking configuration for detecting NoSQL injections (previously converted to a dict). + */ +class FromDataDictToSink extends TaintTracking2::Configuration { + FromDataDictToSink() { this = "FromDataDictToSink" } + + override predicate isSource(DataFlow::Node source) { + exists(Decoding decoding | decoding.getFormat() = "JSON" and source = decoding.getOutput()) + } + + override predicate isSink(DataFlow::Node sink) { sink = any(NoSQLQuery noSQLQuery).getQuery() } + + override predicate isSanitizer(DataFlow::Node sanitizer) { + sanitizer = any(NoSQLSanitizer noSQLSanitizer).getAnInput() + } +} + +/** + * A predicate checking string-to-dict conversion and its arrival to a NoSQL injection sink. + */ +predicate noSQLInjectionFlow(CustomPathNode source, CustomPathNode sink) { + exists( + RFSToDictConfig config, DataFlow::PathNode mid1, DataFlow2::PathNode mid2, + FromDataDictToSink config2 + | + config.hasFlowPath(source.asNode1(), mid1) and + config2.hasFlowPath(mid2, sink.asNode2()) and + mid1.getNode().asCfgNode() = mid2.getNode().asCfgNode() + ) +} diff --git a/python/ql/src/qlpack.lock.yml b/python/ql/src/qlpack.lock.yml new file mode 100644 index 00000000000..06dd07fc7dc --- /dev/null +++ b/python/ql/src/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 9807b169d44..26f051faa54 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,8 @@ -name: codeql-python -version: 0.0.0 -dbscheme: semmlecode.python.dbscheme +name: codeql/python-queries +version: 0.0.2 +dependencies: + codeql/python-all: ^0.0.2 + codeql/suite-helpers: ^0.0.2 suites: codeql-suites extractor: python +defaultSuiteFile: codeql-suites/python-code-scanning.qls diff --git a/python/ql/src/semmle/python/frameworks/PEP249.qll b/python/ql/src/semmle/python/frameworks/PEP249.qll deleted file mode 100644 index 3ae2b5bf610..00000000000 --- a/python/ql/src/semmle/python/frameworks/PEP249.qll +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Provides classes modeling PEP 249. - * See https://www.python.org/dev/peps/pep-0249/. - */ - -private import python -private import semmle.python.dataflow.new.DataFlow -private import semmle.python.dataflow.new.RemoteFlowSources -private import semmle.python.Concepts -private import semmle.python.ApiGraphs - -/** - * A module implementing PEP 249. Extend this class for implementations. - * - * DEPRECATED: Extend `PEP249ModuleApiNode` instead. - */ -abstract deprecated class PEP249Module extends DataFlow::Node { } - -/** - * An abstract class encompassing API graph nodes that implement PEP 249. - * Extend this class for implementations. - */ -abstract class PEP249ModuleApiNode extends API::Node { - /** Gets a string representation of this element. */ - override string toString() { result = this.(API::Node).toString() } -} - -/** Gets a reference to a connect call. */ -DataFlow::Node connect() { result = any(PEP249ModuleApiNode a).getMember("connect").getAUse() } - -/** - * Provides models for the `db.Connection` class - * - * See https://www.python.org/dev/peps/pep-0249/#connection-objects. - */ -module Connection { - /** - * A source of instances of `db.Connection`, extend this class to model new instances. - * - * This can include instantiations of the class, return values from function - * calls, or a special parameter that will be set when functions are called by external - * libraries. - * - * Use the predicate `Connection::instance()` to get references to instances of `db.Connection`. - * - * Extend this class if the module implementing PEP 249 offers more direct ways to obtain - * a connection than going through `connect`. - */ - abstract class InstanceSource extends DataFlow::Node { } - - /** A direct instantiation of `db.Connection`. */ - private class ClassInstantiation extends InstanceSource, DataFlow::CallCfgNode { - ClassInstantiation() { this.getFunction() = connect() } - } - - /** Gets a reference to an instance of `db.Connection`. */ - private DataFlow::TypeTrackingNode instance(DataFlow::TypeTracker t) { - t.start() and - result instanceof InstanceSource - or - exists(DataFlow::TypeTracker t2 | result = instance(t2).track(t2, t)) - } - - /** Gets a reference to an instance of `db.Connection`. */ - DataFlow::Node instance() { instance(DataFlow::TypeTracker::end()).flowsTo(result) } -} - -/** - * Provides models for the `cursor` method on a connection. - * See https://www.python.org/dev/peps/pep-0249/#cursor. - */ -module cursor { - /** Gets a reference to the `cursor` method on a connection. */ - private DataFlow::TypeTrackingNode methodRef(DataFlow::TypeTracker t) { - t.startInAttr("cursor") and - result = Connection::instance() - or - exists(DataFlow::TypeTracker t2 | result = methodRef(t2).track(t2, t)) - } - - /** Gets a reference to the `cursor` method on a connection. */ - DataFlow::Node methodRef() { methodRef(DataFlow::TypeTracker::end()).flowsTo(result) } - - /** Gets a reference to a result of calling the `cursor` method on a connection. */ - private DataFlow::TypeTrackingNode methodResult(DataFlow::TypeTracker t) { - t.start() and - result.asCfgNode().(CallNode).getFunction() = methodRef().asCfgNode() - or - exists(DataFlow::TypeTracker t2 | result = methodResult(t2).track(t2, t)) - } - - /** Gets a reference to a result of calling the `cursor` method on a connection. */ - DataFlow::Node methodResult() { methodResult(DataFlow::TypeTracker::end()).flowsTo(result) } -} - -/** - * Gets a reference to the `execute` method on a cursor (or on a connection). - * - * Note: while `execute` method on a connection is not part of PEP249, if it is used, we - * recognize it as an alias for constructing a cursor and calling `execute` on it. - * - * See https://www.python.org/dev/peps/pep-0249/#id15. - */ -private DataFlow::TypeTrackingNode execute(DataFlow::TypeTracker t) { - t.startInAttr("execute") and - result in [cursor::methodResult(), Connection::instance()] - or - exists(DataFlow::TypeTracker t2 | result = execute(t2).track(t2, t)) -} - -/** - * Gets a reference to the `execute` method on a cursor (or on a connection). - * - * Note: while `execute` method on a connection is not part of PEP249, if it is used, we - * recognize it as an alias for constructing a cursor and calling `execute` on it. - * - * See https://www.python.org/dev/peps/pep-0249/#id15. - */ -DataFlow::Node execute() { execute(DataFlow::TypeTracker::end()).flowsTo(result) } - -/** A call to the `execute` method on a cursor (or on a connection). */ -private class ExecuteCall extends SqlExecution::Range, DataFlow::CallCfgNode { - ExecuteCall() { this.getFunction() = execute() } - - override DataFlow::Node getSql() { result in [this.getArg(0), this.getArgByName("sql")] } -} diff --git a/python/ql/src/semmle/python/security/performance/RegExpTreeView.qll b/python/ql/src/semmle/python/security/performance/RegExpTreeView.qll deleted file mode 100644 index addd192cafa..00000000000 --- a/python/ql/src/semmle/python/security/performance/RegExpTreeView.qll +++ /dev/null @@ -1,15 +0,0 @@ -/** - * This module should provide a class hierarchy corresponding to a parse tree of regular expressions. - */ - -import python -import semmle.python.RegexTreeView - -/** - * Holds if the regular expression should not be considered. - * - * For javascript we make the pragmatic performance optimization to ignore files we did not extract. - */ -predicate isExcluded(RegExpParent parent) { - not exists(parent.getRegex().getLocation().getFile().getRelativePath()) -} diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/NoSQLInjection.expected b/python/ql/test/experimental/query-tests/Security/CWE-943/NoSQLInjection.expected new file mode 100644 index 00000000000..c6dd255a0de --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/NoSQLInjection.expected @@ -0,0 +1,131 @@ +edges +| flask_mongoengine_bad.py:19:21:19:27 | ControlFlowNode for request | flask_mongoengine_bad.py:19:21:19:32 | ControlFlowNode for Attribute | +| flask_mongoengine_bad.py:19:21:19:32 | ControlFlowNode for Attribute | flask_mongoengine_bad.py:19:21:19:42 | ControlFlowNode for Subscript | +| flask_mongoengine_bad.py:19:21:19:42 | ControlFlowNode for Subscript | flask_mongoengine_bad.py:20:19:20:43 | ControlFlowNode for Attribute() | +| flask_mongoengine_bad.py:20:19:20:43 | ControlFlowNode for Attribute() | flask_mongoengine_bad.py:22:34:22:44 | ControlFlowNode for json_search | +| flask_mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | flask_mongoengine_bad.py:26:21:26:32 | ControlFlowNode for Attribute | +| flask_mongoengine_bad.py:26:21:26:32 | ControlFlowNode for Attribute | flask_mongoengine_bad.py:26:21:26:42 | ControlFlowNode for Subscript | +| flask_mongoengine_bad.py:26:21:26:42 | ControlFlowNode for Subscript | flask_mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | +| flask_mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | flask_mongoengine_bad.py:30:39:30:59 | ControlFlowNode for Dict | +| flask_mongoengine_good.py:20:21:20:27 | ControlFlowNode for request | flask_mongoengine_good.py:20:21:20:32 | ControlFlowNode for Attribute | +| flask_mongoengine_good.py:20:21:20:32 | ControlFlowNode for Attribute | flask_mongoengine_good.py:20:21:20:42 | ControlFlowNode for Subscript | +| flask_mongoengine_good.py:20:21:20:42 | ControlFlowNode for Subscript | flask_mongoengine_good.py:21:19:21:43 | ControlFlowNode for Attribute() | +| flask_pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | flask_pymongo_bad.py:11:21:11:32 | ControlFlowNode for Attribute | +| flask_pymongo_bad.py:11:21:11:32 | ControlFlowNode for Attribute | flask_pymongo_bad.py:11:21:11:42 | ControlFlowNode for Subscript | +| flask_pymongo_bad.py:11:21:11:42 | ControlFlowNode for Subscript | flask_pymongo_bad.py:12:19:12:43 | ControlFlowNode for Attribute() | +| flask_pymongo_bad.py:12:19:12:43 | ControlFlowNode for Attribute() | flask_pymongo_bad.py:14:31:14:51 | ControlFlowNode for Dict | +| flask_pymongo_good.py:12:21:12:27 | ControlFlowNode for request | flask_pymongo_good.py:12:21:12:32 | ControlFlowNode for Attribute | +| flask_pymongo_good.py:12:21:12:32 | ControlFlowNode for Attribute | flask_pymongo_good.py:12:21:12:42 | ControlFlowNode for Subscript | +| flask_pymongo_good.py:12:21:12:42 | ControlFlowNode for Subscript | flask_pymongo_good.py:13:19:13:43 | ControlFlowNode for Attribute() | +| mongoengine_bad.py:18:21:18:27 | ControlFlowNode for request | mongoengine_bad.py:18:21:18:32 | ControlFlowNode for Attribute | +| mongoengine_bad.py:18:21:18:32 | ControlFlowNode for Attribute | mongoengine_bad.py:18:21:18:42 | ControlFlowNode for Subscript | +| mongoengine_bad.py:18:21:18:42 | ControlFlowNode for Subscript | mongoengine_bad.py:19:19:19:43 | ControlFlowNode for Attribute() | +| mongoengine_bad.py:19:19:19:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:22:26:22:46 | ControlFlowNode for Dict | +| mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | mongoengine_bad.py:26:21:26:32 | ControlFlowNode for Attribute | +| mongoengine_bad.py:26:21:26:32 | ControlFlowNode for Attribute | mongoengine_bad.py:26:21:26:42 | ControlFlowNode for Subscript | +| mongoengine_bad.py:26:21:26:42 | ControlFlowNode for Subscript | mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | +| mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:30:26:30:46 | ControlFlowNode for Dict | +| mongoengine_bad.py:34:21:34:27 | ControlFlowNode for request | mongoengine_bad.py:34:21:34:32 | ControlFlowNode for Attribute | +| mongoengine_bad.py:34:21:34:32 | ControlFlowNode for Attribute | mongoengine_bad.py:34:21:34:42 | ControlFlowNode for Subscript | +| mongoengine_bad.py:34:21:34:42 | ControlFlowNode for Subscript | mongoengine_bad.py:35:19:35:43 | ControlFlowNode for Attribute() | +| mongoengine_bad.py:35:19:35:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:38:26:38:46 | ControlFlowNode for Dict | +| mongoengine_bad.py:42:21:42:27 | ControlFlowNode for request | mongoengine_bad.py:42:21:42:32 | ControlFlowNode for Attribute | +| mongoengine_bad.py:42:21:42:32 | ControlFlowNode for Attribute | mongoengine_bad.py:42:21:42:42 | ControlFlowNode for Subscript | +| mongoengine_bad.py:42:21:42:42 | ControlFlowNode for Subscript | mongoengine_bad.py:43:19:43:43 | ControlFlowNode for Attribute() | +| mongoengine_bad.py:43:19:43:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:46:26:46:46 | ControlFlowNode for Dict | +| mongoengine_bad.py:50:21:50:27 | ControlFlowNode for request | mongoengine_bad.py:50:21:50:32 | ControlFlowNode for Attribute | +| mongoengine_bad.py:50:21:50:32 | ControlFlowNode for Attribute | mongoengine_bad.py:50:21:50:42 | ControlFlowNode for Subscript | +| mongoengine_bad.py:50:21:50:42 | ControlFlowNode for Subscript | mongoengine_bad.py:51:19:51:43 | ControlFlowNode for Attribute() | +| mongoengine_bad.py:51:19:51:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:53:34:53:44 | ControlFlowNode for json_search | +| mongoengine_bad.py:57:21:57:27 | ControlFlowNode for request | mongoengine_bad.py:57:21:57:32 | ControlFlowNode for Attribute | +| mongoengine_bad.py:57:21:57:32 | ControlFlowNode for Attribute | mongoengine_bad.py:57:21:57:42 | ControlFlowNode for Subscript | +| mongoengine_bad.py:57:21:57:42 | ControlFlowNode for Subscript | mongoengine_bad.py:58:19:58:43 | ControlFlowNode for Attribute() | +| mongoengine_bad.py:58:19:58:43 | ControlFlowNode for Attribute() | mongoengine_bad.py:61:29:61:49 | ControlFlowNode for Dict | +| mongoengine_good.py:19:21:19:27 | ControlFlowNode for request | mongoengine_good.py:19:21:19:32 | ControlFlowNode for Attribute | +| mongoengine_good.py:19:21:19:32 | ControlFlowNode for Attribute | mongoengine_good.py:19:21:19:42 | ControlFlowNode for Subscript | +| mongoengine_good.py:19:21:19:42 | ControlFlowNode for Subscript | mongoengine_good.py:20:19:20:43 | ControlFlowNode for Attribute() | +| pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | pymongo_bad.py:11:21:11:32 | ControlFlowNode for Attribute | +| pymongo_bad.py:11:21:11:32 | ControlFlowNode for Attribute | pymongo_bad.py:11:21:11:42 | ControlFlowNode for Subscript | +| pymongo_bad.py:11:21:11:42 | ControlFlowNode for Subscript | pymongo_bad.py:12:19:12:43 | ControlFlowNode for Attribute() | +| pymongo_bad.py:12:19:12:43 | ControlFlowNode for Attribute() | pymongo_bad.py:14:42:14:62 | ControlFlowNode for Dict | +| pymongo_good.py:12:21:12:27 | ControlFlowNode for request | pymongo_good.py:12:21:12:32 | ControlFlowNode for Attribute | +| pymongo_good.py:12:21:12:32 | ControlFlowNode for Attribute | pymongo_good.py:12:21:12:42 | ControlFlowNode for Subscript | +| pymongo_good.py:12:21:12:42 | ControlFlowNode for Subscript | pymongo_good.py:13:19:13:43 | ControlFlowNode for Attribute() | +nodes +| flask_mongoengine_bad.py:19:21:19:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| flask_mongoengine_bad.py:19:21:19:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| flask_mongoengine_bad.py:19:21:19:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| flask_mongoengine_bad.py:20:19:20:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| flask_mongoengine_bad.py:22:34:22:44 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | +| flask_mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| flask_mongoengine_bad.py:26:21:26:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| flask_mongoengine_bad.py:26:21:26:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| flask_mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| flask_mongoengine_bad.py:30:39:30:59 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| flask_mongoengine_good.py:20:21:20:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| flask_mongoengine_good.py:20:21:20:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| flask_mongoengine_good.py:20:21:20:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| flask_mongoengine_good.py:21:19:21:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| flask_pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| flask_pymongo_bad.py:11:21:11:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| flask_pymongo_bad.py:11:21:11:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| flask_pymongo_bad.py:12:19:12:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| flask_pymongo_bad.py:14:31:14:51 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| flask_pymongo_good.py:12:21:12:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| flask_pymongo_good.py:12:21:12:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| flask_pymongo_good.py:12:21:12:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| flask_pymongo_good.py:13:19:13:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| mongoengine_bad.py:18:21:18:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| mongoengine_bad.py:18:21:18:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| mongoengine_bad.py:18:21:18:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| mongoengine_bad.py:19:19:19:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| mongoengine_bad.py:22:26:22:46 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| mongoengine_bad.py:26:21:26:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| mongoengine_bad.py:26:21:26:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| mongoengine_bad.py:27:19:27:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| mongoengine_bad.py:30:26:30:46 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_bad.py:34:21:34:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| mongoengine_bad.py:34:21:34:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| mongoengine_bad.py:34:21:34:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| mongoengine_bad.py:35:19:35:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| mongoengine_bad.py:38:26:38:46 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_bad.py:42:21:42:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| mongoengine_bad.py:42:21:42:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| mongoengine_bad.py:42:21:42:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| mongoengine_bad.py:43:19:43:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| mongoengine_bad.py:46:26:46:46 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_bad.py:50:21:50:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| mongoengine_bad.py:50:21:50:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| mongoengine_bad.py:50:21:50:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| mongoengine_bad.py:51:19:51:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| mongoengine_bad.py:53:34:53:44 | ControlFlowNode for json_search | semmle.label | ControlFlowNode for json_search | +| mongoengine_bad.py:57:21:57:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| mongoengine_bad.py:57:21:57:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| mongoengine_bad.py:57:21:57:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| mongoengine_bad.py:58:19:58:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| mongoengine_bad.py:61:29:61:49 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| mongoengine_good.py:19:21:19:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| mongoengine_good.py:19:21:19:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| mongoengine_good.py:19:21:19:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| mongoengine_good.py:20:19:20:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| pymongo_bad.py:11:21:11:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| pymongo_bad.py:11:21:11:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| pymongo_bad.py:12:19:12:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| pymongo_bad.py:14:42:14:62 | ControlFlowNode for Dict | semmle.label | ControlFlowNode for Dict | +| pymongo_good.py:12:21:12:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| pymongo_good.py:12:21:12:32 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| pymongo_good.py:12:21:12:42 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| pymongo_good.py:13:19:13:43 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +#select +| flask_mongoengine_bad.py:22:34:22:44 | ControlFlowNode for json_search | flask_mongoengine_bad.py:19:21:19:27 | ControlFlowNode for request | flask_mongoengine_bad.py:22:34:22:44 | ControlFlowNode for json_search | $@ NoSQL query contains an unsanitized $@ | flask_mongoengine_bad.py:22:34:22:44 | ControlFlowNode for json_search | This | flask_mongoengine_bad.py:19:21:19:27 | ControlFlowNode for request | user-provided value | +| flask_mongoengine_bad.py:30:39:30:59 | ControlFlowNode for Dict | flask_mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | flask_mongoengine_bad.py:30:39:30:59 | ControlFlowNode for Dict | $@ NoSQL query contains an unsanitized $@ | flask_mongoengine_bad.py:30:39:30:59 | ControlFlowNode for Dict | This | flask_mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | user-provided value | +| flask_pymongo_bad.py:14:31:14:51 | ControlFlowNode for Dict | flask_pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | flask_pymongo_bad.py:14:31:14:51 | ControlFlowNode for Dict | $@ NoSQL query contains an unsanitized $@ | flask_pymongo_bad.py:14:31:14:51 | ControlFlowNode for Dict | This | flask_pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | user-provided value | +| mongoengine_bad.py:22:26:22:46 | ControlFlowNode for Dict | mongoengine_bad.py:18:21:18:27 | ControlFlowNode for request | mongoengine_bad.py:22:26:22:46 | ControlFlowNode for Dict | $@ NoSQL query contains an unsanitized $@ | mongoengine_bad.py:22:26:22:46 | ControlFlowNode for Dict | This | mongoengine_bad.py:18:21:18:27 | ControlFlowNode for request | user-provided value | +| mongoengine_bad.py:30:26:30:46 | ControlFlowNode for Dict | mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | mongoengine_bad.py:30:26:30:46 | ControlFlowNode for Dict | $@ NoSQL query contains an unsanitized $@ | mongoengine_bad.py:30:26:30:46 | ControlFlowNode for Dict | This | mongoengine_bad.py:26:21:26:27 | ControlFlowNode for request | user-provided value | +| mongoengine_bad.py:38:26:38:46 | ControlFlowNode for Dict | mongoengine_bad.py:34:21:34:27 | ControlFlowNode for request | mongoengine_bad.py:38:26:38:46 | ControlFlowNode for Dict | $@ NoSQL query contains an unsanitized $@ | mongoengine_bad.py:38:26:38:46 | ControlFlowNode for Dict | This | mongoengine_bad.py:34:21:34:27 | ControlFlowNode for request | user-provided value | +| mongoengine_bad.py:46:26:46:46 | ControlFlowNode for Dict | mongoengine_bad.py:42:21:42:27 | ControlFlowNode for request | mongoengine_bad.py:46:26:46:46 | ControlFlowNode for Dict | $@ NoSQL query contains an unsanitized $@ | mongoengine_bad.py:46:26:46:46 | ControlFlowNode for Dict | This | mongoengine_bad.py:42:21:42:27 | ControlFlowNode for request | user-provided value | +| mongoengine_bad.py:53:34:53:44 | ControlFlowNode for json_search | mongoengine_bad.py:50:21:50:27 | ControlFlowNode for request | mongoengine_bad.py:53:34:53:44 | ControlFlowNode for json_search | $@ NoSQL query contains an unsanitized $@ | mongoengine_bad.py:53:34:53:44 | ControlFlowNode for json_search | This | mongoengine_bad.py:50:21:50:27 | ControlFlowNode for request | user-provided value | +| mongoengine_bad.py:61:29:61:49 | ControlFlowNode for Dict | mongoengine_bad.py:57:21:57:27 | ControlFlowNode for request | mongoengine_bad.py:61:29:61:49 | ControlFlowNode for Dict | $@ NoSQL query contains an unsanitized $@ | mongoengine_bad.py:61:29:61:49 | ControlFlowNode for Dict | This | mongoengine_bad.py:57:21:57:27 | ControlFlowNode for request | user-provided value | +| pymongo_bad.py:14:42:14:62 | ControlFlowNode for Dict | pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | pymongo_bad.py:14:42:14:62 | ControlFlowNode for Dict | $@ NoSQL query contains an unsanitized $@ | pymongo_bad.py:14:42:14:62 | ControlFlowNode for Dict | This | pymongo_bad.py:11:21:11:27 | ControlFlowNode for request | user-provided value | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/NoSQLInjection.qlref b/python/ql/test/experimental/query-tests/Security/CWE-943/NoSQLInjection.qlref new file mode 100644 index 00000000000..3ca00df892b --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/NoSQLInjection.qlref @@ -0,0 +1 @@ +experimental/Security/CWE-943/NoSQLInjection.ql diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/flask_mongoengine_bad.py b/python/ql/test/experimental/query-tests/Security/CWE-943/flask_mongoengine_bad.py new file mode 100644 index 00000000000..9fc8aaefc0f --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/flask_mongoengine_bad.py @@ -0,0 +1,33 @@ +from flask import Flask, request +from flask_mongoengine import MongoEngine +import json + +app = Flask(__name__) +app.config.from_pyfile('the-config.cfg') +db = MongoEngine(app) + + +class Movie(db.Document): + title = db.StringField(required=True) + + +Movie(title='test').save() + + +@app.route("/subclass_objects") +def subclass_objects(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + return Movie.objects(__raw__=json_search) + +@app.route("/get_db_find") +def get_db_find(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + retrieved_db = db.get_db() + return retrieved_db["Movie"].find({'name': json_search}) + +# if __name__ == "__main__": +# app.run(debug=True) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/flask_mongoengine_good.py b/python/ql/test/experimental/query-tests/Security/CWE-943/flask_mongoengine_good.py new file mode 100644 index 00000000000..29a2c75d664 --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/flask_mongoengine_good.py @@ -0,0 +1,27 @@ +from flask import Flask, request +from flask_mongoengine import MongoEngine +from mongosanitizer.sanitizer import sanitize +import json + +app = Flask(__name__) +app.config.from_pyfile('the-config.cfg') +db = MongoEngine(app) + + +class Movie(db.Document): + title = db.StringField(required=True) + + +Movie(title='test').save() + + +@app.route("/subclass_objects") +def subclass_objects(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + safe_search = sanitize(json_search) + + return Movie.objects(__raw__=safe_search) + +# if __name__ == "__main__": +# app.run(debug=True) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/flask_pymongo_bad.py b/python/ql/test/experimental/query-tests/Security/CWE-943/flask_pymongo_bad.py new file mode 100644 index 00000000000..0c1023971da --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/flask_pymongo_bad.py @@ -0,0 +1,17 @@ +from flask import Flask, request +from flask_pymongo import PyMongo +import json + +app = Flask(__name__) +mongo = PyMongo(app) + + +@app.route("/") +def home_page(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + return mongo.db.user.find({'name': json_search}) + +# if __name__ == "__main__": +# app.run(debug=True) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/flask_pymongo_good.py b/python/ql/test/experimental/query-tests/Security/CWE-943/flask_pymongo_good.py new file mode 100644 index 00000000000..6576ba88af8 --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/flask_pymongo_good.py @@ -0,0 +1,19 @@ +from flask import Flask, request +from flask_pymongo import PyMongo +from mongosanitizer.sanitizer import sanitize +import json + +app = Flask(__name__) +mongo = PyMongo(app) + + +@app.route("/") +def home_page(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + safe_search = sanitize(json_search) + + return mongo.db.user.find({'name': safe_search}) + +# if __name__ == "__main__": +# app.run(debug=True) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/mongoengine_bad.py b/python/ql/test/experimental/query-tests/Security/CWE-943/mongoengine_bad.py new file mode 100644 index 00000000000..81800425e46 --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/mongoengine_bad.py @@ -0,0 +1,64 @@ +from flask import Flask, request +import mongoengine as me +from mongoengine.connection import get_db, connect +import json + +app = Flask(__name__) + + +class Movie(me.Document): + title = me.StringField(required=True) + + +Movie(title='test').save() + + +@app.route("/connect_find") +def connect_find(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + db = me.connect('mydb') + return db.movie.find({'name': json_search}) + +@app.route("/connection_connect_find") +def connection_connect_find(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + db = connect('mydb') + return db.movie.find({'name': json_search}) + +@app.route("/get_db_find") +def get_db_find(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + db = me.get_db() + return db.movie.find({'name': json_search}) + +@app.route("/connection_get_db_find") +def connection_get_db_find(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + db = get_db() + return db.movie.find({'name': json_search}) + +@app.route("/subclass_objects") +def subclass_objects(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + return Movie.objects(__raw__=json_search) + +@app.route("/subscript_find") +def subscript_find(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + db = me.connect('mydb') + return db['movie'].find({'name': json_search}) + +# if __name__ == "__main__": +# app.run(debug=True) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/mongoengine_good.py b/python/ql/test/experimental/query-tests/Security/CWE-943/mongoengine_good.py new file mode 100644 index 00000000000..c9b2b8e762f --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/mongoengine_good.py @@ -0,0 +1,27 @@ +from flask import Flask, request +import mongoengine as me +from mongoengine.connection import get_db, connect +from mongosanitizer.sanitizer import sanitize +import json + +app = Flask(__name__) + + +class Movie(me.Document): + title = me.StringField(required=True) + + +Movie(title='test').save() + + +@app.route("/connect_find") +def connect_find(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + safe_search = sanitize(json_search) + + db = me.connect('mydb') + return db.movie.find({'name': safe_search}) + +# if __name__ == "__main__": +# app.run(debug=True) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/pymongo_bad.py b/python/ql/test/experimental/query-tests/Security/CWE-943/pymongo_bad.py new file mode 100644 index 00000000000..da16df828b8 --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/pymongo_bad.py @@ -0,0 +1,17 @@ +from flask import Flask, request +from pymongo import MongoClient +import json + +app = Flask(__name__) +client = MongoClient() + + +@app.route("/") +def home_page(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + + return client.db.collection.find_one({'data': json_search}) + +# if __name__ == "__main__": +# app.run(debug=True) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-943/pymongo_good.py b/python/ql/test/experimental/query-tests/Security/CWE-943/pymongo_good.py new file mode 100644 index 00000000000..5b112e12385 --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-943/pymongo_good.py @@ -0,0 +1,19 @@ +from flask import Flask, request +from pymongo import MongoClient +from mongosanitizer.sanitizer import sanitize +import json + +app = Flask(__name__) +client = MongoClient() + + +@app.route("/") +def home_page(): + unsafe_search = request.args['search'] + json_search = json.loads(unsafe_search) + safe_search = sanitize(json_search) + + return client.db.collection.find_one({'data': safe_search}) + +# if __name__ == "__main__": +# app.run(debug=True) diff --git a/python/ql/test/library-tests/frameworks/peewee/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/peewee/ConceptsTest.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/ql/test/library-tests/frameworks/peewee/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/peewee/ConceptsTest.ql new file mode 100644 index 00000000000..b557a0bccb6 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/peewee/ConceptsTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.meta.ConceptsTest diff --git a/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.expected new file mode 100644 index 00000000000..79d760d87f4 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.expected @@ -0,0 +1,3 @@ +argumentToEnsureNotTaintedNotMarkedAsSpurious +untaintedArgumentToEnsureTaintedNotMarkedAsMissing +failures diff --git a/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.ql b/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.ql new file mode 100644 index 00000000000..027ad8667be --- /dev/null +++ b/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.ql @@ -0,0 +1 @@ +import experimental.meta.InlineTaintTest diff --git a/python/ql/test/library-tests/frameworks/peewee/sql_execution.py b/python/ql/test/library-tests/frameworks/peewee/sql_execution.py new file mode 100644 index 00000000000..e6f195eeb47 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/peewee/sql_execution.py @@ -0,0 +1,19 @@ +import peewee +import playhouse.pool + +# This is just one example of one of the support databases +# see https://docs.peewee-orm.com/en/latest/peewee/database.html +db = peewee.MySQLDatabase() + +conn = db.connection() +cursor = conn.cursor() +cursor.execute("sql") # $ getSql="sql" + +cursor = db.cursor() +cursor.execute("sql") # $ getSql="sql" + +db.execute_sql("sql") # $ getSql="sql" + +# Pool extension +pool = playhouse.pool.PooledMySQLDatabase(...) +pool.execute_sql("sql") # $ getSql="sql" diff --git a/python/ql/test/qlpack.lock.yml b/python/ql/test/qlpack.lock.yml new file mode 100644 index 00000000000..06dd07fc7dc --- /dev/null +++ b/python/ql/test/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/python/ql/test/qlpack.yml b/python/ql/test/qlpack.yml index aca2524d023..fb108d37022 100644 --- a/python/ql/test/qlpack.yml +++ b/python/ql/test/qlpack.yml @@ -1,5 +1,7 @@ -name: codeql-python-tests +name: codeql/python-tests version: 0.0.0 -libraryPathDependencies: codeql-python +dependencies: + codeql/python-all: ^0.0.1 + codeql/python-queries: ^0.0.1 extractor: python tests: . diff --git a/python/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegExp.expected b/python/ql/test/query-tests/Security/CWE-020-IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegExp.expected rename to python/ql/test/query-tests/Security/CWE-020-IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected diff --git a/python/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegExp.qlref b/python/ql/test/query-tests/Security/CWE-020-IncompleteHostnameRegExp/IncompleteHostnameRegExp.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegExp.qlref rename to python/ql/test/query-tests/Security/CWE-020-IncompleteHostnameRegExp/IncompleteHostnameRegExp.qlref diff --git a/python/ql/test/query-tests/Security/CWE-020/hosttest.py b/python/ql/test/query-tests/Security/CWE-020-IncompleteHostnameRegExp/hosttest.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-020/hosttest.py rename to python/ql/test/query-tests/Security/CWE-020-IncompleteHostnameRegExp/hosttest.py diff --git a/python/ql/test/query-tests/Security/CWE-020/IncompleteUrlSubstringSanitization.expected b/python/ql/test/query-tests/Security/CWE-020-IncompleteUrlSubstringSanitization/IncompleteUrlSubstringSanitization.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-020/IncompleteUrlSubstringSanitization.expected rename to python/ql/test/query-tests/Security/CWE-020-IncompleteUrlSubstringSanitization/IncompleteUrlSubstringSanitization.expected diff --git a/python/ql/test/query-tests/Security/CWE-020/IncompleteUrlSubstringSanitization.qlref b/python/ql/test/query-tests/Security/CWE-020-IncompleteUrlSubstringSanitization/IncompleteUrlSubstringSanitization.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-020/IncompleteUrlSubstringSanitization.qlref rename to python/ql/test/query-tests/Security/CWE-020-IncompleteUrlSubstringSanitization/IncompleteUrlSubstringSanitization.qlref diff --git a/python/ql/test/query-tests/Security/CWE-020/urltest.py b/python/ql/test/query-tests/Security/CWE-020-IncompleteUrlSubstringSanitization/urltest.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-020/urltest.py rename to python/ql/test/query-tests/Security/CWE-020-IncompleteUrlSubstringSanitization/urltest.py diff --git a/python/ql/test/query-tests/Security/CWE-078-py2/CommandInjection.expected b/python/ql/test/query-tests/Security/CWE-078-CommandInjection-py2/CommandInjection.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-078-py2/CommandInjection.expected rename to python/ql/test/query-tests/Security/CWE-078-CommandInjection-py2/CommandInjection.expected diff --git a/python/ql/test/query-tests/Security/CWE-078-py2/CommandInjection.qlref b/python/ql/test/query-tests/Security/CWE-078-CommandInjection-py2/CommandInjection.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-078-py2/CommandInjection.qlref rename to python/ql/test/query-tests/Security/CWE-078-CommandInjection-py2/CommandInjection.qlref diff --git a/python/ql/test/query-tests/Security/CWE-078-py2/command_injection.py b/python/ql/test/query-tests/Security/CWE-078-CommandInjection-py2/command_injection.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-078-py2/command_injection.py rename to python/ql/test/query-tests/Security/CWE-078-CommandInjection-py2/command_injection.py diff --git a/python/ql/test/query-tests/Security/CWE-078-py2/options b/python/ql/test/query-tests/Security/CWE-078-CommandInjection-py2/options similarity index 100% rename from python/ql/test/query-tests/Security/CWE-078-py2/options rename to python/ql/test/query-tests/Security/CWE-078-CommandInjection-py2/options diff --git a/python/ql/test/query-tests/Security/CWE-078/CommandInjection.expected b/python/ql/test/query-tests/Security/CWE-078-CommandInjection/CommandInjection.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-078/CommandInjection.expected rename to python/ql/test/query-tests/Security/CWE-078-CommandInjection/CommandInjection.expected diff --git a/python/ql/test/query-tests/Security/CWE-078/CommandInjection.qlref b/python/ql/test/query-tests/Security/CWE-078-CommandInjection/CommandInjection.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-078/CommandInjection.qlref rename to python/ql/test/query-tests/Security/CWE-078-CommandInjection/CommandInjection.qlref diff --git a/python/ql/test/query-tests/Security/CWE-078/command_injection.py b/python/ql/test/query-tests/Security/CWE-078-CommandInjection/command_injection.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-078/command_injection.py rename to python/ql/test/query-tests/Security/CWE-078-CommandInjection/command_injection.py diff --git a/python/ql/test/query-tests/Security/CWE-078/options b/python/ql/test/query-tests/Security/CWE-078-CommandInjection/options similarity index 100% rename from python/ql/test/query-tests/Security/CWE-078/options rename to python/ql/test/query-tests/Security/CWE-078-CommandInjection/options diff --git a/python/ql/test/query-tests/Security/CWE-079/Jinja2WithoutEscaping.expected b/python/ql/test/query-tests/Security/CWE-079-Jinja2WithoutEscaping/Jinja2WithoutEscaping.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-079/Jinja2WithoutEscaping.expected rename to python/ql/test/query-tests/Security/CWE-079-Jinja2WithoutEscaping/Jinja2WithoutEscaping.expected diff --git a/python/ql/test/query-tests/Security/CWE-079/Jinja2WithoutEscaping.qlref b/python/ql/test/query-tests/Security/CWE-079-Jinja2WithoutEscaping/Jinja2WithoutEscaping.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-079/Jinja2WithoutEscaping.qlref rename to python/ql/test/query-tests/Security/CWE-079-Jinja2WithoutEscaping/Jinja2WithoutEscaping.qlref diff --git a/python/ql/test/query-tests/Security/CWE-079/jinja2_escaping.py b/python/ql/test/query-tests/Security/CWE-079-Jinja2WithoutEscaping/jinja2_escaping.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-079/jinja2_escaping.py rename to python/ql/test/query-tests/Security/CWE-079-Jinja2WithoutEscaping/jinja2_escaping.py diff --git a/python/ql/test/query-tests/Security/CWE-079/options b/python/ql/test/query-tests/Security/CWE-079-Jinja2WithoutEscaping/options similarity index 100% rename from python/ql/test/query-tests/Security/CWE-079/options rename to python/ql/test/query-tests/Security/CWE-079-Jinja2WithoutEscaping/options diff --git a/python/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected b/python/ql/test/query-tests/Security/CWE-079-ReflectedXss/ReflectedXss.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected rename to python/ql/test/query-tests/Security/CWE-079-ReflectedXss/ReflectedXss.expected diff --git a/python/ql/test/query-tests/Security/CWE-079/ReflectedXss.qlref b/python/ql/test/query-tests/Security/CWE-079-ReflectedXss/ReflectedXss.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-079/ReflectedXss.qlref rename to python/ql/test/query-tests/Security/CWE-079-ReflectedXss/ReflectedXss.qlref diff --git a/python/ql/test/query-tests/Security/CWE-079/reflected_xss.py b/python/ql/test/query-tests/Security/CWE-079-ReflectedXss/reflected_xss.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-079/reflected_xss.py rename to python/ql/test/query-tests/Security/CWE-079-ReflectedXss/reflected_xss.py diff --git a/python/ql/test/query-tests/Security/CWE-089/SqlInjection.expected b/python/ql/test/query-tests/Security/CWE-089-SqlInjection/SqlInjection.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-089/SqlInjection.expected rename to python/ql/test/query-tests/Security/CWE-089-SqlInjection/SqlInjection.expected diff --git a/python/ql/test/query-tests/Security/CWE-089/SqlInjection.qlref b/python/ql/test/query-tests/Security/CWE-089-SqlInjection/SqlInjection.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-089/SqlInjection.qlref rename to python/ql/test/query-tests/Security/CWE-089-SqlInjection/SqlInjection.qlref diff --git a/python/ql/test/query-tests/Security/CWE-089/sql_injection.py b/python/ql/test/query-tests/Security/CWE-089-SqlInjection/sql_injection.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-089/sql_injection.py rename to python/ql/test/query-tests/Security/CWE-089-SqlInjection/sql_injection.py diff --git a/python/ql/test/query-tests/Security/CWE-094/CodeInjection.expected b/python/ql/test/query-tests/Security/CWE-094-CodeInjection/CodeInjection.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-094/CodeInjection.expected rename to python/ql/test/query-tests/Security/CWE-094-CodeInjection/CodeInjection.expected diff --git a/python/ql/test/query-tests/Security/CWE-094-CodeInjection/CodeInjection.qlref b/python/ql/test/query-tests/Security/CWE-094-CodeInjection/CodeInjection.qlref new file mode 100644 index 00000000000..fe9adbf3b64 --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-094-CodeInjection/CodeInjection.qlref @@ -0,0 +1 @@ +Security/CWE-094/CodeInjection.ql diff --git a/python/ql/test/query-tests/Security/CWE-094/code_injection.py b/python/ql/test/query-tests/Security/CWE-094-CodeInjection/code_injection.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-094/code_injection.py rename to python/ql/test/query-tests/Security/CWE-094-CodeInjection/code_injection.py diff --git a/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/ExceptionInfo.expected b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/ExceptionInfo.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/ql/test/query-tests/Security/CWE-209/ExceptionInfo.ql b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/ExceptionInfo.ql similarity index 100% rename from python/ql/test/query-tests/Security/CWE-209/ExceptionInfo.ql rename to python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/ExceptionInfo.ql diff --git a/python/ql/test/query-tests/Security/CWE-209/Exceptions.py b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/Exceptions.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-209/Exceptions.py rename to python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/Exceptions.py diff --git a/python/ql/test/query-tests/Security/CWE-209/StackTraceExposure.expected b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-209/StackTraceExposure.expected rename to python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected diff --git a/python/ql/test/query-tests/Security/CWE-209/StackTraceExposure.qlref b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-209/StackTraceExposure.qlref rename to python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.qlref diff --git a/python/ql/test/query-tests/Security/CWE-209/Stacktrace.py b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/Stacktrace.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-209/Stacktrace.py rename to python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/Stacktrace.py diff --git a/python/ql/test/query-tests/Security/CWE-209/options b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/options similarity index 100% rename from python/ql/test/query-tests/Security/CWE-209/options rename to python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/options diff --git a/python/ql/test/query-tests/Security/CWE-209/test.py b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/test.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-209/test.py rename to python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/test.py diff --git a/python/ql/test/query-tests/Security/CWE-215/FlaskDebug.expected b/python/ql/test/query-tests/Security/CWE-215-FlaskDebug/FlaskDebug.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-215/FlaskDebug.expected rename to python/ql/test/query-tests/Security/CWE-215-FlaskDebug/FlaskDebug.expected diff --git a/python/ql/test/query-tests/Security/CWE-215/FlaskDebug.qlref b/python/ql/test/query-tests/Security/CWE-215-FlaskDebug/FlaskDebug.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-215/FlaskDebug.qlref rename to python/ql/test/query-tests/Security/CWE-215-FlaskDebug/FlaskDebug.qlref diff --git a/python/ql/test/query-tests/Security/CWE-215/options b/python/ql/test/query-tests/Security/CWE-215-FlaskDebug/options similarity index 100% rename from python/ql/test/query-tests/Security/CWE-215/options rename to python/ql/test/query-tests/Security/CWE-215-FlaskDebug/options diff --git a/python/ql/test/query-tests/Security/CWE-215/settings.py b/python/ql/test/query-tests/Security/CWE-215-FlaskDebug/settings.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-215/settings.py rename to python/ql/test/query-tests/Security/CWE-215-FlaskDebug/settings.py diff --git a/python/ql/test/query-tests/Security/CWE-215/test.py b/python/ql/test/query-tests/Security/CWE-215-FlaskDebug/test.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-215/test.py rename to python/ql/test/query-tests/Security/CWE-215-FlaskDebug/test.py diff --git a/python/ql/test/query-tests/Security/CWE-326/WeakCryptoKey.expected b/python/ql/test/query-tests/Security/CWE-326-WeakCryptoKey/WeakCryptoKey.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-326/WeakCryptoKey.expected rename to python/ql/test/query-tests/Security/CWE-326-WeakCryptoKey/WeakCryptoKey.expected diff --git a/python/ql/test/query-tests/Security/CWE-326/WeakCryptoKey.qlref b/python/ql/test/query-tests/Security/CWE-326-WeakCryptoKey/WeakCryptoKey.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-326/WeakCryptoKey.qlref rename to python/ql/test/query-tests/Security/CWE-326-WeakCryptoKey/WeakCryptoKey.qlref diff --git a/python/ql/test/query-tests/Security/CWE-326/test_example.py b/python/ql/test/query-tests/Security/CWE-326-WeakCryptoKey/test_example.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-326/test_example.py rename to python/ql/test/query-tests/Security/CWE-326-WeakCryptoKey/test_example.py diff --git a/python/ql/test/query-tests/Security/CWE-326/weak_crypto.py b/python/ql/test/query-tests/Security/CWE-326-WeakCryptoKey/weak_crypto.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-326/weak_crypto.py rename to python/ql/test/query-tests/Security/CWE-326-WeakCryptoKey/weak_crypto.py diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureDefaultProtocol.expected b/python/ql/test/query-tests/Security/CWE-327-InsecureDefaultProtocol/InsecureDefaultProtocol.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureDefaultProtocol.expected rename to python/ql/test/query-tests/Security/CWE-327-InsecureDefaultProtocol/InsecureDefaultProtocol.expected diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureDefaultProtocol.qlref b/python/ql/test/query-tests/Security/CWE-327-InsecureDefaultProtocol/InsecureDefaultProtocol.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureDefaultProtocol.qlref rename to python/ql/test/query-tests/Security/CWE-327-InsecureDefaultProtocol/InsecureDefaultProtocol.qlref diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureDefaultProtocol/InsecureProtocol.py b/python/ql/test/query-tests/Security/CWE-327-InsecureDefaultProtocol/InsecureProtocol.py new file mode 100644 index 00000000000..1ea2a51a44e --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureDefaultProtocol/InsecureProtocol.py @@ -0,0 +1,7 @@ +import ssl + +# secure versions +ssl.wrap_socket(ssl_version=ssl.PROTOCOL_TLSv1_2) + +# possibly insecure default +ssl.wrap_socket() diff --git a/python/ql/test/query-tests/Security/CWE-327/InsecureProtocol.expected b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-327/InsecureProtocol.expected rename to python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.py b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.py index 1ea2a51a44e..ab80ed47dac 100644 --- a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.py +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.py @@ -1,7 +1,37 @@ import ssl +from OpenSSL import SSL +from ssl import SSLContext -# secure versions +# insecure versions specified +ssl.wrap_socket(ssl_version=ssl.PROTOCOL_SSLv2) +ssl.wrap_socket(ssl_version=ssl.PROTOCOL_SSLv3) +ssl.wrap_socket(ssl_version=ssl.PROTOCOL_TLSv1) + +SSLContext(protocol=ssl.PROTOCOL_SSLv2) +SSLContext(protocol=ssl.PROTOCOL_SSLv3) +SSLContext(protocol=ssl.PROTOCOL_TLSv1) + +SSL.Context(SSL.SSLv2_METHOD) +SSL.Context(SSL.SSLv3_METHOD) +SSL.Context(SSL.TLSv1_METHOD) + +METHOD = SSL.SSLv2_METHOD +SSL.Context(METHOD) + +# importing the protocol constant directly +from ssl import PROTOCOL_SSLv2 +ssl.wrap_socket(ssl_version=PROTOCOL_SSLv2) +SSLContext(protocol=PROTOCOL_SSLv2) + +# secure versions specified ssl.wrap_socket(ssl_version=ssl.PROTOCOL_TLSv1_2) +SSLContext(protocol=ssl.PROTOCOL_TLSv1_2) +SSL.Context(SSL.TLSv1_2_METHOD) -# possibly insecure default -ssl.wrap_socket() +# insecure versions allowed by specified range +SSLContext(protocol=ssl.PROTOCOL_SSLv23) +SSLContext(protocol=ssl.PROTOCOL_TLS) +SSLContext(protocol=ssl.PROTOCOL_TLS_CLIENT) +SSLContext(protocol=ssl.PROTOCOL_TLS_SERVER) + +SSL.Context(SSL.SSLv23_METHOD) diff --git a/python/ql/test/query-tests/Security/CWE-327/InsecureProtocol.qlref b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-327/InsecureProtocol.qlref rename to python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.qlref diff --git a/python/ql/test/query-tests/Security/CWE-327/options b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/options similarity index 100% rename from python/ql/test/query-tests/Security/CWE-327/options rename to python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/options diff --git a/python/ql/test/query-tests/Security/CWE-327/pyOpenSSL_fluent.py b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/pyOpenSSL_fluent.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-327/pyOpenSSL_fluent.py rename to python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/pyOpenSSL_fluent.py diff --git a/python/ql/test/query-tests/Security/CWE-327/ssl_fluent.py b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/ssl_fluent.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-327/ssl_fluent.py rename to python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/ssl_fluent.py diff --git a/python/ql/test/query-tests/Security/CWE-327/InsecureProtocol.py b/python/ql/test/query-tests/Security/CWE-327/InsecureProtocol.py deleted file mode 100644 index ab80ed47dac..00000000000 --- a/python/ql/test/query-tests/Security/CWE-327/InsecureProtocol.py +++ /dev/null @@ -1,37 +0,0 @@ -import ssl -from OpenSSL import SSL -from ssl import SSLContext - -# insecure versions specified -ssl.wrap_socket(ssl_version=ssl.PROTOCOL_SSLv2) -ssl.wrap_socket(ssl_version=ssl.PROTOCOL_SSLv3) -ssl.wrap_socket(ssl_version=ssl.PROTOCOL_TLSv1) - -SSLContext(protocol=ssl.PROTOCOL_SSLv2) -SSLContext(protocol=ssl.PROTOCOL_SSLv3) -SSLContext(protocol=ssl.PROTOCOL_TLSv1) - -SSL.Context(SSL.SSLv2_METHOD) -SSL.Context(SSL.SSLv3_METHOD) -SSL.Context(SSL.TLSv1_METHOD) - -METHOD = SSL.SSLv2_METHOD -SSL.Context(METHOD) - -# importing the protocol constant directly -from ssl import PROTOCOL_SSLv2 -ssl.wrap_socket(ssl_version=PROTOCOL_SSLv2) -SSLContext(protocol=PROTOCOL_SSLv2) - -# secure versions specified -ssl.wrap_socket(ssl_version=ssl.PROTOCOL_TLSv1_2) -SSLContext(protocol=ssl.PROTOCOL_TLSv1_2) -SSL.Context(SSL.TLSv1_2_METHOD) - -# insecure versions allowed by specified range -SSLContext(protocol=ssl.PROTOCOL_SSLv23) -SSLContext(protocol=ssl.PROTOCOL_TLS) -SSLContext(protocol=ssl.PROTOCOL_TLS_CLIENT) -SSLContext(protocol=ssl.PROTOCOL_TLS_SERVER) - -SSL.Context(SSL.SSLv23_METHOD) diff --git a/python/ql/test/query-tests/Security/CWE-377/InsecureTemporaryFile.expected b/python/ql/test/query-tests/Security/CWE-377-InsecureTemporaryFile/InsecureTemporaryFile.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-377/InsecureTemporaryFile.expected rename to python/ql/test/query-tests/Security/CWE-377-InsecureTemporaryFile/InsecureTemporaryFile.expected diff --git a/python/ql/test/query-tests/Security/CWE-377/InsecureTemporaryFile.py b/python/ql/test/query-tests/Security/CWE-377-InsecureTemporaryFile/InsecureTemporaryFile.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-377/InsecureTemporaryFile.py rename to python/ql/test/query-tests/Security/CWE-377-InsecureTemporaryFile/InsecureTemporaryFile.py diff --git a/python/ql/test/query-tests/Security/CWE-377/InsecureTemporaryFile.qlref b/python/ql/test/query-tests/Security/CWE-377-InsecureTemporaryFile/InsecureTemporaryFile.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-377/InsecureTemporaryFile.qlref rename to python/ql/test/query-tests/Security/CWE-377-InsecureTemporaryFile/InsecureTemporaryFile.qlref diff --git a/python/ql/test/query-tests/Security/CWE-377/SecureTemporaryFile.py b/python/ql/test/query-tests/Security/CWE-377-InsecureTemporaryFile/SecureTemporaryFile.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-377/SecureTemporaryFile.py rename to python/ql/test/query-tests/Security/CWE-377-InsecureTemporaryFile/SecureTemporaryFile.py diff --git a/python/ql/test/query-tests/Security/CWE-502/UnsafeDeserialization.expected b/python/ql/test/query-tests/Security/CWE-502-UnsafeDeserialization/UnsafeDeserialization.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-502/UnsafeDeserialization.expected rename to python/ql/test/query-tests/Security/CWE-502-UnsafeDeserialization/UnsafeDeserialization.expected diff --git a/python/ql/test/query-tests/Security/CWE-502/UnsafeDeserialization.qlref b/python/ql/test/query-tests/Security/CWE-502-UnsafeDeserialization/UnsafeDeserialization.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-502/UnsafeDeserialization.qlref rename to python/ql/test/query-tests/Security/CWE-502-UnsafeDeserialization/UnsafeDeserialization.qlref diff --git a/python/ql/test/query-tests/Security/CWE-502/unsafe_deserialization.py b/python/ql/test/query-tests/Security/CWE-502-UnsafeDeserialization/unsafe_deserialization.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-502/unsafe_deserialization.py rename to python/ql/test/query-tests/Security/CWE-502-UnsafeDeserialization/unsafe_deserialization.py diff --git a/python/ql/test/query-tests/Security/CWE-601/UrlRedirect.expected b/python/ql/test/query-tests/Security/CWE-601-UrlRedirect/UrlRedirect.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-601/UrlRedirect.expected rename to python/ql/test/query-tests/Security/CWE-601-UrlRedirect/UrlRedirect.expected diff --git a/python/ql/test/query-tests/Security/CWE-601/UrlRedirect.qlref b/python/ql/test/query-tests/Security/CWE-601-UrlRedirect/UrlRedirect.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-601/UrlRedirect.qlref rename to python/ql/test/query-tests/Security/CWE-601-UrlRedirect/UrlRedirect.qlref diff --git a/python/ql/test/query-tests/Security/CWE-601/options b/python/ql/test/query-tests/Security/CWE-601-UrlRedirect/options similarity index 100% rename from python/ql/test/query-tests/Security/CWE-601/options rename to python/ql/test/query-tests/Security/CWE-601-UrlRedirect/options diff --git a/python/ql/test/query-tests/Security/CWE-601/test.py b/python/ql/test/query-tests/Security/CWE-601-UrlRedirect/test.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-601/test.py rename to python/ql/test/query-tests/Security/CWE-601-UrlRedirect/test.py diff --git a/python/ql/test/query-tests/Security/CWE-730-ReDoS/ReDoS.expected b/python/ql/test/query-tests/Security/CWE-730-ReDoS/ReDoS.expected index 4a4b5ee4262..21db78dd092 100644 --- a/python/ql/test/query-tests/Security/CWE-730-ReDoS/ReDoS.expected +++ b/python/ql/test/query-tests/Security/CWE-730-ReDoS/ReDoS.expected @@ -93,5 +93,7 @@ | redos.py:364:25:364:45 | ((?:a{0,\|-)\|\\w\\{\\d,)+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'a{0,'. | | redos.py:365:25:365:48 | ((?:a{0,2\|-)\|\\w\\{\\d,\\d)+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'a{0,2'. | | redos.py:371:25:371:35 | (\\u0061\|a)* | This part of the regular expression may cause exponential backtracking on strings starting with 'X' and containing many repetitions of 'a'. | +| redos.py:380:35:380:41 | [^"\\s]+ | This part of the regular expression may cause exponential backtracking on strings starting with '/' and containing many repetitions of '!'. | +| redos.py:381:35:381:41 | [^"\\s]+ | This part of the regular expression may cause exponential backtracking on strings starting with '/' and containing many repetitions of '!'. | | unittests.py:5:17:5:23 | (\u00c6\|\\\u00c6)+ | This part of the regular expression may cause exponential backtracking on strings starting with 'X' and containing many repetitions of '\u00c6'. | | unittests.py:9:16:9:24 | (?:.\|\\n)* | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '\\n'. | diff --git a/python/ql/test/query-tests/Security/CWE-730-ReDoS/redos.py b/python/ql/test/query-tests/Security/CWE-730-ReDoS/redos.py index 37c637c2750..733c594a53a 100644 --- a/python/ql/test/query-tests/Security/CWE-730-ReDoS/redos.py +++ b/python/ql/test/query-tests/Security/CWE-730-ReDoS/redos.py @@ -371,4 +371,11 @@ good42 = re.compile(r'''^((?:a{0,2}|-)|\w\{\d,\d\})+X$''') bad87 = re.compile(r'X(\u0061|a)*Y') # GOOD -good43 = re.compile(r'X(\u0061|b)+Y') \ No newline at end of file +good43 = re.compile(r'X(\u0061|b)+Y') + +# GOOD +good44 = re.compile(r'("[^"]*?"|[^"\s]+)+(?=\s*|\s*$)') + +# BAD +bad88 = re.compile(r'/("[^"]*?"|[^"\s]+)+(?=\s*|\s*$)X') +bad89 = re.compile(r'/("[^"]*?"|[^"\s]+)+(?=X)') \ No newline at end of file diff --git a/python/ql/test/query-tests/Security/CWE-732/WeakFilePermissions.expected b/python/ql/test/query-tests/Security/CWE-732-WeakFilePermissions/WeakFilePermissions.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-732/WeakFilePermissions.expected rename to python/ql/test/query-tests/Security/CWE-732-WeakFilePermissions/WeakFilePermissions.expected diff --git a/python/ql/test/query-tests/Security/CWE-732/WeakFilePermissions.qlref b/python/ql/test/query-tests/Security/CWE-732-WeakFilePermissions/WeakFilePermissions.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-732/WeakFilePermissions.qlref rename to python/ql/test/query-tests/Security/CWE-732-WeakFilePermissions/WeakFilePermissions.qlref diff --git a/python/ql/test/query-tests/Security/CWE-732/options b/python/ql/test/query-tests/Security/CWE-732-WeakFilePermissions/options similarity index 100% rename from python/ql/test/query-tests/Security/CWE-732/options rename to python/ql/test/query-tests/Security/CWE-732-WeakFilePermissions/options diff --git a/python/ql/test/query-tests/Security/CWE-732/test.py b/python/ql/test/query-tests/Security/CWE-732-WeakFilePermissions/test.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-732/test.py rename to python/ql/test/query-tests/Security/CWE-732-WeakFilePermissions/test.py diff --git a/python/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.expected b/python/ql/test/query-tests/Security/CWE-798-HardcodedCredentials/HardcodedCredentials.expected similarity index 100% rename from python/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.expected rename to python/ql/test/query-tests/Security/CWE-798-HardcodedCredentials/HardcodedCredentials.expected diff --git a/python/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.qlref b/python/ql/test/query-tests/Security/CWE-798-HardcodedCredentials/HardcodedCredentials.qlref similarity index 100% rename from python/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.qlref rename to python/ql/test/query-tests/Security/CWE-798-HardcodedCredentials/HardcodedCredentials.qlref diff --git a/python/ql/test/query-tests/Security/CWE-798/test.py b/python/ql/test/query-tests/Security/CWE-798-HardcodedCredentials/test.py similarity index 100% rename from python/ql/test/query-tests/Security/CWE-798/test.py rename to python/ql/test/query-tests/Security/CWE-798-HardcodedCredentials/test.py diff --git a/python/upgrades/qlpack.lock.yml b/python/upgrades/qlpack.lock.yml new file mode 100644 index 00000000000..06dd07fc7dc --- /dev/null +++ b/python/upgrades/qlpack.lock.yml @@ -0,0 +1,4 @@ +--- +dependencies: {} +compiled: false +lockVersion: 1.0.0 diff --git a/python/upgrades/qlpack.yml b/python/upgrades/qlpack.yml index 9939911eb99..baea6039148 100644 --- a/python/upgrades/qlpack.yml +++ b/python/upgrades/qlpack.yml @@ -1,2 +1,4 @@ -name: codeql-python-upgrades +name: codeql/python-upgrades upgrades: . +library: true +version: 0.0.2