From 54c7c5e8be789c853751ce0c198789688e330979 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Thu, 18 Jan 2024 11:44:31 +0100 Subject: [PATCH 001/207] Tree sitter extractor: Proper handling of `LGTM_INDEX_FILTERS` If someone had used `LGTM_INDEX_FILTERS=exclude:**/*\ninclude:*.rb` before, we would have mistakenly excluded all files :| (LGTM_INDEX_FILTERS is a prioritized list where later matches take priority over earlier ones) This change is needed to support adding `exclude:**/*` as the first filter if `paths` include a glob, which currently causes bad behavior in the Python extractor. However, we can first introduce that change once this PR has been merged. I realize this change can cause more folders and files to be traversed (since they are not just skipped with --exclude). We plan to make a better long term fix which should bring back the previous performance. --- shared/tree-sitter-extractor/src/autobuilder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/tree-sitter-extractor/src/autobuilder.rs b/shared/tree-sitter-extractor/src/autobuilder.rs index 97ea5a9b32c..9ff63e508f1 100644 --- a/shared/tree-sitter-extractor/src/autobuilder.rs +++ b/shared/tree-sitter-extractor/src/autobuilder.rs @@ -81,7 +81,7 @@ impl Autobuilder { if let Some(stripped) = line.strip_prefix("include:") { cmd.arg("--also-match=".to_owned() + stripped); } else if let Some(stripped) = line.strip_prefix("exclude:") { - cmd.arg("--exclude=".to_owned() + stripped); + cmd.arg("--also-match=!".to_owned() + stripped); } } let exit = &cmd.spawn()?.wait()?; From f20d4e22fe1481167da66af25492af9e079260e9 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Thu, 18 Jan 2024 13:54:45 +0100 Subject: [PATCH 002/207] Handle only `exclude` --- .../tree-sitter-extractor/src/autobuilder.rs | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/shared/tree-sitter-extractor/src/autobuilder.rs b/shared/tree-sitter-extractor/src/autobuilder.rs index 9ff63e508f1..10f66286ab8 100644 --- a/shared/tree-sitter-extractor/src/autobuilder.rs +++ b/shared/tree-sitter-extractor/src/autobuilder.rs @@ -74,10 +74,31 @@ impl Autobuilder { cmd.arg("--working-dir=."); cmd.arg(&self.database); - for line in env::var("LGTM_INDEX_FILTERS") - .unwrap_or_default() - .split('\n') - { + // LGTM_INDEX_FILTERS is a prioritized list of include/exclude filters, where + // later filters take priority over earlier ones. + // 1) If we only see includes, we should ignore everything else, which is + // achieved by using `--also-match={filter}`. + // 2) if we see both includes and excludes, we process them in order by using + // `--also-match={filter}` for includes and `--also-match=!{filter}` for + // excludes. + // 3) If we only see excludes, we should accept everything else. Naive solution + // of just using `--also-match=!{filter}` is not good enough, since nothing + // will make the `--also-match`` pass for any file. In that case, we add a dummy + // initial `--also-match=**/*``to get the desired behavior. + let tmp = env::var("LGTM_INDEX_FILTERS").unwrap_or_default(); + let lgtm_index_filters = tmp.split('\n'); + let lgtm_index_filters_has_include = lgtm_index_filters + .clone() + .any(|s| s.starts_with("include:")); + let lgtm_index_filters_has_exclude = lgtm_index_filters + .clone() + .any(|s| s.starts_with("exclude:")); + + if !lgtm_index_filters_has_include && lgtm_index_filters_has_exclude { + cmd.arg("--also-match=**/*"); + } + + for line in lgtm_index_filters { if let Some(stripped) = line.strip_prefix("include:") { cmd.arg("--also-match=".to_owned() + stripped); } else if let Some(stripped) = line.strip_prefix("exclude:") { From 47720e0998f578ff6df5a936a40b6aa0f3f53daf Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Fri, 12 Jan 2024 21:24:11 +0000 Subject: [PATCH 003/207] C++: generate instructions for destructor calls in IR --- .../raw/internal/TranslatedCall.qll | 2 +- .../internal/TranslatedDeclarationEntry.qll | 4 + .../raw/internal/TranslatedElement.qll | 15 +-- .../raw/internal/TranslatedExpr.qll | 104 ++++++++++++------ .../raw/internal/TranslatedInitialization.qll | 2 +- .../raw/internal/TranslatedStmt.qll | 60 ++++++---- 6 files changed, 123 insertions(+), 64 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index ffa26d180c3..653bcadbdd4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -27,7 +27,7 @@ private CallInstruction getTranslatedCallInstruction(Call call) { * of a higher-level constructor (e.g. the allocator call in a `NewExpr`). */ abstract class TranslatedCall extends TranslatedExpr { - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { // We choose the child's id in the order of evaluation. // The qualifier is evaluated before the call target, because the value of // the call target may depend on the value of the qualifier for virtual diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll index 61095072d5e..76a3c35cb06 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll @@ -60,6 +60,10 @@ abstract class TranslatedLocalVariableDeclaration extends TranslatedVariableInit */ abstract LocalVariable getVariable(); + final override TranslatedElement getChild(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) + } + final override Type getTargetType() { result = getVariableType(this.getVariable()) } final override TranslatedInitialization getInitialization() { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index c3c4bf897cc..66a3721ef96 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -24,6 +24,10 @@ private Element getRealParent(Expr expr) { result = expr.getParentWithConversions() or result.(Destructor).getADestruction() = expr + or + result.(Expr).getAnImplicitDestructorCall() = expr + or + result.(Stmt).getAnImplicitDestructorCall() = expr } IRUserVariable getIRUserVariable(Declaration decl, Variable var) { @@ -105,12 +109,6 @@ private predicate ignoreExprOnly(Expr expr) { newExpr.getAllocatorCall() = expr ) or - exists(DeleteOrDeleteArrayExpr deleteExpr | - // Ignore the destructor call as we don't model it yet. Don't ignore - // its arguments, though, as they are the arguments to the deallocator. - deleteExpr.getDestructorCall() = expr - ) - or // The extractor deliberately emits an `ErrorExpr` as the first argument to // the allocator call, if any, of a `NewOrNewArrayExpr`. That `ErrorExpr` // should not be translated. @@ -752,7 +750,10 @@ newtype TTranslatedElement = not ignoreSideEffects(call) and // Don't bother with destructor calls for now, since we won't see very many of them in the IR // until we start injecting implicit destructor calls. - call instanceof ConstructorCall and + ( + call instanceof ConstructorCall or + call instanceof DestructorCall + ) and opcode = getASideEffectOpcode(call, -1) } or // The side effect that initializes newly-allocated memory. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 1e4b52283fc..fc685773f77 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -75,6 +75,18 @@ abstract class TranslatedExpr extends TranslatedElement { expr.isGLValueCategory() } + abstract TranslatedElement getChildInternal(int id); + + final override TranslatedElement getChild(int id) { + result = this.getChildInternal(id) + or + exists(int maxChildId, int destructorIndex | + maxChildId = max(int childId | exists(this.getChildInternal(childId))) and + result.(TranslatedExpr).getExpr() = expr.getImplicitDestructorCall(destructorIndex) and + id = maxChildId + 1 + destructorIndex + ) + } + final override Locatable getAst() { result = expr } final override Declaration getFunction() { result = getEnclosingDeclaration(expr) } @@ -178,7 +190,7 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, { TranslatedConditionValue() { this = TTranslatedConditionValue(expr) } - override TranslatedElement getChild(int id) { id = 0 and result = this.getCondition() } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getCondition() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getCondition().getFirstInstruction(kind) @@ -318,7 +330,9 @@ abstract class TranslatedValueCategoryAdjustment extends TranslatedExpr { result = this.getOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getOperand() + } final override predicate producesExprResult() { // A temp object always produces the result of the expression. @@ -446,7 +460,7 @@ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy { result = this.getOperand().getFirstInstruction(kind) } - override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getOperand() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = ResultCopyTag() and @@ -485,7 +499,7 @@ class TranslatedCommaExpr extends TranslatedNonConstantExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or id = 1 and result = this.getRightOperand() @@ -526,7 +540,9 @@ private int getElementSize(Type type) { abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr { override CrementOperation expr; - final override TranslatedElement getChild(int id) { id = 0 and result = this.getLoadedOperand() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getLoadedOperand() + } final override string getInstructionConstantValue(InstructionTag tag) { tag = CrementConstantTag() and @@ -695,7 +711,7 @@ class TranslatedArrayExpr extends TranslatedNonConstantExpr { result = this.getBaseOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getBaseOperand() or id = 1 and result = this.getOffsetOperand() @@ -753,7 +769,9 @@ abstract class TranslatedTransparentExpr extends TranslatedNonConstantExpr { result = this.getOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getOperand() + } final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } @@ -810,7 +828,7 @@ class TranslatedTransparentConversion extends TranslatedTransparentExpr { class TranslatedThisExpr extends TranslatedNonConstantExpr { override ThisExpr expr; - final override TranslatedElement getChild(int id) { none() } + final override TranslatedElement getChildInternal(int id) { none() } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = ThisAddressTag() and @@ -855,7 +873,7 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr { abstract class TranslatedVariableAccess extends TranslatedNonConstantExpr { override VariableAccess expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getQualifier() // Might not exist } @@ -962,7 +980,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp result = this.getInstruction(StructuredBindingAccessTag()) } - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { // Structured bindings cannot be qualified. none() } @@ -1010,7 +1028,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp class TranslatedFunctionAccess extends TranslatedNonConstantExpr { override FunctionAccess expr; - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getQualifier() // Might not exist } @@ -1077,7 +1095,7 @@ abstract class TranslatedConstantExpr extends TranslatedCoreExpr, TTranslatedVal kind instanceof GotoEdge } - final override TranslatedElement getChild(int id) { none() } + final override TranslatedElement getChildInternal(int id) { none() } final override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1154,7 +1172,9 @@ class TranslatedUnaryExpr extends TranslatedSingleInstructionExpr { result = this.getOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getOperand() + } final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and @@ -1195,7 +1215,9 @@ abstract class TranslatedConversion extends TranslatedNonConstantExpr { result = this.getOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getOperand() + } final TranslatedExpr getOperand() { result = getTranslatedExpr(expr.getExpr()) } } @@ -1432,7 +1454,7 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or id = 1 and result = this.getRightOperand() @@ -1518,7 +1540,7 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { class TranslatedAssignExpr extends TranslatedNonConstantExpr { override AssignExpr expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or id = 1 and result = this.getRightOperand() @@ -1592,7 +1614,7 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr { class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { override BlockAssignExpr expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or id = 1 and result = this.getRightOperand() @@ -1661,7 +1683,7 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { class TranslatedAssignOperation extends TranslatedNonConstantExpr { override AssignOperation expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLoadedLeftOperand() or id = 1 and result = this.getRightOperand() @@ -1911,7 +1933,7 @@ class TranslatedConstantAllocationSize extends TranslatedAllocationSize { result = this.getParent().getChildSuccessor(this, kind) } - final override TranslatedElement getChild(int id) { none() } + final override TranslatedElement getChildInternal(int id) { none() } final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } @@ -1966,7 +1988,7 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize { result = this.getParent().getChildSuccessor(this, kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getExtent() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getExtent() } final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { child = this.getExtent() and @@ -2167,7 +2189,9 @@ abstract class StructorCallContext extends TranslatedElement { class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, StructorCallContext { override DestructorFieldDestruction expr; - final override TranslatedElement getChild(int id) { id = 0 and result = this.getDestructorCall() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getDestructorCall() + } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and @@ -2415,7 +2439,7 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { class TranslatedTernaryConditionalExpr extends TranslatedConditionalExpr, ConditionContext { TranslatedTernaryConditionalExpr() { not expr.isTwoOperand() } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getCondition() or id = 1 and result = this.getThen() @@ -2470,7 +2494,7 @@ class TranslatedTernaryConditionalExpr extends TranslatedConditionalExpr, Condit class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr { TranslatedBinaryConditionalExpr() { expr.isTwoOperand() } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { // We only truly have two children, because our "condition" and "then" are the same as far as // the extractor is concerned. id = 0 and result = this.getCondition() @@ -2554,6 +2578,10 @@ class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr, override Type getTargetType() { result = expr.getType() } + final override TranslatedElement getChildInternal(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) + } + final override TranslatedInitialization getInitialization() { result = getTranslatedInitialization(expr.getExpr()) } @@ -2599,6 +2627,10 @@ abstract class TranslatedThrowExpr extends TranslatedNonConstantExpr { class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableInitialization { TranslatedThrowValueExpr() { not expr instanceof ReThrowExpr } + final override TranslatedElement getChildInternal(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { TranslatedThrowExpr.super.hasInstruction(opcode, tag, resultType) or @@ -2658,7 +2690,7 @@ class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableIn class TranslatedReThrowExpr extends TranslatedThrowExpr { override ReThrowExpr expr; - override TranslatedElement getChild(int id) { none() } + override TranslatedElement getChildInternal(int id) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(ThrowTag()) and @@ -2696,7 +2728,7 @@ class TranslatedBuiltInOperation extends TranslatedNonConstantExpr { ) } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { result = getTranslatedExpr(expr.getChild(id).getFullyConverted()) } @@ -2812,7 +2844,7 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr { final override Instruction getResult() { none() } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getVAList() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() } private TranslatedExpr getVAList() { result = getTranslatedExpr(expr.getVAList().getFullyConverted()) @@ -2885,7 +2917,7 @@ class TranslatedVarArg extends TranslatedNonConstantExpr { final override Instruction getResult() { result = this.getInstruction(VarArgsArgAddressTag()) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getVAList() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() } private TranslatedExpr getVAList() { result = getTranslatedExpr(expr.getVAList().getFullyConverted()) @@ -2957,7 +2989,7 @@ class TranslatedVarArgsEnd extends TranslatedNonConstantExpr { final override Instruction getResult() { none() } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getVAList() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() } private TranslatedExpr getVAList() { result = getTranslatedExpr(expr.getVAList().getFullyConverted()) @@ -3003,7 +3035,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { final override Instruction getResult() { result = this.getInstruction(VarArgsVAListStoreTag()) } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getDestinationVAList() or id = 1 and result = this.getSourceVAList() @@ -3059,7 +3091,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { abstract class TranslatedNewOrNewArrayExpr extends TranslatedNonConstantExpr, InitializationContext { override NewOrNewArrayExpr expr; - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getAllocatorCall() or id = 1 and result = this.getInitialization() @@ -3149,7 +3181,7 @@ class TranslatedConditionDeclExpr extends TranslatedNonConstantExpr { result = this.getDecl().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getDecl() or id = 1 and result = this.getConditionExpr() @@ -3189,7 +3221,9 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont kind instanceof GotoEdge } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getInitialization() } + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getInitialization() + } override Instruction getResult() { result = this.getInstruction(LoadTag()) } @@ -3280,7 +3314,7 @@ class TranslatedStmtExpr extends TranslatedNonConstantExpr { result = this.getStmt().getFirstInstruction(kind) } - final override TranslatedElement getChild(int id) { id = 0 and result = this.getStmt() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getStmt() } override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { tag instanceof OnlyInstructionTag and @@ -3318,7 +3352,7 @@ class TranslatedErrorExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } - final override TranslatedElement getChild(int id) { none() } + final override TranslatedElement getChildInternal(int id) { none() } final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and @@ -3412,7 +3446,7 @@ class TranslatedAssumeExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } - final override TranslatedElement getChild(int id) { none() } + final override TranslatedElement getChildInternal(int id) { none() } final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index fcff4a838eb..d08329c777c 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -35,7 +35,7 @@ abstract class InitializationContext extends TranslatedElement { * declarations, `return` statements, and `throw` expressions. */ abstract class TranslatedVariableInitialization extends TranslatedElement, InitializationContext { - final override TranslatedElement getChild(int id) { id = 0 and result = this.getInitialization() } + TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() } final override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(InitializerVariableAddressTag()) and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 67a7a8aa83b..8f7a4a2e513 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -235,6 +235,18 @@ abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt { TranslatedStmt() { this = TTranslatedStmt(stmt) } + abstract TranslatedElement getChildInternal(int id); + + final override TranslatedElement getChild(int id) { + result = this.getChildInternal(id) + or + exists(int maxChildId, int destructorIndex | + maxChildId = max(int childId | exists(this.getChildInternal(childId))) and + result.(TranslatedExpr).getExpr() = stmt.getImplicitDestructorCall(destructorIndex) and + id = maxChildId + 1 + destructorIndex + ) + } + final override string toString() { result = stmt.toString() } final override Locatable getAst() { result = stmt } @@ -252,7 +264,7 @@ class TranslatedEmptyStmt extends TranslatedStmt { stmt instanceof SwitchCase } - override TranslatedElement getChild(int id) { none() } + override TranslatedElement getChildInternal(int id) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(OnlyInstructionTag()) and @@ -281,7 +293,7 @@ class TranslatedEmptyStmt extends TranslatedStmt { class TranslatedDeclStmt extends TranslatedStmt { override DeclStmt stmt; - override TranslatedElement getChild(int id) { result = this.getDeclarationEntry(id) } + override TranslatedElement getChildInternal(int id) { result = this.getDeclarationEntry(id) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() @@ -335,7 +347,7 @@ class TranslatedExprStmt extends TranslatedStmt { TranslatedExpr getExpr() { result = getTranslatedExpr(stmt.getExpr().getFullyConverted()) } - override TranslatedElement getChild(int id) { id = 0 and result = this.getExpr() } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getExpr() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() @@ -371,6 +383,10 @@ class TranslatedReturnValueStmt extends TranslatedReturnStmt, TranslatedVariable result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } + final override TranslatedElement getChildInternal(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) + } + final override Type getTargetType() { result = this.getEnclosingFunction().getReturnType() } final override TranslatedInitialization getInitialization() { @@ -390,7 +406,7 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { stmt.hasExpr() and not hasReturnValue(stmt.getEnclosingFunction()) } - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getExpr() } @@ -428,7 +444,7 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { not stmt.hasExpr() and not hasReturnValue(stmt.getEnclosingFunction()) } - override TranslatedElement getChild(int id) { none() } + override TranslatedElement getChildInternal(int id) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(OnlyInstructionTag()) and @@ -464,6 +480,10 @@ class TranslatedNoValueReturnStmt extends TranslatedReturnStmt, TranslatedVariab result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } + final override TranslatedElement getChildInternal(int id) { + result = TranslatedVariableInitialization.super.getChildInternal(id) + } + final override Type getTargetType() { result = this.getEnclosingFunction().getReturnType() } final override TranslatedInitialization getInitialization() { none() } @@ -518,7 +538,7 @@ private class TryOrMicrosoftTryStmt extends Stmt { class TranslatedTryStmt extends TranslatedStmt { override TryOrMicrosoftTryStmt stmt; - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getBody() or result = this.getHandler(id - 1) @@ -581,7 +601,7 @@ class TranslatedTryStmt extends TranslatedStmt { class TranslatedBlock extends TranslatedStmt { override BlockStmt stmt; - override TranslatedElement getChild(int id) { result = this.getStmt(id) } + override TranslatedElement getChildInternal(int id) { result = this.getStmt(id) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { this.isEmpty() and @@ -623,7 +643,7 @@ class TranslatedBlock extends TranslatedStmt { abstract class TranslatedHandler extends TranslatedStmt { override Handler stmt; - override TranslatedElement getChild(int id) { id = 1 and result = this.getBlock() } + override TranslatedElement getChildInternal(int id) { id = 1 and result = this.getBlock() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(CatchTag()) and @@ -656,8 +676,8 @@ class TranslatedCatchByTypeHandler extends TranslatedHandler { resultType = getVoidType() } - override TranslatedElement getChild(int id) { - result = super.getChild(id) + override TranslatedElement getChildInternal(int id) { + result = super.getChildInternal(id) or id = 0 and result = this.getParameter() } @@ -717,7 +737,7 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { else result = this.getFirstConditionInstruction(kind) } - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or id = 1 and result = this.getCondition() @@ -791,7 +811,7 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { final predicate hasCondition() { exists(stmt.getCondition()) } - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getCondition() or id = 1 and result = this.getBody() @@ -842,7 +862,7 @@ class TranslatedDoStmt extends TranslatedLoop { class TranslatedForStmt extends TranslatedLoop { override ForStmt stmt; - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or id = 1 and result = this.getCondition() @@ -893,7 +913,7 @@ class TranslatedForStmt extends TranslatedLoop { class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext { override RangeBasedForStmt stmt; - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getRangeVariableDeclStmt() or // Note: `__begin` and `__end` are declared by the same `DeclStmt` @@ -987,7 +1007,7 @@ class TranslatedJumpStmt extends TranslatedStmt { kind instanceof GotoEdge } - override TranslatedElement getChild(int id) { none() } + override TranslatedElement getChildInternal(int id) { none() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and @@ -1031,7 +1051,7 @@ class TranslatedSwitchStmt extends TranslatedStmt { else result = this.getFirstExprInstruction(kind) } - override TranslatedElement getChild(int id) { + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or id = 1 and result = this.getExpr() @@ -1086,7 +1106,7 @@ class TranslatedSwitchStmt extends TranslatedStmt { class TranslatedAsmStmt extends TranslatedStmt { override AsmStmt stmt; - override TranslatedExpr getChild(int id) { + override TranslatedExpr getChildInternal(int id) { result = getTranslatedExpr(stmt.getChild(id).(Expr).getFullyConverted()) } @@ -1108,7 +1128,7 @@ class TranslatedAsmStmt extends TranslatedStmt { exists(int index | tag = AsmTag() and operandTag = asmOperand(index) and - result = this.getChild(index).getResult() + result = this.getChildInternal(index).getResult() ) } @@ -1140,7 +1160,7 @@ class TranslatedAsmStmt extends TranslatedStmt { class TranslatedVlaDimensionStmt extends TranslatedStmt { override VlaDimensionStmt stmt; - override TranslatedExpr getChild(int id) { + override TranslatedExpr getChildInternal(int id) { id = 0 and result = getTranslatedExpr(stmt.getDimensionExpr().getFullyConverted()) } @@ -1164,7 +1184,7 @@ class TranslatedVlaDimensionStmt extends TranslatedStmt { class TranslatedVlaDeclarationStmt extends TranslatedStmt { override VlaDeclStmt stmt; - override TranslatedExpr getChild(int id) { none() } + override TranslatedExpr getChildInternal(int id) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(OnlyInstructionTag()) and From 3a404cec67ac39a9ef94568ca4fab057d776bbce Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Wed, 24 Jan 2024 18:33:55 +0000 Subject: [PATCH 004/207] C++: Add `getLastInstruction` to IR generation --- .../raw/internal/TranslatedCall.qll | 13 +++ .../raw/internal/TranslatedCondition.qll | 14 +++ .../internal/TranslatedDeclarationEntry.qll | 6 ++ .../raw/internal/TranslatedElement.qll | 2 + .../raw/internal/TranslatedExpr.qll | 95 +++++++++++++++++++ .../raw/internal/TranslatedFunction.qll | 22 +++++ .../raw/internal/TranslatedGlobalVar.qll | 2 + .../raw/internal/TranslatedInitialization.qll | 36 +++++++ .../raw/internal/TranslatedStmt.qll | 48 ++++++++++ 9 files changed, 238 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index 653bcadbdd4..82c61fef162 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -47,6 +47,8 @@ abstract class TranslatedCall extends TranslatedExpr { else result = this.getFirstCallTargetInstruction(kind) } + override Instruction getLastInstruction() { result = this.getSideEffects().getLastInstruction() } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = CallTag() and opcode instanceof Opcode::Call and @@ -246,6 +248,15 @@ abstract class TranslatedSideEffects extends TranslatedElement { result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { + if exists(this.getAChild()) + then result = this.getChild(max(int i | exists(this.getChild(i)))).getLastInstruction() + else + // If there are no side effects, the "last" instruction should be the parent call's last + // instruction, so that implicit destructors can be inserted in the right place. + result = this.getParent().getInstruction(CallTag()) + } + final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } /** Gets the primary instruction to be associated with each side effect instruction. */ @@ -423,6 +434,8 @@ abstract class TranslatedSideEffect extends TranslatedElement { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType type) { tag = OnlyInstructionTag() and this.sideEffectInstruction(opcode, type) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll index 333e87ca214..2c06a03d469 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll @@ -56,6 +56,10 @@ abstract class TranslatedFlexibleCondition extends TranslatedCondition, Conditio result = this.getOperand().getFirstInstruction(kind) } + final override Instruction getLastInstruction() { + result = this.getOperand().getLastInstruction() + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } @@ -104,6 +108,12 @@ abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeConditio result = this.getLeftOperand().getFirstInstruction(kind) } + final override Instruction getLastInstruction() { + result = this.getLeftOperand().getLastInstruction() + or + result = this.getRightOperand().getLastInstruction() + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } @@ -162,6 +172,10 @@ class TranslatedValueCondition extends TranslatedCondition, TTranslatedValueCond result = this.getValueExpr().getFirstInstruction(kind) } + override Instruction getLastInstruction() { + result = this.getInstruction(ValueConditionConditionalBranchTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = ValueConditionConditionalBranchTag() and opcode instanceof Opcode::ConditionalBranch and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll index 76a3c35cb06..a2bc01afe69 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll @@ -156,6 +156,12 @@ class TranslatedStaticLocalVariableDeclarationEntry extends TranslatedDeclaratio kind instanceof GotoEdge } + final override Instruction getLastInstruction() { + result = this.getInstruction(DynamicInitializationConditionalBranchTag()) + or + result = this.getInstruction(DynamicInitializationFlagStoreTag()) + } + final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { tag = DynamicInitializationFlagAddressTag() and kind instanceof GotoEdge and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 66a3721ef96..249e7176c39 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -904,6 +904,8 @@ abstract class TranslatedElement extends TTranslatedElement { */ abstract Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind); + abstract Instruction getLastInstruction(); + /** * Gets the successor instruction to which control should flow after the * child element specified by `child` has finished execution. The successor diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index fc685773f77..7b09908a3c2 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -196,6 +196,10 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, result = this.getCondition().getFirstInstruction(kind) } + override Instruction getLastInstruction() { + result = this.getInstruction(ConditionValueResultLoadTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { ( tag = ConditionValueTrueTempAddressTag() or @@ -370,6 +374,8 @@ class TranslatedLoad extends TranslatedValueCategoryAdjustment, TTranslatedLoad kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(LoadTag()) } + override Instruction getResult() { result = this.getInstruction(LoadTag()) } override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { @@ -416,6 +422,8 @@ class TranslatedSyntheticTemporaryObject extends TranslatedValueCategoryAdjustme result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { result = this.getInstruction(InitializerStoreTag()) } + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(InitializerVariableAddressTag()) and @@ -473,6 +481,8 @@ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy { result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { result = this.getInstruction(ResultCopyTag()) } + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(ResultCopyTag()) and @@ -499,6 +509,8 @@ class TranslatedCommaExpr extends TranslatedNonConstantExpr { result = this.getLeftOperand().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getRightOperand().getLastInstruction() } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or @@ -608,6 +620,8 @@ abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr { result = this.getLoadedOperand().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(CrementStoreTag()) } + final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( @@ -711,6 +725,8 @@ class TranslatedArrayExpr extends TranslatedNonConstantExpr { result = this.getBaseOperand().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getBaseOperand() or @@ -769,6 +785,8 @@ abstract class TranslatedTransparentExpr extends TranslatedNonConstantExpr { result = this.getOperand().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getOperand().getLastInstruction() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getOperand() } @@ -847,6 +865,8 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(ThisLoadTag()) } + final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = ThisAddressTag() and @@ -908,6 +928,8 @@ class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess { ) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { none() } @@ -942,6 +964,8 @@ class TranslatedFieldAccess extends TranslatedVariableAccess { result = this.getQualifier().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = OnlyInstructionTag() and operandTag instanceof UnaryOperandTag and @@ -980,6 +1004,8 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp result = this.getInstruction(StructuredBindingAccessTag()) } + override Instruction getLastInstruction() { result = this.getInstruction(LoadTag()) } + override TranslatedElement getChildInternal(int id) { // Structured bindings cannot be qualified. none() @@ -1044,6 +1070,8 @@ class TranslatedFunctionAccess extends TranslatedNonConstantExpr { ) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { @@ -1095,6 +1123,8 @@ abstract class TranslatedConstantExpr extends TranslatedCoreExpr, TTranslatedVal kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override TranslatedElement getChildInternal(int id) { none() } final override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1172,6 +1202,8 @@ class TranslatedUnaryExpr extends TranslatedSingleInstructionExpr { result = this.getOperand().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getOperand() } @@ -1232,6 +1264,8 @@ abstract class TranslatedSingleInstructionConversion extends TranslatedConversio result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(OnlyInstructionTag()) and @@ -1329,6 +1363,10 @@ class TranslatedInheritanceConversion extends TranslatedSingleInstructionConvers class TranslatedBoolConversion extends TranslatedConversion { override BoolConversion expr; + override Instruction getLastInstruction() { + result = this.getInstruction(BoolConversionCompareTag()) + } + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = BoolConversionConstantTag() and @@ -1454,6 +1492,8 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { result = this.getLeftOperand().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() or @@ -1551,6 +1591,8 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr { result = this.getRightOperand().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(AssignmentStoreTag()) } + final override Instruction getResult() { // The following distinction is needed to work around extractor limitations // in old versions of the extractor. @@ -1625,6 +1667,8 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { result = this.getLeftOperand().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(AssignmentStoreTag()) } + final override Instruction getResult() { result = this.getInstruction(AssignmentStoreTag()) } final TranslatedExpr getLeftOperand() { @@ -1694,6 +1738,8 @@ class TranslatedAssignOperation extends TranslatedNonConstantExpr { result = this.getRightOperand().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(AssignmentStoreTag()) } + final override Instruction getResult() { // The following distinction is needed to work around extractor limitations // in old versions of the extractor. @@ -1922,6 +1968,8 @@ class TranslatedConstantAllocationSize extends TranslatedAllocationSize { result = this.getInstruction(AllocationSizeTag()) } + override Instruction getLastInstruction() { result = this.getInstruction(AllocationSizeTag()) } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = AllocationSizeTag() and opcode instanceof Opcode::Constant and @@ -1959,6 +2007,8 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize { result = this.getExtent().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(AllocationSizeTag()) } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { resultType = getTypeForPRValue(expr.getAllocator().getParameter(0).getType()) and ( @@ -2216,6 +2266,8 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = OnlyInstructionTag() and operandTag instanceof UnaryOperandTag and @@ -2240,6 +2292,15 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { override ConditionalExpr expr; + override Instruction getLastInstruction() { + if this.elseIsVoid() + then result = this.getElse().getLastInstruction() + else + if exists(this.getInstruction(ConditionValueResultLoadTag())) + then result = this.getInstruction(ConditionValueResultLoadTag()) + else result = this.getInstruction(ConditionValueResultTempAddressTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { // Note that the ternary flavor needs no explicit `ConditionalBranch` instruction here, because // the condition is a `TranslatedCondition`, which will simply connect the successor edges of @@ -2697,6 +2758,8 @@ class TranslatedReThrowExpr extends TranslatedThrowExpr { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(ThrowTag()) } + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } final override Opcode getThrowOpcode() { result instanceof Opcode::ReThrow } @@ -2728,6 +2791,8 @@ class TranslatedBuiltInOperation extends TranslatedNonConstantExpr { ) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override TranslatedElement getChildInternal(int id) { result = getTranslatedExpr(expr.getChild(id).getFullyConverted()) } @@ -2842,6 +2907,10 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr { kind instanceof GotoEdge } + override Instruction getLastInstruction() { + result = this.getInstruction(VarArgsVAListStoreTag()) + } + final override Instruction getResult() { none() } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() } @@ -2915,6 +2984,10 @@ class TranslatedVarArg extends TranslatedNonConstantExpr { result = this.getVAList().getFirstInstruction(kind) } + override Instruction getLastInstruction() { + result = this.getInstruction(VarArgsVAListStoreTag()) + } + final override Instruction getResult() { result = this.getInstruction(VarArgsArgAddressTag()) } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() } @@ -2987,6 +3060,8 @@ class TranslatedVarArgsEnd extends TranslatedNonConstantExpr { result = this.getVAList().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override Instruction getResult() { none() } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getVAList() } @@ -3033,6 +3108,10 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { result = this.getSourceVAList().getFirstInstruction(kind) } + override Instruction getLastInstruction() { + result = this.getInstruction(VarArgsVAListStoreTag()) + } + final override Instruction getResult() { result = this.getInstruction(VarArgsVAListStoreTag()) } final override TranslatedElement getChildInternal(int id) { @@ -3107,6 +3186,12 @@ abstract class TranslatedNewOrNewArrayExpr extends TranslatedNonConstantExpr, In result = this.getAllocatorCall().getFirstInstruction(kind) } + override Instruction getLastInstruction() { + if exists(this.getInitialization()) + then result = this.getInitialization().getLastInstruction() + else result = this.getInstruction(OnlyInstructionTag()) + } + final override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { @@ -3181,6 +3266,8 @@ class TranslatedConditionDeclExpr extends TranslatedNonConstantExpr { result = this.getDecl().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(ThrowTag()) } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getDecl() or @@ -3221,6 +3308,8 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(LoadTag()) } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() } @@ -3314,6 +3403,8 @@ class TranslatedStmtExpr extends TranslatedNonConstantExpr { result = this.getStmt().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getStmt().getLastInstruction() } + final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getStmt() } override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { @@ -3352,6 +3443,8 @@ class TranslatedErrorExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override TranslatedElement getChildInternal(int id) { none() } final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { @@ -3446,6 +3539,8 @@ class TranslatedAssumeExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + final override TranslatedElement getChildInternal(int id) { none() } final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll index a8f10f75d16..5ffc8e92207 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -114,6 +114,9 @@ class TranslatedFunction extends TranslatedRootElement, TTranslatedFunction { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(ExitFunctionTag()) } + + final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( @@ -379,6 +382,12 @@ abstract class TranslatedParameter extends TranslatedElement { kind instanceof GotoEdge } + override Instruction getLastInstruction() { + if this.hasIndirection() + then result = this.getInstruction(InitializerIndirectStoreTag()) + else result = this.getInstruction(InitializerStoreTag()) + } + final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = InitializerVariableAddressTag() and @@ -611,6 +620,8 @@ class TranslatedConstructorInitList extends TranslatedElement, InitializationCon else result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { result = this.getChild(max(int id | exists(this.getChild(id)))).getLastInstruction() } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } @@ -677,6 +688,7 @@ class TranslatedDestructorDestructionList extends TranslatedElement, then result = this.getChild(0).getFirstInstruction(kind) else result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { result = this.getChild(max(int id | exists(this.getChild(id)))).getLastInstruction() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() @@ -728,6 +740,15 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { else result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { + if exists(this.getAChild()) + then + result = + max(TranslatedElement child, int id | child = this.getChild(id) | child order by id) + .getFirstInstruction(any(GotoEdge goto)) + else result = this.getParent().getChildSuccessor(this, any(GotoEdge goto)) + } + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { exists(int id | child = this.getChild(id) | if exists(TranslatedReadEffect child2, int id2 | id2 > id and child2 = this.getChild(id2)) @@ -772,6 +793,7 @@ abstract class TranslatedReadEffect extends TranslatedElement { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { opcode instanceof Opcode::ReturnIndirection and tag = OnlyInstructionTag() and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll index d14adfa80e8..d3c6178fa3b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll @@ -27,6 +27,8 @@ class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(ExitFunctionTag()) } + override TranslatedElement getChild(int n) { n = 1 and result = getTranslatedInitialization(var.getInitializer().getExpr().getFullyConverted()) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index d08329c777c..b1302bd5a50 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -42,6 +42,8 @@ abstract class TranslatedVariableInitialization extends TranslatedElement, Initi kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = InitializerVariableAddressTag() and opcode instanceof Opcode::VariableAddress and @@ -177,6 +179,8 @@ abstract class TranslatedListInitialization extends TranslatedInitialization, In result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { result = this.getInstruction(ThrowTag()) } + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { exists(int index | child = this.getChild(index) and @@ -260,6 +264,8 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio not expr instanceof StringLiteral } + override Instruction getLastInstruction() { result = this.getInstruction(InitializerStoreTag()) } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = InitializerStoreTag() and opcode instanceof Opcode::Store and @@ -296,6 +302,12 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio class TranslatedStringLiteralInitialization extends TranslatedDirectInitialization { override StringLiteral expr; + override Instruction getLastInstruction() { + if this.zeroInitRange(_, _) + then result = this.getInstruction(ZeroPadStringStoreTag()) + else result = this.getInstruction(InitializerStoreTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { // Load the string literal to make it a prvalue of type `char[len]` tag = InitializerLoadStringTag() and @@ -457,6 +469,8 @@ class TranslatedConstructorInitialization extends TranslatedDirectInitialization { override ConstructorCall expr; + override Instruction getLastInstruction() { result = this.getInitializer().getLastInstruction() } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } @@ -558,6 +572,10 @@ class TranslatedExplicitFieldInitialization extends TranslatedFieldInitializatio this = TTranslatedExplicitFieldInitialization(ast, field, expr, position) } + override Instruction getLastInstruction() { + result = this.getInitialization().getLastInstruction() + } + override Instruction getTargetAddress() { result = this.getInstruction(this.getFieldAddressTag()) } @@ -595,6 +613,10 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, { TranslatedFieldValueInitialization() { this = TTranslatedFieldValueInitialization(ast, field) } + override Instruction getLastInstruction() { + result = this.getInstruction(this.getFieldDefaultValueStoreTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { TranslatedFieldInitialization.super.hasInstruction(opcode, tag, resultType) or @@ -743,6 +765,10 @@ class TranslatedExplicitElementInitialization extends TranslatedElementInitializ this = TTranslatedExplicitElementInitialization(initList, elementIndex, position) } + override Instruction getLastInstruction() { + result = this.getInstruction(this.getElementAddressTag()) + } + override Instruction getTargetAddress() { result = this.getInstruction(this.getElementAddressTag()) } @@ -788,6 +814,10 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati this = TTranslatedElementValueInitialization(initList, elementIndex, elementCount) } + override Instruction getLastInstruction() { + result = this.getInstruction(this.getElementDefaultValueStoreTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { TranslatedElementInitialization.super.hasInstruction(opcode, tag, resultType) or @@ -894,6 +924,8 @@ abstract class TranslatedBaseStructorCall extends TranslatedStructorCallFromStru kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getStructorCall().getLastInstruction() } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and opcode instanceof Opcode::ConvertToNonVirtualBase and @@ -947,6 +979,8 @@ class TranslatedConstructorDelegationInit extends TranslatedConstructorCallFromC result = this.getStructorCall().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getStructorCall().getLastInstruction() } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } @@ -1009,6 +1043,8 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { none() } // FIXME: does this need to be filled in? + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 8f7a4a2e513..1d3b508d6b7 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -211,6 +211,12 @@ class TranslatedMicrosoftTryExceptHandler extends TranslatedElement, result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { + result = this.getTranslatedHandler().getLastInstruction() + or + result = this.getInstruction(UnwindTag()) + } + private TranslatedExpr getTranslatedCondition() { result = getTranslatedExpr(tryExcept.getCondition()) } @@ -271,6 +277,8 @@ class TranslatedEmptyStmt extends TranslatedStmt { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and opcode instanceof Opcode::NoOp and @@ -306,6 +314,10 @@ class TranslatedDeclStmt extends TranslatedStmt { result = this.getParent().getChildSuccessor(this, kind) } + override Instruction getLastInstruction() { + result = this.getChild(this.getChildCount() - 1).getLastInstruction() + } + private int getChildCount() { result = count(this.getDeclarationEntry(_)) } IRDeclarationEntry getIRDeclarationEntry(int index) { @@ -357,6 +369,8 @@ class TranslatedExprStmt extends TranslatedStmt { result = this.getExpr().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getExpr().getLastInstruction() } + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { @@ -415,6 +429,8 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { result = this.getExpr().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and opcode instanceof Opcode::NoOp and @@ -451,6 +467,8 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and opcode instanceof Opcode::NoOp and @@ -557,6 +575,8 @@ class TranslatedTryStmt extends TranslatedStmt { result = this.getBody().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getFinally().getLastInstruction() } + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { // All non-finally children go to the successor of the `try` if // there is no finally block, but if there is a finally block @@ -616,6 +636,12 @@ class TranslatedBlock extends TranslatedStmt { else result = this.getStmt(0).getFirstInstruction(kind) } + override Instruction getLastInstruction() { + if this.isEmpty() + then result = this.getInstruction(OnlyInstructionTag()) + else result = this.getStmt(this.getStmtCount() - 1).getFirstInstruction(any(GotoEdge goto)) + } + private predicate isEmpty() { not exists(stmt.getStmt(0)) } private TranslatedStmt getStmt(int index) { result = getTranslatedStmt(stmt.getStmt(index)) } @@ -650,6 +676,8 @@ abstract class TranslatedHandler extends TranslatedStmt { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getBlock().getLastInstruction() } + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { child = this.getBlock() and result = this.getParent().getChildSuccessor(this, kind) } @@ -737,6 +765,10 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { else result = this.getFirstConditionInstruction(kind) } + override Instruction getLastInstruction() { + result = this.getElse().getLastInstruction() or result = this.getThen().getLastInstruction() // FIXME: how do we handle the CFG merge here + } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or @@ -797,6 +829,10 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { override Loop stmt; + override Instruction getLastInstruction() { + result = this.getCondition().getLastInstruction() // FIXME: how do we handle the branch here + } + final TranslatedCondition getCondition() { result = getTranslatedCondition(stmt.getCondition().getFullyConverted()) } @@ -932,6 +968,8 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext { result = this.getRangeVariableDeclStmt().getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getCondition().getLastInstruction() } + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { child = this.getRangeVariableDeclStmt() and result = this.getBeginEndVariableDeclStmt().getFirstInstruction(kind) @@ -1007,6 +1045,8 @@ class TranslatedJumpStmt extends TranslatedStmt { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override TranslatedElement getChildInternal(int id) { none() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -1051,6 +1091,8 @@ class TranslatedSwitchStmt extends TranslatedStmt { else result = this.getFirstExprInstruction(kind) } + override Instruction getLastInstruction() { result = this.getBody().getLastInstruction() } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or @@ -1118,6 +1160,8 @@ class TranslatedAsmStmt extends TranslatedStmt { ) } + override Instruction getLastInstruction() { result = this.getInstruction(AsmTag()) } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = AsmTag() and opcode instanceof Opcode::InlineAsm and @@ -1169,6 +1213,8 @@ class TranslatedVlaDimensionStmt extends TranslatedStmt { result = this.getChild(0).getFirstInstruction(kind) } + override Instruction getLastInstruction() { result = this.getChild(0).getLastInstruction() } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } @@ -1191,6 +1237,8 @@ class TranslatedVlaDeclarationStmt extends TranslatedStmt { kind instanceof GotoEdge } + override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { // TODO: This needs a new kind of instruction that represents initialization of a VLA. // For now we just emit a `NoOp` instruction so that the CFG isn't incomplete. From 85d1d079c8109bb857eb55641ae9ff5b9b3d9eb8 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Thu, 1 Feb 2024 19:44:18 +0000 Subject: [PATCH 005/207] C++: Add implicit named destructosrs to the IR CFG --- cpp/ql/lib/semmle/code/cpp/Enclosing.qll | 2 + .../raw/internal/IRConstruction.qll | 3 +- .../raw/internal/InstructionTag.qll | 12 +- .../raw/internal/TranslatedCall.qll | 45 +- .../raw/internal/TranslatedCondition.qll | 22 +- .../internal/TranslatedDeclarationEntry.qll | 4 +- .../raw/internal/TranslatedElement.qll | 75 +- .../raw/internal/TranslatedExpr.qll | 335 ++++--- .../raw/internal/TranslatedFunction.qll | 59 +- .../raw/internal/TranslatedGlobalVar.qll | 4 +- .../raw/internal/TranslatedInitialization.qll | 102 +- .../raw/internal/TranslatedStmt.qll | 177 ++-- cpp/ql/test/library-tests/ir/ir/ir.cpp | 37 +- .../test/library-tests/ir/ir/raw_ir.expected | 883 ++++++++++++++---- 14 files changed, 1291 insertions(+), 469 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/Enclosing.qll b/cpp/ql/lib/semmle/code/cpp/Enclosing.qll index d821589a76c..013f5e672be 100644 --- a/cpp/ql/lib/semmle/code/cpp/Enclosing.qll +++ b/cpp/ql/lib/semmle/code/cpp/Enclosing.qll @@ -60,4 +60,6 @@ Element exprEnclosingElement(Expr e) { ) else result = de.getDeclaration() ) + or + result.(Stmt).getAnImplicitDestructorCall() = e } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll index 7e4c3e7934c..8fcbfbf63ce 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll @@ -11,6 +11,7 @@ private import InstructionTag private import TranslatedCondition private import TranslatedElement private import TranslatedExpr +private import TranslatedCall private import TranslatedStmt private import TranslatedFunction private import TranslatedGlobalVar @@ -266,7 +267,7 @@ CppType getInstructionOperandType(Instruction instruction, TypedOperandTag tag) Instruction getPhiInstructionBlockStart(PhiInstruction instr) { none() } Instruction getInstructionSuccessor(Instruction instruction, EdgeKind kind) { - result = + result = getInstructionTranslatedElement(instruction) .getInstructionSuccessor(getInstructionTag(instruction), kind) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll index b3ac43e2873..f9315a36bcf 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll @@ -85,10 +85,14 @@ newtype TInstructionTag = // The next three cases handle generation of branching for __except handling. TryExceptCompareNegativeOneBranch() or TryExceptCompareZeroBranch() or - TryExceptCompareOneBranch() + TryExceptCompareOneBranch() or + ImplicitDestructorTag(int index) { + exists(Expr e | exists(e.getImplicitDestructorCall(index))) or + exists(Stmt s | exists(s.getImplicitDestructorCall(index))) + } class InstructionTag extends TInstructionTag { - final string toString() { result = "Tag" } + final string toString() { result = getInstructionTagId(this) } } /** @@ -255,4 +259,8 @@ string getInstructionTagId(TInstructionTag tag) { tag = TryExceptCompareZeroBranch() and result = "TryExceptCompareZeroBranch" or tag = TryExceptCompareOneBranch() and result = "TryExceptCompareOneBranch" + or + exists(int index | + tag = ImplicitDestructorTag(index) and result = "ImplicitDestructor(" + index + ")" + ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index 82c61fef162..dd0e86ad370 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -47,7 +47,11 @@ abstract class TranslatedCall extends TranslatedExpr { else result = this.getFirstCallTargetInstruction(kind) } - override Instruction getLastInstruction() { result = this.getSideEffects().getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getSideEffects().getLastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getSideEffects() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = CallTag() and @@ -55,7 +59,7 @@ abstract class TranslatedCall extends TranslatedExpr { resultType = getTypeForPRValue(this.getCallResultType()) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getQualifier() and result = this.getFirstCallTargetInstruction(kind) or @@ -89,7 +93,8 @@ abstract class TranslatedCall extends TranslatedExpr { ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + kind instanceof GotoEdge and tag = CallTag() and result = this.getSideEffects().getFirstInstruction(kind) } @@ -227,7 +232,7 @@ abstract class TranslatedSideEffects extends TranslatedElement { ) } - final override Instruction getChildSuccessor(TranslatedElement te, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement te, EdgeKind kind) { exists(int i | this.getChild(i) = te and if exists(this.getChild(i + 1)) @@ -236,6 +241,10 @@ abstract class TranslatedSideEffects extends TranslatedElement { ) } + override TranslatedElement getLastChild() { + result = this.getChild(max(int i | exists(this.getChild(i)))) + } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType type) { none() } @@ -248,7 +257,7 @@ abstract class TranslatedSideEffects extends TranslatedElement { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { if exists(this.getAChild()) then result = this.getChild(max(int i | exists(this.getChild(i)))).getLastInstruction() else @@ -257,7 +266,9 @@ abstract class TranslatedSideEffects extends TranslatedElement { result = this.getParent().getInstruction(CallTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } /** Gets the primary instruction to be associated with each side effect instruction. */ abstract Instruction getPrimaryInstruction(); @@ -284,8 +295,8 @@ abstract class TranslatedDirectCall extends TranslatedCall { resultType = getFunctionGLValueType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedCall.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedCall.super.getInstructionSuccessorInternal(tag, kind) or tag = CallTargetTag() and result = this.getFirstArgumentOrCallInstruction(kind) @@ -378,6 +389,16 @@ class TranslatedStructorCall extends TranslatedFunctionCall { context = this.getParent() and result = context.getReceiver() ) + or + exists(Stmt parent | + expr = parent.getAnImplicitDestructorCall() and + result = getTranslatedExpr(expr.getQualifier().getFullyConverted()).getResult() + ) + or + exists(Expr parent | + expr = parent.getAnImplicitDestructorCall() and + result = getTranslatedExpr(expr.getQualifier().getFullyConverted()).getResult() + ) } override predicate hasQualifier() { any() } @@ -427,21 +448,23 @@ private int initializeAllocationGroup() { result = 3 } abstract class TranslatedSideEffect extends TranslatedElement { final override TranslatedElement getChild(int n) { none() } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } final override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType type) { tag = OnlyInstructionTag() and this.sideEffectInstruction(opcode, type) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { result = this.getParent().getChildSuccessor(this, kind) and tag = OnlyInstructionTag() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll index 2c06a03d469..9d56274386d 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll @@ -50,13 +50,15 @@ abstract class TranslatedFlexibleCondition extends TranslatedCondition, Conditio { TranslatedFlexibleCondition() { this = TTranslatedFlexibleCondition(expr) } + final override predicate handlesDestructorsExplicitly() { none() } // TODO: this needs to be revisted when we get unnamed destructors + final override TranslatedElement getChild(int id) { id = 0 and result = this.getOperand() } final override Instruction getFirstInstruction(EdgeKind kind) { result = this.getOperand().getFirstInstruction(kind) } - final override Instruction getLastInstruction() { + final override Instruction getLastInstructionInternal() { result = this.getOperand().getLastInstruction() } @@ -64,7 +66,9 @@ abstract class TranslatedFlexibleCondition extends TranslatedCondition, Conditio none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } @@ -98,6 +102,8 @@ abstract class TranslatedNativeCondition extends TranslatedCondition, TTranslate abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeCondition, ConditionContext { override BinaryLogicalOperation expr; + final override predicate handlesDestructorsExplicitly() { none() } // TODO: this needs to be revisted when we get unnamed destructors + final override TranslatedElement getChild(int id) { id = 0 and result = this.getLeftOperand() or @@ -108,7 +114,7 @@ abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeConditio result = this.getLeftOperand().getFirstInstruction(kind) } - final override Instruction getLastInstruction() { + final override Instruction getLastInstructionInternal() { result = this.getLeftOperand().getLastInstruction() or result = this.getRightOperand().getLastInstruction() @@ -118,7 +124,9 @@ abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeConditio none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } final TranslatedCondition getLeftOperand() { result = getTranslatedCondition(expr.getLeftOperand().getFullyConverted()) @@ -172,10 +180,12 @@ class TranslatedValueCondition extends TranslatedCondition, TTranslatedValueCond result = this.getValueExpr().getFirstInstruction(kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getInstruction(ValueConditionConditionalBranchTag()) } + final override predicate handlesDestructorsExplicitly() { none() } // TODO: this needs to be revisted when we get unnamed destructors + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = ValueConditionConditionalBranchTag() and opcode instanceof Opcode::ConditionalBranch and @@ -188,7 +198,7 @@ class TranslatedValueCondition extends TranslatedCondition, TTranslatedValueCond kind instanceof GotoEdge } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = ValueConditionConditionalBranchTag() and ( kind instanceof TrueEdge and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll index a2bc01afe69..0a2de9c749b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll @@ -156,13 +156,13 @@ class TranslatedStaticLocalVariableDeclarationEntry extends TranslatedDeclaratio kind instanceof GotoEdge } - final override Instruction getLastInstruction() { + final override Instruction getLastInstructionInternal() { result = this.getInstruction(DynamicInitializationConditionalBranchTag()) or result = this.getInstruction(DynamicInitializationFlagStoreTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = DynamicInitializationFlagAddressTag() and kind instanceof GotoEdge and result = this.getInstruction(DynamicInitializationFlagLoadTag()) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 249e7176c39..78e56175836 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -20,9 +20,18 @@ private import SideEffects * they were explicit nodes in the expression tree, rather than as implicit * nodes as in the regular AST representation. */ -private Element getRealParent(Expr expr) { +Element getRealParent(Expr expr) { result = expr.getParentWithConversions() or + /* + * exists(Stmt destructorParent, DestructorCall dc | + * destructorParent.getAnImplicitDestructorCall() = dc and + * dc.getQualifier() = expr and + * result = dc + * ) + * or + */ + result.(Destructor).getADestruction() = expr or result.(Expr).getAnImplicitDestructorCall() = expr @@ -748,12 +757,7 @@ newtype TTranslatedElement = // on `*this` without an `Expr`. TTranslatedStructorQualifierSideEffect(Call call, SideEffectOpcode opcode) { not ignoreSideEffects(call) and - // Don't bother with destructor calls for now, since we won't see very many of them in the IR - // until we start injecting implicit destructor calls. - ( - call instanceof ConstructorCall or - call instanceof DestructorCall - ) and + call instanceof ConstructorCall and opcode = getASideEffectOpcode(call, -1) } or // The side effect that initializes newly-allocated memory. @@ -866,6 +870,17 @@ abstract class TranslatedElement extends TTranslatedElement { 1 + sum(TranslatedElement child | child = this.getChildByRank(_) | child.getDescendantCount()) } + /** + * Holds if this element has implicit destructor calls that should follow it. + */ + predicate hasImplicitDestructorCalls() { none() } + + /** + */ + int getFirstDestructorCallIndex() { none() } + + predicate handlesDestructorsExplicitly() { none() } + private int getUniqueId() { if not exists(this.getParent()) then result = 0 @@ -902,16 +917,56 @@ abstract class TranslatedElement extends TTranslatedElement { * Gets the successor instruction of the instruction that was generated by * this element for tag `tag`. The successor edge kind is specified by `kind`. */ - abstract Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind); + abstract Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind); - abstract Instruction getLastInstruction(); + Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + if + this.hasImplicitDestructorCalls() and + this.getInstruction(tag) = this.getLastInstructionInternal() and + not this.handlesDestructorsExplicitly() + then + result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) and + kind instanceof GotoEdge + else result = this.getInstructionSuccessorInternal(tag, kind) + } + + final Instruction getLastInstruction() { + if this.hasImplicitDestructorCalls() and not this.handlesDestructorsExplicitly() + then result = this.getChild(max(int n | exists(this.getChild(n)))).getLastInstruction() // last destructor + else result = this.getLastInstructionInternal() + } + + abstract Instruction getLastInstructionInternal(); + + TranslatedElement getLastChild() { none() } /** * Gets the successor instruction to which control should flow after the * child element specified by `child` has finished execution. The successor * edge kind is specified by `kind`. */ - abstract Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind); + Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } + + Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + ( + if + // this is the last child and we need to handle destructors for it + this.hasImplicitDestructorCalls() and + not this.handlesDestructorsExplicitly() and + child = this.getLastChild() + then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) + else result = this.getChildSuccessorInternal(child, kind) + ) + or + not this.handlesDestructorsExplicitly() and + exists(int id | + id >= this.getFirstDestructorCallIndex() and + child = this.getChild(id) and + if id = max(int n | exists(this.getChild(n))) + then result = this.getParent().getChildSuccessor(this, kind) + else result = this.getChild(id + 1).getFirstInstruction(kind) + ) + } /** * Gets the instruction to which control should flow if an exception is thrown diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 7b09908a3c2..e5f77c4483a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -14,6 +14,7 @@ private import TranslatedFunction private import TranslatedInitialization private import TranslatedStmt private import TranslatedGlobalVar +private import IRConstruction import TranslatedCall /** @@ -87,6 +88,16 @@ abstract class TranslatedExpr extends TranslatedElement { ) } + final override predicate hasImplicitDestructorCalls() { + exists(expr.getAnImplicitDestructorCall()) + } + + final override int getFirstDestructorCallIndex() { + result = max(int childId | exists(this.getChildInternal(childId))) + 1 + or + not exists(this.getChildInternal(_)) and result = 0 + } + final override Locatable getAst() { result = expr } final override Declaration getFunction() { result = getEnclosingDeclaration(expr) } @@ -196,7 +207,7 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, result = this.getCondition().getFirstInstruction(kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getInstruction(ConditionValueResultLoadTag()) } @@ -228,7 +239,7 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, resultType = this.getResultType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = ConditionValueTrueTempAddressTag() and @@ -305,7 +316,7 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, override Instruction getResult() { result = this.getInstruction(ConditionValueResultLoadTag()) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and @@ -363,18 +374,18 @@ class TranslatedLoad extends TranslatedValueCategoryAdjustment, TTranslatedLoad override predicate isResultGLValue() { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = LoadTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(LoadTag()) and kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(LoadTag()) } + override Instruction getLastInstructionInternal() { result = this.getInstruction(LoadTag()) } override Instruction getResult() { result = this.getInstruction(LoadTag()) } @@ -413,7 +424,7 @@ class TranslatedSyntheticTemporaryObject extends TranslatedValueCategoryAdjustme override predicate isResultGLValue() { any() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = InitializerVariableAddressTag() and result = this.getInstruction(InitializerStoreTag()) and kind instanceof GotoEdge @@ -422,9 +433,11 @@ class TranslatedSyntheticTemporaryObject extends TranslatedValueCategoryAdjustme result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { result = this.getInstruction(InitializerStoreTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(InitializerStoreTag()) + } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(InitializerVariableAddressTag()) and kind instanceof GotoEdge @@ -476,14 +489,16 @@ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy { resultType = this.getOperand().getResultType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = ResultCopyTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { result = this.getInstruction(ResultCopyTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(ResultCopyTag()) + } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(ResultCopyTag()) and kind instanceof GotoEdge @@ -509,7 +524,9 @@ class TranslatedCommaExpr extends TranslatedNonConstantExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getRightOperand().getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getRightOperand().getLastInstruction() + } override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() @@ -517,11 +534,13 @@ class TranslatedCommaExpr extends TranslatedNonConstantExpr { id = 1 and result = this.getRightOperand() } + override TranslatedElement getLastChild() { result = this.getRightOperand() } + override Instruction getResult() { result = this.getRightOperand().getResult() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getLeftOperand() and result = this.getRightOperand().getFirstInstruction(kind) or @@ -620,9 +639,11 @@ abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr { result = this.getLoadedOperand().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(CrementStoreTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(CrementStoreTag()) + } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = CrementConstantTag() and @@ -636,7 +657,7 @@ abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getLoadedOperand() and result = this.getInstruction(CrementConstantTag()) and kind instanceof GotoEdge @@ -725,7 +746,9 @@ class TranslatedArrayExpr extends TranslatedNonConstantExpr { result = this.getBaseOperand().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getBaseOperand() @@ -733,12 +756,12 @@ class TranslatedArrayExpr extends TranslatedNonConstantExpr { id = 1 and result = this.getOffsetOperand() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getBaseOperand() and result = this.getOffsetOperand().getFirstInstruction(kind) or @@ -785,15 +808,21 @@ abstract class TranslatedTransparentExpr extends TranslatedNonConstantExpr { result = this.getOperand().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getOperand().getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getOperand().getLastInstruction() + } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getOperand() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override TranslatedElement getLastChild() { result = this.getOperand() } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } + + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getParent().getChildSuccessor(this, kind) } @@ -865,9 +894,9 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(ThisLoadTag()) } + override Instruction getLastInstructionInternal() { result = this.getInstruction(ThisLoadTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = ThisAddressTag() and result = this.getInstruction(ThisLoadTag()) @@ -876,7 +905,9 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = ThisLoadTag() and @@ -903,12 +934,12 @@ abstract class TranslatedVariableAccess extends TranslatedNonConstantExpr { override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getQualifier() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -928,7 +959,9 @@ class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess { ) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { none() @@ -964,7 +997,9 @@ class TranslatedFieldAccess extends TranslatedVariableAccess { result = this.getQualifier().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = OnlyInstructionTag() and @@ -1004,7 +1039,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp result = this.getInstruction(StructuredBindingAccessTag()) } - override Instruction getLastInstruction() { result = this.getInstruction(LoadTag()) } + override Instruction getLastInstructionInternal() { result = this.getInstruction(LoadTag()) } override TranslatedElement getChildInternal(int id) { // Structured bindings cannot be qualified. @@ -1013,7 +1048,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp override Instruction getResult() { result = this.getInstruction(LoadTag()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = StructuredBindingAccessTag() and kind instanceof GotoEdge and result = this.getInstruction(LoadTag()) @@ -1022,7 +1057,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = StructuredBindingAccessTag() and @@ -1070,11 +1105,13 @@ class TranslatedFunctionAccess extends TranslatedNonConstantExpr { ) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } @@ -1090,7 +1127,7 @@ class TranslatedFunctionAccess extends TranslatedNonConstantExpr { result = expr.getTarget() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getQualifier() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -1123,7 +1160,9 @@ abstract class TranslatedConstantExpr extends TranslatedCoreExpr, TTranslatedVal kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override TranslatedElement getChildInternal(int id) { none() } @@ -1139,12 +1178,14 @@ abstract class TranslatedConstantExpr extends TranslatedCoreExpr, TTranslatedVal resultType = this.getResultType() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } abstract Opcode getOpcode(); } @@ -1202,18 +1243,20 @@ class TranslatedUnaryExpr extends TranslatedSingleInstructionExpr { result = this.getOperand().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getOperand() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -1259,14 +1302,16 @@ abstract class TranslatedConversion extends TranslatedNonConstantExpr { * single instruction. */ abstract class TranslatedSingleInstructionConversion extends TranslatedConversion { - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -1363,11 +1408,11 @@ class TranslatedInheritanceConversion extends TranslatedSingleInstructionConvers class TranslatedBoolConversion extends TranslatedConversion { override BoolConversion expr; - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getInstruction(BoolConversionCompareTag()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = BoolConversionConstantTag() and result = this.getInstruction(BoolConversionCompareTag()) @@ -1376,7 +1421,7 @@ class TranslatedBoolConversion extends TranslatedConversion { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getOperand() and result = this.getInstruction(BoolConversionConstantTag()) and kind instanceof GotoEdge @@ -1492,7 +1537,9 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getLeftOperand() @@ -1518,12 +1565,12 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getLeftOperand() and result = this.getRightOperand().getFirstInstruction(kind) or @@ -1591,7 +1638,9 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr { result = this.getRightOperand().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(AssignmentStoreTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(AssignmentStoreTag()) + } final override Instruction getResult() { // The following distinction is needed to work around extractor limitations @@ -1617,12 +1666,12 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getRValue().getFullyConverted()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = AssignmentStoreTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { // Operands are evaluated right-to-left. child = this.getRightOperand() and result = this.getLeftOperand().getFirstInstruction(kind) @@ -1667,7 +1716,9 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(AssignmentStoreTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(AssignmentStoreTag()) + } final override Instruction getResult() { result = this.getInstruction(AssignmentStoreTag()) } @@ -1679,7 +1730,7 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getRValue().getFullyConverted()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = LoadTag() and result = this.getInstruction(AssignmentStoreTag()) and kind instanceof GotoEdge @@ -1688,7 +1739,7 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getLeftOperand() and result = this.getRightOperand().getFirstInstruction(kind) or @@ -1738,7 +1789,9 @@ class TranslatedAssignOperation extends TranslatedNonConstantExpr { result = this.getRightOperand().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(AssignmentStoreTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(AssignmentStoreTag()) + } final override Instruction getResult() { // The following distinction is needed to work around extractor limitations @@ -1776,7 +1829,7 @@ class TranslatedAssignOperation extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getRValue().getFullyConverted()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = AssignOperationConvertLeftTag() and @@ -1797,7 +1850,7 @@ class TranslatedAssignOperation extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { // Operands are evaluated right-to-left. child = this.getRightOperand() and result = this.getLoadedLeftOperand().getFirstInstruction(kind) @@ -1968,7 +2021,9 @@ class TranslatedConstantAllocationSize extends TranslatedAllocationSize { result = this.getInstruction(AllocationSizeTag()) } - override Instruction getLastInstruction() { result = this.getInstruction(AllocationSizeTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(AllocationSizeTag()) + } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = AllocationSizeTag() and @@ -1976,14 +2031,16 @@ class TranslatedConstantAllocationSize extends TranslatedAllocationSize { resultType = getTypeForPRValue(expr.getAllocator().getParameter(0).getType()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = AllocationSizeTag() and result = this.getParent().getChildSuccessor(this, kind) } final override TranslatedElement getChildInternal(int id) { none() } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override string getInstructionConstantValue(InstructionTag tag) { tag = AllocationSizeTag() and @@ -2007,7 +2064,9 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize { result = this.getExtent().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(AllocationSizeTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(AllocationSizeTag()) + } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { resultType = getTypeForPRValue(expr.getAllocator().getParameter(0).getType()) and @@ -2023,7 +2082,7 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize { ) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( this.extentNeedsConversion() and @@ -2040,7 +2099,7 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize { final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getExtent() } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getExtent() and kind instanceof GotoEdge and if this.extentNeedsConversion() @@ -2174,8 +2233,8 @@ class TranslatedDeleteOrDeleteArrayExpr extends TranslatedNonConstantExpr, Trans else opcode instanceof Opcode::VirtualDeleteFunctionAddress } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedCall.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedCall.super.getInstructionSuccessorInternal(tag, kind) or tag = CallTargetTag() and result = this.getFirstArgumentOrCallInstruction(kind) @@ -2243,18 +2302,20 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St id = 0 and result = this.getDestructorCall() } + override TranslatedElement getLastChild() { result = this.getDestructorCall() } + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and opcode instanceof Opcode::FieldAddress and resultType = getTypeForGLValue(expr.getTarget().getType()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getDestructorCall().getFirstInstruction(kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getDestructorCall() and result = this.getParent().getChildSuccessor(this, kind) } @@ -2266,7 +2327,9 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = OnlyInstructionTag() and @@ -2292,7 +2355,7 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { override ConditionalExpr expr; - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { if this.elseIsVoid() then result = this.getElse().getLastInstruction() else @@ -2301,6 +2364,8 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { else result = this.getInstruction(ConditionValueResultTempAddressTag()) } + override TranslatedElement getLastChild() { this.elseIsVoid() and result = this.getElse() } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { // Note that the ternary flavor needs no explicit `ConditionalBranch` instruction here, because // the condition is a `TranslatedCondition`, which will simply connect the successor edges of @@ -2345,7 +2410,7 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { not this.resultIsVoid() and ( not this.thenIsVoid() and @@ -2453,7 +2518,7 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { else result = this.getInstruction(ConditionValueResultLoadTag()) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getElse() and if this.elseIsVoid() then result = this.getParent().getChildSuccessor(this, kind) @@ -2512,8 +2577,8 @@ class TranslatedTernaryConditionalExpr extends TranslatedConditionalExpr, Condit result = this.getCondition().getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { - result = TranslatedConditionalExpr.super.getChildSuccessor(child, kind) + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = TranslatedConditionalExpr.super.getChildSuccessorInternal(child, kind) or ( child = this.getThen() and @@ -2576,8 +2641,8 @@ class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = super.getInstructionSuccessorInternal(tag, kind) or tag = ValueConditionConditionalBranchTag() and ( @@ -2597,8 +2662,8 @@ class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr { result = this.getCondition().getResult() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { - result = super.getChildSuccessor(child, kind) + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = super.getChildSuccessorInternal(child, kind) or kind instanceof GotoEdge and child = this.getCondition() and @@ -2643,6 +2708,12 @@ class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr, result = TranslatedVariableInitialization.super.getChildInternal(id) } + final override Instruction getChildSuccessorInternal(TranslatedElement elem, EdgeKind kind) { + result = TranslatedVariableInitialization.super.getChildSuccessorInternal(elem, kind) + } + + final override TranslatedElement getLastChild() { result = this.getInitialization() } + final override TranslatedInitialization getInitialization() { result = getTranslatedInitialization(expr.getExpr()) } @@ -2670,7 +2741,7 @@ abstract class TranslatedThrowExpr extends TranslatedNonConstantExpr { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = ThrowTag() and kind instanceof ExceptionEdge and result = this.getParent().getExceptionSuccessorInstruction(any(GotoEdge edge)) @@ -2692,16 +2763,20 @@ class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableIn result = TranslatedVariableInitialization.super.getChildInternal(id) } + final override Instruction getChildSuccessorInternal(TranslatedElement elem, EdgeKind kind) { + result = TranslatedVariableInitialization.super.getChildSuccessorInternal(elem, kind) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { TranslatedThrowExpr.super.hasInstruction(opcode, tag, resultType) or TranslatedVariableInitialization.super.hasInstruction(opcode, tag, resultType) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedThrowExpr.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedThrowExpr.super.getInstructionSuccessorInternal(tag, kind) or - result = TranslatedVariableInitialization.super.getInstructionSuccessor(tag, kind) + result = TranslatedVariableInitialization.super.getInstructionSuccessorInternal(tag, kind) } final override Instruction getInitializationSuccessor(EdgeKind kind) { @@ -2758,9 +2833,9 @@ class TranslatedReThrowExpr extends TranslatedThrowExpr { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(ThrowTag()) } + override Instruction getLastInstructionInternal() { result = this.getInstruction(ThrowTag()) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } final override Opcode getThrowOpcode() { result instanceof Opcode::ReThrow } } @@ -2791,18 +2866,20 @@ class TranslatedBuiltInOperation extends TranslatedNonConstantExpr { ) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override TranslatedElement getChildInternal(int id) { result = getTranslatedExpr(expr.getChild(id).getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int id | child = this.getChild(id) | result = this.getChild(id + 1).getFirstInstruction(kind) or @@ -2907,7 +2984,7 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr { kind instanceof GotoEdge } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getInstruction(VarArgsVAListStoreTag()) } @@ -2919,7 +2996,7 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getVAList().getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = VarArgsStartEllipsisAddressTag() and kind instanceof GotoEdge and result = this.getInstruction(VarArgsStartTag()) @@ -2931,7 +3008,7 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getVAList() and result = this.getInstruction(VarArgsVAListStoreTag()) and kind instanceof GotoEdge @@ -2984,7 +3061,7 @@ class TranslatedVarArg extends TranslatedNonConstantExpr { result = this.getVAList().getFirstInstruction(kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getInstruction(VarArgsVAListStoreTag()) } @@ -2996,7 +3073,7 @@ class TranslatedVarArg extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getVAList().getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = VarArgsVAListLoadTag() and kind instanceof GotoEdge and result = this.getInstruction(VarArgsArgAddressTag()) @@ -3013,7 +3090,7 @@ class TranslatedVarArg extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getVAList() and result = this.getInstruction(VarArgsVAListLoadTag()) and kind instanceof GotoEdge @@ -3060,7 +3137,9 @@ class TranslatedVarArgsEnd extends TranslatedNonConstantExpr { result = this.getVAList().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override Instruction getResult() { none() } @@ -3070,12 +3149,12 @@ class TranslatedVarArgsEnd extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getVAList().getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getVAList() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -3108,7 +3187,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { result = this.getSourceVAList().getFirstInstruction(kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getInstruction(VarArgsVAListStoreTag()) } @@ -3128,7 +3207,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { result = getTranslatedExpr(expr.getSourceVAList().getFullyConverted()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = VarArgsVAListLoadTag() and result = this.getDestinationVAList().getFirstInstruction(kind) or @@ -3136,7 +3215,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { kind instanceof GotoEdge and ( child = this.getSourceVAList() and @@ -3186,22 +3265,24 @@ abstract class TranslatedNewOrNewArrayExpr extends TranslatedNonConstantExpr, In result = this.getAllocatorCall().getFirstInstruction(kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { if exists(this.getInitialization()) then result = this.getInitialization().getLastInstruction() else result = this.getInstruction(OnlyInstructionTag()) } + override TranslatedElement getLastChild() { result = this.getInitialization() } + final override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and if exists(this.getInitialization()) then result = this.getInitialization().getFirstInstruction(kind) else result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { kind instanceof GotoEdge and child = this.getAllocatorCall() and result = this.getInstruction(OnlyInstructionTag()) @@ -3266,7 +3347,9 @@ class TranslatedConditionDeclExpr extends TranslatedNonConstantExpr { result = this.getDecl().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(ThrowTag()) } + override Instruction getLastInstructionInternal() { + result = this.getConditionExpr().getLastInstruction() + } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getDecl() @@ -3274,11 +3357,13 @@ class TranslatedConditionDeclExpr extends TranslatedNonConstantExpr { id = 1 and result = this.getConditionExpr() } + override TranslatedElement getLastChild() { result = this.getConditionExpr() } + override Instruction getResult() { result = this.getConditionExpr().getResult() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getDecl() and result = this.getConditionExpr().getFirstInstruction(kind) or @@ -3308,7 +3393,7 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(LoadTag()) } + override Instruction getLastInstructionInternal() { result = this.getInstruction(LoadTag()) } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() @@ -3316,7 +3401,7 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont override Instruction getResult() { result = this.getInstruction(LoadTag()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = InitializerVariableAddressTag() and kind instanceof GotoEdge and result = this.getInstruction(InitializerStoreTag()) @@ -3334,7 +3419,7 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getInstruction(LoadTag()) and kind instanceof GotoEdge @@ -3403,16 +3488,18 @@ class TranslatedStmtExpr extends TranslatedNonConstantExpr { result = this.getStmt().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getStmt().getLastInstruction() } + override Instruction getLastInstructionInternal() { result = this.getStmt().getLastInstruction() } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getStmt() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override TranslatedElement getLastChild() { result = this.getStmt() } + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag instanceof OnlyInstructionTag and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getStmt() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -3443,16 +3530,20 @@ class TranslatedErrorExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override TranslatedElement getChildInternal(int id) { none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { none() @@ -3539,14 +3630,18 @@ class TranslatedAssumeExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } final override TranslatedElement getChildInternal(int id) { none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll index 5ffc8e92207..924755712b4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -114,10 +114,11 @@ class TranslatedFunction extends TranslatedRootElement, TTranslatedFunction { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(ExitFunctionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(ExitFunctionTag()) + } - - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = EnterFunctionTag() and @@ -153,7 +154,7 @@ class TranslatedFunction extends TranslatedRootElement, TTranslatedFunction { ) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int paramIndex | child = this.getParameter(paramIndex) | if exists(func.getParameter(paramIndex + 1)) or @@ -382,13 +383,13 @@ abstract class TranslatedParameter extends TranslatedElement { kind instanceof GotoEdge } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { if this.hasIndirection() then result = this.getInstruction(InitializerIndirectStoreTag()) else result = this.getInstruction(InitializerStoreTag()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = InitializerVariableAddressTag() and result = this.getInstruction(InitializerStoreTag()) @@ -406,7 +407,7 @@ abstract class TranslatedParameter extends TranslatedElement { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = InitializerVariableAddressTag() and @@ -620,7 +621,13 @@ class TranslatedConstructorInitList extends TranslatedElement, InitializationCon else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { result = this.getChild(max(int id | exists(this.getChild(id)))).getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getLastChild().getLastInstruction() + } + + override TranslatedElement getLastChild() { + result = this.getChild(max(int id | exists(this.getChild(id)))) + } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() @@ -628,9 +635,9 @@ class TranslatedConstructorInitList extends TranslatedElement, InitializationCon override Function getFunction() { result = func } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int id | child = this.getChild(id) and if exists(this.getChild(id + 1)) @@ -688,7 +695,14 @@ class TranslatedDestructorDestructionList extends TranslatedElement, then result = this.getChild(0).getFirstInstruction(kind) else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { result = this.getChild(max(int id | exists(this.getChild(id)))).getLastInstruction() } + + override Instruction getLastInstructionInternal() { + result = this.getChild(max(int id | exists(this.getChild(id)))).getLastInstruction() + } + + override TranslatedElement getLastChild() { + result = this.getChild(max(int id | exists(this.getChild(id)))) + } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() @@ -696,9 +710,9 @@ class TranslatedDestructorDestructionList extends TranslatedElement, override Function getFunction() { result = func } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int id | child = this.getChild(id) and if exists(this.getChild(id + 1)) @@ -740,7 +754,7 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { if exists(this.getAChild()) then result = @@ -748,8 +762,12 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { .getFirstInstruction(any(GotoEdge goto)) else result = this.getParent().getChildSuccessor(this, any(GotoEdge goto)) } + + override TranslatedElement getLastChild() { + result = this.getChild(max(int id | exists(this.getChild(id)))) + } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int id | child = this.getChild(id) | if exists(TranslatedReadEffect child2, int id2 | id2 > id and child2 = this.getChild(id2)) then @@ -767,7 +785,7 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } } private TranslatedThisReadEffect getTranslatedThisReadEffect(Function func) { @@ -781,9 +799,9 @@ private TranslatedParameterReadEffect getTranslatedParameterReadEffect(Parameter abstract class TranslatedReadEffect extends TranslatedElement { override TranslatedElement getChild(int id) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } @@ -793,7 +811,10 @@ abstract class TranslatedReadEffect extends TranslatedElement { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { opcode instanceof Opcode::ReturnIndirection and tag = OnlyInstructionTag() and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll index d3c6178fa3b..9c646133895 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll @@ -27,7 +27,7 @@ class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(ExitFunctionTag()) } + override Instruction getLastInstructionInternal() { result = this.getInstruction(ExitFunctionTag()) } override TranslatedElement getChild(int n) { n = 1 and @@ -60,7 +60,7 @@ class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, type = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = EnterFunctionTag() and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index b1302bd5a50..57e5c518643 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -42,7 +42,11 @@ abstract class TranslatedVariableInitialization extends TranslatedElement, Initi kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInitialization().getLastInstruction() + or + not exists(this.getInitialization()) and result = this.getInstruction(OnlyInstructionTag()) + } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = InitializerVariableAddressTag() and @@ -55,7 +59,7 @@ abstract class TranslatedVariableInitialization extends TranslatedElement, Initi resultType = getTypeForPRValue(this.getTargetType()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { ( tag = InitializerVariableAddressTag() and if this.hasUninitializedInstruction() @@ -73,7 +77,7 @@ abstract class TranslatedVariableInitialization extends TranslatedElement, Initi ) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getInitializationSuccessor(kind) } @@ -179,9 +183,11 @@ abstract class TranslatedListInitialization extends TranslatedInitialization, In result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { result = this.getInstruction(ThrowTag()) } + override Instruction getLastInstructionInternal() { + result = this.getChild(max(int i | exists(this.getChild(i)))).getLastInstruction() + } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int index | child = this.getChild(index) and if exists(this.getChild(index + 1)) @@ -194,7 +200,9 @@ abstract class TranslatedListInitialization extends TranslatedInitialization, In none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } override Instruction getTargetAddress() { result = this.getContext().getTargetAddress() } @@ -264,7 +272,9 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio not expr instanceof StringLiteral } - override Instruction getLastInstruction() { result = this.getInstruction(InitializerStoreTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(InitializerStoreTag()) + } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = InitializerStoreTag() and @@ -272,12 +282,12 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio resultType = getTypeForPRValue(this.getContext().getTargetType()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = InitializerStoreTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitializer() and result = this.getInstruction(InitializerStoreTag()) and kind instanceof GotoEdge @@ -302,7 +312,7 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio class TranslatedStringLiteralInitialization extends TranslatedDirectInitialization { override StringLiteral expr; - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { if this.zeroInitRange(_, _) then result = this.getInstruction(ZeroPadStringStoreTag()) else result = this.getInstruction(InitializerStoreTag()) @@ -349,7 +359,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and tag = InitializerLoadStringTag() and result = this.getInstruction(InitializerStoreTag()) @@ -379,7 +389,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati ) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitializer() and result = this.getInstruction(InitializerLoadStringTag()) and kind instanceof GotoEdge @@ -469,18 +479,22 @@ class TranslatedConstructorInitialization extends TranslatedDirectInitialization { override ConstructorCall expr; - override Instruction getLastInstruction() { result = this.getInitializer().getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getInitializer().getLastInstruction() + } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitializer() and result = this.getParent().getChildSuccessor(this, kind) } + override TranslatedElement getLastChild() { result = this.getInitializer() } + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { none() } @@ -572,7 +586,7 @@ class TranslatedExplicitFieldInitialization extends TranslatedFieldInitializatio this = TTranslatedExplicitFieldInitialization(ast, field, expr, position) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getInitialization().getLastInstruction() } @@ -582,17 +596,19 @@ class TranslatedExplicitFieldInitialization extends TranslatedFieldInitializatio override Type getTargetType() { result = field.getUnspecifiedType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = this.getFieldAddressTag() and result = this.getInitialization().getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getParent().getChildSuccessor(this, kind) } override TranslatedElement getChild(int id) { id = 0 and result = this.getInitialization() } + override TranslatedElement getLastChild() { result = this.getInitialization() } + private TranslatedInitialization getInitialization() { result = getTranslatedInitialization(expr) } @@ -613,7 +629,7 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, { TranslatedFieldValueInitialization() { this = TTranslatedFieldValueInitialization(ast, field) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getInstruction(this.getFieldDefaultValueStoreTag()) } @@ -629,7 +645,7 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, resultType = getTypeForPRValue(field.getUnspecifiedType()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and ( tag = this.getFieldAddressTag() and @@ -661,7 +677,7 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, ) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } override TranslatedElement getChild(int id) { none() } @@ -711,7 +727,7 @@ abstract class TranslatedElementInitialization extends TranslatedElement { resultType = getTypeForGLValue(this.getElementType()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = this.getElementIndexTag() and result = this.getInstruction(this.getElementAddressTag()) and kind instanceof GotoEdge @@ -765,8 +781,8 @@ class TranslatedExplicitElementInitialization extends TranslatedElementInitializ this = TTranslatedExplicitElementInitialization(initList, elementIndex, position) } - override Instruction getLastInstruction() { - result = this.getInstruction(this.getElementAddressTag()) + override Instruction getLastInstructionInternal() { + result = this.getInitialization().getLastInstruction() } override Instruction getTargetAddress() { @@ -775,14 +791,14 @@ class TranslatedExplicitElementInitialization extends TranslatedElementInitializ override Type getTargetType() { result = this.getElementType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedElementInitialization.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedElementInitialization.super.getInstructionSuccessorInternal(tag, kind) or tag = this.getElementAddressTag() and result = this.getInitialization().getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getParent().getChildSuccessor(this, kind) } @@ -814,7 +830,7 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati this = TTranslatedElementValueInitialization(initList, elementIndex, elementCount) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getInstruction(this.getElementDefaultValueStoreTag()) } @@ -830,8 +846,8 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati resultType = this.getDefaultValueType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { - result = TranslatedElementInitialization.super.getInstructionSuccessor(tag, kind) + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + result = TranslatedElementInitialization.super.getInstructionSuccessorInternal(tag, kind) or kind instanceof GotoEdge and ( @@ -866,7 +882,7 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati ) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } override TranslatedElement getChild(int id) { none() } @@ -906,11 +922,13 @@ abstract class TranslatedStructorCallFromStructor extends TranslatedElement, Str final override Function getFunction() { result = getEnclosingFunction(call) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getStructorCall() and result = this.getParent().getChildSuccessor(this, kind) } + override TranslatedElement getLastChild() { result = this.getStructorCall() } + final TranslatedExpr getStructorCall() { result = getTranslatedExpr(call) } } @@ -924,7 +942,9 @@ abstract class TranslatedBaseStructorCall extends TranslatedStructorCallFromStru kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getStructorCall().getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getStructorCall().getLastInstruction() + } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and @@ -932,7 +952,7 @@ abstract class TranslatedBaseStructorCall extends TranslatedStructorCallFromStru resultType = getTypeForGLValue(call.getTarget().getDeclaringType()) } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getStructorCall().getFirstInstruction(kind) } @@ -979,13 +999,17 @@ class TranslatedConstructorDelegationInit extends TranslatedConstructorCallFromC result = this.getStructorCall().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getStructorCall().getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getStructorCall().getLastInstruction() + } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } final override Instruction getReceiver() { result = getTranslatedFunction(this.getFunction()).getInitializeThisInstruction() @@ -1043,7 +1067,7 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { none() } // FIXME: does this need to be filled in? + override Instruction getLastInstructionInternal() { none() } // FIXME: does this need to be filled in? override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() @@ -1053,9 +1077,9 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr override Declaration getFunction() { result = this.getParent().getFunction() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } TranslatedConstructorBareInit getTranslatedConstructorBareInit(ConstructorInit init) { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 1d3b508d6b7..33d80bf8918 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -138,7 +138,7 @@ class TranslatedMicrosoftTryExceptHandler extends TranslatedElement, result = "1" } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { // Generate -1 -> Compare condition tag = TryExceptGenerateNegativeOne() and kind instanceof GotoEdge and @@ -202,7 +202,7 @@ class TranslatedMicrosoftTryExceptHandler extends TranslatedElement, result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { kind instanceof GotoEdge and child = this.getTranslatedCondition() and result = this.getInstruction(TryExceptGenerateNegativeOne()) @@ -211,7 +211,9 @@ class TranslatedMicrosoftTryExceptHandler extends TranslatedElement, result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { + override TranslatedElement getLastChild() { result = this.getTranslatedHandler() } + + override Instruction getLastInstructionInternal() { result = this.getTranslatedHandler().getLastInstruction() or result = this.getInstruction(UnwindTag()) @@ -246,13 +248,22 @@ abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt { final override TranslatedElement getChild(int id) { result = this.getChildInternal(id) or - exists(int maxChildId, int destructorIndex | - maxChildId = max(int childId | exists(this.getChildInternal(childId))) and + exists(int destructorIndex | result.(TranslatedExpr).getExpr() = stmt.getImplicitDestructorCall(destructorIndex) and - id = maxChildId + 1 + destructorIndex + id = this.getFirstDestructorCallIndex() + destructorIndex ) } + final override int getFirstDestructorCallIndex() { + result = max(int childId | exists(this.getChildInternal(childId))) + 1 + or + not exists(this.getChildInternal(_)) and result = 0 + } + + final override predicate hasImplicitDestructorCalls() { + exists(stmt.getAnImplicitDestructorCall()) + } + final override string toString() { result = stmt.toString() } final override Locatable getAst() { result = stmt } @@ -277,7 +288,9 @@ class TranslatedEmptyStmt extends TranslatedStmt { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and @@ -285,12 +298,12 @@ class TranslatedEmptyStmt extends TranslatedStmt { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } /** @@ -314,10 +327,12 @@ class TranslatedDeclStmt extends TranslatedStmt { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getChild(this.getChildCount() - 1).getLastInstruction() } + override TranslatedElement getLastChild() { result = this.getChild(this.getChildCount() - 1) } + private int getChildCount() { result = count(this.getDeclarationEntry(_)) } IRDeclarationEntry getIRDeclarationEntry(int index) { @@ -342,9 +357,9 @@ class TranslatedDeclStmt extends TranslatedStmt { ) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int index | child = this.getDeclarationEntry(index) and if index = (this.getChildCount() - 1) @@ -369,11 +384,13 @@ class TranslatedExprStmt extends TranslatedStmt { result = this.getExpr().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getExpr().getLastInstruction() } + override Instruction getLastInstructionInternal() { result = this.getExpr().getLastInstruction() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override TranslatedElement getLastChild() { result = this.getExpr() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getExpr() and result = this.getParent().getChildSuccessor(this, kind) } @@ -429,7 +446,9 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { result = this.getExpr().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and @@ -437,12 +456,12 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getExpr() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge @@ -467,7 +486,9 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = OnlyInstructionTag() and @@ -475,12 +496,12 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } /** @@ -569,15 +590,23 @@ class TranslatedTryStmt extends TranslatedStmt { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getBody().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getFinally().getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getLastChild().getLastInstruction() + } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override TranslatedElement getLastChild() { + if exists(this.getFinally()) + then result = this.getFinally() + else result = [this.getBody(), this.getHandler(_)] + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { // All non-finally children go to the successor of the `try` if // there is no finally block, but if there is a finally block // then we go to that one. @@ -636,24 +665,28 @@ class TranslatedBlock extends TranslatedStmt { else result = this.getStmt(0).getFirstInstruction(kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { if this.isEmpty() then result = this.getInstruction(OnlyInstructionTag()) else result = this.getStmt(this.getStmtCount() - 1).getFirstInstruction(any(GotoEdge goto)) } + override TranslatedElement getLastChild() { + not this.isEmpty() and result = this.getStmt(this.getStmtCount() - 1) + } + private predicate isEmpty() { not exists(stmt.getStmt(0)) } private TranslatedStmt getStmt(int index) { result = getTranslatedStmt(stmt.getStmt(index)) } private int getStmtCount() { result = stmt.getNumStmt() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int index | child = this.getStmt(index) and if index = (this.getStmtCount() - 1) @@ -676,9 +709,13 @@ abstract class TranslatedHandler extends TranslatedStmt { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getBlock().getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getBlock().getLastInstruction() + } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override TranslatedElement getLastChild() { result = this.getBlock() } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getBlock() and result = this.getParent().getChildSuccessor(this, kind) } @@ -710,14 +747,14 @@ class TranslatedCatchByTypeHandler extends TranslatedHandler { id = 0 and result = this.getParameter() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { - result = super.getChildSuccessor(child, kind) + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = super.getChildSuccessorInternal(child, kind) or child = this.getParameter() and result = this.getBlock().getFirstInstruction(kind) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = CatchTag() and ( kind instanceof GotoEdge and @@ -750,7 +787,7 @@ class TranslatedCatchAnyHandler extends TranslatedHandler { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = CatchTag() and result = this.getBlock().getFirstInstruction(kind) } @@ -765,10 +802,14 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { else result = this.getFirstConditionInstruction(kind) } - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getElse().getLastInstruction() or result = this.getThen().getLastInstruction() // FIXME: how do we handle the CFG merge here } + override TranslatedElement getLastChild() { + result = this.getElse() or result = this.getThen() // FIXME: how do we handle the CFG merge here + } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or @@ -799,7 +840,7 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { private predicate hasElse() { exists(stmt.getElse()) } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and @@ -813,7 +854,7 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getFirstConditionInstruction(kind) or @@ -829,10 +870,12 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { override Loop stmt; - override Instruction getLastInstruction() { + override Instruction getLastInstructionInternal() { result = this.getCondition().getLastInstruction() // FIXME: how do we handle the branch here } + override TranslatedElement getLastChild() { result = this.getCondition() } + final TranslatedCondition getCondition() { result = getTranslatedCondition(stmt.getCondition().getFullyConverted()) } @@ -857,7 +900,9 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { none() } - final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + none() + } final override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and result = this.getBody().getFirstInstruction(kind) @@ -876,7 +921,7 @@ class TranslatedWhileStmt extends TranslatedLoop { result = this.getFirstConditionInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getBody() and result = this.getFirstConditionInstruction(kind) } @@ -889,7 +934,7 @@ class TranslatedDoStmt extends TranslatedLoop { result = this.getBody().getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getBody() and result = this.getFirstConditionInstruction(kind) } @@ -924,7 +969,7 @@ class TranslatedForStmt extends TranslatedLoop { else result = this.getFirstConditionInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getFirstConditionInstruction(kind) or @@ -968,9 +1013,13 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext { result = this.getRangeVariableDeclStmt().getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getCondition().getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getCondition().getLastInstruction() + } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override TranslatedElement getLastChild() { result = this.getCondition() } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getRangeVariableDeclStmt() and result = this.getBeginEndVariableDeclStmt().getFirstInstruction(kind) or @@ -991,7 +1040,7 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and @@ -1045,7 +1094,9 @@ class TranslatedJumpStmt extends TranslatedStmt { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } override TranslatedElement getChildInternal(int id) { none() } @@ -1055,12 +1106,12 @@ class TranslatedJumpStmt extends TranslatedStmt { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = getTranslatedStmt(stmt.getTarget()).getFirstInstruction(kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } private EdgeKind getCaseEdge(SwitchCase switchCase) { @@ -1091,7 +1142,9 @@ class TranslatedSwitchStmt extends TranslatedStmt { else result = this.getFirstExprInstruction(kind) } - override Instruction getLastInstruction() { result = this.getBody().getLastInstruction() } + override Instruction getLastInstructionInternal() { result = this.getBody().getLastInstruction() } + + override TranslatedElement getLastChild() { result = this.getBody() } override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() @@ -1119,7 +1172,7 @@ class TranslatedSwitchStmt extends TranslatedStmt { result = this.getExpr().getResult() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = SwitchBranchTag() and exists(SwitchCase switchCase | switchCase = stmt.getASwitchCase() and @@ -1133,7 +1186,7 @@ class TranslatedSwitchStmt extends TranslatedStmt { result = this.getParent().getChildSuccessor(this, any(GotoEdge edge)) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getFirstExprInstruction(kind) or @@ -1160,7 +1213,7 @@ class TranslatedAsmStmt extends TranslatedStmt { ) } - override Instruction getLastInstruction() { result = this.getInstruction(AsmTag()) } + override Instruction getLastInstructionInternal() { result = this.getInstruction(AsmTag()) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = AsmTag() and @@ -1184,12 +1237,12 @@ class TranslatedAsmStmt extends TranslatedStmt { result = getUnknownType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = AsmTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { exists(int index | child = this.getChild(index) and if exists(this.getChild(index + 1)) @@ -1213,15 +1266,19 @@ class TranslatedVlaDimensionStmt extends TranslatedStmt { result = this.getChild(0).getFirstInstruction(kind) } - override Instruction getLastInstruction() { result = this.getChild(0).getLastInstruction() } + override Instruction getLastInstructionInternal() { + result = this.getChild(0).getLastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getChild(0) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getChild(0) and result = this.getParent().getChildSuccessor(this, kind) } @@ -1237,7 +1294,9 @@ class TranslatedVlaDeclarationStmt extends TranslatedStmt { kind instanceof GotoEdge } - override Instruction getLastInstruction() { result = this.getInstruction(OnlyInstructionTag()) } + override Instruction getLastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { // TODO: This needs a new kind of instruction that represents initialization of a VLA. @@ -1247,10 +1306,10 @@ class TranslatedVlaDeclarationStmt extends TranslatedStmt { resultType = getVoidType() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index adaae6b7e59..771eda49d39 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -605,7 +605,7 @@ struct String { String& operator=(String&&); const char* c_str() const; - + char pop_back(); private: const char* p; }; @@ -2112,4 +2112,39 @@ char* test_strtod(char *s) { return end; } +void TryCatchDestructors(bool b) { + try { + String s; + if (b) { + throw "string literal"; + } + String s2; + } + catch (const char* s) { + throw String(s); + } + catch (const String& e) { + } + catch (...) { + throw; + } +} + +void IfDestructors(bool b) { + String s1; + if(b) { + String s2; + } else { + String s3; + } + String s4; +} + +void ForDestructors() { + char c = 'a'; + for(String s("hello"); c != 0; c = s.pop_back()) { + String s2; + } +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index af98e5f6419..5027e28db2f 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -3526,42 +3526,66 @@ ir.cpp: # 615| void DeclareObject() # 615| Block 0 -# 615| v615_1(void) = EnterFunction : -# 615| mu615_2(unknown) = AliasedDefinition : -# 615| mu615_3(unknown) = InitializeNonLocal : -# 616| r616_1(glval) = VariableAddress[s1] : -# 616| mu616_2(String) = Uninitialized[s1] : &:r616_1 -# 616| r616_3(glval) = FunctionAddress[String] : -# 616| v616_4(void) = Call[String] : func:r616_3, this:r616_1 -# 616| mu616_5(unknown) = ^CallSideEffect : ~m? -# 616| mu616_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r616_1 -# 617| r617_1(glval) = VariableAddress[s2] : -# 617| mu617_2(String) = Uninitialized[s2] : &:r617_1 -# 617| r617_3(glval) = FunctionAddress[String] : -# 617| r617_4(glval) = StringConstant["hello"] : -# 617| r617_5(char *) = Convert : r617_4 -# 617| v617_6(void) = Call[String] : func:r617_3, this:r617_1, 0:r617_5 -# 617| mu617_7(unknown) = ^CallSideEffect : ~m? -# 617| v617_8(void) = ^BufferReadSideEffect[0] : &:r617_5, ~m? -# 617| mu617_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r617_1 -# 618| r618_1(glval) = VariableAddress[s3] : -# 618| r618_2(glval) = FunctionAddress[ReturnObject] : -# 618| r618_3(String) = Call[ReturnObject] : func:r618_2 -# 618| mu618_4(unknown) = ^CallSideEffect : ~m? -# 618| mu618_5(String) = Store[s3] : &:r618_1, r618_3 -# 619| r619_1(glval) = VariableAddress[s4] : -# 619| mu619_2(String) = Uninitialized[s4] : &:r619_1 -# 619| r619_3(glval) = FunctionAddress[String] : -# 619| r619_4(glval) = StringConstant["test"] : -# 619| r619_5(char *) = Convert : r619_4 -# 619| v619_6(void) = Call[String] : func:r619_3, this:r619_1, 0:r619_5 -# 619| mu619_7(unknown) = ^CallSideEffect : ~m? -# 619| v619_8(void) = ^BufferReadSideEffect[0] : &:r619_5, ~m? -# 619| mu619_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r619_1 -# 620| v620_1(void) = NoOp : -# 615| v615_4(void) = ReturnVoid : -# 615| v615_5(void) = AliasedUse : ~m? -# 615| v615_6(void) = ExitFunction : +# 615| v615_1(void) = EnterFunction : +# 615| mu615_2(unknown) = AliasedDefinition : +# 615| mu615_3(unknown) = InitializeNonLocal : +# 616| r616_1(glval) = VariableAddress[s1] : +# 616| mu616_2(String) = Uninitialized[s1] : &:r616_1 +# 616| r616_3(glval) = FunctionAddress[String] : +# 616| v616_4(void) = Call[String] : func:r616_3, this:r616_1 +# 616| mu616_5(unknown) = ^CallSideEffect : ~m? +# 616| mu616_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r616_1 +# 617| r617_1(glval) = VariableAddress[s2] : +# 617| mu617_2(String) = Uninitialized[s2] : &:r617_1 +# 617| r617_3(glval) = FunctionAddress[String] : +# 617| r617_4(glval) = StringConstant["hello"] : +# 617| r617_5(char *) = Convert : r617_4 +# 617| v617_6(void) = Call[String] : func:r617_3, this:r617_1, 0:r617_5 +# 617| mu617_7(unknown) = ^CallSideEffect : ~m? +# 617| v617_8(void) = ^BufferReadSideEffect[0] : &:r617_5, ~m? +# 617| mu617_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r617_1 +# 618| r618_1(glval) = VariableAddress[s3] : +# 618| r618_2(glval) = FunctionAddress[ReturnObject] : +# 618| r618_3(String) = Call[ReturnObject] : func:r618_2 +# 618| mu618_4(unknown) = ^CallSideEffect : ~m? +# 618| mu618_5(String) = Store[s3] : &:r618_1, r618_3 +# 619| r619_1(glval) = VariableAddress[s4] : +# 619| mu619_2(String) = Uninitialized[s4] : &:r619_1 +# 619| r619_3(glval) = FunctionAddress[String] : +# 619| r619_4(glval) = StringConstant["test"] : +# 619| r619_5(char *) = Convert : r619_4 +# 619| v619_6(void) = Call[String] : func:r619_3, this:r619_1, 0:r619_5 +# 619| mu619_7(unknown) = ^CallSideEffect : ~m? +# 619| v619_8(void) = ^BufferReadSideEffect[0] : &:r619_5, ~m? +# 619| mu619_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r619_1 +# 620| v620_1(void) = NoOp : +# 620| r620_2(glval) = VariableAddress[s4] : +# 620| r620_3(glval) = FunctionAddress[~String] : +# 620| v620_4(void) = Call[~String] : func:r620_3, this:r620_2 +# 620| mu620_5(unknown) = ^CallSideEffect : ~m? +# 620| v620_6(void) = ^IndirectReadSideEffect[-1] : &:r620_2, ~m? +# 620| mu620_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_2 +# 620| r620_8(glval) = VariableAddress[s3] : +# 620| r620_9(glval) = FunctionAddress[~String] : +# 620| v620_10(void) = Call[~String] : func:r620_9, this:r620_8 +# 620| mu620_11(unknown) = ^CallSideEffect : ~m? +# 620| v620_12(void) = ^IndirectReadSideEffect[-1] : &:r620_8, ~m? +# 620| mu620_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_8 +# 620| r620_14(glval) = VariableAddress[s2] : +# 620| r620_15(glval) = FunctionAddress[~String] : +# 620| v620_16(void) = Call[~String] : func:r620_15, this:r620_14 +# 620| mu620_17(unknown) = ^CallSideEffect : ~m? +# 620| v620_18(void) = ^IndirectReadSideEffect[-1] : &:r620_14, ~m? +# 620| mu620_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_14 +# 620| r620_20(glval) = VariableAddress[s1] : +# 620| r620_21(glval) = FunctionAddress[~String] : +# 620| v620_22(void) = Call[~String] : func:r620_21, this:r620_20 +# 620| mu620_23(unknown) = ^CallSideEffect : ~m? +# 620| v620_24(void) = ^IndirectReadSideEffect[-1] : &:r620_20, ~m? +# 620| mu620_25(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_20 +# 615| v615_4(void) = ReturnVoid : +# 615| v615_5(void) = AliasedUse : ~m? +# 615| v615_6(void) = ExitFunction : # 622| void CallMethods(String&, String*, String) # 622| Block 0 @@ -4924,6 +4948,24 @@ ir.cpp: # 839| r839_4(glval) = VariableAddress[pb] : # 839| mu839_5(Base *) = Store[pb] : &:r839_4, r839_3 # 840| v840_1(void) = NoOp : +# 840| r840_2(glval) = VariableAddress[d] : +# 840| r840_3(glval) = FunctionAddress[~Derived] : +# 840| v840_4(void) = Call[~Derived] : func:r840_3, this:r840_2 +# 840| mu840_5(unknown) = ^CallSideEffect : ~m? +# 840| v840_6(void) = ^IndirectReadSideEffect[-1] : &:r840_2, ~m? +# 840| mu840_7(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r840_2 +# 840| r840_8(glval) = VariableAddress[m] : +# 840| r840_9(glval) = FunctionAddress[~Middle] : +# 840| v840_10(void) = Call[~Middle] : func:r840_9, this:r840_8 +# 840| mu840_11(unknown) = ^CallSideEffect : ~m? +# 840| v840_12(void) = ^IndirectReadSideEffect[-1] : &:r840_8, ~m? +# 840| mu840_13(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r840_8 +# 840| r840_14(glval) = VariableAddress[b] : +# 840| r840_15(glval) = FunctionAddress[~Base] : +# 840| v840_16(void) = Call[~Base] : func:r840_15, this:r840_14 +# 840| mu840_17(unknown) = ^CallSideEffect : ~m? +# 840| v840_18(void) = ^IndirectReadSideEffect[-1] : &:r840_14, ~m? +# 840| mu840_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r840_14 # 799| v799_4(void) = ReturnVoid : # 799| v799_5(void) = AliasedUse : ~m? # 799| v799_6(void) = ExitFunction : @@ -4984,63 +5026,75 @@ ir.cpp: # 849| void DynamicCast() # 849| Block 0 -# 849| v849_1(void) = EnterFunction : -# 849| mu849_2(unknown) = AliasedDefinition : -# 849| mu849_3(unknown) = InitializeNonLocal : -# 850| r850_1(glval) = VariableAddress[b] : -# 850| mu850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 -# 850| r850_3(glval) = FunctionAddress[PolymorphicBase] : -# 850| v850_4(void) = Call[PolymorphicBase] : func:r850_3, this:r850_1 -# 850| mu850_5(unknown) = ^CallSideEffect : ~m? -# 850| mu850_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 -# 851| r851_1(glval) = VariableAddress[d] : -# 851| mu851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 -# 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : -# 851| v851_4(void) = Call[PolymorphicDerived] : func:r851_3, this:r851_1 -# 851| mu851_5(unknown) = ^CallSideEffect : ~m? -# 851| mu851_6(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 -# 853| r853_1(glval) = VariableAddress[pb] : -# 853| r853_2(glval) = VariableAddress[b] : -# 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 -# 853| mu853_4(PolymorphicBase *) = Store[pb] : &:r853_1, r853_3 -# 854| r854_1(glval) = VariableAddress[pd] : -# 854| r854_2(glval) = VariableAddress[d] : -# 854| r854_3(PolymorphicDerived *) = CopyValue : r854_2 -# 854| mu854_4(PolymorphicDerived *) = Store[pd] : &:r854_1, r854_3 -# 857| r857_1(glval) = VariableAddress[pd] : -# 857| r857_2(PolymorphicDerived *) = Load[pd] : &:r857_1, ~m? -# 857| r857_3(PolymorphicBase *) = CheckedConvertOrNull : r857_2 -# 857| r857_4(glval) = VariableAddress[pb] : -# 857| mu857_5(PolymorphicBase *) = Store[pb] : &:r857_4, r857_3 -# 858| r858_1(glval) = VariableAddress[rb] : -# 858| r858_2(glval) = VariableAddress[d] : -# 858| r858_3(glval) = CheckedConvertOrThrow : r858_2 -# 858| r858_4(PolymorphicBase &) = CopyValue : r858_3 -# 858| mu858_5(PolymorphicBase &) = Store[rb] : &:r858_1, r858_4 -# 860| r860_1(glval) = VariableAddress[pb] : -# 860| r860_2(PolymorphicBase *) = Load[pb] : &:r860_1, ~m? -# 860| r860_3(PolymorphicDerived *) = CheckedConvertOrNull : r860_2 -# 860| r860_4(glval) = VariableAddress[pd] : -# 860| mu860_5(PolymorphicDerived *) = Store[pd] : &:r860_4, r860_3 -# 861| r861_1(glval) = VariableAddress[rd] : -# 861| r861_2(glval) = VariableAddress[b] : -# 861| r861_3(glval) = CheckedConvertOrThrow : r861_2 -# 861| r861_4(PolymorphicDerived &) = CopyValue : r861_3 -# 861| mu861_5(PolymorphicDerived &) = Store[rd] : &:r861_1, r861_4 -# 863| r863_1(glval) = VariableAddress[pv] : -# 863| r863_2(glval) = VariableAddress[pb] : -# 863| r863_3(PolymorphicBase *) = Load[pb] : &:r863_2, ~m? -# 863| r863_4(void *) = CompleteObjectAddress : r863_3 -# 863| mu863_5(void *) = Store[pv] : &:r863_1, r863_4 -# 864| r864_1(glval) = VariableAddress[pcv] : -# 864| r864_2(glval) = VariableAddress[pd] : -# 864| r864_3(PolymorphicDerived *) = Load[pd] : &:r864_2, ~m? -# 864| r864_4(void *) = CompleteObjectAddress : r864_3 -# 864| mu864_5(void *) = Store[pcv] : &:r864_1, r864_4 -# 865| v865_1(void) = NoOp : -# 849| v849_4(void) = ReturnVoid : -# 849| v849_5(void) = AliasedUse : ~m? -# 849| v849_6(void) = ExitFunction : +# 849| v849_1(void) = EnterFunction : +# 849| mu849_2(unknown) = AliasedDefinition : +# 849| mu849_3(unknown) = InitializeNonLocal : +# 850| r850_1(glval) = VariableAddress[b] : +# 850| mu850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 +# 850| r850_3(glval) = FunctionAddress[PolymorphicBase] : +# 850| v850_4(void) = Call[PolymorphicBase] : func:r850_3, this:r850_1 +# 850| mu850_5(unknown) = ^CallSideEffect : ~m? +# 850| mu850_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 +# 851| r851_1(glval) = VariableAddress[d] : +# 851| mu851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 +# 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : +# 851| v851_4(void) = Call[PolymorphicDerived] : func:r851_3, this:r851_1 +# 851| mu851_5(unknown) = ^CallSideEffect : ~m? +# 851| mu851_6(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 +# 853| r853_1(glval) = VariableAddress[pb] : +# 853| r853_2(glval) = VariableAddress[b] : +# 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 +# 853| mu853_4(PolymorphicBase *) = Store[pb] : &:r853_1, r853_3 +# 854| r854_1(glval) = VariableAddress[pd] : +# 854| r854_2(glval) = VariableAddress[d] : +# 854| r854_3(PolymorphicDerived *) = CopyValue : r854_2 +# 854| mu854_4(PolymorphicDerived *) = Store[pd] : &:r854_1, r854_3 +# 857| r857_1(glval) = VariableAddress[pd] : +# 857| r857_2(PolymorphicDerived *) = Load[pd] : &:r857_1, ~m? +# 857| r857_3(PolymorphicBase *) = CheckedConvertOrNull : r857_2 +# 857| r857_4(glval) = VariableAddress[pb] : +# 857| mu857_5(PolymorphicBase *) = Store[pb] : &:r857_4, r857_3 +# 858| r858_1(glval) = VariableAddress[rb] : +# 858| r858_2(glval) = VariableAddress[d] : +# 858| r858_3(glval) = CheckedConvertOrThrow : r858_2 +# 858| r858_4(PolymorphicBase &) = CopyValue : r858_3 +# 858| mu858_5(PolymorphicBase &) = Store[rb] : &:r858_1, r858_4 +# 860| r860_1(glval) = VariableAddress[pb] : +# 860| r860_2(PolymorphicBase *) = Load[pb] : &:r860_1, ~m? +# 860| r860_3(PolymorphicDerived *) = CheckedConvertOrNull : r860_2 +# 860| r860_4(glval) = VariableAddress[pd] : +# 860| mu860_5(PolymorphicDerived *) = Store[pd] : &:r860_4, r860_3 +# 861| r861_1(glval) = VariableAddress[rd] : +# 861| r861_2(glval) = VariableAddress[b] : +# 861| r861_3(glval) = CheckedConvertOrThrow : r861_2 +# 861| r861_4(PolymorphicDerived &) = CopyValue : r861_3 +# 861| mu861_5(PolymorphicDerived &) = Store[rd] : &:r861_1, r861_4 +# 863| r863_1(glval) = VariableAddress[pv] : +# 863| r863_2(glval) = VariableAddress[pb] : +# 863| r863_3(PolymorphicBase *) = Load[pb] : &:r863_2, ~m? +# 863| r863_4(void *) = CompleteObjectAddress : r863_3 +# 863| mu863_5(void *) = Store[pv] : &:r863_1, r863_4 +# 864| r864_1(glval) = VariableAddress[pcv] : +# 864| r864_2(glval) = VariableAddress[pd] : +# 864| r864_3(PolymorphicDerived *) = Load[pd] : &:r864_2, ~m? +# 864| r864_4(void *) = CompleteObjectAddress : r864_3 +# 864| mu864_5(void *) = Store[pcv] : &:r864_1, r864_4 +# 865| v865_1(void) = NoOp : +# 865| r865_2(glval) = VariableAddress[d] : +# 865| r865_3(glval) = FunctionAddress[~PolymorphicDerived] : +# 865| v865_4(void) = Call[~PolymorphicDerived] : func:r865_3, this:r865_2 +# 865| mu865_5(unknown) = ^CallSideEffect : ~m? +# 865| v865_6(void) = ^IndirectReadSideEffect[-1] : &:r865_2, ~m? +# 865| mu865_7(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r865_2 +# 865| r865_8(glval) = VariableAddress[b] : +# 865| r865_9(glval) = FunctionAddress[~PolymorphicBase] : +# 865| v865_10(void) = Call[~PolymorphicBase] : func:r865_9, this:r865_8 +# 865| mu865_11(unknown) = ^CallSideEffect : ~m? +# 865| v865_12(void) = ^IndirectReadSideEffect[-1] : &:r865_8, ~m? +# 865| mu865_13(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r865_8 +# 849| v849_4(void) = ReturnVoid : +# 849| v849_5(void) = AliasedUse : ~m? +# 849| v849_6(void) = ExitFunction : # 867| void String::String() # 867| Block 0 @@ -5746,17 +5800,35 @@ ir.cpp: # 1015| void OperatorDelete() # 1015| Block 0 -# 1015| v1015_1(void) = EnterFunction : -# 1015| mu1015_2(unknown) = AliasedDefinition : -# 1015| mu1015_3(unknown) = InitializeNonLocal : -# 1016| r1016_1(glval) = FunctionAddress[operator delete] : -# 1016| r1016_2(int *) = Constant[0] : -# 1016| v1016_3(void) = Call[operator delete] : func:r1016_1, 0:r1016_2 -# 1016| mu1016_4(unknown) = ^CallSideEffect : ~m? -# 1017| r1017_1(glval) = FunctionAddress[operator delete] : -# 1017| r1017_2(String *) = Constant[0] : -# 1017| v1017_3(void) = Call[operator delete] : func:r1017_1, 0:r1017_2 -# 1017| mu1017_4(unknown) = ^CallSideEffect : ~m? +# 1015| v1015_1(void) = EnterFunction : +# 1015| mu1015_2(unknown) = AliasedDefinition : +# 1015| mu1015_3(unknown) = InitializeNonLocal : +# 1016| r1016_1(glval) = FunctionAddress[operator delete] : +# 1016| r1016_2(int *) = Constant[0] : +# 1016| v1016_3(void) = Call[operator delete] : func:r1016_1, 0:r1016_2 +# 1016| mu1016_4(unknown) = ^CallSideEffect : ~m? +# 1017| r1017_1(glval) = FunctionAddress[operator delete] : +# 1017| r1017_2(String *) = Constant[0] : +#-----| Goto -> Block 1 +#-----| Goto -> Block 3 + +# 1017| Block 1 +# 1017| r1017_3(glval) = FunctionAddress[~String] : +# 1017| v1017_4(void) = Call[~String] : func:r1017_3 +# 1017| mu1017_5(unknown) = ^CallSideEffect : ~m? +# 1017| v1017_6(void) = ^IndirectReadSideEffect[-1] : &:r1017_2, ~m? +# 1017| mu1017_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1017_2 + +# 1020| Block 1 +# 1020| r1020_1(glval) = FunctionAddress[~PolymorphicBase] : +# 1020| v1020_2(void) = Call[~PolymorphicBase] : func:r1020_1 +# 1020| mu1020_3(unknown) = ^CallSideEffect : ~m? +# 1020| v1020_4(void) = ^IndirectReadSideEffect[-1] : &:r1020_7, ~m? +# 1020| mu1020_5(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r1020_7 + +# 1017| Block 3 +# 1017| v1017_8(void) = Call[operator delete] : func:r1017_1, 0:r1017_2 +# 1017| mu1017_9(unknown) = ^CallSideEffect : ~m? # 1018| r1018_1(glval) = FunctionAddress[operator delete] : # 1018| r1018_2(SizedDealloc *) = Constant[0] : # 1018| v1018_3(void) = Call[operator delete] : func:r1018_1, 0:r1018_2 @@ -5765,28 +5837,50 @@ ir.cpp: # 1019| r1019_2(Overaligned *) = Constant[0] : # 1019| v1019_3(void) = Call[operator delete] : func:r1019_1, 0:r1019_2 # 1019| mu1019_4(unknown) = ^CallSideEffect : ~m? -# 1020| r1020_1(glval) = VirtualDeleteFunctionAddress : -# 1020| r1020_2(PolymorphicBase *) = Constant[0] : -# 1020| v1020_3(void) = Call[?] : func:r1020_1, 0:r1020_2 -# 1020| mu1020_4(unknown) = ^CallSideEffect : ~m? -# 1021| v1021_1(void) = NoOp : -# 1015| v1015_4(void) = ReturnVoid : -# 1015| v1015_5(void) = AliasedUse : ~m? -# 1015| v1015_6(void) = ExitFunction : +# 1020| r1020_6(glval) = VirtualDeleteFunctionAddress : +# 1020| r1020_7(PolymorphicBase *) = Constant[0] : +#-----| Goto -> Block 1 +#-----| Goto -> Block 4 + +# 1020| Block 4 +# 1020| v1020_8(void) = Call[?] : func:r1020_6, 0:r1020_7 +# 1020| mu1020_9(unknown) = ^CallSideEffect : ~m? +# 1021| v1021_1(void) = NoOp : +# 1015| v1015_4(void) = ReturnVoid : +# 1015| v1015_5(void) = AliasedUse : ~m? +# 1015| v1015_6(void) = ExitFunction : # 1024| void OperatorDeleteArray() # 1024| Block 0 -# 1024| v1024_1(void) = EnterFunction : -# 1024| mu1024_2(unknown) = AliasedDefinition : -# 1024| mu1024_3(unknown) = InitializeNonLocal : -# 1025| r1025_1(glval) = FunctionAddress[operator delete[]] : -# 1025| r1025_2(int *) = Constant[0] : -# 1025| v1025_3(void) = Call[operator delete[]] : func:r1025_1, 0:r1025_2 -# 1025| mu1025_4(unknown) = ^CallSideEffect : ~m? -# 1026| r1026_1(glval) = FunctionAddress[operator delete[]] : -# 1026| r1026_2(String *) = Constant[0] : -# 1026| v1026_3(void) = Call[operator delete[]] : func:r1026_1, 0:r1026_2 -# 1026| mu1026_4(unknown) = ^CallSideEffect : ~m? +# 1024| v1024_1(void) = EnterFunction : +# 1024| mu1024_2(unknown) = AliasedDefinition : +# 1024| mu1024_3(unknown) = InitializeNonLocal : +# 1025| r1025_1(glval) = FunctionAddress[operator delete[]] : +# 1025| r1025_2(int *) = Constant[0] : +# 1025| v1025_3(void) = Call[operator delete[]] : func:r1025_1, 0:r1025_2 +# 1025| mu1025_4(unknown) = ^CallSideEffect : ~m? +# 1026| r1026_1(glval) = FunctionAddress[operator delete[]] : +# 1026| r1026_2(String *) = Constant[0] : +#-----| Goto -> Block 1 +#-----| Goto -> Block 3 + +# 1026| Block 1 +# 1026| r1026_3(glval) = FunctionAddress[~String] : +# 1026| v1026_4(void) = Call[~String] : func:r1026_3 +# 1026| mu1026_5(unknown) = ^CallSideEffect : ~m? +# 1026| v1026_6(void) = ^IndirectReadSideEffect[-1] : &:r1026_2, ~m? +# 1026| mu1026_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1026_2 + +# 1029| Block 1 +# 1029| r1029_1(glval) = FunctionAddress[~PolymorphicBase] : +# 1029| v1029_2(void) = Call[~PolymorphicBase] : func:r1029_1 +# 1029| mu1029_3(unknown) = ^CallSideEffect : ~m? +# 1029| v1029_4(void) = ^IndirectReadSideEffect[-1] : &:r1029_7, ~m? +# 1029| mu1029_5(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r1029_7 + +# 1026| Block 3 +# 1026| v1026_8(void) = Call[operator delete[]] : func:r1026_1, 0:r1026_2 +# 1026| mu1026_9(unknown) = ^CallSideEffect : ~m? # 1027| r1027_1(glval) = FunctionAddress[operator delete[]] : # 1027| r1027_2(SizedDealloc *) = Constant[0] : # 1027| v1027_3(void) = Call[operator delete[]] : func:r1027_1, 0:r1027_2 @@ -5795,14 +5889,18 @@ ir.cpp: # 1028| r1028_2(Overaligned *) = Constant[0] : # 1028| v1028_3(void) = Call[operator delete[]] : func:r1028_1, 0:r1028_2 # 1028| mu1028_4(unknown) = ^CallSideEffect : ~m? -# 1029| r1029_1(glval) = FunctionAddress[operator delete[]] : -# 1029| r1029_2(PolymorphicBase *) = Constant[0] : -# 1029| v1029_3(void) = Call[operator delete[]] : func:r1029_1, 0:r1029_2 -# 1029| mu1029_4(unknown) = ^CallSideEffect : ~m? -# 1030| v1030_1(void) = NoOp : -# 1024| v1024_4(void) = ReturnVoid : -# 1024| v1024_5(void) = AliasedUse : ~m? -# 1024| v1024_6(void) = ExitFunction : +# 1029| r1029_6(glval) = FunctionAddress[operator delete[]] : +# 1029| r1029_7(PolymorphicBase *) = Constant[0] : +#-----| Goto -> Block 1 +#-----| Goto -> Block 4 + +# 1029| Block 4 +# 1029| v1029_8(void) = Call[operator delete[]] : func:r1029_6, 0:r1029_7 +# 1029| mu1029_9(unknown) = ^CallSideEffect : ~m? +# 1030| v1030_1(void) = NoOp : +# 1024| v1024_4(void) = ReturnVoid : +# 1024| v1024_5(void) = AliasedUse : ~m? +# 1024| v1024_6(void) = ExitFunction : # 1034| void EmptyStructInit() # 1034| Block 0 @@ -6038,6 +6136,18 @@ ir.cpp: # 1055| mu1055_6(unknown) = ^CallSideEffect : ~m? # 1055| v1055_7(void) = ^IndirectReadSideEffect[-1] : &:r1055_2, ~m? # 1056| v1056_1(void) = NoOp : +# 1056| r1056_2(glval) = VariableAddress[lambda_val_explicit] : +# 1056| r1056_3(glval) = FunctionAddress[~] : +# 1056| v1056_4(void) = Call[~] : func:r1056_3, this:r1056_2 +# 1056| mu1056_5(unknown) = ^CallSideEffect : ~m? +# 1056| v1056_6(void) = ^IndirectReadSideEffect[-1] : &:r1056_2, ~m? +# 1056| mu1056_7(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1056_2 +# 1056| r1056_8(glval) = VariableAddress[lambda_val] : +# 1056| r1056_9(glval) = FunctionAddress[~] : +# 1056| v1056_10(void) = Call[~] : func:r1056_9, this:r1056_8 +# 1056| mu1056_11(unknown) = ^CallSideEffect : ~m? +# 1056| v1056_12(void) = ^IndirectReadSideEffect[-1] : &:r1056_8, ~m? +# 1056| mu1056_13(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1056_8 # 1040| v1040_10(void) = ReturnIndirection[s] : &:r1040_8, ~m? # 1040| v1040_11(void) = ReturnVoid : # 1040| v1040_12(void) = AliasedUse : ~m? @@ -7134,11 +7244,29 @@ ir.cpp: #-----| Goto -> Block 6 # 1244| Block 6 -# 1244| v1244_1(void) = NoOp : -# 1240| v1240_8(void) = ReturnIndirection[dynamic] : &:r1240_6, ~m? -# 1240| v1240_9(void) = ReturnVoid : -# 1240| v1240_10(void) = AliasedUse : ~m? -# 1240| v1240_11(void) = ExitFunction : +# 1244| v1244_1(void) = NoOp : +# 1244| r1244_2(glval) = VariableAddress[c] : +# 1244| r1244_3(glval) = FunctionAddress[~String] : +# 1244| v1244_4(void) = Call[~String] : func:r1244_3, this:r1244_2 +# 1244| mu1244_5(unknown) = ^CallSideEffect : ~m? +# 1244| v1244_6(void) = ^IndirectReadSideEffect[-1] : &:r1244_2, ~m? +# 1244| mu1244_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1244_2 +# 1244| r1244_8(glval) = VariableAddress[b] : +# 1244| r1244_9(glval) = FunctionAddress[~String] : +# 1244| v1244_10(void) = Call[~String] : func:r1244_9, this:r1244_8 +# 1244| mu1244_11(unknown) = ^CallSideEffect : ~m? +# 1244| v1244_12(void) = ^IndirectReadSideEffect[-1] : &:r1244_8, ~m? +# 1244| mu1244_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1244_8 +# 1244| r1244_14(glval) = VariableAddress[a] : +# 1244| r1244_15(glval) = FunctionAddress[~String] : +# 1244| v1244_16(void) = Call[~String] : func:r1244_15, this:r1244_14 +# 1244| mu1244_17(unknown) = ^CallSideEffect : ~m? +# 1244| v1244_18(void) = ^IndirectReadSideEffect[-1] : &:r1244_14, ~m? +# 1244| mu1244_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r1244_14 +# 1240| v1240_8(void) = ReturnIndirection[dynamic] : &:r1240_6, ~m? +# 1240| v1240_9(void) = ReturnVoid : +# 1240| v1240_10(void) = AliasedUse : ~m? +# 1240| v1240_11(void) = ExitFunction : # 1251| void test_strings(char*, char*) # 1251| Block 0 @@ -7307,6 +7435,12 @@ ir.cpp: # 1286| v1286_5(void) = Call[static_member_without_def] : func:r1286_4 # 1286| mu1286_6(unknown) = ^CallSideEffect : ~m? # 1287| v1287_1(void) = NoOp : +# 1287| r1287_2(glval) = VariableAddress[c] : +# 1287| r1287_3(glval) = FunctionAddress[~C] : +# 1287| v1287_4(void) = Call[~C] : func:r1287_3, this:r1287_2 +# 1287| mu1287_5(unknown) = ^CallSideEffect : ~m? +# 1287| v1287_6(void) = ^IndirectReadSideEffect[-1] : &:r1287_2, ~m? +# 1287| mu1287_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1287_2 # 1270| v1270_10(void) = ReturnIndirection[a_arg] : &:r1270_8, ~m? # 1270| v1270_11(void) = ReturnVoid : # 1270| v1270_12(void) = AliasedUse : ~m? @@ -7821,6 +7955,12 @@ ir.cpp: # 1376| mu1376_4(unknown) = ^CallSideEffect : ~m? # 1376| mu1376_5(String) = Store[#temp1376:5] : &:r1376_1, r1376_3 # 1377| v1377_1(void) = NoOp : +# 1377| r1377_2(glval) = VariableAddress[s] : +# 1377| r1377_3(glval) = FunctionAddress[~String] : +# 1377| v1377_4(void) = Call[~String] : func:r1377_3, this:r1377_2 +# 1377| mu1377_5(unknown) = ^CallSideEffect : ~m? +# 1377| v1377_6(void) = ^IndirectReadSideEffect[-1] : &:r1377_2, ~m? +# 1377| mu1377_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1377_2 # 1365| v1365_4(void) = ReturnVoid : # 1365| v1365_5(void) = AliasedUse : ~m? # 1365| v1365_6(void) = ExitFunction : @@ -7885,6 +8025,18 @@ ir.cpp: # 1388| mu1388_4(unknown) = ^CallSideEffect : ~m? # 1388| mu1388_5(destructor_only) = Store[#temp1388:5] : &:r1388_1, r1388_3 # 1389| v1389_1(void) = NoOp : +# 1389| r1389_2(glval) = VariableAddress[d2] : +# 1389| r1389_3(glval) = FunctionAddress[~destructor_only] : +# 1389| v1389_4(void) = Call[~destructor_only] : func:r1389_3, this:r1389_2 +# 1389| mu1389_5(unknown) = ^CallSideEffect : ~m? +# 1389| v1389_6(void) = ^IndirectReadSideEffect[-1] : &:r1389_2, ~m? +# 1389| mu1389_7(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1389_2 +# 1389| r1389_8(glval) = VariableAddress[d] : +# 1389| r1389_9(glval) = FunctionAddress[~destructor_only] : +# 1389| v1389_10(void) = Call[~destructor_only] : func:r1389_9, this:r1389_8 +# 1389| mu1389_11(unknown) = ^CallSideEffect : ~m? +# 1389| v1389_12(void) = ^IndirectReadSideEffect[-1] : &:r1389_8, ~m? +# 1389| mu1389_13(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1389_8 # 1379| v1379_4(void) = ReturnVoid : # 1379| v1379_5(void) = AliasedUse : ~m? # 1379| v1379_6(void) = ExitFunction : @@ -10431,6 +10583,12 @@ ir.cpp: # 1925| r1925_5(glval) = VariableAddress[z] : # 1925| mu1925_6(int) = Store[z] : &:r1925_5, r1925_3 # 1926| v1926_1(void) = NoOp : +# 1926| r1926_2(glval) = VariableAddress[c] : +# 1926| r1926_3(glval) = FunctionAddress[~C] : +# 1926| v1926_4(void) = Call[~C] : func:r1926_3, this:r1926_2 +# 1926| mu1926_5(unknown) = ^CallSideEffect : ~m? +# 1926| v1926_6(void) = ^IndirectReadSideEffect[-1] : &:r1926_2, ~m? +# 1926| mu1926_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1926_2 # 1918| v1918_4(void) = ReturnVoid : # 1918| v1918_5(void) = AliasedUse : ~m? # 1918| v1918_6(void) = ExitFunction : @@ -10664,6 +10822,12 @@ ir.cpp: # 1993| r1993_3(glval<..(*)(..)>) = VariableAddress[pfn] : # 1993| mu1993_4(..(*)(..)) = Store[pfn] : &:r1993_3, r1993_2 # 1994| v1994_1(void) = NoOp : +# 1994| r1994_2(glval) = VariableAddress[c] : +# 1994| r1994_3(glval) = FunctionAddress[~C] : +# 1994| v1994_4(void) = Call[~C] : func:r1994_3, this:r1994_2 +# 1994| mu1994_5(unknown) = ^CallSideEffect : ~m? +# 1994| v1994_6(void) = ^IndirectReadSideEffect[-1] : &:r1994_2, ~m? +# 1994| mu1994_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1994_2 # 1990| v1990_4(void) = ReturnVoid : # 1990| v1990_5(void) = AliasedUse : ~m? # 1990| v1990_6(void) = ExitFunction : @@ -11369,67 +11533,100 @@ ir.cpp: # 2056| int virtual_delete() # 2056| Block 0 -# 2056| v2056_1(void) = EnterFunction : -# 2056| mu2056_2(unknown) = AliasedDefinition : -# 2056| mu2056_3(unknown) = InitializeNonLocal : -# 2058| r2058_1(glval) = VariableAddress[b1] : -# 2058| r2058_2(glval) = FunctionAddress[operator new] : -# 2058| r2058_3(unsigned long) = Constant[8] : -# 2058| r2058_4(void *) = Call[operator new] : func:r2058_2, 0:r2058_3 -# 2058| mu2058_5(unknown) = ^CallSideEffect : ~m? -# 2058| mu2058_6(unknown) = ^InitializeDynamicAllocation : &:r2058_4 -# 2058| r2058_7(Base2 *) = Convert : r2058_4 -# 2058| r2058_8(glval) = FunctionAddress[Base2] : -# 2058| v2058_9(void) = Call[Base2] : func:r2058_8, this:r2058_7 -# 2058| mu2058_10(unknown) = ^CallSideEffect : ~m? -# 2058| mu2058_11(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2058_7 -# 2058| mu2058_12(Base2 *) = Store[b1] : &:r2058_1, r2058_7 -# 2059| r2059_1(glval) = VirtualDeleteFunctionAddress : -# 2059| r2059_2(glval) = VariableAddress[b1] : -# 2059| r2059_3(Base2 *) = Load[b1] : &:r2059_2, ~m? -# 2059| v2059_4(void) = Call[?] : func:r2059_1, 0:r2059_3 -# 2059| mu2059_5(unknown) = ^CallSideEffect : ~m? -# 2061| r2061_1(glval) = VariableAddress[b2] : -# 2061| r2061_2(glval) = FunctionAddress[operator new] : -# 2061| r2061_3(unsigned long) = Constant[16] : -# 2061| r2061_4(void *) = Call[operator new] : func:r2061_2, 0:r2061_3 -# 2061| mu2061_5(unknown) = ^CallSideEffect : ~m? -# 2061| mu2061_6(unknown) = ^InitializeDynamicAllocation : &:r2061_4 -# 2061| r2061_7(Derived2 *) = Convert : r2061_4 -# 2061| r2061_8(glval) = FunctionAddress[Derived2] : -# 2061| v2061_9(void) = Call[Derived2] : func:r2061_8, this:r2061_7 -# 2061| mu2061_10(unknown) = ^CallSideEffect : ~m? -# 2061| mu2061_11(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2061_7 -# 2061| r2061_12(Base2 *) = ConvertToNonVirtualBase[Derived2 : Base2] : r2061_7 -# 2061| mu2061_13(Base2 *) = Store[b2] : &:r2061_1, r2061_12 -# 2062| r2062_1(glval) = VirtualDeleteFunctionAddress : -# 2062| r2062_2(glval) = VariableAddress[b2] : -# 2062| r2062_3(Base2 *) = Load[b2] : &:r2062_2, ~m? -# 2062| v2062_4(void) = Call[?] : func:r2062_1, 0:r2062_3 -# 2062| mu2062_5(unknown) = ^CallSideEffect : ~m? -# 2064| r2064_1(glval) = VariableAddress[d] : -# 2064| r2064_2(glval) = FunctionAddress[operator new] : -# 2064| r2064_3(unsigned long) = Constant[16] : -# 2064| r2064_4(void *) = Call[operator new] : func:r2064_2, 0:r2064_3 -# 2064| mu2064_5(unknown) = ^CallSideEffect : ~m? -# 2064| mu2064_6(unknown) = ^InitializeDynamicAllocation : &:r2064_4 -# 2064| r2064_7(Derived2 *) = Convert : r2064_4 -# 2064| r2064_8(glval) = FunctionAddress[Derived2] : -# 2064| v2064_9(void) = Call[Derived2] : func:r2064_8, this:r2064_7 -# 2064| mu2064_10(unknown) = ^CallSideEffect : ~m? -# 2064| mu2064_11(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2064_7 -# 2064| mu2064_12(Derived2 *) = Store[d] : &:r2064_1, r2064_7 -# 2065| r2065_1(glval) = VirtualDeleteFunctionAddress : -# 2065| r2065_2(glval) = VariableAddress[d] : -# 2065| r2065_3(Derived2 *) = Load[d] : &:r2065_2, ~m? -# 2065| v2065_4(void) = Call[?] : func:r2065_1, 0:r2065_3 -# 2065| mu2065_5(unknown) = ^CallSideEffect : ~m? -# 2066| r2066_1(glval) = VariableAddress[#return] : -# 2066| mu2066_2(int) = Uninitialized[#return] : &:r2066_1 -# 2056| r2056_4(glval) = VariableAddress[#return] : -# 2056| v2056_5(void) = ReturnValue : &:r2056_4, ~m? -# 2056| v2056_6(void) = AliasedUse : ~m? -# 2056| v2056_7(void) = ExitFunction : +# 2056| v2056_1(void) = EnterFunction : +# 2056| mu2056_2(unknown) = AliasedDefinition : +# 2056| mu2056_3(unknown) = InitializeNonLocal : +# 2058| r2058_1(glval) = VariableAddress[b1] : +# 2058| r2058_2(glval) = FunctionAddress[operator new] : +# 2058| r2058_3(unsigned long) = Constant[8] : +# 2058| r2058_4(void *) = Call[operator new] : func:r2058_2, 0:r2058_3 +# 2058| mu2058_5(unknown) = ^CallSideEffect : ~m? +# 2058| mu2058_6(unknown) = ^InitializeDynamicAllocation : &:r2058_4 +# 2058| r2058_7(Base2 *) = Convert : r2058_4 +# 2058| r2058_8(glval) = FunctionAddress[Base2] : +# 2058| v2058_9(void) = Call[Base2] : func:r2058_8, this:r2058_7 +# 2058| mu2058_10(unknown) = ^CallSideEffect : ~m? +# 2058| mu2058_11(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2058_7 +# 2058| mu2058_12(Base2 *) = Store[b1] : &:r2058_1, r2058_7 +# 2059| r2059_1(glval) = VirtualDeleteFunctionAddress : +# 2059| r2059_2(glval) = VariableAddress[b1] : +# 2059| r2059_3(Base2 *) = Load[b1] : &:r2059_2, ~m? +#-----| Goto -> Block 1 +#-----| Goto -> Block 4 + +# 2059| Block 1 +# 2059| r2059_4(glval) = FunctionAddress[~Base2] : +# 2059| v2059_5(void) = Call[~Base2] : func:r2059_4 +# 2059| mu2059_6(unknown) = ^CallSideEffect : ~m? +# 2059| v2059_7(void) = ^IndirectReadSideEffect[-1] : &:r2059_3, ~m? +# 2059| mu2059_8(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2059_3 + +# 2062| Block 1 +# 2062| r2062_1(glval) = FunctionAddress[~Base2] : +# 2062| v2062_2(void) = Call[~Base2] : func:r2062_1 +# 2062| mu2062_3(unknown) = ^CallSideEffect : ~m? +# 2062| v2062_4(void) = ^IndirectReadSideEffect[-1] : &:r2062_8, ~m? +# 2062| mu2062_5(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2062_8 + +# 2065| Block 1 +# 2065| r2065_1(glval) = FunctionAddress[~Derived2] : +# 2065| v2065_2(void) = Call[~Derived2] : func:r2065_1 +# 2065| mu2065_3(unknown) = ^CallSideEffect : ~m? +# 2065| v2065_4(void) = ^IndirectReadSideEffect[-1] : &:r2065_8, ~m? +# 2065| mu2065_5(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2065_8 + +# 2059| Block 4 +# 2059| v2059_9(void) = Call[?] : func:r2059_1, 0:r2059_3 +# 2059| mu2059_10(unknown) = ^CallSideEffect : ~m? +# 2061| r2061_1(glval) = VariableAddress[b2] : +# 2061| r2061_2(glval) = FunctionAddress[operator new] : +# 2061| r2061_3(unsigned long) = Constant[16] : +# 2061| r2061_4(void *) = Call[operator new] : func:r2061_2, 0:r2061_3 +# 2061| mu2061_5(unknown) = ^CallSideEffect : ~m? +# 2061| mu2061_6(unknown) = ^InitializeDynamicAllocation : &:r2061_4 +# 2061| r2061_7(Derived2 *) = Convert : r2061_4 +# 2061| r2061_8(glval) = FunctionAddress[Derived2] : +# 2061| v2061_9(void) = Call[Derived2] : func:r2061_8, this:r2061_7 +# 2061| mu2061_10(unknown) = ^CallSideEffect : ~m? +# 2061| mu2061_11(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2061_7 +# 2061| r2061_12(Base2 *) = ConvertToNonVirtualBase[Derived2 : Base2] : r2061_7 +# 2061| mu2061_13(Base2 *) = Store[b2] : &:r2061_1, r2061_12 +# 2062| r2062_6(glval) = VirtualDeleteFunctionAddress : +# 2062| r2062_7(glval) = VariableAddress[b2] : +# 2062| r2062_8(Base2 *) = Load[b2] : &:r2062_7, ~m? +#-----| Goto -> Block 1 +#-----| Goto -> Block 5 + +# 2062| Block 5 +# 2062| v2062_9(void) = Call[?] : func:r2062_6, 0:r2062_8 +# 2062| mu2062_10(unknown) = ^CallSideEffect : ~m? +# 2064| r2064_1(glval) = VariableAddress[d] : +# 2064| r2064_2(glval) = FunctionAddress[operator new] : +# 2064| r2064_3(unsigned long) = Constant[16] : +# 2064| r2064_4(void *) = Call[operator new] : func:r2064_2, 0:r2064_3 +# 2064| mu2064_5(unknown) = ^CallSideEffect : ~m? +# 2064| mu2064_6(unknown) = ^InitializeDynamicAllocation : &:r2064_4 +# 2064| r2064_7(Derived2 *) = Convert : r2064_4 +# 2064| r2064_8(glval) = FunctionAddress[Derived2] : +# 2064| v2064_9(void) = Call[Derived2] : func:r2064_8, this:r2064_7 +# 2064| mu2064_10(unknown) = ^CallSideEffect : ~m? +# 2064| mu2064_11(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2064_7 +# 2064| mu2064_12(Derived2 *) = Store[d] : &:r2064_1, r2064_7 +# 2065| r2065_6(glval) = VirtualDeleteFunctionAddress : +# 2065| r2065_7(glval) = VariableAddress[d] : +# 2065| r2065_8(Derived2 *) = Load[d] : &:r2065_7, ~m? +#-----| Goto -> Block 1 +#-----| Goto -> Block 6 + +# 2065| Block 6 +# 2065| v2065_9(void) = Call[?] : func:r2065_6, 0:r2065_8 +# 2065| mu2065_10(unknown) = ^CallSideEffect : ~m? +# 2066| r2066_1(glval) = VariableAddress[#return] : +# 2066| mu2066_2(int) = Uninitialized[#return] : &:r2066_1 +# 2056| r2056_4(glval) = VariableAddress[#return] : +# 2056| v2056_5(void) = ReturnValue : &:r2056_4, ~m? +# 2056| v2056_6(void) = AliasedUse : ~m? +# 2056| v2056_7(void) = ExitFunction : # 2070| void test_constant_folding() # 2070| Block 0 @@ -11647,6 +11844,256 @@ ir.cpp: # 2109| v2109_11(void) = AliasedUse : ~m? # 2109| v2109_12(void) = ExitFunction : +# 2115| void TryCatchDestructors(bool) +# 2115| Block 0 +# 2115| v2115_1(void) = EnterFunction : +# 2115| mu2115_2(unknown) = AliasedDefinition : +# 2115| mu2115_3(unknown) = InitializeNonLocal : +# 2115| r2115_4(glval) = VariableAddress[b] : +# 2115| mu2115_5(bool) = InitializeParameter[b] : &:r2115_4 +# 2117| r2117_1(glval) = VariableAddress[s] : +# 2117| mu2117_2(String) = Uninitialized[s] : &:r2117_1 +# 2117| r2117_3(glval) = FunctionAddress[String] : +# 2117| v2117_4(void) = Call[String] : func:r2117_3, this:r2117_1 +# 2117| mu2117_5(unknown) = ^CallSideEffect : ~m? +# 2117| mu2117_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2117_1 +# 2118| r2118_1(glval) = VariableAddress[b] : +# 2118| r2118_2(bool) = Load[b] : &:r2118_1, ~m? +# 2118| v2118_3(void) = ConditionalBranch : r2118_2 +#-----| False -> Block 5 +#-----| True -> Block 3 + +# 2115| Block 1 +# 2115| v2115_6(void) = AliasedUse : ~m? +# 2115| v2115_7(void) = ExitFunction : + +# 2115| Block 2 +# 2115| v2115_8(void) = Unwind : +#-----| Goto -> Block 1 + +# 2119| Block 3 +# 2119| r2119_1(glval) = VariableAddress[#throw2119:7] : +# 2119| r2119_2(glval) = StringConstant["string literal"] : +# 2119| r2119_3(char *) = Convert : r2119_2 +# 2119| mu2119_4(char *) = Store[#throw2119:7] : &:r2119_1, r2119_3 +# 2119| v2119_5(void) = ThrowValue : &:r2119_1, ~m? +#-----| Exception -> Block 6 + +# 2122| Block 4 +# 2122| r2122_1(glval) = VariableAddress[s] : +# 2122| r2122_2(glval) = FunctionAddress[~String] : +# 2122| v2122_3(void) = Call[~String] : func:r2122_2, this:r2122_1 +# 2122| mu2122_4(unknown) = ^CallSideEffect : ~m? +# 2122| v2122_5(void) = ^IndirectReadSideEffect[-1] : &:r2122_1, ~m? +# 2122| mu2122_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2122_1 +#-----| Goto -> Block 5 + +# 2121| Block 5 +# 2121| r2121_1(glval) = VariableAddress[s2] : +# 2121| mu2121_2(String) = Uninitialized[s2] : &:r2121_1 +# 2121| r2121_3(glval) = FunctionAddress[String] : +# 2121| v2121_4(void) = Call[String] : func:r2121_3, this:r2121_1 +# 2121| mu2121_5(unknown) = ^CallSideEffect : ~m? +# 2121| mu2121_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2121_1 +# 2122| r2122_7(glval) = VariableAddress[s2] : +# 2122| r2122_8(glval) = FunctionAddress[~String] : +# 2122| v2122_9(void) = Call[~String] : func:r2122_8, this:r2122_7 +# 2122| mu2122_10(unknown) = ^CallSideEffect : ~m? +# 2122| v2122_11(void) = ^IndirectReadSideEffect[-1] : &:r2122_7, ~m? +# 2122| mu2122_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2122_7 +# 2122| r2122_13(glval) = VariableAddress[s] : +# 2122| r2122_14(glval) = FunctionAddress[~String] : +# 2122| v2122_15(void) = Call[~String] : func:r2122_14, this:r2122_13 +# 2122| mu2122_16(unknown) = ^CallSideEffect : ~m? +# 2122| v2122_17(void) = ^IndirectReadSideEffect[-1] : &:r2122_13, ~m? +# 2122| mu2122_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r2122_13 +#-----| Goto -> Block 11 + +# 2123| Block 6 +# 2123| v2123_1(void) = CatchByType[const char *] : +#-----| Exception -> Block 8 +#-----| Goto -> Block 7 + +# 2123| Block 7 +# 2123| r2123_2(glval) = VariableAddress[s] : +# 2123| mu2123_3(char *) = InitializeParameter[s] : &:r2123_2 +# 2123| r2123_4(char *) = Load[s] : &:r2123_2, ~m? +# 2123| mu2123_5(unknown) = InitializeIndirection[s] : &:r2123_4 +# 2124| r2124_1(glval) = VariableAddress[#throw2124:5] : +# 2124| mu2124_2(String) = Uninitialized[#throw2124:5] : &:r2124_1 +# 2124| r2124_3(glval) = FunctionAddress[String] : +# 2124| r2124_4(glval) = VariableAddress[s] : +# 2124| r2124_5(char *) = Load[s] : &:r2124_4, ~m? +# 2124| v2124_6(void) = Call[String] : func:r2124_3, this:r2124_1, 0:r2124_5 +# 2124| mu2124_7(unknown) = ^CallSideEffect : ~m? +# 2124| v2124_8(void) = ^BufferReadSideEffect[0] : &:r2124_5, ~m? +# 2124| mu2124_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2124_1 +# 2124| v2124_10(void) = ThrowValue : &:r2124_1, ~m? +#-----| Exception -> Block 2 + +# 2126| Block 8 +# 2126| v2126_1(void) = CatchByType[const String &] : +#-----| Exception -> Block 10 +#-----| Goto -> Block 9 + +# 2126| Block 9 +# 2126| r2126_2(glval) = VariableAddress[e] : +# 2126| mu2126_3(String &) = InitializeParameter[e] : &:r2126_2 +# 2126| r2126_4(String &) = Load[e] : &:r2126_2, ~m? +# 2126| mu2126_5(unknown) = InitializeIndirection[e] : &:r2126_4 +# 2126| v2126_6(void) = NoOp : +#-----| Goto -> Block 11 + +# 2128| Block 10 +# 2128| v2128_1(void) = CatchAny : +# 2129| v2129_1(void) = ReThrow : +#-----| Exception -> Block 2 + +# 2131| Block 11 +# 2131| v2131_1(void) = NoOp : +# 2115| v2115_9(void) = ReturnVoid : +#-----| Goto -> Block 1 + +# 2133| void IfDestructors(bool) +# 2133| Block 0 +# 2133| v2133_1(void) = EnterFunction : +# 2133| mu2133_2(unknown) = AliasedDefinition : +# 2133| mu2133_3(unknown) = InitializeNonLocal : +# 2133| r2133_4(glval) = VariableAddress[b] : +# 2133| mu2133_5(bool) = InitializeParameter[b] : &:r2133_4 +# 2134| r2134_1(glval) = VariableAddress[s1] : +# 2134| mu2134_2(String) = Uninitialized[s1] : &:r2134_1 +# 2134| r2134_3(glval) = FunctionAddress[String] : +# 2134| v2134_4(void) = Call[String] : func:r2134_3, this:r2134_1 +# 2134| mu2134_5(unknown) = ^CallSideEffect : ~m? +# 2134| mu2134_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2134_1 +# 2135| r2135_1(glval) = VariableAddress[b] : +# 2135| r2135_2(bool) = Load[b] : &:r2135_1, ~m? +# 2135| v2135_3(void) = ConditionalBranch : r2135_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2136| Block 1 +# 2136| r2136_1(glval) = VariableAddress[s2] : +# 2136| mu2136_2(String) = Uninitialized[s2] : &:r2136_1 +# 2136| r2136_3(glval) = FunctionAddress[String] : +# 2136| v2136_4(void) = Call[String] : func:r2136_3, this:r2136_1 +# 2136| mu2136_5(unknown) = ^CallSideEffect : ~m? +# 2136| mu2136_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2136_1 +# 2137| r2137_1(glval) = VariableAddress[s2] : +# 2137| r2137_2(glval) = FunctionAddress[~String] : +# 2137| v2137_3(void) = Call[~String] : func:r2137_2, this:r2137_1 +# 2137| mu2137_4(unknown) = ^CallSideEffect : ~m? +# 2137| v2137_5(void) = ^IndirectReadSideEffect[-1] : &:r2137_1, ~m? +# 2137| mu2137_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2137_1 +#-----| Goto -> Block 3 + +# 2138| Block 2 +# 2138| r2138_1(glval) = VariableAddress[s3] : +# 2138| mu2138_2(String) = Uninitialized[s3] : &:r2138_1 +# 2138| r2138_3(glval) = FunctionAddress[String] : +# 2138| v2138_4(void) = Call[String] : func:r2138_3, this:r2138_1 +# 2138| mu2138_5(unknown) = ^CallSideEffect : ~m? +# 2138| mu2138_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1 +# 2139| r2139_1(glval) = VariableAddress[s3] : +# 2139| r2139_2(glval) = FunctionAddress[~String] : +# 2139| v2139_3(void) = Call[~String] : func:r2139_2, this:r2139_1 +# 2139| mu2139_4(unknown) = ^CallSideEffect : ~m? +# 2139| v2139_5(void) = ^IndirectReadSideEffect[-1] : &:r2139_1, ~m? +# 2139| mu2139_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2139_1 +#-----| Goto -> Block 3 + +# 2140| Block 3 +# 2140| r2140_1(glval) = VariableAddress[s4] : +# 2140| mu2140_2(String) = Uninitialized[s4] : &:r2140_1 +# 2140| r2140_3(glval) = FunctionAddress[String] : +# 2140| v2140_4(void) = Call[String] : func:r2140_3, this:r2140_1 +# 2140| mu2140_5(unknown) = ^CallSideEffect : ~m? +# 2140| mu2140_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2140_1 +# 2141| v2141_1(void) = NoOp : +# 2141| r2141_2(glval) = VariableAddress[s4] : +# 2141| r2141_3(glval) = FunctionAddress[~String] : +# 2141| v2141_4(void) = Call[~String] : func:r2141_3, this:r2141_2 +# 2141| mu2141_5(unknown) = ^CallSideEffect : ~m? +# 2141| v2141_6(void) = ^IndirectReadSideEffect[-1] : &:r2141_2, ~m? +# 2141| mu2141_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2141_2 +# 2141| r2141_8(glval) = VariableAddress[s1] : +# 2141| r2141_9(glval) = FunctionAddress[~String] : +# 2141| v2141_10(void) = Call[~String] : func:r2141_9, this:r2141_8 +# 2141| mu2141_11(unknown) = ^CallSideEffect : ~m? +# 2141| v2141_12(void) = ^IndirectReadSideEffect[-1] : &:r2141_8, ~m? +# 2141| mu2141_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r2141_8 +# 2133| v2133_6(void) = ReturnVoid : +# 2133| v2133_7(void) = AliasedUse : ~m? +# 2133| v2133_8(void) = ExitFunction : + +# 2143| void ForDestructors() +# 2143| Block 0 +# 2143| v2143_1(void) = EnterFunction : +# 2143| mu2143_2(unknown) = AliasedDefinition : +# 2143| mu2143_3(unknown) = InitializeNonLocal : +# 2144| r2144_1(glval) = VariableAddress[c] : +# 2144| r2144_2(char) = Constant[97] : +# 2144| mu2144_3(char) = Store[c] : &:r2144_1, r2144_2 +# 2145| r2145_1(glval) = VariableAddress[s] : +# 2145| mu2145_2(String) = Uninitialized[s] : &:r2145_1 +# 2145| r2145_3(glval) = FunctionAddress[String] : +# 2145| r2145_4(glval) = StringConstant["hello"] : +# 2145| r2145_5(char *) = Convert : r2145_4 +# 2145| v2145_6(void) = Call[String] : func:r2145_3, this:r2145_1, 0:r2145_5 +# 2145| mu2145_7(unknown) = ^CallSideEffect : ~m? +# 2145| v2145_8(void) = ^BufferReadSideEffect[0] : &:r2145_5, ~m? +# 2145| mu2145_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2145_1 +#-----| Goto -> Block 1 + +# 2145| Block 1 +# 2145| r2145_10(glval) = VariableAddress[c] : +# 2145| r2145_11(char) = Load[c] : &:r2145_10, ~m? +# 2145| r2145_12(int) = Convert : r2145_11 +# 2145| r2145_13(int) = Constant[0] : +# 2145| r2145_14(bool) = CompareNE : r2145_12, r2145_13 +# 2145| v2145_15(void) = ConditionalBranch : r2145_14 +#-----| False -> Block 4 +#-----| True -> Block 2 + +# 2146| Block 2 +# 2146| r2146_1(glval) = VariableAddress[s2] : +# 2146| mu2146_2(String) = Uninitialized[s2] : &:r2146_1 +# 2146| r2146_3(glval) = FunctionAddress[String] : +# 2146| v2146_4(void) = Call[String] : func:r2146_3, this:r2146_1 +# 2146| mu2146_5(unknown) = ^CallSideEffect : ~m? +# 2146| mu2146_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2146_1 +# 2147| r2147_1(glval) = VariableAddress[s2] : +# 2147| r2147_2(glval) = FunctionAddress[~String] : +# 2147| v2147_3(void) = Call[~String] : func:r2147_2, this:r2147_1 +# 2147| mu2147_4(unknown) = ^CallSideEffect : ~m? +# 2147| v2147_5(void) = ^IndirectReadSideEffect[-1] : &:r2147_1, ~m? +# 2147| mu2147_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2147_1 +# 2145| r2145_16(glval) = VariableAddress[s] : +# 2145| r2145_17(glval) = FunctionAddress[pop_back] : +# 2145| r2145_18(char) = Call[pop_back] : func:r2145_17, this:r2145_16 +# 2145| mu2145_19(unknown) = ^CallSideEffect : ~m? +# 2145| v2145_20(void) = ^IndirectReadSideEffect[-1] : &:r2145_16, ~m? +# 2145| mu2145_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r2145_16 +# 2145| r2145_22(glval) = VariableAddress[c] : +# 2145| mu2145_23(char) = Store[c] : &:r2145_22, r2145_18 +#-----| Goto (back edge) -> Block 1 + +# 2145| Block 3 +# 2145| r2145_24(glval) = VariableAddress[s] : +# 2145| r2145_25(glval) = FunctionAddress[~String] : +# 2145| v2145_26(void) = Call[~String] : func:r2145_25, this:r2145_24 +# 2145| mu2145_27(unknown) = ^CallSideEffect : ~m? +# 2145| v2145_28(void) = ^IndirectReadSideEffect[-1] : &:r2145_24, ~m? +# 2145| mu2145_29(String) = ^IndirectMayWriteSideEffect[-1] : &:r2145_24 +#-----| Goto -> Block 4 + +# 2148| Block 4 +# 2148| v2148_1(void) = NoOp : +# 2143| v2143_4(void) = ReturnVoid : +# 2143| v2143_5(void) = AliasedUse : ~m? +# 2143| v2143_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 @@ -11725,6 +12172,12 @@ smart_ptr.cpp: # 12| v12_12(void) = ^BufferReadSideEffect[0] : &:r12_9, ~m? # 12| mu12_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r12_9 # 13| v13_1(void) = NoOp : +# 13| r13_2(glval>>) = VariableAddress[up] : +# 13| r13_3(glval) = FunctionAddress[~unique_ptr] : +# 13| v13_4(void) = Call[~unique_ptr] : func:r13_3, this:r13_2 +# 13| mu13_5(unknown) = ^CallSideEffect : ~m? +# 13| v13_6(void) = ^IndirectReadSideEffect[-1] : &:r13_2, ~m? +# 13| mu13_7(unique_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r13_2 # 10| v10_8(void) = ReturnIndirection[p] : &:r10_6, ~m? # 10| v10_9(void) = ReturnVoid : # 10| v10_10(void) = AliasedUse : ~m? @@ -11764,6 +12217,12 @@ smart_ptr.cpp: # 19| v19_15(void) = ^BufferReadSideEffect[0] : &:r19_12, ~m? # 19| mu19_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r19_12 # 20| v20_1(void) = NoOp : +# 20| r20_2(glval>) = VariableAddress[sp] : +# 20| r20_3(glval) = FunctionAddress[~shared_ptr] : +# 20| v20_4(void) = Call[~shared_ptr] : func:r20_3, this:r20_2 +# 20| mu20_5(unknown) = ^CallSideEffect : ~m? +# 20| v20_6(void) = ^IndirectReadSideEffect[-1] : &:r20_2, ~m? +# 20| mu20_7(shared_ptr) = ^IndirectMayWriteSideEffect[-1] : &:r20_2 # 17| v17_8(void) = ReturnIndirection[p] : &:r17_6, ~m? # 17| v17_9(void) = ReturnVoid : # 17| v17_10(void) = AliasedUse : ~m? @@ -11863,6 +12322,36 @@ smart_ptr.cpp: # 47| mu47_14(unknown) = ^CallSideEffect : ~m? # 47| v47_15(void) = ^BufferReadSideEffect[0] : &:r47_12, ~m? # 48| v48_1(void) = NoOp : +# 48| r48_2(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 48| r48_3(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_4(void) = Call[~shared_ptr] : func:r48_3, this:r48_2 +# 48| mu48_5(unknown) = ^CallSideEffect : ~m? +# 48| v48_6(void) = ^IndirectReadSideEffect[-1] : &:r48_2, ~m? +# 48| mu48_7(shared_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r48_2 +# 48| r48_8(glval>>) = VariableAddress[sp_const_sp_int] : +# 48| r48_9(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_10(void) = Call[~shared_ptr] : func:r48_9, this:r48_8 +# 48| mu48_11(unknown) = ^CallSideEffect : ~m? +# 48| v48_12(void) = ^IndirectReadSideEffect[-1] : &:r48_8, ~m? +# 48| mu48_13(shared_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r48_8 +# 48| r48_14(glval>>) = VariableAddress[sp_sp_const_int] : +# 48| r48_15(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_16(void) = Call[~shared_ptr] : func:r48_15, this:r48_14 +# 48| mu48_17(unknown) = ^CallSideEffect : ~m? +# 48| v48_18(void) = ^IndirectReadSideEffect[-1] : &:r48_14, ~m? +# 48| mu48_19(shared_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r48_14 +# 48| r48_20(glval>) = VariableAddress[sp_const_int_pointer] : +# 48| r48_21(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_22(void) = Call[~shared_ptr] : func:r48_21, this:r48_20 +# 48| mu48_23(unknown) = ^CallSideEffect : ~m? +# 48| v48_24(void) = ^IndirectReadSideEffect[-1] : &:r48_20, ~m? +# 48| mu48_25(shared_ptr) = ^IndirectMayWriteSideEffect[-1] : &:r48_20 +# 48| r48_26(glval>) = VariableAddress[sp_const_int] : +# 48| r48_27(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_28(void) = Call[~shared_ptr] : func:r48_27, this:r48_26 +# 48| mu48_29(unknown) = ^CallSideEffect : ~m? +# 48| v48_30(void) = ^IndirectReadSideEffect[-1] : &:r48_26, ~m? +# 48| mu48_31(shared_ptr) = ^IndirectMayWriteSideEffect[-1] : &:r48_26 # 28| v28_4(void) = ReturnVoid : # 28| v28_5(void) = AliasedUse : ~m? # 28| v28_6(void) = ExitFunction : From 820f4a55713ef22ccb89e90bae5a28a2f0796316 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Thu, 1 Feb 2024 20:11:34 +0000 Subject: [PATCH 006/207] C++: custom destructor handling for `for` loops --- .../raw/internal/TranslatedStmt.qll | 22 +- .../library-tests/ir/ir/PrintAST.expected | 215 ++++++++++++++++++ .../test/library-tests/ir/ir/raw_ir.expected | 13 +- 3 files changed, 241 insertions(+), 9 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 33d80bf8918..13bdf726a43 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -908,7 +908,7 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { child = this.getCondition() and result = this.getBody().getFirstInstruction(kind) } - final override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { + override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and result = this.getParent().getChildSuccessor(this, kind) } @@ -943,6 +943,15 @@ class TranslatedDoStmt extends TranslatedLoop { class TranslatedForStmt extends TranslatedLoop { override ForStmt stmt; + override predicate handlesDestructorsExplicitly() { any() } + + final override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { + child = this.getCondition() and + if this.hasImplicitDestructorCalls() + then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) + else result = this.getParent().getChildSuccessor(this, kind) + } + override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() or @@ -951,6 +960,11 @@ class TranslatedForStmt extends TranslatedLoop { id = 2 and result = this.getUpdate() or id = 3 and result = this.getBody() + or + exists(int n | + result.getAst() = stmt.getImplicitDestructorCall(n) and + id = 4 + n + ) } private TranslatedStmt getInitialization() { @@ -981,6 +995,12 @@ class TranslatedForStmt extends TranslatedLoop { ) or child = this.getUpdate() and result = this.getFirstConditionInstruction(kind) + or + exists(int lastDestructorIndex | + lastDestructorIndex = max(int n | exists(this.getChild(n)) and n >= this.getFirstDestructorCallIndex()) and + child = this.getChild(lastDestructorIndex) and + result = this.getParent().getChildSuccessor(this, kind) + ) } } diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index c14fbc66926..4ea7dfaf471 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -5553,6 +5553,8 @@ ir.cpp: # 605| Type = [RValueReferenceType] String && # 607| [ConstMemberFunction] char const* String::c_str() const # 607| : +# 608| [MemberFunction] char String::pop_back() +# 608| : # 613| [TopLevelFunction] String ReturnObject() # 613| : # 615| [TopLevelFunction] void DeclareObject() @@ -16132,6 +16134,219 @@ ir.cpp: # 2112| getExpr(): [VariableAccess] end # 2112| Type = [CharPointerType] char * # 2112| ValueCategory = prvalue(load) +# 2115| [TopLevelFunction] void TryCatchDestructors(bool) +# 2115| : +# 2115| getParameter(0): [Parameter] b +# 2115| Type = [BoolType] bool +# 2115| getEntryPoint(): [BlockStmt] { ... } +# 2116| getStmt(0): [TryStmt] try { ... } +# 2116| getStmt(): [BlockStmt] { ... } +# 2117| getStmt(0): [DeclStmt] declaration +# 2117| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2117| Type = [Struct] String +# 2117| getVariable().getInitializer(): [Initializer] initializer for s +# 2117| getExpr(): [ConstructorCall] call to String +# 2117| Type = [VoidType] void +# 2117| ValueCategory = prvalue +# 2118| getStmt(1): [IfStmt] if (...) ... +# 2118| getCondition(): [VariableAccess] b +# 2118| Type = [BoolType] bool +# 2118| ValueCategory = prvalue(load) +# 2118| getThen(): [BlockStmt] { ... } +# 2119| getStmt(0): [ExprStmt] ExprStmt +# 2119| getExpr(): [ThrowExpr] throw ... +# 2119| Type = [PointerType] const char * +# 2119| ValueCategory = prvalue +# 2119| getExpr(): string literal +# 2119| Type = [ArrayType] const char[15] +# 2119| Value = [StringLiteral] "string literal" +# 2119| ValueCategory = lvalue +# 2122| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2122| Type = [VoidType] void +# 2122| ValueCategory = prvalue +# 2122| getQualifier(): [VariableAccess] s +# 2122| Type = [Struct] String +# 2122| ValueCategory = lvalue +# 2119| getExpr().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2119| Type = [PointerType] const char * +# 2119| ValueCategory = prvalue +# 2121| getStmt(2): [DeclStmt] declaration +# 2121| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2121| Type = [Struct] String +# 2121| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2121| getExpr(): [ConstructorCall] call to String +# 2121| Type = [VoidType] void +# 2121| ValueCategory = prvalue +# 2122| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2122| Type = [VoidType] void +# 2122| ValueCategory = prvalue +# 2122| getQualifier(): [VariableAccess] s2 +# 2122| Type = [Struct] String +# 2122| ValueCategory = lvalue +# 2122| getImplicitDestructorCall(1): [DestructorCall] call to ~String +# 2122| Type = [VoidType] void +# 2122| ValueCategory = prvalue +# 2122| getQualifier(): [VariableAccess] s +# 2122| Type = [Struct] String +# 2122| ValueCategory = lvalue +# 2123| getChild(1): [Handler] +# 2123| getBlock(): [CatchBlock] { ... } +# 2124| getStmt(0): [ExprStmt] ExprStmt +# 2124| getExpr(): [ThrowExpr] throw ... +# 2124| Type = [Struct] String +# 2124| ValueCategory = prvalue +# 2124| getExpr(): [ConstructorCall] call to String +# 2124| Type = [VoidType] void +# 2124| ValueCategory = prvalue +# 2124| getArgument(0): [VariableAccess] s +# 2124| Type = [PointerType] const char * +# 2124| ValueCategory = prvalue(load) +# 2126| getChild(2): [Handler] +# 2126| getBlock(): [CatchBlock] { ... } +# 2128| getChild(3): [Handler] +# 2128| getBlock(): [CatchAnyBlock] { ... } +# 2129| getStmt(0): [ExprStmt] ExprStmt +# 2129| getExpr(): [ReThrowExpr] re-throw exception +# 2129| Type = [VoidType] void +# 2129| ValueCategory = prvalue +# 2131| getStmt(1): [ReturnStmt] return ... +# 2133| [TopLevelFunction] void IfDestructors(bool) +# 2133| : +# 2133| getParameter(0): [Parameter] b +# 2133| Type = [BoolType] bool +# 2133| getEntryPoint(): [BlockStmt] { ... } +# 2134| getStmt(0): [DeclStmt] declaration +# 2134| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1 +# 2134| Type = [Struct] String +# 2134| getVariable().getInitializer(): [Initializer] initializer for s1 +# 2134| getExpr(): [ConstructorCall] call to String +# 2134| Type = [VoidType] void +# 2134| ValueCategory = prvalue +# 2135| getStmt(1): [IfStmt] if (...) ... +# 2135| getCondition(): [VariableAccess] b +# 2135| Type = [BoolType] bool +# 2135| ValueCategory = prvalue(load) +# 2135| getThen(): [BlockStmt] { ... } +# 2136| getStmt(0): [DeclStmt] declaration +# 2136| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2136| Type = [Struct] String +# 2136| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2136| getExpr(): [ConstructorCall] call to String +# 2136| Type = [VoidType] void +# 2136| ValueCategory = prvalue +# 2137| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2137| Type = [VoidType] void +# 2137| ValueCategory = prvalue +# 2137| getQualifier(): [VariableAccess] s2 +# 2137| Type = [Struct] String +# 2137| ValueCategory = lvalue +# 2137| getElse(): [BlockStmt] { ... } +# 2138| getStmt(0): [DeclStmt] declaration +# 2138| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s3 +# 2138| Type = [Struct] String +# 2138| getVariable().getInitializer(): [Initializer] initializer for s3 +# 2138| getExpr(): [ConstructorCall] call to String +# 2138| Type = [VoidType] void +# 2138| ValueCategory = prvalue +# 2139| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2139| Type = [VoidType] void +# 2139| ValueCategory = prvalue +# 2139| getQualifier(): [VariableAccess] s3 +# 2139| Type = [Struct] String +# 2139| ValueCategory = lvalue +# 2140| getStmt(2): [DeclStmt] declaration +# 2140| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s4 +# 2140| Type = [Struct] String +# 2140| getVariable().getInitializer(): [Initializer] initializer for s4 +# 2140| getExpr(): [ConstructorCall] call to String +# 2140| Type = [VoidType] void +# 2140| ValueCategory = prvalue +# 2141| getStmt(3): [ReturnStmt] return ... +# 2141| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2141| Type = [VoidType] void +# 2141| ValueCategory = prvalue +# 2141| getQualifier(): [VariableAccess] s4 +# 2141| Type = [Struct] String +# 2141| ValueCategory = lvalue +# 2141| getImplicitDestructorCall(1): [DestructorCall] call to ~String +# 2141| Type = [VoidType] void +# 2141| ValueCategory = prvalue +# 2141| getQualifier(): [VariableAccess] s1 +# 2141| Type = [Struct] String +# 2141| ValueCategory = lvalue +# 2143| [TopLevelFunction] void ForDestructors() +# 2143| : +# 2143| getEntryPoint(): [BlockStmt] { ... } +# 2144| getStmt(0): [DeclStmt] declaration +# 2144| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c +# 2144| Type = [PlainCharType] char +# 2144| getVariable().getInitializer(): [Initializer] initializer for c +# 2144| getExpr(): [CharLiteral] 97 +# 2144| Type = [PlainCharType] char +# 2144| Value = [CharLiteral] 97 +# 2144| ValueCategory = prvalue +# 2145| getStmt(1): [ForStmt] for(...;...;...) ... +# 2145| getInitialization(): [DeclStmt] declaration +# 2145| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2145| Type = [Struct] String +# 2145| getVariable().getInitializer(): [Initializer] initializer for s +# 2145| getExpr(): [ConstructorCall] call to String +# 2145| Type = [VoidType] void +# 2145| ValueCategory = prvalue +# 2145| getArgument(0): hello +# 2145| Type = [ArrayType] const char[6] +# 2145| Value = [StringLiteral] "hello" +# 2145| ValueCategory = lvalue +# 2145| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2145| Type = [PointerType] const char * +# 2145| ValueCategory = prvalue +# 2145| getCondition(): [NEExpr] ... != ... +# 2145| Type = [BoolType] bool +# 2145| ValueCategory = prvalue +# 2145| getLeftOperand(): [VariableAccess] c +# 2145| Type = [PlainCharType] char +# 2145| ValueCategory = prvalue(load) +# 2145| getRightOperand(): [Literal] 0 +# 2145| Type = [IntType] int +# 2145| Value = [Literal] 0 +# 2145| ValueCategory = prvalue +# 2145| getLeftOperand().getFullyConverted(): [CStyleCast] (int)... +# 2145| Conversion = [IntegralConversion] integral conversion +# 2145| Type = [IntType] int +# 2145| ValueCategory = prvalue +# 2145| getUpdate(): [AssignExpr] ... = ... +# 2145| Type = [PlainCharType] char +# 2145| ValueCategory = lvalue +# 2145| getLValue(): [VariableAccess] c +# 2145| Type = [PlainCharType] char +# 2145| ValueCategory = lvalue +# 2145| getRValue(): [FunctionCall] call to pop_back +# 2145| Type = [PlainCharType] char +# 2145| ValueCategory = prvalue +# 2145| getQualifier(): [VariableAccess] s +# 2145| Type = [Struct] String +# 2145| ValueCategory = lvalue +# 2145| getStmt(): [BlockStmt] { ... } +# 2146| getStmt(0): [DeclStmt] declaration +# 2146| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2146| Type = [Struct] String +# 2146| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2146| getExpr(): [ConstructorCall] call to String +# 2146| Type = [VoidType] void +# 2146| ValueCategory = prvalue +# 2147| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2147| Type = [VoidType] void +# 2147| ValueCategory = prvalue +# 2147| getQualifier(): [VariableAccess] s2 +# 2147| Type = [Struct] String +# 2147| ValueCategory = lvalue +# 2145| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2145| Type = [VoidType] void +# 2145| ValueCategory = prvalue +# 2145| getQualifier(): [VariableAccess] s +# 2145| Type = [Struct] String +# 2145| ValueCategory = lvalue +# 2148| getStmt(2): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 5027e28db2f..dcd5217b1c8 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12053,7 +12053,7 @@ ir.cpp: # 2145| r2145_13(int) = Constant[0] : # 2145| r2145_14(bool) = CompareNE : r2145_12, r2145_13 # 2145| v2145_15(void) = ConditionalBranch : r2145_14 -#-----| False -> Block 4 +#-----| False -> Block 3 #-----| True -> Block 2 # 2146| Block 2 @@ -12086,13 +12086,10 @@ ir.cpp: # 2145| mu2145_27(unknown) = ^CallSideEffect : ~m? # 2145| v2145_28(void) = ^IndirectReadSideEffect[-1] : &:r2145_24, ~m? # 2145| mu2145_29(String) = ^IndirectMayWriteSideEffect[-1] : &:r2145_24 -#-----| Goto -> Block 4 - -# 2148| Block 4 -# 2148| v2148_1(void) = NoOp : -# 2143| v2143_4(void) = ReturnVoid : -# 2143| v2143_5(void) = AliasedUse : ~m? -# 2143| v2143_6(void) = ExitFunction : +# 2148| v2148_1(void) = NoOp : +# 2143| v2143_4(void) = ReturnVoid : +# 2143| v2143_5(void) = AliasedUse : ~m? +# 2143| v2143_6(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() From 4513fd1b5273d06de0edf64375027a449c244b6c Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Thu, 1 Feb 2024 20:47:20 +0000 Subject: [PATCH 007/207] C++: test for destructors in range-based for --- .../library-tests/ir/ir/PrintAST.expected | 84 ++++++++++++- cpp/ql/test/library-tests/ir/ir/ir.cpp | 8 +- .../test/library-tests/ir/ir/raw_ir.expected | 113 ++++++++++++++++-- 3 files changed, 191 insertions(+), 14 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 4ea7dfaf471..7846386813a 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -9384,14 +9384,30 @@ ir.cpp: # 1054| getRightOperand().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1054| Type = [IntType] int # 1054| ValueCategory = prvalue(load) +# 1059| [CopyAssignmentOperator] vector& vector::operator=(vector const&) +# 1059| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const vector & # 1059| [CopyAssignmentOperator] vector& vector::operator=(vector const&) # 1059| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const vector & -# 1059| [MoveAssignmentOperator] vector& vector::operator=(vector&&) +# 1059| [CopyConstructor] void vector::vector(vector const&) # 1059| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [RValueReferenceType] vector && +#-----| Type = [LValueReferenceType] const vector & +# 1059| [CopyConstructor] void vector::vector(vector const&) +# 1059| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const vector & +# 1060| [CopyAssignmentOperator] vector::iterator& vector::iterator::operator=(vector::iterator const public&) +# 1060| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const iterator & +# 1060| [MoveAssignmentOperator] vector::iterator& vector::iterator::operator=(vector::iterator&&) +# 1060| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] iterator && # 1060| [CopyAssignmentOperator] vector::iterator& vector::iterator::operator=(vector::iterator const public&) # 1060| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) @@ -9400,14 +9416,22 @@ ir.cpp: # 1060| : #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [RValueReferenceType] iterator && +# 1062| [MemberFunction] vector::iterator& vector::iterator::operator++() +# 1062| : # 1062| [MemberFunction] vector::iterator& vector::iterator::operator++() # 1062| : # 1062| [MemberFunction] vector::iterator& vector::iterator::operator++() # 1062| : +# 1063| [ConstMemberFunction] String& vector::iterator::operator*() const +# 1063| : # 1063| [ConstMemberFunction] T& vector::iterator::operator*() const # 1063| : # 1063| [ConstMemberFunction] int& vector::iterator::operator*() const # 1063| : +# 1065| [ConstMemberFunction] bool vector::iterator::operator!=(vector::iterator) const +# 1065| : +# 1065| getParameter(0): [Parameter] right +# 1065| Type = [NestedStruct] iterator # 1065| [ConstMemberFunction] bool vector::iterator::operator!=(vector::iterator) const # 1065| : # 1065| getParameter(0): [Parameter] right @@ -9416,10 +9440,24 @@ ir.cpp: # 1065| : # 1065| getParameter(0): [Parameter] right # 1065| Type = [NestedStruct] iterator +# 1067| [Constructor] void vector::vector(String) +# 1067| : +# 1067| getParameter(0): [Parameter] (unnamed parameter 0) +# 1067| Type = [Struct] String +# 1067| [Constructor] void vector::vector(T) +# 1067| : +# 1067| getParameter(0): [Parameter] (unnamed parameter 0) +# 1067| Type = [TemplateParameter] T +# 1067| [Destructor] void vector::~vector() +# 1067| : +# 1068| [ConstMemberFunction] vector::iterator vector::begin() const +# 1068| : # 1068| [ConstMemberFunction] vector::iterator vector::begin() const # 1068| : # 1068| [ConstMemberFunction] vector::iterator vector::begin() const # 1068| : +# 1069| [ConstMemberFunction] vector::iterator vector::end() const +# 1069| : # 1069| [ConstMemberFunction] vector::iterator vector::end() const # 1069| : # 1069| [ConstMemberFunction] vector::iterator vector::end() const @@ -16346,7 +16384,47 @@ ir.cpp: # 2145| getQualifier(): [VariableAccess] s # 2145| Type = [Struct] String # 2145| ValueCategory = lvalue -# 2148| getStmt(2): [ReturnStmt] return ... +# 2149| getStmt(2): [RangeBasedForStmt] for(...:...) ... +# 2149| getChild(0): [DeclStmt] declaration +# 2149| getBeginEndDeclaration(): [DeclStmt] declaration +# 2149| getCondition(): [FunctionCall] call to operator!= +# 2149| Type = [BoolType] bool +# 2149| ValueCategory = prvalue +# 2149| getQualifier(): [VariableAccess] (__begin) +# 2149| Type = [NestedStruct] iterator +# 2149| ValueCategory = lvalue +# 2149| getArgument(0): [VariableAccess] (__end) +# 2149| Type = [NestedStruct] iterator +# 2149| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2149| getUpdate(): [FunctionCall] call to operator++ +# 2149| Type = [LValueReferenceType] iterator & +# 2149| ValueCategory = prvalue +# 2149| getQualifier(): [VariableAccess] (__begin) +# 2149| Type = [NestedStruct] iterator +# 2149| ValueCategory = lvalue +# 2149| getChild(4): [DeclStmt] declaration +# 2149| getStmt(): [BlockStmt] { ... } +# 2150| getStmt(0): [DeclStmt] declaration +# 2150| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2150| Type = [Struct] String +# 2150| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2150| getExpr(): [ConstructorCall] call to String +# 2150| Type = [VoidType] void +# 2150| ValueCategory = prvalue +# 2151| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2151| Type = [VoidType] void +# 2151| ValueCategory = prvalue +# 2151| getQualifier(): [VariableAccess] s2 +# 2151| Type = [Struct] String +# 2151| ValueCategory = lvalue +# 2149| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2149| Type = [NestedStruct] iterator +# 2149| ValueCategory = lvalue +# 2152| getStmt(3): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 771eda49d39..8ce48fae0bf 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1064,7 +1064,7 @@ struct vector { bool operator!=(iterator right) const; }; - + vector(T); ~vector(); iterator begin() const; iterator end() const; }; @@ -2145,6 +2145,12 @@ void ForDestructors() { for(String s("hello"); c != 0; c = s.pop_back()) { String s2; } + + for(String s : vector(String("hello"))) { + String s2; + } } + + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index dcd5217b1c8..eba511797eb 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12080,16 +12080,109 @@ ir.cpp: #-----| Goto (back edge) -> Block 1 # 2145| Block 3 -# 2145| r2145_24(glval) = VariableAddress[s] : -# 2145| r2145_25(glval) = FunctionAddress[~String] : -# 2145| v2145_26(void) = Call[~String] : func:r2145_25, this:r2145_24 -# 2145| mu2145_27(unknown) = ^CallSideEffect : ~m? -# 2145| v2145_28(void) = ^IndirectReadSideEffect[-1] : &:r2145_24, ~m? -# 2145| mu2145_29(String) = ^IndirectMayWriteSideEffect[-1] : &:r2145_24 -# 2148| v2148_1(void) = NoOp : -# 2143| v2143_4(void) = ReturnVoid : -# 2143| v2143_5(void) = AliasedUse : ~m? -# 2143| v2143_6(void) = ExitFunction : +# 2145| r2145_24(glval) = VariableAddress[s] : +# 2145| r2145_25(glval) = FunctionAddress[~String] : +# 2145| v2145_26(void) = Call[~String] : func:r2145_25, this:r2145_24 +# 2145| mu2145_27(unknown) = ^CallSideEffect : ~m? +# 2145| v2145_28(void) = ^IndirectReadSideEffect[-1] : &:r2145_24, ~m? +# 2145| mu2145_29(String) = ^IndirectMayWriteSideEffect[-1] : &:r2145_24 +# 2149| r2149_1(glval &&>) = VariableAddress[(__range)] : +# 2149| r2149_2(glval>) = VariableAddress[#temp2149:20] : +# 2149| mu2149_3(vector) = Uninitialized[#temp2149:20] : &:r2149_2 +# 2149| r2149_4(glval) = FunctionAddress[vector] : +# 2149| r2149_5(glval) = VariableAddress[#temp2149:35] : +# 2149| mu2149_6(String) = Uninitialized[#temp2149:35] : &:r2149_5 +# 2149| r2149_7(glval) = FunctionAddress[String] : +# 2149| r2149_8(glval) = StringConstant["hello"] : +# 2149| r2149_9(char *) = Convert : r2149_8 +# 2149| v2149_10(void) = Call[String] : func:r2149_7, this:r2149_5, 0:r2149_9 +# 2149| mu2149_11(unknown) = ^CallSideEffect : ~m? +# 2149| v2149_12(void) = ^BufferReadSideEffect[0] : &:r2149_9, ~m? +# 2149| mu2149_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r2149_5 +# 2149| r2149_14(String) = Load[#temp2149:35] : &:r2149_5, ~m? +# 2149| v2149_15(void) = Call[vector] : func:r2149_4, this:r2149_2, 0:r2149_14 +# 2149| mu2149_16(unknown) = ^CallSideEffect : ~m? +# 2149| mu2149_17(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2149_2 +# 2149| r2149_18(vector &) = CopyValue : r2149_2 +# 2149| mu2149_19(vector &&) = Store[(__range)] : &:r2149_1, r2149_18 +# 2149| r2149_20(glval) = VariableAddress[(__begin)] : +# 2149| r2149_21(glval &&>) = VariableAddress[(__range)] : +# 2149| r2149_22(vector &&) = Load[(__range)] : &:r2149_21, ~m? +#-----| r0_1(glval>) = CopyValue : r2149_22 +#-----| r0_2(glval>) = Convert : r0_1 +# 2149| r2149_23(glval) = FunctionAddress[begin] : +# 2149| r2149_24(iterator) = Call[begin] : func:r2149_23, this:r0_2 +# 2149| mu2149_25(unknown) = ^CallSideEffect : ~m? +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m? +# 2149| mu2149_26(iterator) = Store[(__begin)] : &:r2149_20, r2149_24 +# 2149| r2149_27(glval) = VariableAddress[(__end)] : +# 2149| r2149_28(glval &&>) = VariableAddress[(__range)] : +# 2149| r2149_29(vector &&) = Load[(__range)] : &:r2149_28, ~m? +#-----| r0_4(glval>) = CopyValue : r2149_29 +#-----| r0_5(glval>) = Convert : r0_4 +# 2149| r2149_30(glval) = FunctionAddress[end] : +# 2149| r2149_31(iterator) = Call[end] : func:r2149_30, this:r0_5 +# 2149| mu2149_32(unknown) = ^CallSideEffect : ~m? +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? +# 2149| mu2149_33(iterator) = Store[(__end)] : &:r2149_27, r2149_31 +#-----| Goto -> Block 4 + +# 2149| Block 4 +# 2149| r2149_34(glval) = VariableAddress[(__begin)] : +#-----| r0_7(glval) = Convert : r2149_34 +# 2149| r2149_35(glval) = FunctionAddress[operator!=] : +# 2149| r2149_36(glval) = VariableAddress[(__end)] : +# 2149| r2149_37(iterator) = Load[(__end)] : &:r2149_36, ~m? +# 2149| r2149_38(bool) = Call[operator!=] : func:r2149_35, this:r0_7, 0:r2149_37 +# 2149| mu2149_39(unknown) = ^CallSideEffect : ~m? +#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m? +# 2149| v2149_40(void) = ConditionalBranch : r2149_38 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 2149| Block 5 +# 2149| r2149_41(glval) = VariableAddress[s] : +# 2149| mu2149_42(String) = Uninitialized[s] : &:r2149_41 +# 2149| r2149_43(glval) = FunctionAddress[String] : +# 2149| r2149_44(glval) = VariableAddress[(__begin)] : +#-----| r0_9(glval) = Convert : r2149_44 +# 2149| r2149_45(glval) = FunctionAddress[operator*] : +# 2149| r2149_46(String &) = Call[operator*] : func:r2149_45, this:r0_9 +# 2149| mu2149_47(unknown) = ^CallSideEffect : ~m? +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~m? +# 2149| r2149_48(glval) = CopyValue : r2149_46 +# 2149| r2149_49(glval) = Convert : r2149_48 +# 2149| r2149_50(String &) = CopyValue : r2149_49 +# 2149| v2149_51(void) = Call[String] : func:r2149_43, this:r2149_41, 0:r2149_50 +# 2149| mu2149_52(unknown) = ^CallSideEffect : ~m? +# 2149| v2149_53(void) = ^BufferReadSideEffect[0] : &:r2149_50, ~m? +# 2149| mu2149_54(String) = ^IndirectMayWriteSideEffect[-1] : &:r2149_41 +# 2150| r2150_1(glval) = VariableAddress[s2] : +# 2150| mu2150_2(String) = Uninitialized[s2] : &:r2150_1 +# 2150| r2150_3(glval) = FunctionAddress[String] : +# 2150| v2150_4(void) = Call[String] : func:r2150_3, this:r2150_1 +# 2150| mu2150_5(unknown) = ^CallSideEffect : ~m? +# 2150| mu2150_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2150_1 +# 2151| r2151_1(glval) = VariableAddress[s2] : +# 2151| r2151_2(glval) = FunctionAddress[~String] : +# 2151| v2151_3(void) = Call[~String] : func:r2151_2, this:r2151_1 +# 2151| mu2151_4(unknown) = ^CallSideEffect : ~m? +# 2151| v2151_5(void) = ^IndirectReadSideEffect[-1] : &:r2151_1, ~m? +# 2151| mu2151_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2151_1 +# 2149| r2149_55(glval) = VariableAddress[(__begin)] : +# 2149| r2149_56(glval) = FunctionAddress[operator++] : +# 2149| r2149_57(iterator &) = Call[operator++] : func:r2149_56, this:r2149_55 +# 2149| mu2149_58(unknown) = ^CallSideEffect : ~m? +# 2149| v2149_59(void) = ^IndirectReadSideEffect[-1] : &:r2149_55, ~m? +# 2149| mu2149_60(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2149_55 +# 2149| r2149_61(glval) = CopyValue : r2149_57 +#-----| Goto (back edge) -> Block 4 + +# 2152| Block 6 +# 2152| v2152_1(void) = NoOp : +# 2143| v2143_4(void) = ReturnVoid : +# 2143| v2143_5(void) = AliasedUse : ~m? +# 2143| v2143_6(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() From 984c7ab85a27aa2751bfcd92f58e73adafc01750 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Thu, 1 Feb 2024 20:52:55 +0000 Subject: [PATCH 008/207] C++: test for declarations in `if` statement --- .../library-tests/ir/ir/PrintAST.expected | 48 +++++++++++++++++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 8 +++- .../test/library-tests/ir/ir/raw_ir.expected | 46 ++++++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 7846386813a..540ab80addd 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -16425,6 +16425,54 @@ ir.cpp: # 2149| Type = [NestedStruct] iterator # 2149| ValueCategory = lvalue # 2152| getStmt(3): [ReturnStmt] return ... +# 2154| [TopLevelFunction] void IfDestructors2(bool) +# 2154| : +# 2154| getParameter(0): [Parameter] b +# 2154| Type = [BoolType] bool +# 2154| getEntryPoint(): [BlockStmt] { ... } +# 2155| getStmt(0): [IfStmt] if (...) ... +# 2155| getInitialization(): [DeclStmt] declaration +# 2155| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2155| Type = [Struct] String +# 2155| getVariable().getInitializer(): [Initializer] initializer for s +# 2155| getExpr(): [ConstructorCall] call to String +# 2155| Type = [VoidType] void +# 2155| ValueCategory = prvalue +# 2155| getArgument(0): hello +# 2155| Type = [ArrayType] const char[6] +# 2155| Value = [StringLiteral] "hello" +# 2155| ValueCategory = lvalue +# 2155| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2155| Type = [PointerType] const char * +# 2155| ValueCategory = prvalue +# 2155| getCondition(): [VariableAccess] b +# 2155| Type = [BoolType] bool +# 2155| ValueCategory = prvalue(load) +# 2155| getThen(): [BlockStmt] { ... } +# 2156| getStmt(0): [DeclStmt] declaration +# 2156| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 2156| Type = [IntType] int +# 2156| getVariable().getInitializer(): [Initializer] initializer for x +# 2156| getExpr(): [Literal] 0 +# 2156| Type = [IntType] int +# 2156| Value = [Literal] 0 +# 2156| ValueCategory = prvalue +# 2157| getElse(): [BlockStmt] { ... } +# 2158| getStmt(0): [DeclStmt] declaration +# 2158| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2158| Type = [IntType] int +# 2158| getVariable().getInitializer(): [Initializer] initializer for y +# 2158| getExpr(): [Literal] 0 +# 2158| Type = [IntType] int +# 2158| Value = [Literal] 0 +# 2158| ValueCategory = prvalue +# 2159| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2159| Type = [VoidType] void +# 2159| ValueCategory = prvalue +# 2159| getQualifier(): [VariableAccess] s +# 2159| Type = [Struct] String +# 2159| ValueCategory = lvalue +# 2160| getStmt(1): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 8ce48fae0bf..f4e80a06325 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2151,6 +2151,12 @@ void ForDestructors() { } } - +void IfDestructors2(bool b) { + if(String s = String("hello"); b) { + int x = 0; + } else { + int y = 0; + } +} // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index eba511797eb..3defe0f04c7 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12184,6 +12184,52 @@ ir.cpp: # 2143| v2143_5(void) = AliasedUse : ~m? # 2143| v2143_6(void) = ExitFunction : +# 2154| void IfDestructors2(bool) +# 2154| Block 0 +# 2154| v2154_1(void) = EnterFunction : +# 2154| mu2154_2(unknown) = AliasedDefinition : +# 2154| mu2154_3(unknown) = InitializeNonLocal : +# 2154| r2154_4(glval) = VariableAddress[b] : +# 2154| mu2154_5(bool) = InitializeParameter[b] : &:r2154_4 +# 2155| r2155_1(glval) = VariableAddress[s] : +# 2155| mu2155_2(String) = Uninitialized[s] : &:r2155_1 +# 2155| r2155_3(glval) = FunctionAddress[String] : +# 2155| r2155_4(glval) = StringConstant["hello"] : +# 2155| r2155_5(char *) = Convert : r2155_4 +# 2155| v2155_6(void) = Call[String] : func:r2155_3, this:r2155_1, 0:r2155_5 +# 2155| mu2155_7(unknown) = ^CallSideEffect : ~m? +# 2155| v2155_8(void) = ^BufferReadSideEffect[0] : &:r2155_5, ~m? +# 2155| mu2155_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 +# 2155| r2155_10(glval) = VariableAddress[b] : +# 2155| r2155_11(bool) = Load[b] : &:r2155_10, ~m? +# 2155| v2155_12(void) = ConditionalBranch : r2155_11 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2156| Block 1 +# 2156| r2156_1(glval) = VariableAddress[x] : +# 2156| r2156_2(int) = Constant[0] : +# 2156| mu2156_3(int) = Store[x] : &:r2156_1, r2156_2 +#-----| Goto -> Block 3 + +# 2158| Block 2 +# 2158| r2158_1(glval) = VariableAddress[y] : +# 2158| r2158_2(int) = Constant[0] : +# 2158| mu2158_3(int) = Store[y] : &:r2158_1, r2158_2 +#-----| Goto -> Block 3 + +# 2159| Block 3 +# 2159| r2159_1(glval) = VariableAddress[s] : +# 2159| r2159_2(glval) = FunctionAddress[~String] : +# 2159| v2159_3(void) = Call[~String] : func:r2159_2, this:r2159_1 +# 2159| mu2159_4(unknown) = ^CallSideEffect : ~m? +# 2159| v2159_5(void) = ^IndirectReadSideEffect[-1] : &:r2159_1, ~m? +# 2159| mu2159_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2159_1 +# 2160| v2160_1(void) = NoOp : +# 2154| v2154_6(void) = ReturnVoid : +# 2154| v2154_7(void) = AliasedUse : ~m? +# 2154| v2154_8(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 From 2d010f69c6b5b66b0cf0ad7179c5b4edf1574f44 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Thu, 1 Feb 2024 21:01:20 +0000 Subject: [PATCH 009/207] C++: Test for destructors in declaration as `if` condition --- .../library-tests/ir/ir/PrintAST.expected | 66 +++++++++++++++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 15 ++++ .../test/library-tests/ir/ir/raw_ir.expected | 72 +++++++++++++++++++ 3 files changed, 153 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 540ab80addd..20b4e045f62 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -16473,6 +16473,72 @@ ir.cpp: # 2159| Type = [Struct] String # 2159| ValueCategory = lvalue # 2160| getStmt(1): [ReturnStmt] return ... +# 2162| [CopyAssignmentOperator] Bool& Bool::operator=(Bool const&) +# 2162| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool & +# 2162| [CopyConstructor] void Bool::Bool(Bool const&) +# 2162| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool & +# 2164| [Constructor] void Bool::Bool(bool) +# 2164| : +# 2164| getParameter(0): [Parameter] b_ +# 2164| Type = [BoolType] bool +# 2165| [ConversionOperator] bool Bool::operator bool() +# 2165| : +# 2166| [Destructor] void Bool::~Bool() +# 2166| : +# 2169| [TopLevelFunction] void IfDestructors3(bool) +# 2169| : +# 2169| getParameter(0): [Parameter] b +# 2169| Type = [BoolType] bool +# 2169| getEntryPoint(): [BlockStmt] { ... } +# 2170| getStmt(0): [IfStmt] if (...) ... +# 2170| getCondition(): [ConditionDeclExpr] (condition decl) +# 2170| Type = [BoolType] bool +# 2170| ValueCategory = prvalue +# 2170| getChild(0): [FunctionCall] call to operator bool +# 2170| Type = [BoolType] bool +# 2170| ValueCategory = prvalue +# 2170| getQualifier(): [VariableAccess] B +# 2170| Type = [Class] Bool +# 2170| ValueCategory = prvalue(load) +# 2170| getThen(): [BlockStmt] { ... } +# 2171| getStmt(0): [DeclStmt] declaration +# 2171| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1 +# 2171| Type = [Struct] String +# 2171| getVariable().getInitializer(): [Initializer] initializer for s1 +# 2171| getExpr(): [ConstructorCall] call to String +# 2171| Type = [VoidType] void +# 2171| ValueCategory = prvalue +# 2172| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2172| Type = [VoidType] void +# 2172| ValueCategory = prvalue +# 2172| getQualifier(): [VariableAccess] s1 +# 2172| Type = [Struct] String +# 2172| ValueCategory = lvalue +# 2172| getElse(): [BlockStmt] { ... } +# 2173| getStmt(0): [DeclStmt] declaration +# 2173| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2173| Type = [Struct] String +# 2173| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2173| getExpr(): [ConstructorCall] call to String +# 2173| Type = [VoidType] void +# 2173| ValueCategory = prvalue +# 2174| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2174| Type = [VoidType] void +# 2174| ValueCategory = prvalue +# 2174| getQualifier(): [VariableAccess] s2 +# 2174| Type = [Struct] String +# 2174| ValueCategory = lvalue +# 2174| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool +# 2174| Type = [VoidType] void +# 2174| ValueCategory = prvalue +# 2174| getQualifier(): [VariableAccess] B +# 2174| Type = [Class] Bool +# 2174| ValueCategory = lvalue +# 2175| getStmt(1): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index f4e80a06325..92c4f8933d7 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2159,4 +2159,19 @@ void IfDestructors2(bool b) { } } +class Bool { + public: + Bool(bool b_); + operator bool(); + ~Bool(); +}; + +void IfDestructors3(bool b) { + if(Bool B = Bool(b)) { + String s1; + } else { + String s2; + } +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 3defe0f04c7..cb89388faba 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12230,6 +12230,78 @@ ir.cpp: # 2154| v2154_7(void) = AliasedUse : ~m? # 2154| v2154_8(void) = ExitFunction : +# 2169| void IfDestructors3(bool) +# 2169| Block 0 +# 2169| v2169_1(void) = EnterFunction : +# 2169| mu2169_2(unknown) = AliasedDefinition : +# 2169| mu2169_3(unknown) = InitializeNonLocal : +# 2169| r2169_4(glval) = VariableAddress[b] : +# 2169| mu2169_5(bool) = InitializeParameter[b] : &:r2169_4 +# 2170| r2170_1(glval) = VariableAddress[B] : +# 2170| mu2170_2(Bool) = Uninitialized[B] : &:r2170_1 +# 2170| r2170_3(glval) = FunctionAddress[Bool] : +# 2170| r2170_4(glval) = VariableAddress[b] : +# 2170| r2170_5(bool) = Load[b] : &:r2170_4, ~m? +# 2170| v2170_6(void) = Call[Bool] : func:r2170_3, this:r2170_1, 0:r2170_5 +# 2170| mu2170_7(unknown) = ^CallSideEffect : ~m? +# 2170| mu2170_8(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2170_1 + +# 2170| (no string representation) +# 2170| CopyValue: (condition decl) +# 2170| ConditionalBranch: (condition decl) +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2170| Block 1 +# 2170| r2170_9(glval) = VariableAddress[B] : +# 2170| r2170_10(glval) = FunctionAddress[operator bool] : +# 2170| r2170_11(bool) = Call[operator bool] : func:r2170_10, this:r2170_9 +# 2170| mu2170_12(unknown) = ^CallSideEffect : ~m? +# 2170| v2170_13(void) = ^IndirectReadSideEffect[-1] : &:r2170_9, ~m? +# 2170| mu2170_14(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2170_9 + +# 2171| Block 2 +# 2171| r2171_1(glval) = VariableAddress[s1] : +# 2171| mu2171_2(String) = Uninitialized[s1] : &:r2171_1 +# 2171| r2171_3(glval) = FunctionAddress[String] : +# 2171| v2171_4(void) = Call[String] : func:r2171_3, this:r2171_1 +# 2171| mu2171_5(unknown) = ^CallSideEffect : ~m? +# 2171| mu2171_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2171_1 +# 2172| r2172_1(glval) = VariableAddress[s1] : +# 2172| r2172_2(glval) = FunctionAddress[~String] : +# 2172| v2172_3(void) = Call[~String] : func:r2172_2, this:r2172_1 +# 2172| mu2172_4(unknown) = ^CallSideEffect : ~m? +# 2172| v2172_5(void) = ^IndirectReadSideEffect[-1] : &:r2172_1, ~m? +# 2172| mu2172_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2172_1 +#-----| Goto -> Block 4 + +# 2173| Block 3 +# 2173| r2173_1(glval) = VariableAddress[s2] : +# 2173| mu2173_2(String) = Uninitialized[s2] : &:r2173_1 +# 2173| r2173_3(glval) = FunctionAddress[String] : +# 2173| v2173_4(void) = Call[String] : func:r2173_3, this:r2173_1 +# 2173| mu2173_5(unknown) = ^CallSideEffect : ~m? +# 2173| mu2173_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2173_1 +# 2174| r2174_1(glval) = VariableAddress[s2] : +# 2174| r2174_2(glval) = FunctionAddress[~String] : +# 2174| v2174_3(void) = Call[~String] : func:r2174_2, this:r2174_1 +# 2174| mu2174_4(unknown) = ^CallSideEffect : ~m? +# 2174| v2174_5(void) = ^IndirectReadSideEffect[-1] : &:r2174_1, ~m? +# 2174| mu2174_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2174_1 +#-----| Goto -> Block 4 + +# 2174| Block 4 +# 2174| r2174_7(glval) = VariableAddress[B] : +# 2174| r2174_8(glval) = FunctionAddress[~Bool] : +# 2174| v2174_9(void) = Call[~Bool] : func:r2174_8, this:r2174_7 +# 2174| mu2174_10(unknown) = ^CallSideEffect : ~m? +# 2174| v2174_11(void) = ^IndirectReadSideEffect[-1] : &:r2174_7, ~m? +# 2174| mu2174_12(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2174_7 +# 2175| v2175_1(void) = NoOp : +# 2169| v2169_6(void) = ReturnVoid : +# 2169| v2169_7(void) = AliasedUse : ~m? +# 2169| v2169_8(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 From bbabf1dfcc6811415d3d3f2618335e2ccb22144a Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Mon, 5 Feb 2024 18:41:18 +0000 Subject: [PATCH 010/207] C++: add test for constructors in C++17 decl-in-if --- .../library-tests/ir/ir/PrintAST.expected | 66 +++++++++++++++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 16 +++++ .../test/library-tests/ir/ir/raw_ir.expected | 72 +++++++++++++++++++ 3 files changed, 154 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 20b4e045f62..ee09cbfd371 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -16539,6 +16539,72 @@ ir.cpp: # 2174| Type = [Class] Bool # 2174| ValueCategory = lvalue # 2175| getStmt(1): [ReturnStmt] return ... +# 2178| [CopyAssignmentOperator] Bool2& Bool2::operator=(Bool2 const&) +# 2178| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool2 & +# 2178| [CopyConstructor] void Bool2::Bool2(Bool2 const&) +# 2178| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool2 & +# 2180| [Constructor] void Bool2::Bool2(bool) +# 2180| : +# 2180| getParameter(0): [Parameter] b_ +# 2180| Type = [BoolType] bool +# 2181| [ConversionOperator] bool Bool2::operator bool() +# 2181| : +# 2182| [Destructor] void Bool2::~Bool2() +# 2182| : +# 2185| [TopLevelFunction] void IfInitiaiizationConstructor(bool) +# 2185| : +# 2185| getParameter(0): [Parameter] b +# 2185| Type = [BoolType] bool +# 2185| getEntryPoint(): [BlockStmt] { ... } +# 2186| getStmt(0): [IfStmt] if (...) ... +# 2186| getCondition(): [ConditionDeclExpr] (condition decl) +# 2186| Type = [BoolType] bool +# 2186| ValueCategory = prvalue +# 2186| getChild(0): [FunctionCall] call to operator bool +# 2186| Type = [BoolType] bool +# 2186| ValueCategory = prvalue +# 2186| getQualifier(): [VariableAccess] B +# 2186| Type = [Class] Bool2 +# 2186| ValueCategory = prvalue(load) +# 2186| getThen(): [BlockStmt] { ... } +# 2187| getStmt(0): [DeclStmt] declaration +# 2187| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1 +# 2187| Type = [Struct] String +# 2187| getVariable().getInitializer(): [Initializer] initializer for s1 +# 2187| getExpr(): [ConstructorCall] call to String +# 2187| Type = [VoidType] void +# 2187| ValueCategory = prvalue +# 2188| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2188| Type = [VoidType] void +# 2188| ValueCategory = prvalue +# 2188| getQualifier(): [VariableAccess] s1 +# 2188| Type = [Struct] String +# 2188| ValueCategory = lvalue +# 2188| getElse(): [BlockStmt] { ... } +# 2189| getStmt(0): [DeclStmt] declaration +# 2189| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2189| Type = [Struct] String +# 2189| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2189| getExpr(): [ConstructorCall] call to String +# 2189| Type = [VoidType] void +# 2189| ValueCategory = prvalue +# 2190| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2190| Type = [VoidType] void +# 2190| ValueCategory = prvalue +# 2190| getQualifier(): [VariableAccess] s2 +# 2190| Type = [Struct] String +# 2190| ValueCategory = lvalue +# 2190| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool2 +# 2190| Type = [VoidType] void +# 2190| ValueCategory = prvalue +# 2190| getQualifier(): [VariableAccess] B +# 2190| Type = [Class] Bool2 +# 2190| ValueCategory = lvalue +# 2191| getStmt(1): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 92c4f8933d7..040117e4d6f 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2174,4 +2174,20 @@ void IfDestructors3(bool b) { } } + +class Bool2 { + public: + Bool2(bool b_); + operator bool(); + ~Bool2(); +}; + +void IfInitiaiizationConstructor(bool b) { + if(Bool2 B = Bool2(b)) { + String s1; + } else { + String s2; + } +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index cb89388faba..b78bed0c6c6 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12302,6 +12302,78 @@ ir.cpp: # 2169| v2169_7(void) = AliasedUse : ~m? # 2169| v2169_8(void) = ExitFunction : +# 2185| void IfInitiaiizationConstructor(bool) +# 2185| Block 0 +# 2185| v2185_1(void) = EnterFunction : +# 2185| mu2185_2(unknown) = AliasedDefinition : +# 2185| mu2185_3(unknown) = InitializeNonLocal : +# 2185| r2185_4(glval) = VariableAddress[b] : +# 2185| mu2185_5(bool) = InitializeParameter[b] : &:r2185_4 +# 2186| r2186_1(glval) = VariableAddress[B] : +# 2186| mu2186_2(Bool2) = Uninitialized[B] : &:r2186_1 +# 2186| r2186_3(glval) = FunctionAddress[Bool2] : +# 2186| r2186_4(glval) = VariableAddress[b] : +# 2186| r2186_5(bool) = Load[b] : &:r2186_4, ~m? +# 2186| v2186_6(void) = Call[Bool2] : func:r2186_3, this:r2186_1, 0:r2186_5 +# 2186| mu2186_7(unknown) = ^CallSideEffect : ~m? +# 2186| mu2186_8(Bool2) = ^IndirectMayWriteSideEffect[-1] : &:r2186_1 + +# 2186| (no string representation) +# 2186| CopyValue: (condition decl) +# 2186| ConditionalBranch: (condition decl) +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2186| Block 1 +# 2186| r2186_9(glval) = VariableAddress[B] : +# 2186| r2186_10(glval) = FunctionAddress[operator bool] : +# 2186| r2186_11(bool) = Call[operator bool] : func:r2186_10, this:r2186_9 +# 2186| mu2186_12(unknown) = ^CallSideEffect : ~m? +# 2186| v2186_13(void) = ^IndirectReadSideEffect[-1] : &:r2186_9, ~m? +# 2186| mu2186_14(Bool2) = ^IndirectMayWriteSideEffect[-1] : &:r2186_9 + +# 2187| Block 2 +# 2187| r2187_1(glval) = VariableAddress[s1] : +# 2187| mu2187_2(String) = Uninitialized[s1] : &:r2187_1 +# 2187| r2187_3(glval) = FunctionAddress[String] : +# 2187| v2187_4(void) = Call[String] : func:r2187_3, this:r2187_1 +# 2187| mu2187_5(unknown) = ^CallSideEffect : ~m? +# 2187| mu2187_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2187_1 +# 2188| r2188_1(glval) = VariableAddress[s1] : +# 2188| r2188_2(glval) = FunctionAddress[~String] : +# 2188| v2188_3(void) = Call[~String] : func:r2188_2, this:r2188_1 +# 2188| mu2188_4(unknown) = ^CallSideEffect : ~m? +# 2188| v2188_5(void) = ^IndirectReadSideEffect[-1] : &:r2188_1, ~m? +# 2188| mu2188_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2188_1 +#-----| Goto -> Block 4 + +# 2189| Block 3 +# 2189| r2189_1(glval) = VariableAddress[s2] : +# 2189| mu2189_2(String) = Uninitialized[s2] : &:r2189_1 +# 2189| r2189_3(glval) = FunctionAddress[String] : +# 2189| v2189_4(void) = Call[String] : func:r2189_3, this:r2189_1 +# 2189| mu2189_5(unknown) = ^CallSideEffect : ~m? +# 2189| mu2189_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2189_1 +# 2190| r2190_1(glval) = VariableAddress[s2] : +# 2190| r2190_2(glval) = FunctionAddress[~String] : +# 2190| v2190_3(void) = Call[~String] : func:r2190_2, this:r2190_1 +# 2190| mu2190_4(unknown) = ^CallSideEffect : ~m? +# 2190| v2190_5(void) = ^IndirectReadSideEffect[-1] : &:r2190_1, ~m? +# 2190| mu2190_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2190_1 +#-----| Goto -> Block 4 + +# 2190| Block 4 +# 2190| r2190_7(glval) = VariableAddress[B] : +# 2190| r2190_8(glval) = FunctionAddress[~Bool2] : +# 2190| v2190_9(void) = Call[~Bool2] : func:r2190_8, this:r2190_7 +# 2190| mu2190_10(unknown) = ^CallSideEffect : ~m? +# 2190| v2190_11(void) = ^IndirectReadSideEffect[-1] : &:r2190_7, ~m? +# 2190| mu2190_12(Bool2) = ^IndirectMayWriteSideEffect[-1] : &:r2190_7 +# 2191| v2191_1(void) = NoOp : +# 2185| v2185_6(void) = ReturnVoid : +# 2185| v2185_7(void) = AliasedUse : ~m? +# 2185| v2185_8(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 From 8013c2a0747c04baa08a5b75a1a259f3e5c00126 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Mon, 5 Feb 2024 19:14:56 +0000 Subject: [PATCH 011/207] C++: QLDoc and naming updates for implicit destructors in IR --- .../raw/internal/TranslatedCall.qll | 11 +- .../raw/internal/TranslatedCondition.qll | 18 +-- .../internal/TranslatedDeclarationEntry.qll | 4 +- .../raw/internal/TranslatedElement.qll | 62 ++++++---- .../raw/internal/TranslatedExpr.qll | 106 ++++++++++-------- .../raw/internal/TranslatedFunction.qll | 16 +-- .../raw/internal/TranslatedGlobalVar.qll | 4 +- .../raw/internal/TranslatedInitialization.qll | 38 +++---- .../raw/internal/TranslatedStmt.qll | 54 ++++----- 9 files changed, 173 insertions(+), 140 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index dd0e86ad370..86cbc24d8ab 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -47,8 +47,8 @@ abstract class TranslatedCall extends TranslatedExpr { else result = this.getFirstCallTargetInstruction(kind) } - override Instruction getLastInstructionInternal() { - result = this.getSideEffects().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getSideEffects().getALastInstruction() } override TranslatedElement getLastChild() { result = this.getSideEffects() } @@ -94,7 +94,6 @@ abstract class TranslatedCall extends TranslatedExpr { } override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { - kind instanceof GotoEdge and tag = CallTag() and result = this.getSideEffects().getFirstInstruction(kind) } @@ -257,9 +256,9 @@ abstract class TranslatedSideEffects extends TranslatedElement { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { if exists(this.getAChild()) - then result = this.getChild(max(int i | exists(this.getChild(i)))).getLastInstruction() + then result = this.getChild(max(int i | exists(this.getChild(i)))).getALastInstruction() else // If there are no side effects, the "last" instruction should be the parent call's last // instruction, so that implicit destructors can be inserted in the right place. @@ -455,7 +454,7 @@ abstract class TranslatedSideEffect extends TranslatedElement { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll index 9d56274386d..5bc682803a0 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll @@ -58,8 +58,8 @@ abstract class TranslatedFlexibleCondition extends TranslatedCondition, Conditio result = this.getOperand().getFirstInstruction(kind) } - final override Instruction getLastInstructionInternal() { - result = this.getOperand().getLastInstruction() + final override Instruction getALastInstructionInternal() { + result = this.getOperand().getALastInstruction() } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -70,7 +70,7 @@ abstract class TranslatedFlexibleCondition extends TranslatedCondition, Conditio none() } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } abstract TranslatedCondition getOperand(); } @@ -96,7 +96,7 @@ class TranslatedParenthesisCondition extends TranslatedFlexibleCondition { abstract class TranslatedNativeCondition extends TranslatedCondition, TTranslatedNativeCondition { TranslatedNativeCondition() { this = TTranslatedNativeCondition(expr) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } } abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeCondition, ConditionContext { @@ -114,10 +114,10 @@ abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeConditio result = this.getLeftOperand().getFirstInstruction(kind) } - final override Instruction getLastInstructionInternal() { - result = this.getLeftOperand().getLastInstruction() + final override Instruction getALastInstructionInternal() { + result = this.getLeftOperand().getALastInstruction() or - result = this.getRightOperand().getLastInstruction() + result = this.getRightOperand().getALastInstruction() } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -180,7 +180,7 @@ class TranslatedValueCondition extends TranslatedCondition, TTranslatedValueCond result = this.getValueExpr().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(ValueConditionConditionalBranchTag()) } @@ -192,7 +192,7 @@ class TranslatedValueCondition extends TranslatedCondition, TTranslatedValueCond resultType = getVoidType() } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getValueExpr() and result = this.getInstruction(ValueConditionConditionalBranchTag()) and kind instanceof GotoEdge diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll index 0a2de9c749b..55b5aa179f4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll @@ -156,7 +156,7 @@ class TranslatedStaticLocalVariableDeclarationEntry extends TranslatedDeclaratio kind instanceof GotoEdge } - final override Instruction getLastInstructionInternal() { + final override Instruction getALastInstructionInternal() { result = this.getInstruction(DynamicInitializationConditionalBranchTag()) or result = this.getInstruction(DynamicInitializationFlagStoreTag()) @@ -188,7 +188,7 @@ class TranslatedStaticLocalVariableDeclarationEntry extends TranslatedDeclaratio result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getInitialization() and result = this.getInstruction(DynamicInitializationFlagConstantTag()) and kind instanceof GotoEdge diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 78e56175836..cd911392b94 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -23,15 +23,6 @@ private import SideEffects Element getRealParent(Expr expr) { result = expr.getParentWithConversions() or - /* - * exists(Stmt destructorParent, DestructorCall dc | - * destructorParent.getAnImplicitDestructorCall() = dc and - * dc.getQualifier() = expr and - * result = dc - * ) - * or - */ - result.(Destructor).getADestruction() = expr or result.(Expr).getAnImplicitDestructorCall() = expr @@ -873,12 +864,18 @@ abstract class TranslatedElement extends TTranslatedElement { /** * Holds if this element has implicit destructor calls that should follow it. */ - predicate hasImplicitDestructorCalls() { none() } + predicate hasAnImplicitDestructorCall() { none() } /** + * Gets the child index of the first destructor call that should be executed after this `TranslatedElement` */ int getFirstDestructorCallIndex() { none() } + /** + * Holds if this `TranslatedElement` includes any destructor calls that must be performed after + * it in its `getChildSuccessorInternal`, `getInstructionSuccessorInternal`, and + * `getALastInstructionInternal` relations, rather than needing them inserted. + */ predicate handlesDestructorsExplicitly() { none() } private int getUniqueId() { @@ -916,13 +913,19 @@ abstract class TranslatedElement extends TTranslatedElement { /** * Gets the successor instruction of the instruction that was generated by * this element for tag `tag`. The successor edge kind is specified by `kind`. + * This predicate does not usually include destructors, which are inserted as + * part of `getInstructionSuccessor` unless `handlesDestructorsExplicitly` + * holds. */ abstract Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind); - - Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + /** + * Gets the successor instruction of the instruction that was generated by + * this element for tag `tag`. The successor edge kind is specified by `kind`. + */ + final Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { if - this.hasImplicitDestructorCalls() and - this.getInstruction(tag) = this.getLastInstructionInternal() and + this.hasAnImplicitDestructorCall() and + this.getInstruction(tag) = this.getALastInstructionInternal() and not this.handlesDestructorsExplicitly() then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) and @@ -930,13 +933,23 @@ abstract class TranslatedElement extends TTranslatedElement { else result = this.getInstructionSuccessorInternal(tag, kind) } - final Instruction getLastInstruction() { - if this.hasImplicitDestructorCalls() and not this.handlesDestructorsExplicitly() - then result = this.getChild(max(int n | exists(this.getChild(n)))).getLastInstruction() // last destructor - else result = this.getLastInstructionInternal() + /** + * Gets an instruction within this `TranslatedElement` (including its transitive children) which + * will be followed by an instruction outside the `TranslatedElement`. + */ + final Instruction getALastInstruction() { + if this.hasAnImplicitDestructorCall() and not this.handlesDestructorsExplicitly() + then result = this.getChild(max(int n | exists(this.getChild(n)))).getALastInstruction() // last destructor + else result = this.getALastInstructionInternal() } - abstract Instruction getLastInstructionInternal(); + /** + * Gets an instruction within this `TranslatedElement` (including its transitive children) which + * will be followed by an instruction outside the `TranslatedElement`. + * This predicate does not usually include destructors, which are inserted as + * part of `getALastInstruction` unless `handlesDestructorsExplicitly` holds. + */ + abstract Instruction getALastInstructionInternal(); TranslatedElement getLastChild() { none() } @@ -944,14 +957,21 @@ abstract class TranslatedElement extends TTranslatedElement { * Gets the successor instruction to which control should flow after the * child element specified by `child` has finished execution. The successor * edge kind is specified by `kind`. + * This predicate does not usually include destructors, which are inserted as + * part of `getChildSuccessor` unless `handlesDestructorsExplicitly` holds. */ Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } - Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + /** + * Gets the successor instruction to which control should flow after the + * child element specified by `child` has finished execution. The successor + * edge kind is specified by `kind`. + */ + final Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { ( if // this is the last child and we need to handle destructors for it - this.hasImplicitDestructorCalls() and + this.hasAnImplicitDestructorCall() and not this.handlesDestructorsExplicitly() and child = this.getLastChild() then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index e5f77c4483a..adc4c77a14c 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -76,6 +76,15 @@ abstract class TranslatedExpr extends TranslatedElement { expr.isGLValueCategory() } + /** + * Gets the immediate child element of this element. The `id` is unique + * among all children of this element, but the values are not necessarily + * consecutive. + * + * This predicate does not usually include destructors, which are inserted as + * part of `getChild` unless `handlesDestructorsExplicitly` + * holds. + */ abstract TranslatedElement getChildInternal(int id); final override TranslatedElement getChild(int id) { @@ -88,14 +97,17 @@ abstract class TranslatedExpr extends TranslatedElement { ) } - final override predicate hasImplicitDestructorCalls() { + final override predicate hasAnImplicitDestructorCall() { exists(expr.getAnImplicitDestructorCall()) } final override int getFirstDestructorCallIndex() { - result = max(int childId | exists(this.getChildInternal(childId))) + 1 - or - not exists(this.getChildInternal(_)) and result = 0 + not this.handlesDestructorsExplicitly() and + ( + result = max(int childId | exists(this.getChildInternal(childId))) + 1 + or + not exists(this.getChildInternal(_)) and result = 0 + ) } final override Locatable getAst() { result = expr } @@ -207,7 +219,7 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, result = this.getCondition().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(ConditionValueResultLoadTag()) } @@ -385,7 +397,7 @@ class TranslatedLoad extends TranslatedValueCategoryAdjustment, TTranslatedLoad kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { result = this.getInstruction(LoadTag()) } + override Instruction getALastInstructionInternal() { result = this.getInstruction(LoadTag()) } override Instruction getResult() { result = this.getInstruction(LoadTag()) } @@ -433,7 +445,7 @@ class TranslatedSyntheticTemporaryObject extends TranslatedValueCategoryAdjustme result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(InitializerStoreTag()) } @@ -494,7 +506,7 @@ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(ResultCopyTag()) } @@ -524,8 +536,8 @@ class TranslatedCommaExpr extends TranslatedNonConstantExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { - result = this.getRightOperand().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getRightOperand().getALastInstruction() } override TranslatedElement getChildInternal(int id) { @@ -639,7 +651,7 @@ abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr { result = this.getLoadedOperand().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(CrementStoreTag()) } @@ -746,7 +758,7 @@ class TranslatedArrayExpr extends TranslatedNonConstantExpr { result = this.getBaseOperand().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -808,8 +820,8 @@ abstract class TranslatedTransparentExpr extends TranslatedNonConstantExpr { result = this.getOperand().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { - result = this.getOperand().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getOperand().getALastInstruction() } final override TranslatedElement getChildInternal(int id) { @@ -894,7 +906,7 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { result = this.getInstruction(ThisLoadTag()) } + override Instruction getALastInstructionInternal() { result = this.getInstruction(ThisLoadTag()) } final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and @@ -959,7 +971,7 @@ class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess { ) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -997,7 +1009,7 @@ class TranslatedFieldAccess extends TranslatedVariableAccess { result = this.getQualifier().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1039,7 +1051,7 @@ class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExp result = this.getInstruction(StructuredBindingAccessTag()) } - override Instruction getLastInstructionInternal() { result = this.getInstruction(LoadTag()) } + override Instruction getALastInstructionInternal() { result = this.getInstruction(LoadTag()) } override TranslatedElement getChildInternal(int id) { // Structured bindings cannot be qualified. @@ -1105,7 +1117,7 @@ class TranslatedFunctionAccess extends TranslatedNonConstantExpr { ) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1160,7 +1172,7 @@ abstract class TranslatedConstantExpr extends TranslatedCoreExpr, TTranslatedVal kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1243,7 +1255,7 @@ class TranslatedUnaryExpr extends TranslatedSingleInstructionExpr { result = this.getOperand().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1307,7 +1319,7 @@ abstract class TranslatedSingleInstructionConversion extends TranslatedConversio result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1408,7 +1420,7 @@ class TranslatedInheritanceConversion extends TranslatedSingleInstructionConvers class TranslatedBoolConversion extends TranslatedConversion { override BoolConversion expr; - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(BoolConversionCompareTag()) } @@ -1537,7 +1549,7 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1638,7 +1650,7 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr { result = this.getRightOperand().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(AssignmentStoreTag()) } @@ -1716,7 +1728,7 @@ class TranslatedBlockAssignExpr extends TranslatedNonConstantExpr { result = this.getLeftOperand().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(AssignmentStoreTag()) } @@ -1789,7 +1801,7 @@ class TranslatedAssignOperation extends TranslatedNonConstantExpr { result = this.getRightOperand().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(AssignmentStoreTag()) } @@ -2021,7 +2033,7 @@ class TranslatedConstantAllocationSize extends TranslatedAllocationSize { result = this.getInstruction(AllocationSizeTag()) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(AllocationSizeTag()) } @@ -2064,7 +2076,7 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize { result = this.getExtent().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(AllocationSizeTag()) } @@ -2327,7 +2339,7 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -2355,9 +2367,9 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr { override ConditionalExpr expr; - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { if this.elseIsVoid() - then result = this.getElse().getLastInstruction() + then result = this.getElse().getALastInstruction() else if exists(this.getInstruction(ConditionValueResultLoadTag())) then result = this.getInstruction(ConditionValueResultLoadTag()) @@ -2833,7 +2845,7 @@ class TranslatedReThrowExpr extends TranslatedThrowExpr { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { result = this.getInstruction(ThrowTag()) } + override Instruction getALastInstructionInternal() { result = this.getInstruction(ThrowTag()) } override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } @@ -2866,7 +2878,7 @@ class TranslatedBuiltInOperation extends TranslatedNonConstantExpr { ) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -2984,7 +2996,7 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(VarArgsVAListStoreTag()) } @@ -3061,7 +3073,7 @@ class TranslatedVarArg extends TranslatedNonConstantExpr { result = this.getVAList().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(VarArgsVAListStoreTag()) } @@ -3137,7 +3149,7 @@ class TranslatedVarArgsEnd extends TranslatedNonConstantExpr { result = this.getVAList().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -3187,7 +3199,7 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr { result = this.getSourceVAList().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(VarArgsVAListStoreTag()) } @@ -3265,9 +3277,9 @@ abstract class TranslatedNewOrNewArrayExpr extends TranslatedNonConstantExpr, In result = this.getAllocatorCall().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { if exists(this.getInitialization()) - then result = this.getInitialization().getLastInstruction() + then result = this.getInitialization().getALastInstruction() else result = this.getInstruction(OnlyInstructionTag()) } @@ -3347,8 +3359,8 @@ class TranslatedConditionDeclExpr extends TranslatedNonConstantExpr { result = this.getDecl().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { - result = this.getConditionExpr().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getConditionExpr().getALastInstruction() } final override TranslatedElement getChildInternal(int id) { @@ -3393,7 +3405,7 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { result = this.getInstruction(LoadTag()) } + override Instruction getALastInstructionInternal() { result = this.getInstruction(LoadTag()) } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() @@ -3488,7 +3500,9 @@ class TranslatedStmtExpr extends TranslatedNonConstantExpr { result = this.getStmt().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { result = this.getStmt().getLastInstruction() } + override Instruction getALastInstructionInternal() { + result = this.getStmt().getALastInstruction() + } final override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getStmt() } @@ -3530,7 +3544,7 @@ class TranslatedErrorExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -3630,7 +3644,7 @@ class TranslatedAssumeExpr extends TranslatedSingleInstructionExpr { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll index 924755712b4..137371cf90c 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -114,7 +114,7 @@ class TranslatedFunction extends TranslatedRootElement, TTranslatedFunction { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(ExitFunctionTag()) } @@ -383,7 +383,7 @@ abstract class TranslatedParameter extends TranslatedElement { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { if this.hasIndirection() then result = this.getInstruction(InitializerIndirectStoreTag()) else result = this.getInstruction(InitializerStoreTag()) @@ -621,8 +621,8 @@ class TranslatedConstructorInitList extends TranslatedElement, InitializationCon else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { - result = this.getLastChild().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getLastChild().getALastInstruction() } override TranslatedElement getLastChild() { @@ -696,8 +696,8 @@ class TranslatedDestructorDestructionList extends TranslatedElement, else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { - result = this.getChild(max(int id | exists(this.getChild(id)))).getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getChild(max(int id | exists(this.getChild(id)))).getALastInstruction() } override TranslatedElement getLastChild() { @@ -754,7 +754,7 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { else result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { if exists(this.getAChild()) then result = @@ -811,7 +811,7 @@ abstract class TranslatedReadEffect extends TranslatedElement { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll index 9c646133895..a188e98f9d1 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll @@ -27,7 +27,7 @@ class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { result = this.getInstruction(ExitFunctionTag()) } + override Instruction getALastInstructionInternal() { result = this.getInstruction(ExitFunctionTag()) } override TranslatedElement getChild(int n) { n = 1 and @@ -83,7 +83,7 @@ class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, ) } - override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getChild(1) and result = this.getInstruction(ReturnTag()) and kind instanceof GotoEdge diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index 57e5c518643..ff906a85bf5 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -42,8 +42,8 @@ abstract class TranslatedVariableInitialization extends TranslatedElement, Initi kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { - result = this.getInitialization().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getInitialization().getALastInstruction() or not exists(this.getInitialization()) and result = this.getInstruction(OnlyInstructionTag()) } @@ -183,8 +183,8 @@ abstract class TranslatedListInitialization extends TranslatedInitialization, In result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { - result = this.getChild(max(int i | exists(this.getChild(i)))).getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getChild(max(int i | exists(this.getChild(i)))).getALastInstruction() } override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { @@ -272,7 +272,7 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio not expr instanceof StringLiteral } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(InitializerStoreTag()) } @@ -312,7 +312,7 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio class TranslatedStringLiteralInitialization extends TranslatedDirectInitialization { override StringLiteral expr; - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { if this.zeroInitRange(_, _) then result = this.getInstruction(ZeroPadStringStoreTag()) else result = this.getInstruction(InitializerStoreTag()) @@ -479,8 +479,8 @@ class TranslatedConstructorInitialization extends TranslatedDirectInitialization { override ConstructorCall expr; - override Instruction getLastInstructionInternal() { - result = this.getInitializer().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getInitializer().getALastInstruction() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -586,8 +586,8 @@ class TranslatedExplicitFieldInitialization extends TranslatedFieldInitializatio this = TTranslatedExplicitFieldInitialization(ast, field, expr, position) } - override Instruction getLastInstructionInternal() { - result = this.getInitialization().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getInitialization().getALastInstruction() } override Instruction getTargetAddress() { @@ -629,7 +629,7 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, { TranslatedFieldValueInitialization() { this = TTranslatedFieldValueInitialization(ast, field) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(this.getFieldDefaultValueStoreTag()) } @@ -781,8 +781,8 @@ class TranslatedExplicitElementInitialization extends TranslatedElementInitializ this = TTranslatedExplicitElementInitialization(initList, elementIndex, position) } - override Instruction getLastInstructionInternal() { - result = this.getInitialization().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getInitialization().getALastInstruction() } override Instruction getTargetAddress() { @@ -830,7 +830,7 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati this = TTranslatedElementValueInitialization(initList, elementIndex, elementCount) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(this.getElementDefaultValueStoreTag()) } @@ -942,8 +942,8 @@ abstract class TranslatedBaseStructorCall extends TranslatedStructorCallFromStru kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { - result = this.getStructorCall().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getStructorCall().getALastInstruction() } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -999,8 +999,8 @@ class TranslatedConstructorDelegationInit extends TranslatedConstructorCallFromC result = this.getStructorCall().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { - result = this.getStructorCall().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getStructorCall().getALastInstruction() } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -1067,7 +1067,7 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { none() } // FIXME: does this need to be filled in? + override Instruction getALastInstructionInternal() { none() } // FIXME: does this need to be filled in? override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 13bdf726a43..20a5d92268c 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -213,8 +213,8 @@ class TranslatedMicrosoftTryExceptHandler extends TranslatedElement, override TranslatedElement getLastChild() { result = this.getTranslatedHandler() } - override Instruction getLastInstructionInternal() { - result = this.getTranslatedHandler().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getTranslatedHandler().getALastInstruction() or result = this.getInstruction(UnwindTag()) } @@ -260,7 +260,7 @@ abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt { not exists(this.getChildInternal(_)) and result = 0 } - final override predicate hasImplicitDestructorCalls() { + final override predicate hasAnImplicitDestructorCall() { exists(stmt.getAnImplicitDestructorCall()) } @@ -288,7 +288,7 @@ class TranslatedEmptyStmt extends TranslatedStmt { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -327,8 +327,8 @@ class TranslatedDeclStmt extends TranslatedStmt { result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getLastInstructionInternal() { - result = this.getChild(this.getChildCount() - 1).getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getChild(this.getChildCount() - 1).getALastInstruction() } override TranslatedElement getLastChild() { result = this.getChild(this.getChildCount() - 1) } @@ -384,7 +384,7 @@ class TranslatedExprStmt extends TranslatedStmt { result = this.getExpr().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { result = this.getExpr().getLastInstruction() } + override Instruction getALastInstructionInternal() { result = this.getExpr().getALastInstruction() } override TranslatedElement getLastChild() { result = this.getExpr() } @@ -446,7 +446,7 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { result = this.getExpr().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -486,7 +486,7 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -596,8 +596,8 @@ class TranslatedTryStmt extends TranslatedStmt { result = this.getBody().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { - result = this.getLastChild().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getLastChild().getALastInstruction() } override TranslatedElement getLastChild() { @@ -665,7 +665,7 @@ class TranslatedBlock extends TranslatedStmt { else result = this.getStmt(0).getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { if this.isEmpty() then result = this.getInstruction(OnlyInstructionTag()) else result = this.getStmt(this.getStmtCount() - 1).getFirstInstruction(any(GotoEdge goto)) @@ -709,8 +709,8 @@ abstract class TranslatedHandler extends TranslatedStmt { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { - result = this.getBlock().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getBlock().getALastInstruction() } override TranslatedElement getLastChild() { result = this.getBlock() } @@ -802,8 +802,8 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { else result = this.getFirstConditionInstruction(kind) } - override Instruction getLastInstructionInternal() { - result = this.getElse().getLastInstruction() or result = this.getThen().getLastInstruction() // FIXME: how do we handle the CFG merge here + override Instruction getALastInstructionInternal() { + result = this.getElse().getALastInstruction() or result = this.getThen().getALastInstruction() // FIXME: how do we handle the CFG merge here } override TranslatedElement getLastChild() { @@ -870,8 +870,8 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { override Loop stmt; - override Instruction getLastInstructionInternal() { - result = this.getCondition().getLastInstruction() // FIXME: how do we handle the branch here + override Instruction getALastInstructionInternal() { + result = this.getCondition().getALastInstruction() // FIXME: how do we handle the branch here } override TranslatedElement getLastChild() { result = this.getCondition() } @@ -947,7 +947,7 @@ class TranslatedForStmt extends TranslatedLoop { final override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { child = this.getCondition() and - if this.hasImplicitDestructorCalls() + if this.hasAnImplicitDestructorCall() then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) else result = this.getParent().getChildSuccessor(this, kind) } @@ -1033,8 +1033,8 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext { result = this.getRangeVariableDeclStmt().getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { - result = this.getCondition().getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getCondition().getALastInstruction() } override TranslatedElement getLastChild() { result = this.getCondition() } @@ -1114,7 +1114,7 @@ class TranslatedJumpStmt extends TranslatedStmt { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } @@ -1162,7 +1162,7 @@ class TranslatedSwitchStmt extends TranslatedStmt { else result = this.getFirstExprInstruction(kind) } - override Instruction getLastInstructionInternal() { result = this.getBody().getLastInstruction() } + override Instruction getALastInstructionInternal() { result = this.getBody().getALastInstruction() } override TranslatedElement getLastChild() { result = this.getBody() } @@ -1233,7 +1233,7 @@ class TranslatedAsmStmt extends TranslatedStmt { ) } - override Instruction getLastInstructionInternal() { result = this.getInstruction(AsmTag()) } + override Instruction getALastInstructionInternal() { result = this.getInstruction(AsmTag()) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = AsmTag() and @@ -1286,8 +1286,8 @@ class TranslatedVlaDimensionStmt extends TranslatedStmt { result = this.getChild(0).getFirstInstruction(kind) } - override Instruction getLastInstructionInternal() { - result = this.getChild(0).getLastInstruction() + override Instruction getALastInstructionInternal() { + result = this.getChild(0).getALastInstruction() } override TranslatedElement getLastChild() { result = this.getChild(0) } @@ -1314,7 +1314,7 @@ class TranslatedVlaDeclarationStmt extends TranslatedStmt { kind instanceof GotoEdge } - override Instruction getLastInstructionInternal() { + override Instruction getALastInstructionInternal() { result = this.getInstruction(OnlyInstructionTag()) } From 40e06b7877296598dd8577f6aacfdd2086188d24 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 6 Feb 2024 14:55:00 +0000 Subject: [PATCH 012/207] C++: suppress destructor calls on delete in IR generation This avoids an issue with duplicated qualifiers that was causing broken control flow --- .../raw/internal/TranslatedElement.qll | 6 + .../test/library-tests/ir/ir/raw_ir.expected | 275 +++++++----------- 2 files changed, 105 insertions(+), 176 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index cd911392b94..b0796202333 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -116,6 +116,11 @@ private predicate ignoreExprOnly(Expr expr) { or not translateFunction(getEnclosingFunction(expr)) and not Raw::varHasIRFunc(getEnclosingVariable(expr)) + or + exists(DeleteOrDeleteArrayExpr deleteExpr | + // Ignore the destructor call, because the duplicated qualifier breaks control flow. + deleteExpr.getDestructorCall() = expr + ) } /** @@ -918,6 +923,7 @@ abstract class TranslatedElement extends TTranslatedElement { * holds. */ abstract Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind); + /** * Gets the successor instruction of the instruction that was generated by * this element for tag `tag`. The successor edge kind is specified by `kind`. diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index b78bed0c6c6..739bc02864c 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -5800,35 +5800,17 @@ ir.cpp: # 1015| void OperatorDelete() # 1015| Block 0 -# 1015| v1015_1(void) = EnterFunction : -# 1015| mu1015_2(unknown) = AliasedDefinition : -# 1015| mu1015_3(unknown) = InitializeNonLocal : -# 1016| r1016_1(glval) = FunctionAddress[operator delete] : -# 1016| r1016_2(int *) = Constant[0] : -# 1016| v1016_3(void) = Call[operator delete] : func:r1016_1, 0:r1016_2 -# 1016| mu1016_4(unknown) = ^CallSideEffect : ~m? -# 1017| r1017_1(glval) = FunctionAddress[operator delete] : -# 1017| r1017_2(String *) = Constant[0] : -#-----| Goto -> Block 1 -#-----| Goto -> Block 3 - -# 1017| Block 1 -# 1017| r1017_3(glval) = FunctionAddress[~String] : -# 1017| v1017_4(void) = Call[~String] : func:r1017_3 -# 1017| mu1017_5(unknown) = ^CallSideEffect : ~m? -# 1017| v1017_6(void) = ^IndirectReadSideEffect[-1] : &:r1017_2, ~m? -# 1017| mu1017_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1017_2 - -# 1020| Block 1 -# 1020| r1020_1(glval) = FunctionAddress[~PolymorphicBase] : -# 1020| v1020_2(void) = Call[~PolymorphicBase] : func:r1020_1 -# 1020| mu1020_3(unknown) = ^CallSideEffect : ~m? -# 1020| v1020_4(void) = ^IndirectReadSideEffect[-1] : &:r1020_7, ~m? -# 1020| mu1020_5(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r1020_7 - -# 1017| Block 3 -# 1017| v1017_8(void) = Call[operator delete] : func:r1017_1, 0:r1017_2 -# 1017| mu1017_9(unknown) = ^CallSideEffect : ~m? +# 1015| v1015_1(void) = EnterFunction : +# 1015| mu1015_2(unknown) = AliasedDefinition : +# 1015| mu1015_3(unknown) = InitializeNonLocal : +# 1016| r1016_1(glval) = FunctionAddress[operator delete] : +# 1016| r1016_2(int *) = Constant[0] : +# 1016| v1016_3(void) = Call[operator delete] : func:r1016_1, 0:r1016_2 +# 1016| mu1016_4(unknown) = ^CallSideEffect : ~m? +# 1017| r1017_1(glval) = FunctionAddress[operator delete] : +# 1017| r1017_2(String *) = Constant[0] : +# 1017| v1017_3(void) = Call[operator delete] : func:r1017_1, 0:r1017_2 +# 1017| mu1017_4(unknown) = ^CallSideEffect : ~m? # 1018| r1018_1(glval) = FunctionAddress[operator delete] : # 1018| r1018_2(SizedDealloc *) = Constant[0] : # 1018| v1018_3(void) = Call[operator delete] : func:r1018_1, 0:r1018_2 @@ -5837,50 +5819,28 @@ ir.cpp: # 1019| r1019_2(Overaligned *) = Constant[0] : # 1019| v1019_3(void) = Call[operator delete] : func:r1019_1, 0:r1019_2 # 1019| mu1019_4(unknown) = ^CallSideEffect : ~m? -# 1020| r1020_6(glval) = VirtualDeleteFunctionAddress : -# 1020| r1020_7(PolymorphicBase *) = Constant[0] : -#-----| Goto -> Block 1 -#-----| Goto -> Block 4 - -# 1020| Block 4 -# 1020| v1020_8(void) = Call[?] : func:r1020_6, 0:r1020_7 -# 1020| mu1020_9(unknown) = ^CallSideEffect : ~m? -# 1021| v1021_1(void) = NoOp : -# 1015| v1015_4(void) = ReturnVoid : -# 1015| v1015_5(void) = AliasedUse : ~m? -# 1015| v1015_6(void) = ExitFunction : +# 1020| r1020_1(glval) = VirtualDeleteFunctionAddress : +# 1020| r1020_2(PolymorphicBase *) = Constant[0] : +# 1020| v1020_3(void) = Call[?] : func:r1020_1, 0:r1020_2 +# 1020| mu1020_4(unknown) = ^CallSideEffect : ~m? +# 1021| v1021_1(void) = NoOp : +# 1015| v1015_4(void) = ReturnVoid : +# 1015| v1015_5(void) = AliasedUse : ~m? +# 1015| v1015_6(void) = ExitFunction : # 1024| void OperatorDeleteArray() # 1024| Block 0 -# 1024| v1024_1(void) = EnterFunction : -# 1024| mu1024_2(unknown) = AliasedDefinition : -# 1024| mu1024_3(unknown) = InitializeNonLocal : -# 1025| r1025_1(glval) = FunctionAddress[operator delete[]] : -# 1025| r1025_2(int *) = Constant[0] : -# 1025| v1025_3(void) = Call[operator delete[]] : func:r1025_1, 0:r1025_2 -# 1025| mu1025_4(unknown) = ^CallSideEffect : ~m? -# 1026| r1026_1(glval) = FunctionAddress[operator delete[]] : -# 1026| r1026_2(String *) = Constant[0] : -#-----| Goto -> Block 1 -#-----| Goto -> Block 3 - -# 1026| Block 1 -# 1026| r1026_3(glval) = FunctionAddress[~String] : -# 1026| v1026_4(void) = Call[~String] : func:r1026_3 -# 1026| mu1026_5(unknown) = ^CallSideEffect : ~m? -# 1026| v1026_6(void) = ^IndirectReadSideEffect[-1] : &:r1026_2, ~m? -# 1026| mu1026_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1026_2 - -# 1029| Block 1 -# 1029| r1029_1(glval) = FunctionAddress[~PolymorphicBase] : -# 1029| v1029_2(void) = Call[~PolymorphicBase] : func:r1029_1 -# 1029| mu1029_3(unknown) = ^CallSideEffect : ~m? -# 1029| v1029_4(void) = ^IndirectReadSideEffect[-1] : &:r1029_7, ~m? -# 1029| mu1029_5(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r1029_7 - -# 1026| Block 3 -# 1026| v1026_8(void) = Call[operator delete[]] : func:r1026_1, 0:r1026_2 -# 1026| mu1026_9(unknown) = ^CallSideEffect : ~m? +# 1024| v1024_1(void) = EnterFunction : +# 1024| mu1024_2(unknown) = AliasedDefinition : +# 1024| mu1024_3(unknown) = InitializeNonLocal : +# 1025| r1025_1(glval) = FunctionAddress[operator delete[]] : +# 1025| r1025_2(int *) = Constant[0] : +# 1025| v1025_3(void) = Call[operator delete[]] : func:r1025_1, 0:r1025_2 +# 1025| mu1025_4(unknown) = ^CallSideEffect : ~m? +# 1026| r1026_1(glval) = FunctionAddress[operator delete[]] : +# 1026| r1026_2(String *) = Constant[0] : +# 1026| v1026_3(void) = Call[operator delete[]] : func:r1026_1, 0:r1026_2 +# 1026| mu1026_4(unknown) = ^CallSideEffect : ~m? # 1027| r1027_1(glval) = FunctionAddress[operator delete[]] : # 1027| r1027_2(SizedDealloc *) = Constant[0] : # 1027| v1027_3(void) = Call[operator delete[]] : func:r1027_1, 0:r1027_2 @@ -5889,18 +5849,14 @@ ir.cpp: # 1028| r1028_2(Overaligned *) = Constant[0] : # 1028| v1028_3(void) = Call[operator delete[]] : func:r1028_1, 0:r1028_2 # 1028| mu1028_4(unknown) = ^CallSideEffect : ~m? -# 1029| r1029_6(glval) = FunctionAddress[operator delete[]] : -# 1029| r1029_7(PolymorphicBase *) = Constant[0] : -#-----| Goto -> Block 1 -#-----| Goto -> Block 4 - -# 1029| Block 4 -# 1029| v1029_8(void) = Call[operator delete[]] : func:r1029_6, 0:r1029_7 -# 1029| mu1029_9(unknown) = ^CallSideEffect : ~m? -# 1030| v1030_1(void) = NoOp : -# 1024| v1024_4(void) = ReturnVoid : -# 1024| v1024_5(void) = AliasedUse : ~m? -# 1024| v1024_6(void) = ExitFunction : +# 1029| r1029_1(glval) = FunctionAddress[operator delete[]] : +# 1029| r1029_2(PolymorphicBase *) = Constant[0] : +# 1029| v1029_3(void) = Call[operator delete[]] : func:r1029_1, 0:r1029_2 +# 1029| mu1029_4(unknown) = ^CallSideEffect : ~m? +# 1030| v1030_1(void) = NoOp : +# 1024| v1024_4(void) = ReturnVoid : +# 1024| v1024_5(void) = AliasedUse : ~m? +# 1024| v1024_6(void) = ExitFunction : # 1034| void EmptyStructInit() # 1034| Block 0 @@ -11533,100 +11489,67 @@ ir.cpp: # 2056| int virtual_delete() # 2056| Block 0 -# 2056| v2056_1(void) = EnterFunction : -# 2056| mu2056_2(unknown) = AliasedDefinition : -# 2056| mu2056_3(unknown) = InitializeNonLocal : -# 2058| r2058_1(glval) = VariableAddress[b1] : -# 2058| r2058_2(glval) = FunctionAddress[operator new] : -# 2058| r2058_3(unsigned long) = Constant[8] : -# 2058| r2058_4(void *) = Call[operator new] : func:r2058_2, 0:r2058_3 -# 2058| mu2058_5(unknown) = ^CallSideEffect : ~m? -# 2058| mu2058_6(unknown) = ^InitializeDynamicAllocation : &:r2058_4 -# 2058| r2058_7(Base2 *) = Convert : r2058_4 -# 2058| r2058_8(glval) = FunctionAddress[Base2] : -# 2058| v2058_9(void) = Call[Base2] : func:r2058_8, this:r2058_7 -# 2058| mu2058_10(unknown) = ^CallSideEffect : ~m? -# 2058| mu2058_11(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2058_7 -# 2058| mu2058_12(Base2 *) = Store[b1] : &:r2058_1, r2058_7 -# 2059| r2059_1(glval) = VirtualDeleteFunctionAddress : -# 2059| r2059_2(glval) = VariableAddress[b1] : -# 2059| r2059_3(Base2 *) = Load[b1] : &:r2059_2, ~m? -#-----| Goto -> Block 1 -#-----| Goto -> Block 4 - -# 2059| Block 1 -# 2059| r2059_4(glval) = FunctionAddress[~Base2] : -# 2059| v2059_5(void) = Call[~Base2] : func:r2059_4 -# 2059| mu2059_6(unknown) = ^CallSideEffect : ~m? -# 2059| v2059_7(void) = ^IndirectReadSideEffect[-1] : &:r2059_3, ~m? -# 2059| mu2059_8(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2059_3 - -# 2062| Block 1 -# 2062| r2062_1(glval) = FunctionAddress[~Base2] : -# 2062| v2062_2(void) = Call[~Base2] : func:r2062_1 -# 2062| mu2062_3(unknown) = ^CallSideEffect : ~m? -# 2062| v2062_4(void) = ^IndirectReadSideEffect[-1] : &:r2062_8, ~m? -# 2062| mu2062_5(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2062_8 - -# 2065| Block 1 -# 2065| r2065_1(glval) = FunctionAddress[~Derived2] : -# 2065| v2065_2(void) = Call[~Derived2] : func:r2065_1 -# 2065| mu2065_3(unknown) = ^CallSideEffect : ~m? -# 2065| v2065_4(void) = ^IndirectReadSideEffect[-1] : &:r2065_8, ~m? -# 2065| mu2065_5(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2065_8 - -# 2059| Block 4 -# 2059| v2059_9(void) = Call[?] : func:r2059_1, 0:r2059_3 -# 2059| mu2059_10(unknown) = ^CallSideEffect : ~m? -# 2061| r2061_1(glval) = VariableAddress[b2] : -# 2061| r2061_2(glval) = FunctionAddress[operator new] : -# 2061| r2061_3(unsigned long) = Constant[16] : -# 2061| r2061_4(void *) = Call[operator new] : func:r2061_2, 0:r2061_3 -# 2061| mu2061_5(unknown) = ^CallSideEffect : ~m? -# 2061| mu2061_6(unknown) = ^InitializeDynamicAllocation : &:r2061_4 -# 2061| r2061_7(Derived2 *) = Convert : r2061_4 -# 2061| r2061_8(glval) = FunctionAddress[Derived2] : -# 2061| v2061_9(void) = Call[Derived2] : func:r2061_8, this:r2061_7 -# 2061| mu2061_10(unknown) = ^CallSideEffect : ~m? -# 2061| mu2061_11(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2061_7 -# 2061| r2061_12(Base2 *) = ConvertToNonVirtualBase[Derived2 : Base2] : r2061_7 -# 2061| mu2061_13(Base2 *) = Store[b2] : &:r2061_1, r2061_12 -# 2062| r2062_6(glval) = VirtualDeleteFunctionAddress : -# 2062| r2062_7(glval) = VariableAddress[b2] : -# 2062| r2062_8(Base2 *) = Load[b2] : &:r2062_7, ~m? -#-----| Goto -> Block 1 -#-----| Goto -> Block 5 - -# 2062| Block 5 -# 2062| v2062_9(void) = Call[?] : func:r2062_6, 0:r2062_8 -# 2062| mu2062_10(unknown) = ^CallSideEffect : ~m? -# 2064| r2064_1(glval) = VariableAddress[d] : -# 2064| r2064_2(glval) = FunctionAddress[operator new] : -# 2064| r2064_3(unsigned long) = Constant[16] : -# 2064| r2064_4(void *) = Call[operator new] : func:r2064_2, 0:r2064_3 -# 2064| mu2064_5(unknown) = ^CallSideEffect : ~m? -# 2064| mu2064_6(unknown) = ^InitializeDynamicAllocation : &:r2064_4 -# 2064| r2064_7(Derived2 *) = Convert : r2064_4 -# 2064| r2064_8(glval) = FunctionAddress[Derived2] : -# 2064| v2064_9(void) = Call[Derived2] : func:r2064_8, this:r2064_7 -# 2064| mu2064_10(unknown) = ^CallSideEffect : ~m? -# 2064| mu2064_11(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2064_7 -# 2064| mu2064_12(Derived2 *) = Store[d] : &:r2064_1, r2064_7 -# 2065| r2065_6(glval) = VirtualDeleteFunctionAddress : -# 2065| r2065_7(glval) = VariableAddress[d] : -# 2065| r2065_8(Derived2 *) = Load[d] : &:r2065_7, ~m? -#-----| Goto -> Block 1 -#-----| Goto -> Block 6 - -# 2065| Block 6 -# 2065| v2065_9(void) = Call[?] : func:r2065_6, 0:r2065_8 -# 2065| mu2065_10(unknown) = ^CallSideEffect : ~m? -# 2066| r2066_1(glval) = VariableAddress[#return] : -# 2066| mu2066_2(int) = Uninitialized[#return] : &:r2066_1 -# 2056| r2056_4(glval) = VariableAddress[#return] : -# 2056| v2056_5(void) = ReturnValue : &:r2056_4, ~m? -# 2056| v2056_6(void) = AliasedUse : ~m? -# 2056| v2056_7(void) = ExitFunction : +# 2056| v2056_1(void) = EnterFunction : +# 2056| mu2056_2(unknown) = AliasedDefinition : +# 2056| mu2056_3(unknown) = InitializeNonLocal : +# 2058| r2058_1(glval) = VariableAddress[b1] : +# 2058| r2058_2(glval) = FunctionAddress[operator new] : +# 2058| r2058_3(unsigned long) = Constant[8] : +# 2058| r2058_4(void *) = Call[operator new] : func:r2058_2, 0:r2058_3 +# 2058| mu2058_5(unknown) = ^CallSideEffect : ~m? +# 2058| mu2058_6(unknown) = ^InitializeDynamicAllocation : &:r2058_4 +# 2058| r2058_7(Base2 *) = Convert : r2058_4 +# 2058| r2058_8(glval) = FunctionAddress[Base2] : +# 2058| v2058_9(void) = Call[Base2] : func:r2058_8, this:r2058_7 +# 2058| mu2058_10(unknown) = ^CallSideEffect : ~m? +# 2058| mu2058_11(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2058_7 +# 2058| mu2058_12(Base2 *) = Store[b1] : &:r2058_1, r2058_7 +# 2059| r2059_1(glval) = VirtualDeleteFunctionAddress : +# 2059| r2059_2(glval) = VariableAddress[b1] : +# 2059| r2059_3(Base2 *) = Load[b1] : &:r2059_2, ~m? +# 2059| v2059_4(void) = Call[?] : func:r2059_1, 0:r2059_3 +# 2059| mu2059_5(unknown) = ^CallSideEffect : ~m? +# 2061| r2061_1(glval) = VariableAddress[b2] : +# 2061| r2061_2(glval) = FunctionAddress[operator new] : +# 2061| r2061_3(unsigned long) = Constant[16] : +# 2061| r2061_4(void *) = Call[operator new] : func:r2061_2, 0:r2061_3 +# 2061| mu2061_5(unknown) = ^CallSideEffect : ~m? +# 2061| mu2061_6(unknown) = ^InitializeDynamicAllocation : &:r2061_4 +# 2061| r2061_7(Derived2 *) = Convert : r2061_4 +# 2061| r2061_8(glval) = FunctionAddress[Derived2] : +# 2061| v2061_9(void) = Call[Derived2] : func:r2061_8, this:r2061_7 +# 2061| mu2061_10(unknown) = ^CallSideEffect : ~m? +# 2061| mu2061_11(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2061_7 +# 2061| r2061_12(Base2 *) = ConvertToNonVirtualBase[Derived2 : Base2] : r2061_7 +# 2061| mu2061_13(Base2 *) = Store[b2] : &:r2061_1, r2061_12 +# 2062| r2062_1(glval) = VirtualDeleteFunctionAddress : +# 2062| r2062_2(glval) = VariableAddress[b2] : +# 2062| r2062_3(Base2 *) = Load[b2] : &:r2062_2, ~m? +# 2062| v2062_4(void) = Call[?] : func:r2062_1, 0:r2062_3 +# 2062| mu2062_5(unknown) = ^CallSideEffect : ~m? +# 2064| r2064_1(glval) = VariableAddress[d] : +# 2064| r2064_2(glval) = FunctionAddress[operator new] : +# 2064| r2064_3(unsigned long) = Constant[16] : +# 2064| r2064_4(void *) = Call[operator new] : func:r2064_2, 0:r2064_3 +# 2064| mu2064_5(unknown) = ^CallSideEffect : ~m? +# 2064| mu2064_6(unknown) = ^InitializeDynamicAllocation : &:r2064_4 +# 2064| r2064_7(Derived2 *) = Convert : r2064_4 +# 2064| r2064_8(glval) = FunctionAddress[Derived2] : +# 2064| v2064_9(void) = Call[Derived2] : func:r2064_8, this:r2064_7 +# 2064| mu2064_10(unknown) = ^CallSideEffect : ~m? +# 2064| mu2064_11(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2064_7 +# 2064| mu2064_12(Derived2 *) = Store[d] : &:r2064_1, r2064_7 +# 2065| r2065_1(glval) = VirtualDeleteFunctionAddress : +# 2065| r2065_2(glval) = VariableAddress[d] : +# 2065| r2065_3(Derived2 *) = Load[d] : &:r2065_2, ~m? +# 2065| v2065_4(void) = Call[?] : func:r2065_1, 0:r2065_3 +# 2065| mu2065_5(unknown) = ^CallSideEffect : ~m? +# 2066| r2066_1(glval) = VariableAddress[#return] : +# 2066| mu2066_2(int) = Uninitialized[#return] : &:r2066_1 +# 2056| r2056_4(glval) = VariableAddress[#return] : +# 2056| v2056_5(void) = ReturnValue : &:r2056_4, ~m? +# 2056| v2056_6(void) = AliasedUse : ~m? +# 2056| v2056_7(void) = ExitFunction : # 2070| void test_constant_folding() # 2070| Block 0 From 5653c3f9723ef773f4495a3bcba9e65b0456cbf6 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 6 Feb 2024 21:04:52 +0000 Subject: [PATCH 013/207] C++: Update IR test expectations for named destructors --- .../library-tests/ir/ir/aliased_ir.expected | 1310 +++++++++++++---- .../ir/ir/aliased_ssa_consistency.expected | 10 +- .../aliased_ssa_consistency_unsound.expected | 10 +- .../ir/ir/operand_locations.expected | 731 ++++++++- .../ir/ir/raw_consistency.expected | 6 + .../ir/ir/unaliased_ssa_consistency.expected | 10 +- ...unaliased_ssa_consistency_unsound.expected | 10 +- 7 files changed, 1747 insertions(+), 340 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 3949bb9f0f6..47074e1b904 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -3628,50 +3628,82 @@ ir.cpp: # 615| void DeclareObject() # 615| Block 0 -# 615| v615_1(void) = EnterFunction : -# 615| m615_2(unknown) = AliasedDefinition : -# 615| m615_3(unknown) = InitializeNonLocal : -# 615| m615_4(unknown) = Chi : total:m615_2, partial:m615_3 -# 616| r616_1(glval) = VariableAddress[s1] : -# 616| m616_2(String) = Uninitialized[s1] : &:r616_1 -# 616| r616_3(glval) = FunctionAddress[String] : -# 616| v616_4(void) = Call[String] : func:r616_3, this:r616_1 -# 616| m616_5(unknown) = ^CallSideEffect : ~m615_4 -# 616| m616_6(unknown) = Chi : total:m615_4, partial:m616_5 -# 616| m616_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r616_1 -# 616| m616_8(String) = Chi : total:m616_2, partial:m616_7 -# 617| r617_1(glval) = VariableAddress[s2] : -# 617| m617_2(String) = Uninitialized[s2] : &:r617_1 -# 617| r617_3(glval) = FunctionAddress[String] : -# 617| r617_4(glval) = StringConstant["hello"] : -# 617| r617_5(char *) = Convert : r617_4 -# 617| v617_6(void) = Call[String] : func:r617_3, this:r617_1, 0:r617_5 -# 617| m617_7(unknown) = ^CallSideEffect : ~m616_6 -# 617| m617_8(unknown) = Chi : total:m616_6, partial:m617_7 -# 617| v617_9(void) = ^BufferReadSideEffect[0] : &:r617_5, ~m615_3 -# 617| m617_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r617_1 -# 617| m617_11(String) = Chi : total:m617_2, partial:m617_10 -# 618| r618_1(glval) = VariableAddress[s3] : -# 618| r618_2(glval) = FunctionAddress[ReturnObject] : -# 618| r618_3(String) = Call[ReturnObject] : func:r618_2 -# 618| m618_4(unknown) = ^CallSideEffect : ~m617_8 -# 618| m618_5(unknown) = Chi : total:m617_8, partial:m618_4 -# 618| m618_6(String) = Store[s3] : &:r618_1, r618_3 -# 619| r619_1(glval) = VariableAddress[s4] : -# 619| m619_2(String) = Uninitialized[s4] : &:r619_1 -# 619| r619_3(glval) = FunctionAddress[String] : -# 619| r619_4(glval) = StringConstant["test"] : -# 619| r619_5(char *) = Convert : r619_4 -# 619| v619_6(void) = Call[String] : func:r619_3, this:r619_1, 0:r619_5 -# 619| m619_7(unknown) = ^CallSideEffect : ~m618_5 -# 619| m619_8(unknown) = Chi : total:m618_5, partial:m619_7 -# 619| v619_9(void) = ^BufferReadSideEffect[0] : &:r619_5, ~m615_3 -# 619| m619_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r619_1 -# 619| m619_11(String) = Chi : total:m619_2, partial:m619_10 -# 620| v620_1(void) = NoOp : -# 615| v615_5(void) = ReturnVoid : -# 615| v615_6(void) = AliasedUse : ~m619_8 -# 615| v615_7(void) = ExitFunction : +# 615| v615_1(void) = EnterFunction : +# 615| m615_2(unknown) = AliasedDefinition : +# 615| m615_3(unknown) = InitializeNonLocal : +# 615| m615_4(unknown) = Chi : total:m615_2, partial:m615_3 +# 616| r616_1(glval) = VariableAddress[s1] : +# 616| m616_2(String) = Uninitialized[s1] : &:r616_1 +# 616| r616_3(glval) = FunctionAddress[String] : +# 616| v616_4(void) = Call[String] : func:r616_3, this:r616_1 +# 616| m616_5(unknown) = ^CallSideEffect : ~m615_4 +# 616| m616_6(unknown) = Chi : total:m615_4, partial:m616_5 +# 616| m616_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r616_1 +# 616| m616_8(String) = Chi : total:m616_2, partial:m616_7 +# 617| r617_1(glval) = VariableAddress[s2] : +# 617| m617_2(String) = Uninitialized[s2] : &:r617_1 +# 617| r617_3(glval) = FunctionAddress[String] : +# 617| r617_4(glval) = StringConstant["hello"] : +# 617| r617_5(char *) = Convert : r617_4 +# 617| v617_6(void) = Call[String] : func:r617_3, this:r617_1, 0:r617_5 +# 617| m617_7(unknown) = ^CallSideEffect : ~m616_6 +# 617| m617_8(unknown) = Chi : total:m616_6, partial:m617_7 +# 617| v617_9(void) = ^BufferReadSideEffect[0] : &:r617_5, ~m615_3 +# 617| m617_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r617_1 +# 617| m617_11(String) = Chi : total:m617_2, partial:m617_10 +# 618| r618_1(glval) = VariableAddress[s3] : +# 618| r618_2(glval) = FunctionAddress[ReturnObject] : +# 618| r618_3(String) = Call[ReturnObject] : func:r618_2 +# 618| m618_4(unknown) = ^CallSideEffect : ~m617_8 +# 618| m618_5(unknown) = Chi : total:m617_8, partial:m618_4 +# 618| m618_6(String) = Store[s3] : &:r618_1, r618_3 +# 619| r619_1(glval) = VariableAddress[s4] : +# 619| m619_2(String) = Uninitialized[s4] : &:r619_1 +# 619| r619_3(glval) = FunctionAddress[String] : +# 619| r619_4(glval) = StringConstant["test"] : +# 619| r619_5(char *) = Convert : r619_4 +# 619| v619_6(void) = Call[String] : func:r619_3, this:r619_1, 0:r619_5 +# 619| m619_7(unknown) = ^CallSideEffect : ~m618_5 +# 619| m619_8(unknown) = Chi : total:m618_5, partial:m619_7 +# 619| v619_9(void) = ^BufferReadSideEffect[0] : &:r619_5, ~m615_3 +# 619| m619_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r619_1 +# 619| m619_11(String) = Chi : total:m619_2, partial:m619_10 +# 620| v620_1(void) = NoOp : +# 620| r620_2(glval) = VariableAddress[s4] : +# 620| r620_3(glval) = FunctionAddress[~String] : +# 620| v620_4(void) = Call[~String] : func:r620_3, this:r620_2 +# 620| m620_5(unknown) = ^CallSideEffect : ~m619_8 +# 620| m620_6(unknown) = Chi : total:m619_8, partial:m620_5 +# 620| v620_7(void) = ^IndirectReadSideEffect[-1] : &:r620_2, m619_11 +# 620| m620_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_2 +# 620| m620_9(String) = Chi : total:m619_11, partial:m620_8 +# 620| r620_10(glval) = VariableAddress[s3] : +# 620| r620_11(glval) = FunctionAddress[~String] : +# 620| v620_12(void) = Call[~String] : func:r620_11, this:r620_10 +# 620| m620_13(unknown) = ^CallSideEffect : ~m620_6 +# 620| m620_14(unknown) = Chi : total:m620_6, partial:m620_13 +# 620| v620_15(void) = ^IndirectReadSideEffect[-1] : &:r620_10, m618_6 +# 620| m620_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_10 +# 620| m620_17(String) = Chi : total:m618_6, partial:m620_16 +# 620| r620_18(glval) = VariableAddress[s2] : +# 620| r620_19(glval) = FunctionAddress[~String] : +# 620| v620_20(void) = Call[~String] : func:r620_19, this:r620_18 +# 620| m620_21(unknown) = ^CallSideEffect : ~m620_14 +# 620| m620_22(unknown) = Chi : total:m620_14, partial:m620_21 +# 620| v620_23(void) = ^IndirectReadSideEffect[-1] : &:r620_18, m617_11 +# 620| m620_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_18 +# 620| m620_25(String) = Chi : total:m617_11, partial:m620_24 +# 620| r620_26(glval) = VariableAddress[s1] : +# 620| r620_27(glval) = FunctionAddress[~String] : +# 620| v620_28(void) = Call[~String] : func:r620_27, this:r620_26 +# 620| m620_29(unknown) = ^CallSideEffect : ~m620_22 +# 620| m620_30(unknown) = Chi : total:m620_22, partial:m620_29 +# 620| v620_31(void) = ^IndirectReadSideEffect[-1] : &:r620_26, m616_8 +# 620| m620_32(String) = ^IndirectMayWriteSideEffect[-1] : &:r620_26 +# 620| m620_33(String) = Chi : total:m616_8, partial:m620_32 +# 615| v615_5(void) = ReturnVoid : +# 615| v615_6(void) = AliasedUse : ~m620_30 +# 615| v615_7(void) = ExitFunction : # 622| void CallMethods(String&, String*, String) # 622| Block 0 @@ -5158,8 +5190,32 @@ ir.cpp: # 839| r839_4(glval) = VariableAddress[pb] : # 839| m839_5(Base *) = Store[pb] : &:r839_4, r839_3 # 840| v840_1(void) = NoOp : +# 840| r840_2(glval) = VariableAddress[d] : +# 840| r840_3(glval) = FunctionAddress[~Derived] : +# 840| v840_4(void) = Call[~Derived] : func:r840_3, this:r840_2 +# 840| m840_5(unknown) = ^CallSideEffect : ~m831_10 +# 840| m840_6(unknown) = Chi : total:m831_10, partial:m840_5 +# 840| v840_7(void) = ^IndirectReadSideEffect[-1] : &:r840_2, m831_14 +# 840| m840_8(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r840_2 +# 840| m840_9(Derived) = Chi : total:m831_14, partial:m840_8 +# 840| r840_10(glval) = VariableAddress[m] : +# 840| r840_11(glval) = FunctionAddress[~Middle] : +# 840| v840_12(void) = Call[~Middle] : func:r840_11, this:r840_10 +# 840| m840_13(unknown) = ^CallSideEffect : ~m840_6 +# 840| m840_14(unknown) = Chi : total:m840_6, partial:m840_13 +# 840| v840_15(void) = ^IndirectReadSideEffect[-1] : &:r840_10, m817_13 +# 840| m840_16(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r840_10 +# 840| m840_17(Middle) = Chi : total:m817_13, partial:m840_16 +# 840| r840_18(glval) = VariableAddress[b] : +# 840| r840_19(glval) = FunctionAddress[~Base] : +# 840| v840_20(void) = Call[~Base] : func:r840_19, this:r840_18 +# 840| m840_21(unknown) = ^CallSideEffect : ~m840_14 +# 840| m840_22(unknown) = Chi : total:m840_14, partial:m840_21 +# 840| v840_23(void) = ^IndirectReadSideEffect[-1] : &:r840_18, m824_24 +# 840| m840_24(Base) = ^IndirectMayWriteSideEffect[-1] : &:r840_18 +# 840| m840_25(Base) = Chi : total:m824_24, partial:m840_24 # 799| v799_5(void) = ReturnVoid : -# 799| v799_6(void) = AliasedUse : ~m831_10 +# 799| v799_6(void) = AliasedUse : ~m840_22 # 799| v799_7(void) = ExitFunction : # 842| void PolymorphicBase::PolymorphicBase() @@ -5224,68 +5280,84 @@ ir.cpp: # 849| void DynamicCast() # 849| Block 0 -# 849| v849_1(void) = EnterFunction : -# 849| m849_2(unknown) = AliasedDefinition : -# 849| m849_3(unknown) = InitializeNonLocal : -# 849| m849_4(unknown) = Chi : total:m849_2, partial:m849_3 -# 850| r850_1(glval) = VariableAddress[b] : -# 850| m850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 -# 850| r850_3(glval) = FunctionAddress[PolymorphicBase] : -# 850| v850_4(void) = Call[PolymorphicBase] : func:r850_3, this:r850_1 -# 850| m850_5(unknown) = ^CallSideEffect : ~m849_4 -# 850| m850_6(unknown) = Chi : total:m849_4, partial:m850_5 -# 850| m850_7(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 -# 850| m850_8(PolymorphicBase) = Chi : total:m850_2, partial:m850_7 -# 851| r851_1(glval) = VariableAddress[d] : -# 851| m851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 -# 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : -# 851| v851_4(void) = Call[PolymorphicDerived] : func:r851_3, this:r851_1 -# 851| m851_5(unknown) = ^CallSideEffect : ~m850_6 -# 851| m851_6(unknown) = Chi : total:m850_6, partial:m851_5 -# 851| m851_7(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 -# 851| m851_8(PolymorphicDerived) = Chi : total:m851_2, partial:m851_7 -# 853| r853_1(glval) = VariableAddress[pb] : -# 853| r853_2(glval) = VariableAddress[b] : -# 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 -# 853| m853_4(PolymorphicBase *) = Store[pb] : &:r853_1, r853_3 -# 854| r854_1(glval) = VariableAddress[pd] : -# 854| r854_2(glval) = VariableAddress[d] : -# 854| r854_3(PolymorphicDerived *) = CopyValue : r854_2 -# 854| m854_4(PolymorphicDerived *) = Store[pd] : &:r854_1, r854_3 -# 857| r857_1(glval) = VariableAddress[pd] : -# 857| r857_2(PolymorphicDerived *) = Load[pd] : &:r857_1, m854_4 -# 857| r857_3(PolymorphicBase *) = CheckedConvertOrNull : r857_2 -# 857| r857_4(glval) = VariableAddress[pb] : -# 857| m857_5(PolymorphicBase *) = Store[pb] : &:r857_4, r857_3 -# 858| r858_1(glval) = VariableAddress[rb] : -# 858| r858_2(glval) = VariableAddress[d] : -# 858| r858_3(glval) = CheckedConvertOrThrow : r858_2 -# 858| r858_4(PolymorphicBase &) = CopyValue : r858_3 -# 858| m858_5(PolymorphicBase &) = Store[rb] : &:r858_1, r858_4 -# 860| r860_1(glval) = VariableAddress[pb] : -# 860| r860_2(PolymorphicBase *) = Load[pb] : &:r860_1, m857_5 -# 860| r860_3(PolymorphicDerived *) = CheckedConvertOrNull : r860_2 -# 860| r860_4(glval) = VariableAddress[pd] : -# 860| m860_5(PolymorphicDerived *) = Store[pd] : &:r860_4, r860_3 -# 861| r861_1(glval) = VariableAddress[rd] : -# 861| r861_2(glval) = VariableAddress[b] : -# 861| r861_3(glval) = CheckedConvertOrThrow : r861_2 -# 861| r861_4(PolymorphicDerived &) = CopyValue : r861_3 -# 861| m861_5(PolymorphicDerived &) = Store[rd] : &:r861_1, r861_4 -# 863| r863_1(glval) = VariableAddress[pv] : -# 863| r863_2(glval) = VariableAddress[pb] : -# 863| r863_3(PolymorphicBase *) = Load[pb] : &:r863_2, m857_5 -# 863| r863_4(void *) = CompleteObjectAddress : r863_3 -# 863| m863_5(void *) = Store[pv] : &:r863_1, r863_4 -# 864| r864_1(glval) = VariableAddress[pcv] : -# 864| r864_2(glval) = VariableAddress[pd] : -# 864| r864_3(PolymorphicDerived *) = Load[pd] : &:r864_2, m860_5 -# 864| r864_4(void *) = CompleteObjectAddress : r864_3 -# 864| m864_5(void *) = Store[pcv] : &:r864_1, r864_4 -# 865| v865_1(void) = NoOp : -# 849| v849_5(void) = ReturnVoid : -# 849| v849_6(void) = AliasedUse : ~m851_6 -# 849| v849_7(void) = ExitFunction : +# 849| v849_1(void) = EnterFunction : +# 849| m849_2(unknown) = AliasedDefinition : +# 849| m849_3(unknown) = InitializeNonLocal : +# 849| m849_4(unknown) = Chi : total:m849_2, partial:m849_3 +# 850| r850_1(glval) = VariableAddress[b] : +# 850| m850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 +# 850| r850_3(glval) = FunctionAddress[PolymorphicBase] : +# 850| v850_4(void) = Call[PolymorphicBase] : func:r850_3, this:r850_1 +# 850| m850_5(unknown) = ^CallSideEffect : ~m849_4 +# 850| m850_6(unknown) = Chi : total:m849_4, partial:m850_5 +# 850| m850_7(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 +# 850| m850_8(PolymorphicBase) = Chi : total:m850_2, partial:m850_7 +# 851| r851_1(glval) = VariableAddress[d] : +# 851| m851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 +# 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : +# 851| v851_4(void) = Call[PolymorphicDerived] : func:r851_3, this:r851_1 +# 851| m851_5(unknown) = ^CallSideEffect : ~m850_6 +# 851| m851_6(unknown) = Chi : total:m850_6, partial:m851_5 +# 851| m851_7(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 +# 851| m851_8(PolymorphicDerived) = Chi : total:m851_2, partial:m851_7 +# 853| r853_1(glval) = VariableAddress[pb] : +# 853| r853_2(glval) = VariableAddress[b] : +# 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 +# 853| m853_4(PolymorphicBase *) = Store[pb] : &:r853_1, r853_3 +# 854| r854_1(glval) = VariableAddress[pd] : +# 854| r854_2(glval) = VariableAddress[d] : +# 854| r854_3(PolymorphicDerived *) = CopyValue : r854_2 +# 854| m854_4(PolymorphicDerived *) = Store[pd] : &:r854_1, r854_3 +# 857| r857_1(glval) = VariableAddress[pd] : +# 857| r857_2(PolymorphicDerived *) = Load[pd] : &:r857_1, m854_4 +# 857| r857_3(PolymorphicBase *) = CheckedConvertOrNull : r857_2 +# 857| r857_4(glval) = VariableAddress[pb] : +# 857| m857_5(PolymorphicBase *) = Store[pb] : &:r857_4, r857_3 +# 858| r858_1(glval) = VariableAddress[rb] : +# 858| r858_2(glval) = VariableAddress[d] : +# 858| r858_3(glval) = CheckedConvertOrThrow : r858_2 +# 858| r858_4(PolymorphicBase &) = CopyValue : r858_3 +# 858| m858_5(PolymorphicBase &) = Store[rb] : &:r858_1, r858_4 +# 860| r860_1(glval) = VariableAddress[pb] : +# 860| r860_2(PolymorphicBase *) = Load[pb] : &:r860_1, m857_5 +# 860| r860_3(PolymorphicDerived *) = CheckedConvertOrNull : r860_2 +# 860| r860_4(glval) = VariableAddress[pd] : +# 860| m860_5(PolymorphicDerived *) = Store[pd] : &:r860_4, r860_3 +# 861| r861_1(glval) = VariableAddress[rd] : +# 861| r861_2(glval) = VariableAddress[b] : +# 861| r861_3(glval) = CheckedConvertOrThrow : r861_2 +# 861| r861_4(PolymorphicDerived &) = CopyValue : r861_3 +# 861| m861_5(PolymorphicDerived &) = Store[rd] : &:r861_1, r861_4 +# 863| r863_1(glval) = VariableAddress[pv] : +# 863| r863_2(glval) = VariableAddress[pb] : +# 863| r863_3(PolymorphicBase *) = Load[pb] : &:r863_2, m857_5 +# 863| r863_4(void *) = CompleteObjectAddress : r863_3 +# 863| m863_5(void *) = Store[pv] : &:r863_1, r863_4 +# 864| r864_1(glval) = VariableAddress[pcv] : +# 864| r864_2(glval) = VariableAddress[pd] : +# 864| r864_3(PolymorphicDerived *) = Load[pd] : &:r864_2, m860_5 +# 864| r864_4(void *) = CompleteObjectAddress : r864_3 +# 864| m864_5(void *) = Store[pcv] : &:r864_1, r864_4 +# 865| v865_1(void) = NoOp : +# 865| r865_2(glval) = VariableAddress[d] : +# 865| r865_3(glval) = FunctionAddress[~PolymorphicDerived] : +# 865| v865_4(void) = Call[~PolymorphicDerived] : func:r865_3, this:r865_2 +# 865| m865_5(unknown) = ^CallSideEffect : ~m851_6 +# 865| m865_6(unknown) = Chi : total:m851_6, partial:m865_5 +# 865| v865_7(void) = ^IndirectReadSideEffect[-1] : &:r865_2, m851_8 +# 865| m865_8(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r865_2 +# 865| m865_9(PolymorphicDerived) = Chi : total:m851_8, partial:m865_8 +# 865| r865_10(glval) = VariableAddress[b] : +# 865| r865_11(glval) = FunctionAddress[~PolymorphicBase] : +# 865| v865_12(void) = Call[~PolymorphicBase] : func:r865_11, this:r865_10 +# 865| m865_13(unknown) = ^CallSideEffect : ~m865_6 +# 865| m865_14(unknown) = Chi : total:m865_6, partial:m865_13 +# 865| v865_15(void) = ^IndirectReadSideEffect[-1] : &:r865_10, m850_8 +# 865| m865_16(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r865_10 +# 865| m865_17(PolymorphicBase) = Chi : total:m850_8, partial:m865_16 +# 849| v849_5(void) = ReturnVoid : +# 849| v849_6(void) = AliasedUse : ~m865_14 +# 849| v849_7(void) = ExitFunction : # 867| void String::String() # 867| Block 0 @@ -6187,184 +6259,200 @@ ir.cpp: # 1040| void Lambda(int, String const&) # 1040| Block 0 -# 1040| v1040_1(void) = EnterFunction : -# 1040| m1040_2(unknown) = AliasedDefinition : -# 1040| m1040_3(unknown) = InitializeNonLocal : -# 1040| m1040_4(unknown) = Chi : total:m1040_2, partial:m1040_3 -# 1040| r1040_5(glval) = VariableAddress[x] : -# 1040| m1040_6(int) = InitializeParameter[x] : &:r1040_5 -# 1040| r1040_7(glval) = VariableAddress[s] : -# 1040| m1040_8(String &) = InitializeParameter[s] : &:r1040_7 -# 1040| r1040_9(String &) = Load[s] : &:r1040_7, m1040_8 -# 1040| m1040_10(unknown) = InitializeIndirection[s] : &:r1040_9 -# 1041| r1041_1(glval) = VariableAddress[lambda_empty] : -# 1041| r1041_2(glval) = VariableAddress[#temp1041:23] : -# 1041| m1041_3(decltype([...](...){...})) = Uninitialized[#temp1041:23] : &:r1041_2 -# 1041| r1041_4(decltype([...](...){...})) = Load[#temp1041:23] : &:r1041_2, m1041_3 -# 1041| m1041_5(decltype([...](...){...})) = Store[lambda_empty] : &:r1041_1, r1041_4 -# 1042| r1042_1(char) = Constant[65] : -# 1043| r1043_1(glval) = VariableAddress[lambda_ref] : -# 1043| r1043_2(glval) = VariableAddress[#temp1043:20] : -# 1043| m1043_3(decltype([...](...){...})) = Uninitialized[#temp1043:20] : &:r1043_2 -# 1043| r1043_4(glval) = FieldAddress[s] : r1043_2 -# 1043| r1043_5(glval) = VariableAddress[s] : -# 1043| r1043_6(String &) = Load[s] : &:r1043_5, m1040_8 -# 1043| r1043_7(glval) = CopyValue : r1043_6 -# 1043| r1043_8(String &) = CopyValue : r1043_7 -# 1043| m1043_9(String &) = Store[?] : &:r1043_4, r1043_8 -# 1043| m1043_10(decltype([...](...){...})) = Chi : total:m1043_3, partial:m1043_9 -# 1043| r1043_11(glval) = FieldAddress[x] : r1043_2 -# 1043| r1043_12(glval) = VariableAddress[x] : -#-----| r0_1(int &) = CopyValue : r1043_12 -#-----| m0_2(int &) = Store[?] : &:r1043_11, r0_1 -#-----| m0_3(decltype([...](...){...})) = Chi : total:m1043_10, partial:m0_2 -# 1043| r1043_13(decltype([...](...){...})) = Load[#temp1043:20] : &:r1043_2, m0_3 -# 1043| m1043_14(decltype([...](...){...})) = Store[lambda_ref] : &:r1043_1, r1043_13 -# 1044| r1044_1(glval) = VariableAddress[lambda_ref] : -# 1044| r1044_2(glval) = Convert : r1044_1 -# 1044| r1044_3(glval) = FunctionAddress[operator()] : -# 1044| r1044_4(float) = Constant[1.0] : -# 1044| r1044_5(char) = Call[operator()] : func:r1044_3, this:r1044_2, 0:r1044_4 -# 1044| m1044_6(unknown) = ^CallSideEffect : ~m1040_4 -# 1044| m1044_7(unknown) = Chi : total:m1040_4, partial:m1044_6 -# 1044| v1044_8(void) = ^IndirectReadSideEffect[-1] : &:r1044_2, m1043_14 -# 1045| r1045_1(glval) = VariableAddress[lambda_val] : -# 1045| r1045_2(glval) = VariableAddress[#temp1045:20] : -# 1045| m1045_3(decltype([...](...){...})) = Uninitialized[#temp1045:20] : &:r1045_2 -# 1045| r1045_4(glval) = FieldAddress[s] : r1045_2 -# 1045| r1045_5(glval) = FunctionAddress[String] : -# 1045| v1045_6(void) = Call[String] : func:r1045_5, this:r1045_4 -# 1045| m1045_7(unknown) = ^CallSideEffect : ~m1044_7 -# 1045| m1045_8(unknown) = Chi : total:m1044_7, partial:m1045_7 -# 1045| m1045_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_4 -# 1045| m1045_10(decltype([...](...){...})) = Chi : total:m1045_3, partial:m1045_9 -# 1045| r1045_11(glval) = FieldAddress[x] : r1045_2 -# 1045| r1045_12(glval) = VariableAddress[x] : -# 1045| r1045_13(int) = Load[x] : &:r1045_12, m1040_6 -# 1045| m1045_14(int) = Store[?] : &:r1045_11, r1045_13 -# 1045| m1045_15(decltype([...](...){...})) = Chi : total:m1045_10, partial:m1045_14 -# 1045| r1045_16(decltype([...](...){...})) = Load[#temp1045:20] : &:r1045_2, m1045_15 -# 1045| m1045_17(decltype([...](...){...})) = Store[lambda_val] : &:r1045_1, r1045_16 -# 1046| r1046_1(glval) = VariableAddress[lambda_val] : -# 1046| r1046_2(glval) = Convert : r1046_1 -# 1046| r1046_3(glval) = FunctionAddress[operator()] : -# 1046| r1046_4(float) = Constant[2.0] : -# 1046| r1046_5(char) = Call[operator()] : func:r1046_3, this:r1046_2, 0:r1046_4 -# 1046| m1046_6(unknown) = ^CallSideEffect : ~m1045_8 -# 1046| m1046_7(unknown) = Chi : total:m1045_8, partial:m1046_6 -# 1046| v1046_8(void) = ^IndirectReadSideEffect[-1] : &:r1046_2, m1045_17 -# 1047| r1047_1(glval) = VariableAddress[lambda_ref_explicit] : -# 1047| r1047_2(glval) = VariableAddress[#temp1047:29] : -# 1047| m1047_3(decltype([...](...){...})) = Uninitialized[#temp1047:29] : &:r1047_2 -# 1047| r1047_4(glval) = FieldAddress[s] : r1047_2 -# 1047| r1047_5(glval) = VariableAddress[s] : -# 1047| r1047_6(String &) = Load[s] : &:r1047_5, m1040_8 -# 1047| r1047_7(glval) = CopyValue : r1047_6 -# 1047| r1047_8(String &) = CopyValue : r1047_7 -# 1047| m1047_9(String &) = Store[?] : &:r1047_4, r1047_8 -# 1047| r1047_10(decltype([...](...){...})) = Load[#temp1047:29] : &:r1047_2, ~m1047_9 -# 1047| m1047_11(decltype([...](...){...})) = Store[lambda_ref_explicit] : &:r1047_1, r1047_10 -# 1048| r1048_1(glval) = VariableAddress[lambda_ref_explicit] : -# 1048| r1048_2(glval) = Convert : r1048_1 -# 1048| r1048_3(glval) = FunctionAddress[operator()] : -# 1048| r1048_4(float) = Constant[3.0] : -# 1048| r1048_5(char) = Call[operator()] : func:r1048_3, this:r1048_2, 0:r1048_4 -# 1048| m1048_6(unknown) = ^CallSideEffect : ~m1046_7 -# 1048| m1048_7(unknown) = Chi : total:m1046_7, partial:m1048_6 -# 1048| v1048_8(void) = ^IndirectReadSideEffect[-1] : &:r1048_2, m1047_11 -# 1049| r1049_1(glval) = VariableAddress[lambda_val_explicit] : -# 1049| r1049_2(glval) = VariableAddress[#temp1049:29] : -# 1049| m1049_3(decltype([...](...){...})) = Uninitialized[#temp1049:29] : &:r1049_2 -# 1049| r1049_4(glval) = FieldAddress[s] : r1049_2 -# 1049| r1049_5(glval) = FunctionAddress[String] : -# 1049| v1049_6(void) = Call[String] : func:r1049_5, this:r1049_4 -# 1049| m1049_7(unknown) = ^CallSideEffect : ~m1048_7 -# 1049| m1049_8(unknown) = Chi : total:m1048_7, partial:m1049_7 -# 1049| m1049_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1049_4 -# 1049| m1049_10(decltype([...](...){...})) = Chi : total:m1049_3, partial:m1049_9 -# 1049| r1049_11(decltype([...](...){...})) = Load[#temp1049:29] : &:r1049_2, m1049_10 -# 1049| m1049_12(decltype([...](...){...})) = Store[lambda_val_explicit] : &:r1049_1, r1049_11 -# 1050| r1050_1(glval) = VariableAddress[lambda_val_explicit] : -# 1050| r1050_2(glval) = Convert : r1050_1 -# 1050| r1050_3(glval) = FunctionAddress[operator()] : -# 1050| r1050_4(float) = Constant[4.0] : -# 1050| r1050_5(char) = Call[operator()] : func:r1050_3, this:r1050_2, 0:r1050_4 -# 1050| m1050_6(unknown) = ^CallSideEffect : ~m1049_8 -# 1050| m1050_7(unknown) = Chi : total:m1049_8, partial:m1050_6 -# 1050| v1050_8(void) = ^IndirectReadSideEffect[-1] : &:r1050_2, m1049_12 -# 1051| r1051_1(glval) = VariableAddress[lambda_mixed_explicit] : -# 1051| r1051_2(glval) = VariableAddress[#temp1051:31] : -# 1051| m1051_3(decltype([...](...){...})) = Uninitialized[#temp1051:31] : &:r1051_2 -# 1051| r1051_4(glval) = FieldAddress[s] : r1051_2 -# 1051| r1051_5(glval) = VariableAddress[s] : -# 1051| r1051_6(String &) = Load[s] : &:r1051_5, m1040_8 -# 1051| r1051_7(glval) = CopyValue : r1051_6 -# 1051| r1051_8(String &) = CopyValue : r1051_7 -# 1051| m1051_9(String &) = Store[?] : &:r1051_4, r1051_8 -# 1051| m1051_10(decltype([...](...){...})) = Chi : total:m1051_3, partial:m1051_9 -# 1051| r1051_11(glval) = FieldAddress[x] : r1051_2 -# 1051| r1051_12(glval) = VariableAddress[x] : -# 1051| r1051_13(int) = Load[x] : &:r1051_12, m1040_6 -# 1051| m1051_14(int) = Store[?] : &:r1051_11, r1051_13 -# 1051| m1051_15(decltype([...](...){...})) = Chi : total:m1051_10, partial:m1051_14 -# 1051| r1051_16(decltype([...](...){...})) = Load[#temp1051:31] : &:r1051_2, m1051_15 -# 1051| m1051_17(decltype([...](...){...})) = Store[lambda_mixed_explicit] : &:r1051_1, r1051_16 -# 1052| r1052_1(glval) = VariableAddress[lambda_mixed_explicit] : -# 1052| r1052_2(glval) = Convert : r1052_1 -# 1052| r1052_3(glval) = FunctionAddress[operator()] : -# 1052| r1052_4(float) = Constant[5.0] : -# 1052| r1052_5(char) = Call[operator()] : func:r1052_3, this:r1052_2, 0:r1052_4 -# 1052| m1052_6(unknown) = ^CallSideEffect : ~m1050_7 -# 1052| m1052_7(unknown) = Chi : total:m1050_7, partial:m1052_6 -# 1052| v1052_8(void) = ^IndirectReadSideEffect[-1] : &:r1052_2, m1051_17 -# 1053| r1053_1(glval) = VariableAddress[r] : -# 1053| r1053_2(glval) = VariableAddress[x] : -# 1053| r1053_3(int) = Load[x] : &:r1053_2, m1040_6 -# 1053| r1053_4(int) = Constant[1] : -# 1053| r1053_5(int) = Sub : r1053_3, r1053_4 -# 1053| m1053_6(int) = Store[r] : &:r1053_1, r1053_5 -# 1054| r1054_1(glval) = VariableAddress[lambda_inits] : -# 1054| r1054_2(glval) = VariableAddress[#temp1054:22] : -# 1054| m1054_3(decltype([...](...){...})) = Uninitialized[#temp1054:22] : &:r1054_2 -# 1054| r1054_4(glval) = FieldAddress[s] : r1054_2 -# 1054| r1054_5(glval) = VariableAddress[s] : -# 1054| r1054_6(String &) = Load[s] : &:r1054_5, m1040_8 -# 1054| r1054_7(glval) = CopyValue : r1054_6 -# 1054| r1054_8(String &) = CopyValue : r1054_7 -# 1054| m1054_9(String &) = Store[?] : &:r1054_4, r1054_8 -# 1054| m1054_10(decltype([...](...){...})) = Chi : total:m1054_3, partial:m1054_9 -# 1054| r1054_11(glval) = FieldAddress[x] : r1054_2 -# 1054| r1054_12(glval) = VariableAddress[x] : -# 1054| r1054_13(int) = Load[x] : &:r1054_12, m1040_6 -# 1054| m1054_14(int) = Store[?] : &:r1054_11, r1054_13 -# 1054| m1054_15(decltype([...](...){...})) = Chi : total:m1054_10, partial:m1054_14 -# 1054| r1054_16(glval) = FieldAddress[i] : r1054_2 -# 1054| r1054_17(glval) = VariableAddress[x] : -# 1054| r1054_18(int) = Load[x] : &:r1054_17, m1040_6 -# 1054| r1054_19(int) = Constant[1] : -# 1054| r1054_20(int) = Add : r1054_18, r1054_19 -# 1054| m1054_21(int) = Store[?] : &:r1054_16, r1054_20 -# 1054| m1054_22(decltype([...](...){...})) = Chi : total:m1054_15, partial:m1054_21 -# 1054| r1054_23(glval) = FieldAddress[j] : r1054_2 -# 1054| r1054_24(glval) = VariableAddress[r] : -# 1054| r1054_25(int &) = CopyValue : r1054_24 -# 1054| m1054_26(int &) = Store[?] : &:r1054_23, r1054_25 -# 1054| m1054_27(decltype([...](...){...})) = Chi : total:m1054_22, partial:m1054_26 -# 1054| r1054_28(decltype([...](...){...})) = Load[#temp1054:22] : &:r1054_2, m1054_27 -# 1054| m1054_29(decltype([...](...){...})) = Store[lambda_inits] : &:r1054_1, r1054_28 -# 1055| r1055_1(glval) = VariableAddress[lambda_inits] : -# 1055| r1055_2(glval) = Convert : r1055_1 -# 1055| r1055_3(glval) = FunctionAddress[operator()] : -# 1055| r1055_4(float) = Constant[6.0] : -# 1055| r1055_5(char) = Call[operator()] : func:r1055_3, this:r1055_2, 0:r1055_4 -# 1055| m1055_6(unknown) = ^CallSideEffect : ~m1052_7 -# 1055| m1055_7(unknown) = Chi : total:m1052_7, partial:m1055_6 -# 1055| v1055_8(void) = ^IndirectReadSideEffect[-1] : &:r1055_2, m1054_29 -# 1056| v1056_1(void) = NoOp : -# 1040| v1040_11(void) = ReturnIndirection[s] : &:r1040_9, m1040_10 -# 1040| v1040_12(void) = ReturnVoid : -# 1040| v1040_13(void) = AliasedUse : ~m1055_7 -# 1040| v1040_14(void) = ExitFunction : +# 1040| v1040_1(void) = EnterFunction : +# 1040| m1040_2(unknown) = AliasedDefinition : +# 1040| m1040_3(unknown) = InitializeNonLocal : +# 1040| m1040_4(unknown) = Chi : total:m1040_2, partial:m1040_3 +# 1040| r1040_5(glval) = VariableAddress[x] : +# 1040| m1040_6(int) = InitializeParameter[x] : &:r1040_5 +# 1040| r1040_7(glval) = VariableAddress[s] : +# 1040| m1040_8(String &) = InitializeParameter[s] : &:r1040_7 +# 1040| r1040_9(String &) = Load[s] : &:r1040_7, m1040_8 +# 1040| m1040_10(unknown) = InitializeIndirection[s] : &:r1040_9 +# 1041| r1041_1(glval) = VariableAddress[lambda_empty] : +# 1041| r1041_2(glval) = VariableAddress[#temp1041:23] : +# 1041| m1041_3(decltype([...](...){...})) = Uninitialized[#temp1041:23] : &:r1041_2 +# 1041| r1041_4(decltype([...](...){...})) = Load[#temp1041:23] : &:r1041_2, m1041_3 +# 1041| m1041_5(decltype([...](...){...})) = Store[lambda_empty] : &:r1041_1, r1041_4 +# 1042| r1042_1(char) = Constant[65] : +# 1043| r1043_1(glval) = VariableAddress[lambda_ref] : +# 1043| r1043_2(glval) = VariableAddress[#temp1043:20] : +# 1043| m1043_3(decltype([...](...){...})) = Uninitialized[#temp1043:20] : &:r1043_2 +# 1043| r1043_4(glval) = FieldAddress[s] : r1043_2 +# 1043| r1043_5(glval) = VariableAddress[s] : +# 1043| r1043_6(String &) = Load[s] : &:r1043_5, m1040_8 +# 1043| r1043_7(glval) = CopyValue : r1043_6 +# 1043| r1043_8(String &) = CopyValue : r1043_7 +# 1043| m1043_9(String &) = Store[?] : &:r1043_4, r1043_8 +# 1043| m1043_10(decltype([...](...){...})) = Chi : total:m1043_3, partial:m1043_9 +# 1043| r1043_11(glval) = FieldAddress[x] : r1043_2 +# 1043| r1043_12(glval) = VariableAddress[x] : +#-----| r0_1(int &) = CopyValue : r1043_12 +#-----| m0_2(int &) = Store[?] : &:r1043_11, r0_1 +#-----| m0_3(decltype([...](...){...})) = Chi : total:m1043_10, partial:m0_2 +# 1043| r1043_13(decltype([...](...){...})) = Load[#temp1043:20] : &:r1043_2, m0_3 +# 1043| m1043_14(decltype([...](...){...})) = Store[lambda_ref] : &:r1043_1, r1043_13 +# 1044| r1044_1(glval) = VariableAddress[lambda_ref] : +# 1044| r1044_2(glval) = Convert : r1044_1 +# 1044| r1044_3(glval) = FunctionAddress[operator()] : +# 1044| r1044_4(float) = Constant[1.0] : +# 1044| r1044_5(char) = Call[operator()] : func:r1044_3, this:r1044_2, 0:r1044_4 +# 1044| m1044_6(unknown) = ^CallSideEffect : ~m1040_4 +# 1044| m1044_7(unknown) = Chi : total:m1040_4, partial:m1044_6 +# 1044| v1044_8(void) = ^IndirectReadSideEffect[-1] : &:r1044_2, m1043_14 +# 1045| r1045_1(glval) = VariableAddress[lambda_val] : +# 1045| r1045_2(glval) = VariableAddress[#temp1045:20] : +# 1045| m1045_3(decltype([...](...){...})) = Uninitialized[#temp1045:20] : &:r1045_2 +# 1045| r1045_4(glval) = FieldAddress[s] : r1045_2 +# 1045| r1045_5(glval) = FunctionAddress[String] : +# 1045| v1045_6(void) = Call[String] : func:r1045_5, this:r1045_4 +# 1045| m1045_7(unknown) = ^CallSideEffect : ~m1044_7 +# 1045| m1045_8(unknown) = Chi : total:m1044_7, partial:m1045_7 +# 1045| m1045_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_4 +# 1045| m1045_10(decltype([...](...){...})) = Chi : total:m1045_3, partial:m1045_9 +# 1045| r1045_11(glval) = FieldAddress[x] : r1045_2 +# 1045| r1045_12(glval) = VariableAddress[x] : +# 1045| r1045_13(int) = Load[x] : &:r1045_12, m1040_6 +# 1045| m1045_14(int) = Store[?] : &:r1045_11, r1045_13 +# 1045| m1045_15(decltype([...](...){...})) = Chi : total:m1045_10, partial:m1045_14 +# 1045| r1045_16(decltype([...](...){...})) = Load[#temp1045:20] : &:r1045_2, m1045_15 +# 1045| m1045_17(decltype([...](...){...})) = Store[lambda_val] : &:r1045_1, r1045_16 +# 1046| r1046_1(glval) = VariableAddress[lambda_val] : +# 1046| r1046_2(glval) = Convert : r1046_1 +# 1046| r1046_3(glval) = FunctionAddress[operator()] : +# 1046| r1046_4(float) = Constant[2.0] : +# 1046| r1046_5(char) = Call[operator()] : func:r1046_3, this:r1046_2, 0:r1046_4 +# 1046| m1046_6(unknown) = ^CallSideEffect : ~m1045_8 +# 1046| m1046_7(unknown) = Chi : total:m1045_8, partial:m1046_6 +# 1046| v1046_8(void) = ^IndirectReadSideEffect[-1] : &:r1046_2, m1045_17 +# 1047| r1047_1(glval) = VariableAddress[lambda_ref_explicit] : +# 1047| r1047_2(glval) = VariableAddress[#temp1047:29] : +# 1047| m1047_3(decltype([...](...){...})) = Uninitialized[#temp1047:29] : &:r1047_2 +# 1047| r1047_4(glval) = FieldAddress[s] : r1047_2 +# 1047| r1047_5(glval) = VariableAddress[s] : +# 1047| r1047_6(String &) = Load[s] : &:r1047_5, m1040_8 +# 1047| r1047_7(glval) = CopyValue : r1047_6 +# 1047| r1047_8(String &) = CopyValue : r1047_7 +# 1047| m1047_9(String &) = Store[?] : &:r1047_4, r1047_8 +# 1047| r1047_10(decltype([...](...){...})) = Load[#temp1047:29] : &:r1047_2, ~m1047_9 +# 1047| m1047_11(decltype([...](...){...})) = Store[lambda_ref_explicit] : &:r1047_1, r1047_10 +# 1048| r1048_1(glval) = VariableAddress[lambda_ref_explicit] : +# 1048| r1048_2(glval) = Convert : r1048_1 +# 1048| r1048_3(glval) = FunctionAddress[operator()] : +# 1048| r1048_4(float) = Constant[3.0] : +# 1048| r1048_5(char) = Call[operator()] : func:r1048_3, this:r1048_2, 0:r1048_4 +# 1048| m1048_6(unknown) = ^CallSideEffect : ~m1046_7 +# 1048| m1048_7(unknown) = Chi : total:m1046_7, partial:m1048_6 +# 1048| v1048_8(void) = ^IndirectReadSideEffect[-1] : &:r1048_2, m1047_11 +# 1049| r1049_1(glval) = VariableAddress[lambda_val_explicit] : +# 1049| r1049_2(glval) = VariableAddress[#temp1049:29] : +# 1049| m1049_3(decltype([...](...){...})) = Uninitialized[#temp1049:29] : &:r1049_2 +# 1049| r1049_4(glval) = FieldAddress[s] : r1049_2 +# 1049| r1049_5(glval) = FunctionAddress[String] : +# 1049| v1049_6(void) = Call[String] : func:r1049_5, this:r1049_4 +# 1049| m1049_7(unknown) = ^CallSideEffect : ~m1048_7 +# 1049| m1049_8(unknown) = Chi : total:m1048_7, partial:m1049_7 +# 1049| m1049_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1049_4 +# 1049| m1049_10(decltype([...](...){...})) = Chi : total:m1049_3, partial:m1049_9 +# 1049| r1049_11(decltype([...](...){...})) = Load[#temp1049:29] : &:r1049_2, m1049_10 +# 1049| m1049_12(decltype([...](...){...})) = Store[lambda_val_explicit] : &:r1049_1, r1049_11 +# 1050| r1050_1(glval) = VariableAddress[lambda_val_explicit] : +# 1050| r1050_2(glval) = Convert : r1050_1 +# 1050| r1050_3(glval) = FunctionAddress[operator()] : +# 1050| r1050_4(float) = Constant[4.0] : +# 1050| r1050_5(char) = Call[operator()] : func:r1050_3, this:r1050_2, 0:r1050_4 +# 1050| m1050_6(unknown) = ^CallSideEffect : ~m1049_8 +# 1050| m1050_7(unknown) = Chi : total:m1049_8, partial:m1050_6 +# 1050| v1050_8(void) = ^IndirectReadSideEffect[-1] : &:r1050_2, m1049_12 +# 1051| r1051_1(glval) = VariableAddress[lambda_mixed_explicit] : +# 1051| r1051_2(glval) = VariableAddress[#temp1051:31] : +# 1051| m1051_3(decltype([...](...){...})) = Uninitialized[#temp1051:31] : &:r1051_2 +# 1051| r1051_4(glval) = FieldAddress[s] : r1051_2 +# 1051| r1051_5(glval) = VariableAddress[s] : +# 1051| r1051_6(String &) = Load[s] : &:r1051_5, m1040_8 +# 1051| r1051_7(glval) = CopyValue : r1051_6 +# 1051| r1051_8(String &) = CopyValue : r1051_7 +# 1051| m1051_9(String &) = Store[?] : &:r1051_4, r1051_8 +# 1051| m1051_10(decltype([...](...){...})) = Chi : total:m1051_3, partial:m1051_9 +# 1051| r1051_11(glval) = FieldAddress[x] : r1051_2 +# 1051| r1051_12(glval) = VariableAddress[x] : +# 1051| r1051_13(int) = Load[x] : &:r1051_12, m1040_6 +# 1051| m1051_14(int) = Store[?] : &:r1051_11, r1051_13 +# 1051| m1051_15(decltype([...](...){...})) = Chi : total:m1051_10, partial:m1051_14 +# 1051| r1051_16(decltype([...](...){...})) = Load[#temp1051:31] : &:r1051_2, m1051_15 +# 1051| m1051_17(decltype([...](...){...})) = Store[lambda_mixed_explicit] : &:r1051_1, r1051_16 +# 1052| r1052_1(glval) = VariableAddress[lambda_mixed_explicit] : +# 1052| r1052_2(glval) = Convert : r1052_1 +# 1052| r1052_3(glval) = FunctionAddress[operator()] : +# 1052| r1052_4(float) = Constant[5.0] : +# 1052| r1052_5(char) = Call[operator()] : func:r1052_3, this:r1052_2, 0:r1052_4 +# 1052| m1052_6(unknown) = ^CallSideEffect : ~m1050_7 +# 1052| m1052_7(unknown) = Chi : total:m1050_7, partial:m1052_6 +# 1052| v1052_8(void) = ^IndirectReadSideEffect[-1] : &:r1052_2, m1051_17 +# 1053| r1053_1(glval) = VariableAddress[r] : +# 1053| r1053_2(glval) = VariableAddress[x] : +# 1053| r1053_3(int) = Load[x] : &:r1053_2, m1040_6 +# 1053| r1053_4(int) = Constant[1] : +# 1053| r1053_5(int) = Sub : r1053_3, r1053_4 +# 1053| m1053_6(int) = Store[r] : &:r1053_1, r1053_5 +# 1054| r1054_1(glval) = VariableAddress[lambda_inits] : +# 1054| r1054_2(glval) = VariableAddress[#temp1054:22] : +# 1054| m1054_3(decltype([...](...){...})) = Uninitialized[#temp1054:22] : &:r1054_2 +# 1054| r1054_4(glval) = FieldAddress[s] : r1054_2 +# 1054| r1054_5(glval) = VariableAddress[s] : +# 1054| r1054_6(String &) = Load[s] : &:r1054_5, m1040_8 +# 1054| r1054_7(glval) = CopyValue : r1054_6 +# 1054| r1054_8(String &) = CopyValue : r1054_7 +# 1054| m1054_9(String &) = Store[?] : &:r1054_4, r1054_8 +# 1054| m1054_10(decltype([...](...){...})) = Chi : total:m1054_3, partial:m1054_9 +# 1054| r1054_11(glval) = FieldAddress[x] : r1054_2 +# 1054| r1054_12(glval) = VariableAddress[x] : +# 1054| r1054_13(int) = Load[x] : &:r1054_12, m1040_6 +# 1054| m1054_14(int) = Store[?] : &:r1054_11, r1054_13 +# 1054| m1054_15(decltype([...](...){...})) = Chi : total:m1054_10, partial:m1054_14 +# 1054| r1054_16(glval) = FieldAddress[i] : r1054_2 +# 1054| r1054_17(glval) = VariableAddress[x] : +# 1054| r1054_18(int) = Load[x] : &:r1054_17, m1040_6 +# 1054| r1054_19(int) = Constant[1] : +# 1054| r1054_20(int) = Add : r1054_18, r1054_19 +# 1054| m1054_21(int) = Store[?] : &:r1054_16, r1054_20 +# 1054| m1054_22(decltype([...](...){...})) = Chi : total:m1054_15, partial:m1054_21 +# 1054| r1054_23(glval) = FieldAddress[j] : r1054_2 +# 1054| r1054_24(glval) = VariableAddress[r] : +# 1054| r1054_25(int &) = CopyValue : r1054_24 +# 1054| m1054_26(int &) = Store[?] : &:r1054_23, r1054_25 +# 1054| m1054_27(decltype([...](...){...})) = Chi : total:m1054_22, partial:m1054_26 +# 1054| r1054_28(decltype([...](...){...})) = Load[#temp1054:22] : &:r1054_2, m1054_27 +# 1054| m1054_29(decltype([...](...){...})) = Store[lambda_inits] : &:r1054_1, r1054_28 +# 1055| r1055_1(glval) = VariableAddress[lambda_inits] : +# 1055| r1055_2(glval) = Convert : r1055_1 +# 1055| r1055_3(glval) = FunctionAddress[operator()] : +# 1055| r1055_4(float) = Constant[6.0] : +# 1055| r1055_5(char) = Call[operator()] : func:r1055_3, this:r1055_2, 0:r1055_4 +# 1055| m1055_6(unknown) = ^CallSideEffect : ~m1052_7 +# 1055| m1055_7(unknown) = Chi : total:m1052_7, partial:m1055_6 +# 1055| v1055_8(void) = ^IndirectReadSideEffect[-1] : &:r1055_2, m1054_29 +# 1056| v1056_1(void) = NoOp : +# 1056| r1056_2(glval) = VariableAddress[lambda_val_explicit] : +# 1056| r1056_3(glval) = FunctionAddress[~] : +# 1056| v1056_4(void) = Call[~] : func:r1056_3, this:r1056_2 +# 1056| m1056_5(unknown) = ^CallSideEffect : ~m1055_7 +# 1056| m1056_6(unknown) = Chi : total:m1055_7, partial:m1056_5 +# 1056| v1056_7(void) = ^IndirectReadSideEffect[-1] : &:r1056_2, m1049_12 +# 1056| m1056_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1056_2 +# 1056| m1056_9(decltype([...](...){...})) = Chi : total:m1049_12, partial:m1056_8 +# 1056| r1056_10(glval) = VariableAddress[lambda_val] : +# 1056| r1056_11(glval) = FunctionAddress[~] : +# 1056| v1056_12(void) = Call[~] : func:r1056_11, this:r1056_10 +# 1056| m1056_13(unknown) = ^CallSideEffect : ~m1056_6 +# 1056| m1056_14(unknown) = Chi : total:m1056_6, partial:m1056_13 +# 1056| v1056_15(void) = ^IndirectReadSideEffect[-1] : &:r1056_10, m1045_17 +# 1056| m1056_16(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1056_10 +# 1056| m1056_17(decltype([...](...){...})) = Chi : total:m1045_17, partial:m1056_16 +# 1040| v1040_11(void) = ReturnIndirection[s] : &:r1040_9, m1040_10 +# 1040| v1040_12(void) = ReturnVoid : +# 1040| v1040_13(void) = AliasedUse : ~m1056_14 +# 1040| v1040_14(void) = ExitFunction : # 1041| void (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::(unnamed constructor)((void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)&&) # 1041| Block 0 @@ -7517,12 +7605,36 @@ ir.cpp: #-----| Goto -> Block 6 # 1244| Block 6 -# 1244| m1244_1(unknown) = Phi : from 4:~m1243_1, from 5:~m1243_17 -# 1244| v1244_2(void) = NoOp : -# 1240| v1240_9(void) = ReturnIndirection[dynamic] : &:r1240_7, m1240_8 -# 1240| v1240_10(void) = ReturnVoid : -# 1240| v1240_11(void) = AliasedUse : ~m1244_1 -# 1240| v1240_12(void) = ExitFunction : +# 1244| m1244_1(unknown) = Phi : from 4:~m1243_1, from 5:~m1243_17 +# 1244| v1244_2(void) = NoOp : +# 1244| r1244_3(glval) = VariableAddress[c] : +# 1244| r1244_4(glval) = FunctionAddress[~String] : +# 1244| v1244_5(void) = Call[~String] : func:r1244_4, this:r1244_3 +# 1244| m1244_6(unknown) = ^CallSideEffect : ~m1244_1 +# 1244| m1244_7(unknown) = Chi : total:m1244_1, partial:m1244_6 +# 1244| v1244_8(void) = ^IndirectReadSideEffect[-1] : &:r1244_3, ~m1244_7 +# 1244| m1244_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1244_3 +# 1244| m1244_10(unknown) = Chi : total:m1244_7, partial:m1244_9 +# 1244| r1244_11(glval) = VariableAddress[b] : +# 1244| r1244_12(glval) = FunctionAddress[~String] : +# 1244| v1244_13(void) = Call[~String] : func:r1244_12, this:r1244_11 +# 1244| m1244_14(unknown) = ^CallSideEffect : ~m1244_10 +# 1244| m1244_15(unknown) = Chi : total:m1244_10, partial:m1244_14 +# 1244| v1244_16(void) = ^IndirectReadSideEffect[-1] : &:r1244_11, ~m1244_15 +# 1244| m1244_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r1244_11 +# 1244| m1244_18(unknown) = Chi : total:m1244_15, partial:m1244_17 +# 1244| r1244_19(glval) = VariableAddress[a] : +# 1244| r1244_20(glval) = FunctionAddress[~String] : +# 1244| v1244_21(void) = Call[~String] : func:r1244_20, this:r1244_19 +# 1244| m1244_22(unknown) = ^CallSideEffect : ~m1244_18 +# 1244| m1244_23(unknown) = Chi : total:m1244_18, partial:m1244_22 +# 1244| v1244_24(void) = ^IndirectReadSideEffect[-1] : &:r1244_19, ~m1244_23 +# 1244| m1244_25(String) = ^IndirectMayWriteSideEffect[-1] : &:r1244_19 +# 1244| m1244_26(unknown) = Chi : total:m1244_23, partial:m1244_25 +# 1240| v1240_9(void) = ReturnIndirection[dynamic] : &:r1240_7, m1240_8 +# 1240| v1240_10(void) = ReturnVoid : +# 1240| v1240_11(void) = AliasedUse : ~m1244_26 +# 1240| v1240_12(void) = ExitFunction : # 1251| void test_strings(char*, char*) # 1251| Block 0 @@ -7717,9 +7829,17 @@ ir.cpp: # 1286| m1286_7(unknown) = ^CallSideEffect : ~m1286_4 # 1286| m1286_8(unknown) = Chi : total:m1286_4, partial:m1286_7 # 1287| v1287_1(void) = NoOp : +# 1287| r1287_2(glval) = VariableAddress[c] : +# 1287| r1287_3(glval) = FunctionAddress[~C] : +# 1287| v1287_4(void) = Call[~C] : func:r1287_3, this:r1287_2 +# 1287| m1287_5(unknown) = ^CallSideEffect : ~m1286_8 +# 1287| m1287_6(unknown) = Chi : total:m1286_8, partial:m1287_5 +# 1287| v1287_7(void) = ^IndirectReadSideEffect[-1] : &:r1287_2, m1271_8 +# 1287| m1287_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r1287_2 +# 1287| m1287_9(C) = Chi : total:m1271_8, partial:m1287_8 # 1270| v1270_11(void) = ReturnIndirection[a_arg] : &:r1270_9, m1281_12 # 1270| v1270_12(void) = ReturnVoid : -# 1270| v1270_13(void) = AliasedUse : ~m1286_8 +# 1270| v1270_13(void) = AliasedUse : ~m1287_6 # 1270| v1270_14(void) = ExitFunction : # 1289| int missingReturnValue(bool, int) @@ -8279,8 +8399,16 @@ ir.cpp: # 1376| m1376_5(unknown) = Chi : total:m1374_11, partial:m1376_4 # 1376| m1376_6(String) = Store[#temp1376:5] : &:r1376_1, r1376_3 # 1377| v1377_1(void) = NoOp : +# 1377| r1377_2(glval) = VariableAddress[s] : +# 1377| r1377_3(glval) = FunctionAddress[~String] : +# 1377| v1377_4(void) = Call[~String] : func:r1377_3, this:r1377_2 +# 1377| m1377_5(unknown) = ^CallSideEffect : ~m1376_5 +# 1377| m1377_6(unknown) = Chi : total:m1376_5, partial:m1377_5 +# 1377| v1377_7(void) = ^IndirectReadSideEffect[-1] : &:r1377_2, m1366_6 +# 1377| m1377_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1377_2 +# 1377| m1377_9(String) = Chi : total:m1366_6, partial:m1377_8 # 1365| v1365_5(void) = ReturnVoid : -# 1365| v1365_6(void) = AliasedUse : ~m1376_5 +# 1365| v1365_6(void) = AliasedUse : ~m1377_6 # 1365| v1365_7(void) = ExitFunction : # 1379| void temporary_destructor_only() @@ -8354,8 +8482,24 @@ ir.cpp: # 1388| m1388_5(unknown) = Chi : total:m1386_10, partial:m1388_4 # 1388| m1388_6(destructor_only) = Store[#temp1388:5] : &:r1388_1, r1388_3 # 1389| v1389_1(void) = NoOp : +# 1389| r1389_2(glval) = VariableAddress[d2] : +# 1389| r1389_3(glval) = FunctionAddress[~destructor_only] : +# 1389| v1389_4(void) = Call[~destructor_only] : func:r1389_3, this:r1389_2 +# 1389| m1389_5(unknown) = ^CallSideEffect : ~m1388_5 +# 1389| m1389_6(unknown) = Chi : total:m1388_5, partial:m1389_5 +# 1389| v1389_7(void) = ^IndirectReadSideEffect[-1] : &:r1389_2, m1382_2 +# 1389| m1389_8(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1389_2 +# 1389| m1389_9(destructor_only) = Chi : total:m1382_2, partial:m1389_8 +# 1389| r1389_10(glval) = VariableAddress[d] : +# 1389| r1389_11(glval) = FunctionAddress[~destructor_only] : +# 1389| v1389_12(void) = Call[~destructor_only] : func:r1389_11, this:r1389_10 +# 1389| m1389_13(unknown) = ^CallSideEffect : ~m1389_6 +# 1389| m1389_14(unknown) = Chi : total:m1389_6, partial:m1389_13 +# 1389| v1389_15(void) = ^IndirectReadSideEffect[-1] : &:r1389_10, m1380_6 +# 1389| m1389_16(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1389_10 +# 1389| m1389_17(destructor_only) = Chi : total:m1380_6, partial:m1389_16 # 1379| v1379_5(void) = ReturnVoid : -# 1379| v1379_6(void) = AliasedUse : ~m1388_5 +# 1379| v1379_6(void) = AliasedUse : ~m1389_14 # 1379| v1379_7(void) = ExitFunction : # 1391| void temporary_copy_constructor() @@ -11110,8 +11254,16 @@ ir.cpp: # 1925| r1925_6(glval) = VariableAddress[z] : # 1925| m1925_7(int) = Store[z] : &:r1925_6, r1925_3 # 1926| v1926_1(void) = NoOp : +# 1926| r1926_2(glval) = VariableAddress[c] : +# 1926| r1926_3(glval) = FunctionAddress[~C] : +# 1926| v1926_4(void) = Call[~C] : func:r1926_3, this:r1926_2 +# 1926| m1926_5(unknown) = ^CallSideEffect : ~m1925_5 +# 1926| m1926_6(unknown) = Chi : total:m1925_5, partial:m1926_5 +# 1926| v1926_7(void) = ^IndirectReadSideEffect[-1] : &:r1926_2, m1919_8 +# 1926| m1926_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r1926_2 +# 1926| m1926_9(C) = Chi : total:m1919_8, partial:m1926_8 # 1918| v1918_5(void) = ReturnVoid : -# 1918| v1918_6(void) = AliasedUse : ~m1925_5 +# 1918| v1918_6(void) = AliasedUse : ~m1926_6 # 1918| v1918_7(void) = ExitFunction : # 1928| void test_double_assign() @@ -11371,8 +11523,16 @@ ir.cpp: # 1993| r1993_3(glval<..(*)(..)>) = VariableAddress[pfn] : # 1993| m1993_4(..(*)(..)) = Store[pfn] : &:r1993_3, r1993_2 # 1994| v1994_1(void) = NoOp : +# 1994| r1994_2(glval) = VariableAddress[c] : +# 1994| r1994_3(glval) = FunctionAddress[~C] : +# 1994| v1994_4(void) = Call[~C] : func:r1994_3, this:r1994_2 +# 1994| m1994_5(unknown) = ^CallSideEffect : ~m1991_6 +# 1994| m1994_6(unknown) = Chi : total:m1991_6, partial:m1994_5 +# 1994| v1994_7(void) = ^IndirectReadSideEffect[-1] : &:r1994_2, m1991_8 +# 1994| m1994_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r1994_2 +# 1994| m1994_9(C) = Chi : total:m1991_8, partial:m1994_8 # 1990| v1990_5(void) = ReturnVoid : -# 1990| v1990_6(void) = AliasedUse : ~m1991_6 +# 1990| v1990_6(void) = AliasedUse : ~m1994_6 # 1990| v1990_7(void) = ExitFunction : # 1996| void TernaryTestInt(bool, int, int, int) @@ -12441,6 +12601,490 @@ ir.cpp: # 2109| v2109_12(void) = AliasedUse : m2109_3 # 2109| v2109_13(void) = ExitFunction : +# 2115| void TryCatchDestructors(bool) +# 2115| Block 0 +# 2115| v2115_1(void) = EnterFunction : +# 2115| m2115_2(unknown) = AliasedDefinition : +# 2115| m2115_3(unknown) = InitializeNonLocal : +# 2115| m2115_4(unknown) = Chi : total:m2115_2, partial:m2115_3 +# 2115| r2115_5(glval) = VariableAddress[b] : +# 2115| m2115_6(bool) = InitializeParameter[b] : &:r2115_5 +# 2117| r2117_1(glval) = VariableAddress[s] : +# 2117| m2117_2(String) = Uninitialized[s] : &:r2117_1 +# 2117| r2117_3(glval) = FunctionAddress[String] : +# 2117| v2117_4(void) = Call[String] : func:r2117_3, this:r2117_1 +# 2117| m2117_5(unknown) = ^CallSideEffect : ~m2115_4 +# 2117| m2117_6(unknown) = Chi : total:m2115_4, partial:m2117_5 +# 2117| m2117_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2117_1 +# 2117| m2117_8(String) = Chi : total:m2117_2, partial:m2117_7 +# 2118| r2118_1(glval) = VariableAddress[b] : +# 2118| r2118_2(bool) = Load[b] : &:r2118_1, m2115_6 +# 2118| v2118_3(void) = ConditionalBranch : r2118_2 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 2115| Block 1 +# 2115| m2115_7(unknown) = Phi : from 2:~m2115_10, from 10:~m2131_1 +# 2115| v2115_8(void) = AliasedUse : ~m2115_7 +# 2115| v2115_9(void) = ExitFunction : + +# 2115| Block 2 +# 2115| m2115_10(unknown) = Phi : from 6:~m2124_8, from 9:~m2117_6 +# 2115| v2115_11(void) = Unwind : +#-----| Goto -> Block 1 + +# 2119| Block 3 +# 2119| r2119_1(glval) = VariableAddress[#throw2119:7] : +# 2119| r2119_2(glval) = StringConstant["string literal"] : +# 2119| r2119_3(char *) = Convert : r2119_2 +# 2119| m2119_4(char *) = Store[#throw2119:7] : &:r2119_1, r2119_3 +# 2119| v2119_5(void) = ThrowValue : &:r2119_1, m2119_4 +#-----| Exception -> Block 5 + +# 2121| Block 4 +# 2121| r2121_1(glval) = VariableAddress[s2] : +# 2121| m2121_2(String) = Uninitialized[s2] : &:r2121_1 +# 2121| r2121_3(glval) = FunctionAddress[String] : +# 2121| v2121_4(void) = Call[String] : func:r2121_3, this:r2121_1 +# 2121| m2121_5(unknown) = ^CallSideEffect : ~m2117_6 +# 2121| m2121_6(unknown) = Chi : total:m2117_6, partial:m2121_5 +# 2121| m2121_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2121_1 +# 2121| m2121_8(String) = Chi : total:m2121_2, partial:m2121_7 +# 2122| r2122_1(glval) = VariableAddress[s2] : +# 2122| r2122_2(glval) = FunctionAddress[~String] : +# 2122| v2122_3(void) = Call[~String] : func:r2122_2, this:r2122_1 +# 2122| m2122_4(unknown) = ^CallSideEffect : ~m2121_6 +# 2122| m2122_5(unknown) = Chi : total:m2121_6, partial:m2122_4 +# 2122| v2122_6(void) = ^IndirectReadSideEffect[-1] : &:r2122_1, m2121_8 +# 2122| m2122_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2122_1 +# 2122| m2122_8(String) = Chi : total:m2121_8, partial:m2122_7 +# 2122| r2122_9(glval) = VariableAddress[s] : +# 2122| r2122_10(glval) = FunctionAddress[~String] : +# 2122| v2122_11(void) = Call[~String] : func:r2122_10, this:r2122_9 +# 2122| m2122_12(unknown) = ^CallSideEffect : ~m2122_5 +# 2122| m2122_13(unknown) = Chi : total:m2122_5, partial:m2122_12 +# 2122| v2122_14(void) = ^IndirectReadSideEffect[-1] : &:r2122_9, m2117_8 +# 2122| m2122_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r2122_9 +# 2122| m2122_16(String) = Chi : total:m2117_8, partial:m2122_15 +#-----| Goto -> Block 10 + +# 2123| Block 5 +# 2123| v2123_1(void) = CatchByType[const char *] : +#-----| Exception -> Block 7 +#-----| Goto -> Block 6 + +# 2123| Block 6 +# 2123| r2123_2(glval) = VariableAddress[s] : +# 2123| m2123_3(char *) = InitializeParameter[s] : &:r2123_2 +# 2123| r2123_4(char *) = Load[s] : &:r2123_2, m2123_3 +# 2123| m2123_5(unknown) = InitializeIndirection[s] : &:r2123_4 +# 2124| r2124_1(glval) = VariableAddress[#throw2124:5] : +# 2124| m2124_2(String) = Uninitialized[#throw2124:5] : &:r2124_1 +# 2124| r2124_3(glval) = FunctionAddress[String] : +# 2124| r2124_4(glval) = VariableAddress[s] : +# 2124| r2124_5(char *) = Load[s] : &:r2124_4, m2123_3 +# 2124| v2124_6(void) = Call[String] : func:r2124_3, this:r2124_1, 0:r2124_5 +# 2124| m2124_7(unknown) = ^CallSideEffect : ~m2117_6 +# 2124| m2124_8(unknown) = Chi : total:m2117_6, partial:m2124_7 +# 2124| v2124_9(void) = ^BufferReadSideEffect[0] : &:r2124_5, ~m2123_5 +# 2124| m2124_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2124_1 +# 2124| m2124_11(String) = Chi : total:m2124_2, partial:m2124_10 +# 2124| v2124_12(void) = ThrowValue : &:r2124_1, m2124_11 +#-----| Exception -> Block 2 + +# 2126| Block 7 +# 2126| v2126_1(void) = CatchByType[const String &] : +#-----| Exception -> Block 9 +#-----| Goto -> Block 8 + +# 2126| Block 8 +# 2126| r2126_2(glval) = VariableAddress[e] : +# 2126| m2126_3(String &) = InitializeParameter[e] : &:r2126_2 +# 2126| r2126_4(String &) = Load[e] : &:r2126_2, m2126_3 +# 2126| m2126_5(unknown) = InitializeIndirection[e] : &:r2126_4 +# 2126| v2126_6(void) = NoOp : +#-----| Goto -> Block 10 + +# 2128| Block 9 +# 2128| v2128_1(void) = CatchAny : +# 2129| v2129_1(void) = ReThrow : +#-----| Exception -> Block 2 + +# 2131| Block 10 +# 2131| m2131_1(unknown) = Phi : from 4:~m2122_13, from 8:~m2117_6 +# 2131| v2131_2(void) = NoOp : +# 2115| v2115_12(void) = ReturnVoid : +#-----| Goto -> Block 1 + +# 2133| void IfDestructors(bool) +# 2133| Block 0 +# 2133| v2133_1(void) = EnterFunction : +# 2133| m2133_2(unknown) = AliasedDefinition : +# 2133| m2133_3(unknown) = InitializeNonLocal : +# 2133| m2133_4(unknown) = Chi : total:m2133_2, partial:m2133_3 +# 2133| r2133_5(glval) = VariableAddress[b] : +# 2133| m2133_6(bool) = InitializeParameter[b] : &:r2133_5 +# 2134| r2134_1(glval) = VariableAddress[s1] : +# 2134| m2134_2(String) = Uninitialized[s1] : &:r2134_1 +# 2134| r2134_3(glval) = FunctionAddress[String] : +# 2134| v2134_4(void) = Call[String] : func:r2134_3, this:r2134_1 +# 2134| m2134_5(unknown) = ^CallSideEffect : ~m2133_4 +# 2134| m2134_6(unknown) = Chi : total:m2133_4, partial:m2134_5 +# 2134| m2134_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2134_1 +# 2134| m2134_8(String) = Chi : total:m2134_2, partial:m2134_7 +# 2135| r2135_1(glval) = VariableAddress[b] : +# 2135| r2135_2(bool) = Load[b] : &:r2135_1, m2133_6 +# 2135| v2135_3(void) = ConditionalBranch : r2135_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2136| Block 1 +# 2136| r2136_1(glval) = VariableAddress[s2] : +# 2136| m2136_2(String) = Uninitialized[s2] : &:r2136_1 +# 2136| r2136_3(glval) = FunctionAddress[String] : +# 2136| v2136_4(void) = Call[String] : func:r2136_3, this:r2136_1 +# 2136| m2136_5(unknown) = ^CallSideEffect : ~m2134_6 +# 2136| m2136_6(unknown) = Chi : total:m2134_6, partial:m2136_5 +# 2136| m2136_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2136_1 +# 2136| m2136_8(String) = Chi : total:m2136_2, partial:m2136_7 +# 2137| r2137_1(glval) = VariableAddress[s2] : +# 2137| r2137_2(glval) = FunctionAddress[~String] : +# 2137| v2137_3(void) = Call[~String] : func:r2137_2, this:r2137_1 +# 2137| m2137_4(unknown) = ^CallSideEffect : ~m2136_6 +# 2137| m2137_5(unknown) = Chi : total:m2136_6, partial:m2137_4 +# 2137| v2137_6(void) = ^IndirectReadSideEffect[-1] : &:r2137_1, m2136_8 +# 2137| m2137_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2137_1 +# 2137| m2137_8(String) = Chi : total:m2136_8, partial:m2137_7 +#-----| Goto -> Block 3 + +# 2138| Block 2 +# 2138| r2138_1(glval) = VariableAddress[s3] : +# 2138| m2138_2(String) = Uninitialized[s3] : &:r2138_1 +# 2138| r2138_3(glval) = FunctionAddress[String] : +# 2138| v2138_4(void) = Call[String] : func:r2138_3, this:r2138_1 +# 2138| m2138_5(unknown) = ^CallSideEffect : ~m2134_6 +# 2138| m2138_6(unknown) = Chi : total:m2134_6, partial:m2138_5 +# 2138| m2138_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1 +# 2138| m2138_8(String) = Chi : total:m2138_2, partial:m2138_7 +# 2139| r2139_1(glval) = VariableAddress[s3] : +# 2139| r2139_2(glval) = FunctionAddress[~String] : +# 2139| v2139_3(void) = Call[~String] : func:r2139_2, this:r2139_1 +# 2139| m2139_4(unknown) = ^CallSideEffect : ~m2138_6 +# 2139| m2139_5(unknown) = Chi : total:m2138_6, partial:m2139_4 +# 2139| v2139_6(void) = ^IndirectReadSideEffect[-1] : &:r2139_1, m2138_8 +# 2139| m2139_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2139_1 +# 2139| m2139_8(String) = Chi : total:m2138_8, partial:m2139_7 +#-----| Goto -> Block 3 + +# 2140| Block 3 +# 2140| m2140_1(unknown) = Phi : from 1:~m2137_5, from 2:~m2139_5 +# 2140| r2140_2(glval) = VariableAddress[s4] : +# 2140| m2140_3(String) = Uninitialized[s4] : &:r2140_2 +# 2140| r2140_4(glval) = FunctionAddress[String] : +# 2140| v2140_5(void) = Call[String] : func:r2140_4, this:r2140_2 +# 2140| m2140_6(unknown) = ^CallSideEffect : ~m2140_1 +# 2140| m2140_7(unknown) = Chi : total:m2140_1, partial:m2140_6 +# 2140| m2140_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r2140_2 +# 2140| m2140_9(String) = Chi : total:m2140_3, partial:m2140_8 +# 2141| v2141_1(void) = NoOp : +# 2141| r2141_2(glval) = VariableAddress[s4] : +# 2141| r2141_3(glval) = FunctionAddress[~String] : +# 2141| v2141_4(void) = Call[~String] : func:r2141_3, this:r2141_2 +# 2141| m2141_5(unknown) = ^CallSideEffect : ~m2140_7 +# 2141| m2141_6(unknown) = Chi : total:m2140_7, partial:m2141_5 +# 2141| v2141_7(void) = ^IndirectReadSideEffect[-1] : &:r2141_2, m2140_9 +# 2141| m2141_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r2141_2 +# 2141| m2141_9(String) = Chi : total:m2140_9, partial:m2141_8 +# 2141| r2141_10(glval) = VariableAddress[s1] : +# 2141| r2141_11(glval) = FunctionAddress[~String] : +# 2141| v2141_12(void) = Call[~String] : func:r2141_11, this:r2141_10 +# 2141| m2141_13(unknown) = ^CallSideEffect : ~m2141_6 +# 2141| m2141_14(unknown) = Chi : total:m2141_6, partial:m2141_13 +# 2141| v2141_15(void) = ^IndirectReadSideEffect[-1] : &:r2141_10, m2134_8 +# 2141| m2141_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r2141_10 +# 2141| m2141_17(String) = Chi : total:m2134_8, partial:m2141_16 +# 2133| v2133_7(void) = ReturnVoid : +# 2133| v2133_8(void) = AliasedUse : ~m2141_14 +# 2133| v2133_9(void) = ExitFunction : + +# 2143| void ForDestructors() +# 2143| Block 0 +# 2143| v2143_1(void) = EnterFunction : +# 2143| m2143_2(unknown) = AliasedDefinition : +# 2143| m2143_3(unknown) = InitializeNonLocal : +# 2143| m2143_4(unknown) = Chi : total:m2143_2, partial:m2143_3 +# 2144| r2144_1(glval) = VariableAddress[c] : +# 2144| r2144_2(char) = Constant[97] : +# 2144| m2144_3(char) = Store[c] : &:r2144_1, r2144_2 +# 2145| r2145_1(glval) = VariableAddress[s] : +# 2145| m2145_2(String) = Uninitialized[s] : &:r2145_1 +# 2145| r2145_3(glval) = FunctionAddress[String] : +# 2145| r2145_4(glval) = StringConstant["hello"] : +# 2145| r2145_5(char *) = Convert : r2145_4 +# 2145| v2145_6(void) = Call[String] : func:r2145_3, this:r2145_1, 0:r2145_5 +# 2145| m2145_7(unknown) = ^CallSideEffect : ~m2143_4 +# 2145| m2145_8(unknown) = Chi : total:m2143_4, partial:m2145_7 +# 2145| v2145_9(void) = ^BufferReadSideEffect[0] : &:r2145_5, ~m2143_3 +# 2145| m2145_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2145_1 +# 2145| m2145_11(String) = Chi : total:m2145_2, partial:m2145_10 +#-----| Goto -> Block 1 + +# 2145| Block 1 +# 2145| m2145_12(String) = Phi : from 0:m2145_11, from 2:m2145_28 +# 2145| m2145_13(unknown) = Phi : from 0:~m2145_8, from 2:~m2145_25 +# 2145| m2145_14(char) = Phi : from 0:m2144_3, from 2:m2145_30 +# 2145| r2145_15(glval) = VariableAddress[c] : +# 2145| r2145_16(char) = Load[c] : &:r2145_15, m2145_14 +# 2145| r2145_17(int) = Convert : r2145_16 +# 2145| r2145_18(int) = Constant[0] : +# 2145| r2145_19(bool) = CompareNE : r2145_17, r2145_18 +# 2145| v2145_20(void) = ConditionalBranch : r2145_19 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2146| Block 2 +# 2146| r2146_1(glval) = VariableAddress[s2] : +# 2146| m2146_2(String) = Uninitialized[s2] : &:r2146_1 +# 2146| r2146_3(glval) = FunctionAddress[String] : +# 2146| v2146_4(void) = Call[String] : func:r2146_3, this:r2146_1 +# 2146| m2146_5(unknown) = ^CallSideEffect : ~m2145_13 +# 2146| m2146_6(unknown) = Chi : total:m2145_13, partial:m2146_5 +# 2146| m2146_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2146_1 +# 2146| m2146_8(String) = Chi : total:m2146_2, partial:m2146_7 +# 2147| r2147_1(glval) = VariableAddress[s2] : +# 2147| r2147_2(glval) = FunctionAddress[~String] : +# 2147| v2147_3(void) = Call[~String] : func:r2147_2, this:r2147_1 +# 2147| m2147_4(unknown) = ^CallSideEffect : ~m2146_6 +# 2147| m2147_5(unknown) = Chi : total:m2146_6, partial:m2147_4 +# 2147| v2147_6(void) = ^IndirectReadSideEffect[-1] : &:r2147_1, m2146_8 +# 2147| m2147_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2147_1 +# 2147| m2147_8(String) = Chi : total:m2146_8, partial:m2147_7 +# 2145| r2145_21(glval) = VariableAddress[s] : +# 2145| r2145_22(glval) = FunctionAddress[pop_back] : +# 2145| r2145_23(char) = Call[pop_back] : func:r2145_22, this:r2145_21 +# 2145| m2145_24(unknown) = ^CallSideEffect : ~m2147_5 +# 2145| m2145_25(unknown) = Chi : total:m2147_5, partial:m2145_24 +# 2145| v2145_26(void) = ^IndirectReadSideEffect[-1] : &:r2145_21, m2145_12 +# 2145| m2145_27(String) = ^IndirectMayWriteSideEffect[-1] : &:r2145_21 +# 2145| m2145_28(String) = Chi : total:m2145_12, partial:m2145_27 +# 2145| r2145_29(glval) = VariableAddress[c] : +# 2145| m2145_30(char) = Store[c] : &:r2145_29, r2145_23 +#-----| Goto (back edge) -> Block 1 + +# 2145| Block 3 +# 2145| r2145_31(glval) = VariableAddress[s] : +# 2145| r2145_32(glval) = FunctionAddress[~String] : +# 2145| v2145_33(void) = Call[~String] : func:r2145_32, this:r2145_31 +# 2145| m2145_34(unknown) = ^CallSideEffect : ~m2145_13 +# 2145| m2145_35(unknown) = Chi : total:m2145_13, partial:m2145_34 +# 2145| v2145_36(void) = ^IndirectReadSideEffect[-1] : &:r2145_31, m2145_12 +# 2145| m2145_37(String) = ^IndirectMayWriteSideEffect[-1] : &:r2145_31 +# 2145| m2145_38(String) = Chi : total:m2145_12, partial:m2145_37 +# 2149| r2149_1(glval &&>) = VariableAddress[(__range)] : +# 2149| r2149_2(glval>) = VariableAddress[#temp2149:20] : +# 2149| m2149_3(vector) = Uninitialized[#temp2149:20] : &:r2149_2 +# 2149| r2149_4(glval) = FunctionAddress[vector] : +# 2149| r2149_5(glval) = VariableAddress[#temp2149:35] : +# 2149| m2149_6(String) = Uninitialized[#temp2149:35] : &:r2149_5 +# 2149| r2149_7(glval) = FunctionAddress[String] : +# 2149| r2149_8(glval) = StringConstant["hello"] : +# 2149| r2149_9(char *) = Convert : r2149_8 +# 2149| v2149_10(void) = Call[String] : func:r2149_7, this:r2149_5, 0:r2149_9 +# 2149| m2149_11(unknown) = ^CallSideEffect : ~m2145_35 +# 2149| m2149_12(unknown) = Chi : total:m2145_35, partial:m2149_11 +# 2149| v2149_13(void) = ^BufferReadSideEffect[0] : &:r2149_9, ~m2143_3 +# 2149| m2149_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r2149_5 +# 2149| m2149_15(String) = Chi : total:m2149_6, partial:m2149_14 +# 2149| r2149_16(String) = Load[#temp2149:35] : &:r2149_5, m2149_15 +# 2149| v2149_17(void) = Call[vector] : func:r2149_4, this:r2149_2, 0:r2149_16 +# 2149| m2149_18(unknown) = ^CallSideEffect : ~m2149_12 +# 2149| m2149_19(unknown) = Chi : total:m2149_12, partial:m2149_18 +# 2149| m2149_20(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2149_2 +# 2149| m2149_21(vector) = Chi : total:m2149_3, partial:m2149_20 +# 2149| r2149_22(vector &) = CopyValue : r2149_2 +# 2149| m2149_23(vector &&) = Store[(__range)] : &:r2149_1, r2149_22 +# 2149| r2149_24(glval) = VariableAddress[(__begin)] : +# 2149| r2149_25(glval &&>) = VariableAddress[(__range)] : +# 2149| r2149_26(vector &&) = Load[(__range)] : &:r2149_25, m2149_23 +#-----| r0_1(glval>) = CopyValue : r2149_26 +#-----| r0_2(glval>) = Convert : r0_1 +# 2149| r2149_27(glval) = FunctionAddress[begin] : +# 2149| r2149_28(iterator) = Call[begin] : func:r2149_27, this:r0_2 +# 2149| m2149_29(unknown) = ^CallSideEffect : ~m2149_19 +# 2149| m2149_30(unknown) = Chi : total:m2149_19, partial:m2149_29 +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, m2149_21 +# 2149| m2149_31(iterator) = Store[(__begin)] : &:r2149_24, r2149_28 +# 2149| r2149_32(glval) = VariableAddress[(__end)] : +# 2149| r2149_33(glval &&>) = VariableAddress[(__range)] : +# 2149| r2149_34(vector &&) = Load[(__range)] : &:r2149_33, m2149_23 +#-----| r0_4(glval>) = CopyValue : r2149_34 +#-----| r0_5(glval>) = Convert : r0_4 +# 2149| r2149_35(glval) = FunctionAddress[end] : +# 2149| r2149_36(iterator) = Call[end] : func:r2149_35, this:r0_5 +# 2149| m2149_37(unknown) = ^CallSideEffect : ~m2149_30 +# 2149| m2149_38(unknown) = Chi : total:m2149_30, partial:m2149_37 +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, m2149_21 +# 2149| m2149_39(iterator) = Store[(__end)] : &:r2149_32, r2149_36 +#-----| Goto -> Block 4 + +# 2149| Block 4 +# 2149| m2149_40(iterator) = Phi : from 3:m2149_31, from 5:m2149_74 +# 2149| m2149_41(unknown) = Phi : from 3:~m2149_38, from 5:~m2149_71 +# 2149| r2149_42(glval) = VariableAddress[(__begin)] : +#-----| r0_7(glval) = Convert : r2149_42 +# 2149| r2149_43(glval) = FunctionAddress[operator!=] : +# 2149| r2149_44(glval) = VariableAddress[(__end)] : +# 2149| r2149_45(iterator) = Load[(__end)] : &:r2149_44, m2149_39 +# 2149| r2149_46(bool) = Call[operator!=] : func:r2149_43, this:r0_7, 0:r2149_45 +# 2149| m2149_47(unknown) = ^CallSideEffect : ~m2149_41 +# 2149| m2149_48(unknown) = Chi : total:m2149_41, partial:m2149_47 +#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2149_40 +# 2149| v2149_49(void) = ConditionalBranch : r2149_46 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 2149| Block 5 +# 2149| r2149_50(glval) = VariableAddress[s] : +# 2149| m2149_51(String) = Uninitialized[s] : &:r2149_50 +# 2149| r2149_52(glval) = FunctionAddress[String] : +# 2149| r2149_53(glval) = VariableAddress[(__begin)] : +#-----| r0_9(glval) = Convert : r2149_53 +# 2149| r2149_54(glval) = FunctionAddress[operator*] : +# 2149| r2149_55(String &) = Call[operator*] : func:r2149_54, this:r0_9 +# 2149| m2149_56(unknown) = ^CallSideEffect : ~m2149_48 +# 2149| m2149_57(unknown) = Chi : total:m2149_48, partial:m2149_56 +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, m2149_40 +# 2149| r2149_58(glval) = CopyValue : r2149_55 +# 2149| r2149_59(glval) = Convert : r2149_58 +# 2149| r2149_60(String &) = CopyValue : r2149_59 +# 2149| v2149_61(void) = Call[String] : func:r2149_52, this:r2149_50, 0:r2149_60 +# 2149| m2149_62(unknown) = ^CallSideEffect : ~m2149_57 +# 2149| m2149_63(unknown) = Chi : total:m2149_57, partial:m2149_62 +# 2149| v2149_64(void) = ^BufferReadSideEffect[0] : &:r2149_60, ~m2149_63 +# 2149| m2149_65(String) = ^IndirectMayWriteSideEffect[-1] : &:r2149_50 +# 2149| m2149_66(String) = Chi : total:m2149_51, partial:m2149_65 +# 2150| r2150_1(glval) = VariableAddress[s2] : +# 2150| m2150_2(String) = Uninitialized[s2] : &:r2150_1 +# 2150| r2150_3(glval) = FunctionAddress[String] : +# 2150| v2150_4(void) = Call[String] : func:r2150_3, this:r2150_1 +# 2150| m2150_5(unknown) = ^CallSideEffect : ~m2149_63 +# 2150| m2150_6(unknown) = Chi : total:m2149_63, partial:m2150_5 +# 2150| m2150_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2150_1 +# 2150| m2150_8(String) = Chi : total:m2150_2, partial:m2150_7 +# 2151| r2151_1(glval) = VariableAddress[s2] : +# 2151| r2151_2(glval) = FunctionAddress[~String] : +# 2151| v2151_3(void) = Call[~String] : func:r2151_2, this:r2151_1 +# 2151| m2151_4(unknown) = ^CallSideEffect : ~m2150_6 +# 2151| m2151_5(unknown) = Chi : total:m2150_6, partial:m2151_4 +# 2151| v2151_6(void) = ^IndirectReadSideEffect[-1] : &:r2151_1, m2150_8 +# 2151| m2151_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2151_1 +# 2151| m2151_8(String) = Chi : total:m2150_8, partial:m2151_7 +# 2149| r2149_67(glval) = VariableAddress[(__begin)] : +# 2149| r2149_68(glval) = FunctionAddress[operator++] : +# 2149| r2149_69(iterator &) = Call[operator++] : func:r2149_68, this:r2149_67 +# 2149| m2149_70(unknown) = ^CallSideEffect : ~m2151_5 +# 2149| m2149_71(unknown) = Chi : total:m2151_5, partial:m2149_70 +# 2149| v2149_72(void) = ^IndirectReadSideEffect[-1] : &:r2149_67, m2149_40 +# 2149| m2149_73(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2149_67 +# 2149| m2149_74(iterator) = Chi : total:m2149_40, partial:m2149_73 +# 2149| r2149_75(glval) = CopyValue : r2149_69 +#-----| Goto (back edge) -> Block 4 + +# 2152| Block 6 +# 2152| v2152_1(void) = NoOp : +# 2143| v2143_5(void) = ReturnVoid : +# 2143| v2143_6(void) = AliasedUse : ~m2149_48 +# 2143| v2143_7(void) = ExitFunction : + +# 2154| void IfDestructors2(bool) +# 2154| Block 0 +# 2154| v2154_1(void) = EnterFunction : +# 2154| m2154_2(unknown) = AliasedDefinition : +# 2154| m2154_3(unknown) = InitializeNonLocal : +# 2154| m2154_4(unknown) = Chi : total:m2154_2, partial:m2154_3 +# 2154| r2154_5(glval) = VariableAddress[b] : +# 2154| m2154_6(bool) = InitializeParameter[b] : &:r2154_5 +# 2155| r2155_1(glval) = VariableAddress[s] : +# 2155| m2155_2(String) = Uninitialized[s] : &:r2155_1 +# 2155| r2155_3(glval) = FunctionAddress[String] : +# 2155| r2155_4(glval) = StringConstant["hello"] : +# 2155| r2155_5(char *) = Convert : r2155_4 +# 2155| v2155_6(void) = Call[String] : func:r2155_3, this:r2155_1, 0:r2155_5 +# 2155| m2155_7(unknown) = ^CallSideEffect : ~m2154_4 +# 2155| m2155_8(unknown) = Chi : total:m2154_4, partial:m2155_7 +# 2155| v2155_9(void) = ^BufferReadSideEffect[0] : &:r2155_5, ~m2154_3 +# 2155| m2155_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 +# 2155| m2155_11(String) = Chi : total:m2155_2, partial:m2155_10 +# 2155| r2155_12(glval) = VariableAddress[b] : +# 2155| r2155_13(bool) = Load[b] : &:r2155_12, m2154_6 +# 2155| v2155_14(void) = ConditionalBranch : r2155_13 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2156| Block 1 +# 2156| r2156_1(glval) = VariableAddress[x] : +# 2156| r2156_2(int) = Constant[0] : +# 2156| m2156_3(int) = Store[x] : &:r2156_1, r2156_2 +#-----| Goto -> Block 3 + +# 2158| Block 2 +# 2158| r2158_1(glval) = VariableAddress[y] : +# 2158| r2158_2(int) = Constant[0] : +# 2158| m2158_3(int) = Store[y] : &:r2158_1, r2158_2 +#-----| Goto -> Block 3 + +# 2159| Block 3 +# 2159| r2159_1(glval) = VariableAddress[s] : +# 2159| r2159_2(glval) = FunctionAddress[~String] : +# 2159| v2159_3(void) = Call[~String] : func:r2159_2, this:r2159_1 +# 2159| m2159_4(unknown) = ^CallSideEffect : ~m2155_8 +# 2159| m2159_5(unknown) = Chi : total:m2155_8, partial:m2159_4 +# 2159| v2159_6(void) = ^IndirectReadSideEffect[-1] : &:r2159_1, m2155_11 +# 2159| m2159_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2159_1 +# 2159| m2159_8(String) = Chi : total:m2155_11, partial:m2159_7 +# 2160| v2160_1(void) = NoOp : +# 2154| v2154_7(void) = ReturnVoid : +# 2154| v2154_8(void) = AliasedUse : ~m2159_5 +# 2154| v2154_9(void) = ExitFunction : + +# 2169| void IfDestructors3(bool) +# 2169| Block 0 +# 2169| v2169_1(void) = EnterFunction : +# 2169| m2169_2(unknown) = AliasedDefinition : +# 2169| m2169_3(unknown) = InitializeNonLocal : +# 2169| m2169_4(unknown) = Chi : total:m2169_2, partial:m2169_3 +# 2169| r2169_5(glval) = VariableAddress[b] : +# 2169| m2169_6(bool) = InitializeParameter[b] : &:r2169_5 +# 2170| r2170_1(glval) = VariableAddress[B] : +# 2170| m2170_2(Bool) = Uninitialized[B] : &:r2170_1 +# 2170| r2170_3(glval) = FunctionAddress[Bool] : +# 2170| r2170_4(glval) = VariableAddress[b] : +# 2170| r2170_5(bool) = Load[b] : &:r2170_4, m2169_6 +# 2170| v2170_6(void) = Call[Bool] : func:r2170_3, this:r2170_1, 0:r2170_5 +# 2170| m2170_7(unknown) = ^CallSideEffect : ~m2169_4 +# 2170| m2170_8(unknown) = Chi : total:m2169_4, partial:m2170_7 +# 2170| m2170_9(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2170_1 +# 2170| m2170_10(Bool) = Chi : total:m2170_2, partial:m2170_9 + +# 2185| void IfInitiaiizationConstructor(bool) +# 2185| Block 0 +# 2185| v2185_1(void) = EnterFunction : +# 2185| m2185_2(unknown) = AliasedDefinition : +# 2185| m2185_3(unknown) = InitializeNonLocal : +# 2185| m2185_4(unknown) = Chi : total:m2185_2, partial:m2185_3 +# 2185| r2185_5(glval) = VariableAddress[b] : +# 2185| m2185_6(bool) = InitializeParameter[b] : &:r2185_5 +# 2186| r2186_1(glval) = VariableAddress[B] : +# 2186| m2186_2(Bool2) = Uninitialized[B] : &:r2186_1 +# 2186| r2186_3(glval) = FunctionAddress[Bool2] : +# 2186| r2186_4(glval) = VariableAddress[b] : +# 2186| r2186_5(bool) = Load[b] : &:r2186_4, m2185_6 +# 2186| v2186_6(void) = Call[Bool2] : func:r2186_3, this:r2186_1, 0:r2186_5 +# 2186| m2186_7(unknown) = ^CallSideEffect : ~m2185_4 +# 2186| m2186_8(unknown) = Chi : total:m2185_4, partial:m2186_7 +# 2186| m2186_9(Bool2) = ^IndirectMayWriteSideEffect[-1] : &:r2186_1 +# 2186| m2186_10(Bool2) = Chi : total:m2186_2, partial:m2186_9 + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 @@ -12525,13 +13169,21 @@ smart_ptr.cpp: # 12| v12_10(void) = Call[unique_ptr_arg] : func:r12_1, 0:r12_9 # 12| m12_11(unknown) = ^CallSideEffect : ~m11_8 # 12| m12_12(unknown) = Chi : total:m11_8, partial:m12_11 -# 12| v12_13(void) = ^BufferReadSideEffect[0] : &:r12_9, ~m10_8 +# 12| v12_13(void) = ^BufferReadSideEffect[0] : &:r12_9, ~m12_12 # 12| m12_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r12_9 -# 12| m12_15(unknown) = Chi : total:m10_8, partial:m12_14 +# 12| m12_15(unknown) = Chi : total:m12_12, partial:m12_14 # 13| v13_1(void) = NoOp : -# 10| v10_9(void) = ReturnIndirection[p] : &:r10_7, m12_15 +# 13| r13_2(glval>>) = VariableAddress[up] : +# 13| r13_3(glval) = FunctionAddress[~unique_ptr] : +# 13| v13_4(void) = Call[~unique_ptr] : func:r13_3, this:r13_2 +# 13| m13_5(unknown) = ^CallSideEffect : ~m12_15 +# 13| m13_6(unknown) = Chi : total:m12_15, partial:m13_5 +# 13| v13_7(void) = ^IndirectReadSideEffect[-1] : &:r13_2, m11_9 +# 13| m13_8(unique_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r13_2 +# 13| m13_9(unique_ptr>) = Chi : total:m11_9, partial:m13_8 +# 10| v10_9(void) = ReturnIndirection[p] : &:r10_7, m10_8 # 10| v10_10(void) = ReturnVoid : -# 10| v10_11(void) = AliasedUse : ~m12_12 +# 10| v10_11(void) = AliasedUse : ~m13_6 # 10| v10_12(void) = ExitFunction : # 17| void call_shared_ptr_arg(float*) @@ -12569,13 +13221,21 @@ smart_ptr.cpp: # 19| v19_14(void) = Call[shared_ptr_arg] : func:r19_1, 0:r19_13 # 19| m19_15(unknown) = ^CallSideEffect : ~m19_10 # 19| m19_16(unknown) = Chi : total:m19_10, partial:m19_15 -# 19| v19_17(void) = ^BufferReadSideEffect[0] : &:r19_13, ~m17_8 +# 19| v19_17(void) = ^BufferReadSideEffect[0] : &:r19_13, ~m19_16 # 19| m19_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r19_13 -# 19| m19_19(unknown) = Chi : total:m17_8, partial:m19_18 +# 19| m19_19(unknown) = Chi : total:m19_16, partial:m19_18 # 20| v20_1(void) = NoOp : -# 17| v17_9(void) = ReturnIndirection[p] : &:r17_7, m19_19 +# 20| r20_2(glval>) = VariableAddress[sp] : +# 20| r20_3(glval) = FunctionAddress[~shared_ptr] : +# 20| v20_4(void) = Call[~shared_ptr] : func:r20_3, this:r20_2 +# 20| m20_5(unknown) = ^CallSideEffect : ~m19_19 +# 20| m20_6(unknown) = Chi : total:m19_19, partial:m20_5 +# 20| v20_7(void) = ^IndirectReadSideEffect[-1] : &:r20_2, m18_9 +# 20| m20_8(shared_ptr) = ^IndirectMayWriteSideEffect[-1] : &:r20_2 +# 20| m20_9(shared_ptr) = Chi : total:m18_9, partial:m20_8 +# 17| v17_9(void) = ReturnIndirection[p] : &:r17_7, m17_8 # 17| v17_10(void) = ReturnVoid : -# 17| v17_11(void) = AliasedUse : ~m19_16 +# 17| v17_11(void) = AliasedUse : ~m20_6 # 17| v17_12(void) = ExitFunction : # 28| void call_shared_ptr_consts() @@ -12686,8 +13346,48 @@ smart_ptr.cpp: # 47| m47_16(unknown) = Chi : total:m47_10, partial:m47_15 # 47| v47_17(void) = ^BufferReadSideEffect[0] : &:r47_13, ~m47_16 # 48| v48_1(void) = NoOp : +# 48| r48_2(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 48| r48_3(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_4(void) = Call[~shared_ptr] : func:r48_3, this:r48_2 +# 48| m48_5(unknown) = ^CallSideEffect : ~m47_16 +# 48| m48_6(unknown) = Chi : total:m47_16, partial:m48_5 +# 48| v48_7(void) = ^IndirectReadSideEffect[-1] : &:r48_2, m45_2 +# 48| m48_8(shared_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r48_2 +# 48| m48_9(shared_ptr>) = Chi : total:m45_2, partial:m48_8 +# 48| r48_10(glval>>) = VariableAddress[sp_const_sp_int] : +# 48| r48_11(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_12(void) = Call[~shared_ptr] : func:r48_11, this:r48_10 +# 48| m48_13(unknown) = ^CallSideEffect : ~m48_6 +# 48| m48_14(unknown) = Chi : total:m48_6, partial:m48_13 +# 48| v48_15(void) = ^IndirectReadSideEffect[-1] : &:r48_10, m41_2 +# 48| m48_16(shared_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r48_10 +# 48| m48_17(shared_ptr>) = Chi : total:m41_2, partial:m48_16 +# 48| r48_18(glval>>) = VariableAddress[sp_sp_const_int] : +# 48| r48_19(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_20(void) = Call[~shared_ptr] : func:r48_19, this:r48_18 +# 48| m48_21(unknown) = ^CallSideEffect : ~m48_14 +# 48| m48_22(unknown) = Chi : total:m48_14, partial:m48_21 +# 48| v48_23(void) = ^IndirectReadSideEffect[-1] : &:r48_18, m37_2 +# 48| m48_24(shared_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r48_18 +# 48| m48_25(shared_ptr>) = Chi : total:m37_2, partial:m48_24 +# 48| r48_26(glval>) = VariableAddress[sp_const_int_pointer] : +# 48| r48_27(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_28(void) = Call[~shared_ptr] : func:r48_27, this:r48_26 +# 48| m48_29(unknown) = ^CallSideEffect : ~m48_22 +# 48| m48_30(unknown) = Chi : total:m48_22, partial:m48_29 +# 48| v48_31(void) = ^IndirectReadSideEffect[-1] : &:r48_26, m33_2 +# 48| m48_32(shared_ptr) = ^IndirectMayWriteSideEffect[-1] : &:r48_26 +# 48| m48_33(shared_ptr) = Chi : total:m33_2, partial:m48_32 +# 48| r48_34(glval>) = VariableAddress[sp_const_int] : +# 48| r48_35(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_36(void) = Call[~shared_ptr] : func:r48_35, this:r48_34 +# 48| m48_37(unknown) = ^CallSideEffect : ~m48_30 +# 48| m48_38(unknown) = Chi : total:m48_30, partial:m48_37 +# 48| v48_39(void) = ^IndirectReadSideEffect[-1] : &:r48_34, m29_2 +# 48| m48_40(shared_ptr) = ^IndirectMayWriteSideEffect[-1] : &:r48_34 +# 48| m48_41(shared_ptr) = Chi : total:m29_2, partial:m48_40 # 28| v28_5(void) = ReturnVoid : -# 28| v28_6(void) = AliasedUse : ~m47_16 +# 28| v28_6(void) = AliasedUse : ~m48_38 # 28| v28_7(void) = ExitFunction : struct_init.cpp: diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 79887fffc1f..e60d57f0ed6 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,13 +6,19 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2170:16:2170:23 | Chi: call to Bool | Instruction 'Chi: call to Bool' has no successors in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | +| ir.cpp:2186:17:2186:25 | Chi: call to Bool2 | Instruction 'Chi: call to Bool2' has no successors in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition @@ -24,8 +30,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 79887fffc1f..e60d57f0ed6 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,13 +6,19 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2170:16:2170:23 | Chi: call to Bool | Instruction 'Chi: call to Bool' has no successors in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | +| ir.cpp:2186:17:2186:25 | Chi: call to Bool2 | Instruction 'Chi: call to Bool2' has no successors in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition @@ -24,8 +30,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 1a3da84e78f..e22621042e7 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -689,6 +689,7 @@ | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_2 | +| file://:0:0:0:0 | Address | &:r0_2 | | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | @@ -732,12 +733,14 @@ | file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_5 | +| file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_6 | | file://:0:0:0:0 | Address | &:r0_6 | | file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_7 | +| file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_8 | @@ -747,6 +750,7 @@ | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_9 | | file://:0:0:0:0 | Address | &:r0_9 | +| file://:0:0:0:0 | Address | &:r0_9 | | file://:0:0:0:0 | Address | &:r0_10 | | file://:0:0:0:0 | Address | &:r0_10 | | file://:0:0:0:0 | Address | &:r0_10 | @@ -864,6 +868,10 @@ | file://:0:0:0:0 | SideEffect | m1078_23 | | file://:0:0:0:0 | SideEffect | m1084_23 | | file://:0:0:0:0 | SideEffect | m1084_23 | +| file://:0:0:0:0 | SideEffect | m2149_21 | +| file://:0:0:0:0 | SideEffect | m2149_21 | +| file://:0:0:0:0 | SideEffect | m2149_40 | +| file://:0:0:0:0 | SideEffect | m2149_40 | | file://:0:0:0:0 | SideEffect | ~m0_4 | | file://:0:0:0:0 | SideEffect | ~m0_4 | | file://:0:0:0:0 | SideEffect | ~m0_4 | @@ -909,8 +917,10 @@ | file://:0:0:0:0 | StoreValue | r0_22 | | file://:0:0:0:0 | Unary | r0_1 | | file://:0:0:0:0 | Unary | r0_1 | +| file://:0:0:0:0 | Unary | r0_1 | | file://:0:0:0:0 | Unary | r0_2 | | file://:0:0:0:0 | Unary | r0_3 | +| file://:0:0:0:0 | Unary | r0_4 | | file://:0:0:0:0 | Unary | r0_5 | | file://:0:0:0:0 | Unary | r0_5 | | file://:0:0:0:0 | Unary | r0_6 | @@ -2960,7 +2970,7 @@ | ir.cpp:594:15:594:27 | Unary | r594_1 | | ir.cpp:615:6:615:18 | ChiPartial | partial:m615_3 | | ir.cpp:615:6:615:18 | ChiTotal | total:m615_2 | -| ir.cpp:615:6:615:18 | SideEffect | ~m619_8 | +| ir.cpp:615:6:615:18 | SideEffect | ~m620_30 | | ir.cpp:616:12:616:13 | Address | &:r616_1 | | ir.cpp:616:12:616:13 | Address | &:r616_1 | | ir.cpp:616:12:616:13 | Arg(this) | this:r616_1 | @@ -3002,6 +3012,46 @@ | ir.cpp:619:24:619:29 | Arg(0) | 0:r619_5 | | ir.cpp:619:24:619:29 | SideEffect | ~m615_3 | | ir.cpp:619:24:619:29 | Unary | r619_4 | +| ir.cpp:620:1:620:1 | Address | &:r620_2 | +| ir.cpp:620:1:620:1 | Address | &:r620_2 | +| ir.cpp:620:1:620:1 | Address | &:r620_10 | +| ir.cpp:620:1:620:1 | Address | &:r620_10 | +| ir.cpp:620:1:620:1 | Address | &:r620_18 | +| ir.cpp:620:1:620:1 | Address | &:r620_18 | +| ir.cpp:620:1:620:1 | Address | &:r620_26 | +| ir.cpp:620:1:620:1 | Address | &:r620_26 | +| ir.cpp:620:1:620:1 | Arg(this) | this:r620_2 | +| ir.cpp:620:1:620:1 | Arg(this) | this:r620_10 | +| ir.cpp:620:1:620:1 | Arg(this) | this:r620_18 | +| ir.cpp:620:1:620:1 | Arg(this) | this:r620_26 | +| ir.cpp:620:1:620:1 | CallTarget | func:r620_3 | +| ir.cpp:620:1:620:1 | CallTarget | func:r620_11 | +| ir.cpp:620:1:620:1 | CallTarget | func:r620_19 | +| ir.cpp:620:1:620:1 | CallTarget | func:r620_27 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_5 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_8 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_13 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_16 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_21 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_24 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_29 | +| ir.cpp:620:1:620:1 | ChiPartial | partial:m620_32 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m616_8 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m617_11 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m618_6 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m619_8 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m619_11 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m620_6 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m620_14 | +| ir.cpp:620:1:620:1 | ChiTotal | total:m620_22 | +| ir.cpp:620:1:620:1 | SideEffect | m616_8 | +| ir.cpp:620:1:620:1 | SideEffect | m617_11 | +| ir.cpp:620:1:620:1 | SideEffect | m618_6 | +| ir.cpp:620:1:620:1 | SideEffect | m619_11 | +| ir.cpp:620:1:620:1 | SideEffect | ~m619_8 | +| ir.cpp:620:1:620:1 | SideEffect | ~m620_6 | +| ir.cpp:620:1:620:1 | SideEffect | ~m620_14 | +| ir.cpp:620:1:620:1 | SideEffect | ~m620_22 | | ir.cpp:622:6:622:16 | ChiPartial | partial:m622_3 | | ir.cpp:622:6:622:16 | ChiTotal | total:m622_2 | | ir.cpp:622:6:622:16 | SideEffect | ~m625_6 | @@ -3916,7 +3966,7 @@ | ir.cpp:796:3:796:3 | SideEffect | ~m796_16 | | ir.cpp:799:6:799:25 | ChiPartial | partial:m799_3 | | ir.cpp:799:6:799:25 | ChiTotal | total:m799_2 | -| ir.cpp:799:6:799:25 | SideEffect | ~m831_10 | +| ir.cpp:799:6:799:25 | SideEffect | ~m840_22 | | ir.cpp:800:8:800:8 | Address | &:r800_1 | | ir.cpp:800:8:800:8 | Address | &:r800_1 | | ir.cpp:800:8:800:8 | Arg(this) | this:r800_1 | @@ -4267,6 +4317,36 @@ | ir.cpp:839:8:839:10 | Load | m837_3 | | ir.cpp:839:8:839:10 | StoreValue | r839_3 | | ir.cpp:839:8:839:10 | Unary | r839_2 | +| ir.cpp:840:1:840:1 | Address | &:r840_2 | +| ir.cpp:840:1:840:1 | Address | &:r840_2 | +| ir.cpp:840:1:840:1 | Address | &:r840_10 | +| ir.cpp:840:1:840:1 | Address | &:r840_10 | +| ir.cpp:840:1:840:1 | Address | &:r840_18 | +| ir.cpp:840:1:840:1 | Address | &:r840_18 | +| ir.cpp:840:1:840:1 | Arg(this) | this:r840_2 | +| ir.cpp:840:1:840:1 | Arg(this) | this:r840_10 | +| ir.cpp:840:1:840:1 | Arg(this) | this:r840_18 | +| ir.cpp:840:1:840:1 | CallTarget | func:r840_3 | +| ir.cpp:840:1:840:1 | CallTarget | func:r840_11 | +| ir.cpp:840:1:840:1 | CallTarget | func:r840_19 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_5 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_8 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_13 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_16 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_21 | +| ir.cpp:840:1:840:1 | ChiPartial | partial:m840_24 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m817_13 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m824_24 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m831_10 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m831_14 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m840_6 | +| ir.cpp:840:1:840:1 | ChiTotal | total:m840_14 | +| ir.cpp:840:1:840:1 | SideEffect | m817_13 | +| ir.cpp:840:1:840:1 | SideEffect | m824_24 | +| ir.cpp:840:1:840:1 | SideEffect | m831_14 | +| ir.cpp:840:1:840:1 | SideEffect | ~m831_10 | +| ir.cpp:840:1:840:1 | SideEffect | ~m840_6 | +| ir.cpp:840:1:840:1 | SideEffect | ~m840_14 | | ir.cpp:842:8:842:8 | Address | &:r842_5 | | ir.cpp:842:8:842:8 | Address | &:r842_5 | | ir.cpp:842:8:842:8 | Address | &:r842_7 | @@ -4311,7 +4391,7 @@ | ir.cpp:846:8:846:8 | Unary | m846_6 | | ir.cpp:849:6:849:16 | ChiPartial | partial:m849_3 | | ir.cpp:849:6:849:16 | ChiTotal | total:m849_2 | -| ir.cpp:849:6:849:16 | SideEffect | ~m851_6 | +| ir.cpp:849:6:849:16 | SideEffect | ~m865_14 | | ir.cpp:850:19:850:19 | Address | &:r850_1 | | ir.cpp:850:19:850:19 | Address | &:r850_1 | | ir.cpp:850:19:850:19 | Arg(this) | this:r850_1 | @@ -4364,6 +4444,26 @@ | ir.cpp:864:47:864:48 | Address | &:r864_2 | | ir.cpp:864:47:864:48 | Load | m860_5 | | ir.cpp:864:47:864:48 | Unary | r864_3 | +| ir.cpp:865:1:865:1 | Address | &:r865_2 | +| ir.cpp:865:1:865:1 | Address | &:r865_2 | +| ir.cpp:865:1:865:1 | Address | &:r865_10 | +| ir.cpp:865:1:865:1 | Address | &:r865_10 | +| ir.cpp:865:1:865:1 | Arg(this) | this:r865_2 | +| ir.cpp:865:1:865:1 | Arg(this) | this:r865_10 | +| ir.cpp:865:1:865:1 | CallTarget | func:r865_3 | +| ir.cpp:865:1:865:1 | CallTarget | func:r865_11 | +| ir.cpp:865:1:865:1 | ChiPartial | partial:m865_5 | +| ir.cpp:865:1:865:1 | ChiPartial | partial:m865_8 | +| ir.cpp:865:1:865:1 | ChiPartial | partial:m865_13 | +| ir.cpp:865:1:865:1 | ChiPartial | partial:m865_16 | +| ir.cpp:865:1:865:1 | ChiTotal | total:m850_8 | +| ir.cpp:865:1:865:1 | ChiTotal | total:m851_6 | +| ir.cpp:865:1:865:1 | ChiTotal | total:m851_8 | +| ir.cpp:865:1:865:1 | ChiTotal | total:m865_6 | +| ir.cpp:865:1:865:1 | SideEffect | m850_8 | +| ir.cpp:865:1:865:1 | SideEffect | m851_8 | +| ir.cpp:865:1:865:1 | SideEffect | ~m851_6 | +| ir.cpp:865:1:865:1 | SideEffect | ~m865_6 | | ir.cpp:867:1:867:14 | Address | &:m867_6 | | ir.cpp:867:1:867:14 | Address | &:r867_5 | | ir.cpp:867:1:867:14 | Address | &:r867_5 | @@ -5047,7 +5147,7 @@ | ir.cpp:1038:14:1038:14 | StoreValue | r1038_10 | | ir.cpp:1040:6:1040:11 | ChiPartial | partial:m1040_3 | | ir.cpp:1040:6:1040:11 | ChiTotal | total:m1040_2 | -| ir.cpp:1040:6:1040:11 | SideEffect | ~m1055_7 | +| ir.cpp:1040:6:1040:11 | SideEffect | ~m1056_14 | | ir.cpp:1040:17:1040:17 | Address | &:r1040_5 | | ir.cpp:1040:34:1040:34 | Address | &:r1040_7 | | ir.cpp:1040:34:1040:34 | Address | &:r1040_7 | @@ -5525,6 +5625,26 @@ | ir.cpp:1055:15:1055:15 | ChiTotal | total:m1052_7 | | ir.cpp:1055:15:1055:15 | SideEffect | ~m1052_7 | | ir.cpp:1055:16:1055:16 | Arg(0) | 0:r1055_4 | +| ir.cpp:1056:1:1056:1 | Address | &:r1056_2 | +| ir.cpp:1056:1:1056:1 | Address | &:r1056_2 | +| ir.cpp:1056:1:1056:1 | Address | &:r1056_10 | +| ir.cpp:1056:1:1056:1 | Address | &:r1056_10 | +| ir.cpp:1056:1:1056:1 | Arg(this) | this:r1056_2 | +| ir.cpp:1056:1:1056:1 | Arg(this) | this:r1056_10 | +| ir.cpp:1056:1:1056:1 | CallTarget | func:r1056_3 | +| ir.cpp:1056:1:1056:1 | CallTarget | func:r1056_11 | +| ir.cpp:1056:1:1056:1 | ChiPartial | partial:m1056_5 | +| ir.cpp:1056:1:1056:1 | ChiPartial | partial:m1056_8 | +| ir.cpp:1056:1:1056:1 | ChiPartial | partial:m1056_13 | +| ir.cpp:1056:1:1056:1 | ChiPartial | partial:m1056_16 | +| ir.cpp:1056:1:1056:1 | ChiTotal | total:m1045_17 | +| ir.cpp:1056:1:1056:1 | ChiTotal | total:m1049_12 | +| ir.cpp:1056:1:1056:1 | ChiTotal | total:m1055_7 | +| ir.cpp:1056:1:1056:1 | ChiTotal | total:m1056_6 | +| ir.cpp:1056:1:1056:1 | SideEffect | m1045_17 | +| ir.cpp:1056:1:1056:1 | SideEffect | m1049_12 | +| ir.cpp:1056:1:1056:1 | SideEffect | ~m1055_7 | +| ir.cpp:1056:1:1056:1 | SideEffect | ~m1056_6 | | ir.cpp:1077:6:1077:18 | ChiPartial | partial:m1077_3 | | ir.cpp:1077:6:1077:18 | ChiTotal | total:m1077_2 | | ir.cpp:1077:6:1077:18 | SideEffect | ~m1088_1 | @@ -6030,7 +6150,7 @@ | ir.cpp:1237:24:1237:24 | Right | r1237_13 | | ir.cpp:1240:6:1240:31 | ChiPartial | partial:m1240_3 | | ir.cpp:1240:6:1240:31 | ChiTotal | total:m1240_2 | -| ir.cpp:1240:6:1240:31 | SideEffect | ~m1244_1 | +| ir.cpp:1240:6:1240:31 | SideEffect | ~m1244_26 | | ir.cpp:1240:45:1240:51 | Address | &:r1240_5 | | ir.cpp:1240:45:1240:51 | Address | &:r1240_5 | | ir.cpp:1240:45:1240:51 | Address | &:r1240_7 | @@ -6089,8 +6209,38 @@ | ir.cpp:1243:21:1243:27 | Arg(0) | 0:r1243_8 | | ir.cpp:1243:21:1243:27 | Load | m1240_6 | | ir.cpp:1243:21:1243:27 | SideEffect | ~m1240_8 | +| ir.cpp:1244:1:1244:1 | Address | &:r1244_3 | +| ir.cpp:1244:1:1244:1 | Address | &:r1244_3 | +| ir.cpp:1244:1:1244:1 | Address | &:r1244_11 | +| ir.cpp:1244:1:1244:1 | Address | &:r1244_11 | +| ir.cpp:1244:1:1244:1 | Address | &:r1244_19 | +| ir.cpp:1244:1:1244:1 | Address | &:r1244_19 | +| ir.cpp:1244:1:1244:1 | Arg(this) | this:r1244_3 | +| ir.cpp:1244:1:1244:1 | Arg(this) | this:r1244_11 | +| ir.cpp:1244:1:1244:1 | Arg(this) | this:r1244_19 | +| ir.cpp:1244:1:1244:1 | CallTarget | func:r1244_4 | +| ir.cpp:1244:1:1244:1 | CallTarget | func:r1244_12 | +| ir.cpp:1244:1:1244:1 | CallTarget | func:r1244_20 | +| ir.cpp:1244:1:1244:1 | ChiPartial | partial:m1244_6 | +| ir.cpp:1244:1:1244:1 | ChiPartial | partial:m1244_9 | +| ir.cpp:1244:1:1244:1 | ChiPartial | partial:m1244_14 | +| ir.cpp:1244:1:1244:1 | ChiPartial | partial:m1244_17 | +| ir.cpp:1244:1:1244:1 | ChiPartial | partial:m1244_22 | +| ir.cpp:1244:1:1244:1 | ChiPartial | partial:m1244_25 | +| ir.cpp:1244:1:1244:1 | ChiTotal | total:m1244_1 | +| ir.cpp:1244:1:1244:1 | ChiTotal | total:m1244_7 | +| ir.cpp:1244:1:1244:1 | ChiTotal | total:m1244_10 | +| ir.cpp:1244:1:1244:1 | ChiTotal | total:m1244_15 | +| ir.cpp:1244:1:1244:1 | ChiTotal | total:m1244_18 | +| ir.cpp:1244:1:1244:1 | ChiTotal | total:m1244_23 | | ir.cpp:1244:1:1244:1 | Phi | from 4:~m1243_1 | | ir.cpp:1244:1:1244:1 | Phi | from 5:~m1243_17 | +| ir.cpp:1244:1:1244:1 | SideEffect | ~m1244_1 | +| ir.cpp:1244:1:1244:1 | SideEffect | ~m1244_7 | +| ir.cpp:1244:1:1244:1 | SideEffect | ~m1244_10 | +| ir.cpp:1244:1:1244:1 | SideEffect | ~m1244_15 | +| ir.cpp:1244:1:1244:1 | SideEffect | ~m1244_18 | +| ir.cpp:1244:1:1244:1 | SideEffect | ~m1244_23 | | ir.cpp:1251:6:1251:17 | ChiPartial | partial:m1251_3 | | ir.cpp:1251:6:1251:17 | ChiTotal | total:m1251_2 | | ir.cpp:1251:6:1251:17 | SideEffect | m1251_3 | @@ -6166,7 +6316,7 @@ | ir.cpp:1262:21:1262:21 | StoreValue | r1262_2 | | ir.cpp:1270:6:1270:33 | ChiPartial | partial:m1270_3 | | ir.cpp:1270:6:1270:33 | ChiTotal | total:m1270_2 | -| ir.cpp:1270:6:1270:33 | SideEffect | ~m1286_8 | +| ir.cpp:1270:6:1270:33 | SideEffect | ~m1287_6 | | ir.cpp:1270:39:1270:45 | Address | &:r1270_5 | | ir.cpp:1270:51:1270:55 | Address | &:r1270_7 | | ir.cpp:1270:51:1270:55 | Address | &:r1270_7 | @@ -6286,6 +6436,16 @@ | ir.cpp:1286:25:1286:49 | ChiPartial | partial:m1286_7 | | ir.cpp:1286:25:1286:49 | ChiTotal | total:m1286_4 | | ir.cpp:1286:25:1286:49 | SideEffect | ~m1286_4 | +| ir.cpp:1287:1:1287:1 | Address | &:r1287_2 | +| ir.cpp:1287:1:1287:1 | Address | &:r1287_2 | +| ir.cpp:1287:1:1287:1 | Arg(this) | this:r1287_2 | +| ir.cpp:1287:1:1287:1 | CallTarget | func:r1287_3 | +| ir.cpp:1287:1:1287:1 | ChiPartial | partial:m1287_5 | +| ir.cpp:1287:1:1287:1 | ChiPartial | partial:m1287_8 | +| ir.cpp:1287:1:1287:1 | ChiTotal | total:m1271_8 | +| ir.cpp:1287:1:1287:1 | ChiTotal | total:m1286_8 | +| ir.cpp:1287:1:1287:1 | SideEffect | m1271_8 | +| ir.cpp:1287:1:1287:1 | SideEffect | ~m1286_8 | | ir.cpp:1289:5:1289:22 | Address | &:r1289_10 | | ir.cpp:1289:5:1289:22 | ChiPartial | partial:m1289_3 | | ir.cpp:1289:5:1289:22 | ChiTotal | total:m1289_2 | @@ -6564,7 +6724,7 @@ | ir.cpp:1327:5:1327:15 | StoreValue | r1327_2 | | ir.cpp:1365:6:1365:21 | ChiPartial | partial:m1365_3 | | ir.cpp:1365:6:1365:21 | ChiTotal | total:m1365_2 | -| ir.cpp:1365:6:1365:21 | SideEffect | ~m1376_5 | +| ir.cpp:1365:6:1365:21 | SideEffect | ~m1377_6 | | ir.cpp:1366:12:1366:12 | Address | &:r1366_1 | | ir.cpp:1366:16:1366:34 | CallTarget | func:r1366_2 | | ir.cpp:1366:16:1366:34 | ChiPartial | partial:m1366_4 | @@ -6689,9 +6849,19 @@ | ir.cpp:1376:5:1376:28 | SideEffect | ~m1374_11 | | ir.cpp:1376:5:1376:28 | StoreValue | r1376_3 | | ir.cpp:1376:5:1376:30 | Address | &:r1376_1 | +| ir.cpp:1377:1:1377:1 | Address | &:r1377_2 | +| ir.cpp:1377:1:1377:1 | Address | &:r1377_2 | +| ir.cpp:1377:1:1377:1 | Arg(this) | this:r1377_2 | +| ir.cpp:1377:1:1377:1 | CallTarget | func:r1377_3 | +| ir.cpp:1377:1:1377:1 | ChiPartial | partial:m1377_5 | +| ir.cpp:1377:1:1377:1 | ChiPartial | partial:m1377_8 | +| ir.cpp:1377:1:1377:1 | ChiTotal | total:m1366_6 | +| ir.cpp:1377:1:1377:1 | ChiTotal | total:m1376_5 | +| ir.cpp:1377:1:1377:1 | SideEffect | m1366_6 | +| ir.cpp:1377:1:1377:1 | SideEffect | ~m1376_5 | | ir.cpp:1379:6:1379:30 | ChiPartial | partial:m1379_3 | | ir.cpp:1379:6:1379:30 | ChiTotal | total:m1379_2 | -| ir.cpp:1379:6:1379:30 | SideEffect | ~m1388_5 | +| ir.cpp:1379:6:1379:30 | SideEffect | ~m1389_14 | | ir.cpp:1380:21:1380:21 | Address | &:r1380_1 | | ir.cpp:1380:25:1380:52 | CallTarget | func:r1380_2 | | ir.cpp:1380:25:1380:52 | ChiPartial | partial:m1380_4 | @@ -6763,6 +6933,26 @@ | ir.cpp:1388:5:1388:37 | SideEffect | ~m1386_10 | | ir.cpp:1388:5:1388:37 | StoreValue | r1388_3 | | ir.cpp:1388:5:1388:39 | Address | &:r1388_1 | +| ir.cpp:1389:1:1389:1 | Address | &:r1389_2 | +| ir.cpp:1389:1:1389:1 | Address | &:r1389_2 | +| ir.cpp:1389:1:1389:1 | Address | &:r1389_10 | +| ir.cpp:1389:1:1389:1 | Address | &:r1389_10 | +| ir.cpp:1389:1:1389:1 | Arg(this) | this:r1389_2 | +| ir.cpp:1389:1:1389:1 | Arg(this) | this:r1389_10 | +| ir.cpp:1389:1:1389:1 | CallTarget | func:r1389_3 | +| ir.cpp:1389:1:1389:1 | CallTarget | func:r1389_11 | +| ir.cpp:1389:1:1389:1 | ChiPartial | partial:m1389_5 | +| ir.cpp:1389:1:1389:1 | ChiPartial | partial:m1389_8 | +| ir.cpp:1389:1:1389:1 | ChiPartial | partial:m1389_13 | +| ir.cpp:1389:1:1389:1 | ChiPartial | partial:m1389_16 | +| ir.cpp:1389:1:1389:1 | ChiTotal | total:m1380_6 | +| ir.cpp:1389:1:1389:1 | ChiTotal | total:m1382_2 | +| ir.cpp:1389:1:1389:1 | ChiTotal | total:m1388_5 | +| ir.cpp:1389:1:1389:1 | ChiTotal | total:m1389_6 | +| ir.cpp:1389:1:1389:1 | SideEffect | m1380_6 | +| ir.cpp:1389:1:1389:1 | SideEffect | m1382_2 | +| ir.cpp:1389:1:1389:1 | SideEffect | ~m1388_5 | +| ir.cpp:1389:1:1389:1 | SideEffect | ~m1389_6 | | ir.cpp:1391:6:1391:31 | ChiPartial | partial:m1391_3 | | ir.cpp:1391:6:1391:31 | ChiTotal | total:m1391_2 | | ir.cpp:1391:6:1391:31 | SideEffect | ~m1401_6 | @@ -9065,7 +9255,7 @@ | ir.cpp:1915:12:1915:12 | StoreValue | r1915_3 | | ir.cpp:1918:6:1918:43 | ChiPartial | partial:m1918_3 | | ir.cpp:1918:6:1918:43 | ChiTotal | total:m1918_2 | -| ir.cpp:1918:6:1918:43 | SideEffect | ~m1925_5 | +| ir.cpp:1918:6:1918:43 | SideEffect | ~m1926_6 | | ir.cpp:1919:7:1919:7 | Address | &:r1919_1 | | ir.cpp:1919:7:1919:7 | Address | &:r1919_1 | | ir.cpp:1919:7:1919:7 | Arg(this) | this:r1919_1 | @@ -9099,6 +9289,16 @@ | ir.cpp:1925:9:1925:23 | SideEffect | ~m1923_5 | | ir.cpp:1925:9:1925:23 | StoreValue | r1925_3 | | ir.cpp:1925:25:1925:26 | Arg(0) | 0:r1925_2 | +| ir.cpp:1926:1:1926:1 | Address | &:r1926_2 | +| ir.cpp:1926:1:1926:1 | Address | &:r1926_2 | +| ir.cpp:1926:1:1926:1 | Arg(this) | this:r1926_2 | +| ir.cpp:1926:1:1926:1 | CallTarget | func:r1926_3 | +| ir.cpp:1926:1:1926:1 | ChiPartial | partial:m1926_5 | +| ir.cpp:1926:1:1926:1 | ChiPartial | partial:m1926_8 | +| ir.cpp:1926:1:1926:1 | ChiTotal | total:m1919_8 | +| ir.cpp:1926:1:1926:1 | ChiTotal | total:m1925_5 | +| ir.cpp:1926:1:1926:1 | SideEffect | m1919_8 | +| ir.cpp:1926:1:1926:1 | SideEffect | ~m1925_5 | | ir.cpp:1928:6:1928:23 | ChiPartial | partial:m1928_3 | | ir.cpp:1928:6:1928:23 | ChiTotal | total:m1928_2 | | ir.cpp:1928:6:1928:23 | SideEffect | m1928_3 | @@ -9255,7 +9455,7 @@ | ir.cpp:1987:5:1987:21 | Address | &:r1987_1 | | ir.cpp:1990:6:1990:21 | ChiPartial | partial:m1990_3 | | ir.cpp:1990:6:1990:21 | ChiTotal | total:m1990_2 | -| ir.cpp:1990:6:1990:21 | SideEffect | ~m1991_6 | +| ir.cpp:1990:6:1990:21 | SideEffect | ~m1994_6 | | ir.cpp:1991:7:1991:7 | Address | &:r1991_1 | | ir.cpp:1991:7:1991:7 | Address | &:r1991_1 | | ir.cpp:1991:7:1991:7 | Arg(this) | this:r1991_1 | @@ -9269,6 +9469,16 @@ | ir.cpp:1992:23:1992:45 | StoreValue | r1992_2 | | ir.cpp:1993:5:1993:7 | Address | &:r1993_3 | | ir.cpp:1993:13:1993:32 | StoreValue | r1993_2 | +| ir.cpp:1994:1:1994:1 | Address | &:r1994_2 | +| ir.cpp:1994:1:1994:1 | Address | &:r1994_2 | +| ir.cpp:1994:1:1994:1 | Arg(this) | this:r1994_2 | +| ir.cpp:1994:1:1994:1 | CallTarget | func:r1994_3 | +| ir.cpp:1994:1:1994:1 | ChiPartial | partial:m1994_5 | +| ir.cpp:1994:1:1994:1 | ChiPartial | partial:m1994_8 | +| ir.cpp:1994:1:1994:1 | ChiTotal | total:m1991_6 | +| ir.cpp:1994:1:1994:1 | ChiTotal | total:m1991_8 | +| ir.cpp:1994:1:1994:1 | SideEffect | m1991_8 | +| ir.cpp:1994:1:1994:1 | SideEffect | ~m1991_6 | | ir.cpp:1996:6:1996:19 | ChiPartial | partial:m1996_3 | | ir.cpp:1996:6:1996:19 | ChiTotal | total:m1996_2 | | ir.cpp:1996:6:1996:19 | SideEffect | ~m2000_9 | @@ -10070,6 +10280,419 @@ | ir.cpp:2112:10:2112:12 | Address | &:r2112_2 | | ir.cpp:2112:10:2112:12 | Load | m2111_11 | | ir.cpp:2112:10:2112:12 | StoreValue | r2112_3 | +| ir.cpp:2115:6:2115:24 | ChiPartial | partial:m2115_3 | +| ir.cpp:2115:6:2115:24 | ChiTotal | total:m2115_2 | +| ir.cpp:2115:6:2115:24 | Phi | from 2:~m2115_10 | +| ir.cpp:2115:6:2115:24 | Phi | from 6:~m2124_8 | +| ir.cpp:2115:6:2115:24 | Phi | from 9:~m2117_6 | +| ir.cpp:2115:6:2115:24 | Phi | from 10:~m2131_1 | +| ir.cpp:2115:6:2115:24 | SideEffect | ~m2115_7 | +| ir.cpp:2115:31:2115:31 | Address | &:r2115_5 | +| ir.cpp:2117:12:2117:12 | Address | &:r2117_1 | +| ir.cpp:2117:12:2117:12 | Address | &:r2117_1 | +| ir.cpp:2117:12:2117:12 | Arg(this) | this:r2117_1 | +| ir.cpp:2117:12:2117:12 | CallTarget | func:r2117_3 | +| ir.cpp:2117:12:2117:12 | ChiPartial | partial:m2117_5 | +| ir.cpp:2117:12:2117:12 | ChiPartial | partial:m2117_7 | +| ir.cpp:2117:12:2117:12 | ChiTotal | total:m2115_4 | +| ir.cpp:2117:12:2117:12 | ChiTotal | total:m2117_2 | +| ir.cpp:2117:12:2117:12 | SideEffect | ~m2115_4 | +| ir.cpp:2118:9:2118:9 | Address | &:r2118_1 | +| ir.cpp:2118:9:2118:9 | Condition | r2118_2 | +| ir.cpp:2118:9:2118:9 | Load | m2115_6 | +| ir.cpp:2119:7:2119:28 | Address | &:r2119_1 | +| ir.cpp:2119:7:2119:28 | Address | &:r2119_1 | +| ir.cpp:2119:7:2119:28 | Load | m2119_4 | +| ir.cpp:2119:13:2119:28 | StoreValue | r2119_3 | +| ir.cpp:2119:13:2119:28 | Unary | r2119_2 | +| ir.cpp:2121:12:2121:13 | Address | &:r2121_1 | +| ir.cpp:2121:12:2121:13 | Address | &:r2121_1 | +| ir.cpp:2121:12:2121:13 | Arg(this) | this:r2121_1 | +| ir.cpp:2121:12:2121:13 | CallTarget | func:r2121_3 | +| ir.cpp:2121:12:2121:13 | ChiPartial | partial:m2121_5 | +| ir.cpp:2121:12:2121:13 | ChiPartial | partial:m2121_7 | +| ir.cpp:2121:12:2121:13 | ChiTotal | total:m2117_6 | +| ir.cpp:2121:12:2121:13 | ChiTotal | total:m2121_2 | +| ir.cpp:2121:12:2121:13 | SideEffect | ~m2117_6 | +| ir.cpp:2122:3:2122:3 | Address | &:r2122_1 | +| ir.cpp:2122:3:2122:3 | Address | &:r2122_1 | +| ir.cpp:2122:3:2122:3 | Address | &:r2122_9 | +| ir.cpp:2122:3:2122:3 | Address | &:r2122_9 | +| ir.cpp:2122:3:2122:3 | Arg(this) | this:r2122_1 | +| ir.cpp:2122:3:2122:3 | Arg(this) | this:r2122_9 | +| ir.cpp:2122:3:2122:3 | CallTarget | func:r2122_2 | +| ir.cpp:2122:3:2122:3 | CallTarget | func:r2122_10 | +| ir.cpp:2122:3:2122:3 | ChiPartial | partial:m2122_4 | +| ir.cpp:2122:3:2122:3 | ChiPartial | partial:m2122_7 | +| ir.cpp:2122:3:2122:3 | ChiPartial | partial:m2122_12 | +| ir.cpp:2122:3:2122:3 | ChiPartial | partial:m2122_15 | +| ir.cpp:2122:3:2122:3 | ChiTotal | total:m2117_8 | +| ir.cpp:2122:3:2122:3 | ChiTotal | total:m2121_6 | +| ir.cpp:2122:3:2122:3 | ChiTotal | total:m2121_8 | +| ir.cpp:2122:3:2122:3 | ChiTotal | total:m2122_5 | +| ir.cpp:2122:3:2122:3 | SideEffect | m2117_8 | +| ir.cpp:2122:3:2122:3 | SideEffect | m2121_8 | +| ir.cpp:2122:3:2122:3 | SideEffect | ~m2121_6 | +| ir.cpp:2122:3:2122:3 | SideEffect | ~m2122_5 | +| ir.cpp:2123:22:2123:22 | Address | &:r2123_2 | +| ir.cpp:2123:22:2123:22 | Address | &:r2123_2 | +| ir.cpp:2123:22:2123:22 | Address | &:r2123_4 | +| ir.cpp:2123:22:2123:22 | Load | m2123_3 | +| ir.cpp:2124:5:2124:19 | Address | &:r2124_1 | +| ir.cpp:2124:5:2124:19 | Address | &:r2124_1 | +| ir.cpp:2124:5:2124:19 | Address | &:r2124_1 | +| ir.cpp:2124:5:2124:19 | Arg(this) | this:r2124_1 | +| ir.cpp:2124:5:2124:19 | CallTarget | func:r2124_3 | +| ir.cpp:2124:5:2124:19 | ChiPartial | partial:m2124_7 | +| ir.cpp:2124:5:2124:19 | ChiPartial | partial:m2124_10 | +| ir.cpp:2124:5:2124:19 | ChiTotal | total:m2117_6 | +| ir.cpp:2124:5:2124:19 | ChiTotal | total:m2124_2 | +| ir.cpp:2124:5:2124:19 | Load | m2124_11 | +| ir.cpp:2124:5:2124:19 | SideEffect | ~m2117_6 | +| ir.cpp:2124:18:2124:18 | Address | &:r2124_4 | +| ir.cpp:2124:18:2124:18 | Address | &:r2124_5 | +| ir.cpp:2124:18:2124:18 | Arg(0) | 0:r2124_5 | +| ir.cpp:2124:18:2124:18 | Load | m2123_3 | +| ir.cpp:2124:18:2124:18 | SideEffect | ~m2123_5 | +| ir.cpp:2126:24:2126:24 | Address | &:r2126_2 | +| ir.cpp:2126:24:2126:24 | Address | &:r2126_2 | +| ir.cpp:2126:24:2126:24 | Address | &:r2126_4 | +| ir.cpp:2126:24:2126:24 | Load | m2126_3 | +| ir.cpp:2131:1:2131:1 | Phi | from 4:~m2122_13 | +| ir.cpp:2131:1:2131:1 | Phi | from 8:~m2117_6 | +| ir.cpp:2133:6:2133:18 | ChiPartial | partial:m2133_3 | +| ir.cpp:2133:6:2133:18 | ChiTotal | total:m2133_2 | +| ir.cpp:2133:6:2133:18 | SideEffect | ~m2141_14 | +| ir.cpp:2133:25:2133:25 | Address | &:r2133_5 | +| ir.cpp:2134:12:2134:13 | Address | &:r2134_1 | +| ir.cpp:2134:12:2134:13 | Address | &:r2134_1 | +| ir.cpp:2134:12:2134:13 | Arg(this) | this:r2134_1 | +| ir.cpp:2134:12:2134:13 | CallTarget | func:r2134_3 | +| ir.cpp:2134:12:2134:13 | ChiPartial | partial:m2134_5 | +| ir.cpp:2134:12:2134:13 | ChiPartial | partial:m2134_7 | +| ir.cpp:2134:12:2134:13 | ChiTotal | total:m2133_4 | +| ir.cpp:2134:12:2134:13 | ChiTotal | total:m2134_2 | +| ir.cpp:2134:12:2134:13 | SideEffect | ~m2133_4 | +| ir.cpp:2135:8:2135:8 | Address | &:r2135_1 | +| ir.cpp:2135:8:2135:8 | Condition | r2135_2 | +| ir.cpp:2135:8:2135:8 | Load | m2133_6 | +| ir.cpp:2136:16:2136:17 | Address | &:r2136_1 | +| ir.cpp:2136:16:2136:17 | Address | &:r2136_1 | +| ir.cpp:2136:16:2136:17 | Arg(this) | this:r2136_1 | +| ir.cpp:2136:16:2136:17 | CallTarget | func:r2136_3 | +| ir.cpp:2136:16:2136:17 | ChiPartial | partial:m2136_5 | +| ir.cpp:2136:16:2136:17 | ChiPartial | partial:m2136_7 | +| ir.cpp:2136:16:2136:17 | ChiTotal | total:m2134_6 | +| ir.cpp:2136:16:2136:17 | ChiTotal | total:m2136_2 | +| ir.cpp:2136:16:2136:17 | SideEffect | ~m2134_6 | +| ir.cpp:2137:5:2137:5 | Address | &:r2137_1 | +| ir.cpp:2137:5:2137:5 | Address | &:r2137_1 | +| ir.cpp:2137:5:2137:5 | Arg(this) | this:r2137_1 | +| ir.cpp:2137:5:2137:5 | CallTarget | func:r2137_2 | +| ir.cpp:2137:5:2137:5 | ChiPartial | partial:m2137_4 | +| ir.cpp:2137:5:2137:5 | ChiPartial | partial:m2137_7 | +| ir.cpp:2137:5:2137:5 | ChiTotal | total:m2136_6 | +| ir.cpp:2137:5:2137:5 | ChiTotal | total:m2136_8 | +| ir.cpp:2137:5:2137:5 | SideEffect | m2136_8 | +| ir.cpp:2137:5:2137:5 | SideEffect | ~m2136_6 | +| ir.cpp:2138:16:2138:17 | Address | &:r2138_1 | +| ir.cpp:2138:16:2138:17 | Address | &:r2138_1 | +| ir.cpp:2138:16:2138:17 | Arg(this) | this:r2138_1 | +| ir.cpp:2138:16:2138:17 | CallTarget | func:r2138_3 | +| ir.cpp:2138:16:2138:17 | ChiPartial | partial:m2138_5 | +| ir.cpp:2138:16:2138:17 | ChiPartial | partial:m2138_7 | +| ir.cpp:2138:16:2138:17 | ChiTotal | total:m2134_6 | +| ir.cpp:2138:16:2138:17 | ChiTotal | total:m2138_2 | +| ir.cpp:2138:16:2138:17 | SideEffect | ~m2134_6 | +| ir.cpp:2139:5:2139:5 | Address | &:r2139_1 | +| ir.cpp:2139:5:2139:5 | Address | &:r2139_1 | +| ir.cpp:2139:5:2139:5 | Arg(this) | this:r2139_1 | +| ir.cpp:2139:5:2139:5 | CallTarget | func:r2139_2 | +| ir.cpp:2139:5:2139:5 | ChiPartial | partial:m2139_4 | +| ir.cpp:2139:5:2139:5 | ChiPartial | partial:m2139_7 | +| ir.cpp:2139:5:2139:5 | ChiTotal | total:m2138_6 | +| ir.cpp:2139:5:2139:5 | ChiTotal | total:m2138_8 | +| ir.cpp:2139:5:2139:5 | SideEffect | m2138_8 | +| ir.cpp:2139:5:2139:5 | SideEffect | ~m2138_6 | +| ir.cpp:2140:12:2140:13 | Address | &:r2140_2 | +| ir.cpp:2140:12:2140:13 | Address | &:r2140_2 | +| ir.cpp:2140:12:2140:13 | Arg(this) | this:r2140_2 | +| ir.cpp:2140:12:2140:13 | CallTarget | func:r2140_4 | +| ir.cpp:2140:12:2140:13 | ChiPartial | partial:m2140_6 | +| ir.cpp:2140:12:2140:13 | ChiPartial | partial:m2140_8 | +| ir.cpp:2140:12:2140:13 | ChiTotal | total:m2140_1 | +| ir.cpp:2140:12:2140:13 | ChiTotal | total:m2140_3 | +| ir.cpp:2140:12:2140:13 | Phi | from 1:~m2137_5 | +| ir.cpp:2140:12:2140:13 | Phi | from 2:~m2139_5 | +| ir.cpp:2140:12:2140:13 | SideEffect | ~m2140_1 | +| ir.cpp:2141:1:2141:1 | Address | &:r2141_2 | +| ir.cpp:2141:1:2141:1 | Address | &:r2141_2 | +| ir.cpp:2141:1:2141:1 | Address | &:r2141_10 | +| ir.cpp:2141:1:2141:1 | Address | &:r2141_10 | +| ir.cpp:2141:1:2141:1 | Arg(this) | this:r2141_2 | +| ir.cpp:2141:1:2141:1 | Arg(this) | this:r2141_10 | +| ir.cpp:2141:1:2141:1 | CallTarget | func:r2141_3 | +| ir.cpp:2141:1:2141:1 | CallTarget | func:r2141_11 | +| ir.cpp:2141:1:2141:1 | ChiPartial | partial:m2141_5 | +| ir.cpp:2141:1:2141:1 | ChiPartial | partial:m2141_8 | +| ir.cpp:2141:1:2141:1 | ChiPartial | partial:m2141_13 | +| ir.cpp:2141:1:2141:1 | ChiPartial | partial:m2141_16 | +| ir.cpp:2141:1:2141:1 | ChiTotal | total:m2134_8 | +| ir.cpp:2141:1:2141:1 | ChiTotal | total:m2140_7 | +| ir.cpp:2141:1:2141:1 | ChiTotal | total:m2140_9 | +| ir.cpp:2141:1:2141:1 | ChiTotal | total:m2141_6 | +| ir.cpp:2141:1:2141:1 | SideEffect | m2134_8 | +| ir.cpp:2141:1:2141:1 | SideEffect | m2140_9 | +| ir.cpp:2141:1:2141:1 | SideEffect | ~m2140_7 | +| ir.cpp:2141:1:2141:1 | SideEffect | ~m2141_6 | +| ir.cpp:2143:6:2143:19 | ChiPartial | partial:m2143_3 | +| ir.cpp:2143:6:2143:19 | ChiTotal | total:m2143_2 | +| ir.cpp:2143:6:2143:19 | SideEffect | ~m2149_48 | +| ir.cpp:2144:10:2144:10 | Address | &:r2144_1 | +| ir.cpp:2144:13:2144:16 | StoreValue | r2144_2 | +| ir.cpp:2145:16:2145:16 | Address | &:r2145_1 | +| ir.cpp:2145:16:2145:16 | Address | &:r2145_1 | +| ir.cpp:2145:16:2145:16 | Address | &:r2145_31 | +| ir.cpp:2145:16:2145:16 | Address | &:r2145_31 | +| ir.cpp:2145:16:2145:16 | Arg(this) | this:r2145_1 | +| ir.cpp:2145:16:2145:16 | Arg(this) | this:r2145_31 | +| ir.cpp:2145:16:2145:16 | CallTarget | func:r2145_32 | +| ir.cpp:2145:16:2145:16 | ChiPartial | partial:m2145_34 | +| ir.cpp:2145:16:2145:16 | ChiPartial | partial:m2145_37 | +| ir.cpp:2145:16:2145:16 | ChiTotal | total:m2145_12 | +| ir.cpp:2145:16:2145:16 | ChiTotal | total:m2145_13 | +| ir.cpp:2145:16:2145:16 | SideEffect | m2145_12 | +| ir.cpp:2145:16:2145:16 | SideEffect | ~m2145_13 | +| ir.cpp:2145:18:2145:24 | Address | &:r2145_5 | +| ir.cpp:2145:18:2145:24 | Arg(0) | 0:r2145_5 | +| ir.cpp:2145:18:2145:24 | SideEffect | ~m2143_3 | +| ir.cpp:2145:18:2145:24 | Unary | r2145_4 | +| ir.cpp:2145:18:2145:25 | CallTarget | func:r2145_3 | +| ir.cpp:2145:18:2145:25 | ChiPartial | partial:m2145_7 | +| ir.cpp:2145:18:2145:25 | ChiPartial | partial:m2145_10 | +| ir.cpp:2145:18:2145:25 | ChiTotal | total:m2143_4 | +| ir.cpp:2145:18:2145:25 | ChiTotal | total:m2145_2 | +| ir.cpp:2145:18:2145:25 | SideEffect | ~m2143_4 | +| ir.cpp:2145:28:2145:28 | Address | &:r2145_15 | +| ir.cpp:2145:28:2145:28 | Left | r2145_17 | +| ir.cpp:2145:28:2145:28 | Load | m2145_14 | +| ir.cpp:2145:28:2145:28 | Phi | from 0:m2144_3 | +| ir.cpp:2145:28:2145:28 | Phi | from 0:m2145_11 | +| ir.cpp:2145:28:2145:28 | Phi | from 0:~m2145_8 | +| ir.cpp:2145:28:2145:28 | Phi | from 2:m2145_28 | +| ir.cpp:2145:28:2145:28 | Phi | from 2:m2145_30 | +| ir.cpp:2145:28:2145:28 | Phi | from 2:~m2145_25 | +| ir.cpp:2145:28:2145:28 | Unary | r2145_16 | +| ir.cpp:2145:28:2145:33 | Condition | r2145_19 | +| ir.cpp:2145:33:2145:33 | Right | r2145_18 | +| ir.cpp:2145:36:2145:36 | Address | &:r2145_29 | +| ir.cpp:2145:40:2145:40 | Address | &:r2145_21 | +| ir.cpp:2145:40:2145:40 | Address | &:r2145_21 | +| ir.cpp:2145:40:2145:40 | Arg(this) | this:r2145_21 | +| ir.cpp:2145:40:2145:40 | ChiPartial | partial:m2145_27 | +| ir.cpp:2145:40:2145:40 | ChiTotal | total:m2145_12 | +| ir.cpp:2145:40:2145:40 | SideEffect | m2145_12 | +| ir.cpp:2145:42:2145:49 | CallTarget | func:r2145_22 | +| ir.cpp:2145:42:2145:49 | ChiPartial | partial:m2145_24 | +| ir.cpp:2145:42:2145:49 | ChiTotal | total:m2147_5 | +| ir.cpp:2145:42:2145:49 | SideEffect | ~m2147_5 | +| ir.cpp:2145:42:2145:49 | StoreValue | r2145_23 | +| ir.cpp:2146:16:2146:17 | Address | &:r2146_1 | +| ir.cpp:2146:16:2146:17 | Address | &:r2146_1 | +| ir.cpp:2146:16:2146:17 | Arg(this) | this:r2146_1 | +| ir.cpp:2146:16:2146:17 | CallTarget | func:r2146_3 | +| ir.cpp:2146:16:2146:17 | ChiPartial | partial:m2146_5 | +| ir.cpp:2146:16:2146:17 | ChiPartial | partial:m2146_7 | +| ir.cpp:2146:16:2146:17 | ChiTotal | total:m2145_13 | +| ir.cpp:2146:16:2146:17 | ChiTotal | total:m2146_2 | +| ir.cpp:2146:16:2146:17 | SideEffect | ~m2145_13 | +| ir.cpp:2147:5:2147:5 | Address | &:r2147_1 | +| ir.cpp:2147:5:2147:5 | Address | &:r2147_1 | +| ir.cpp:2147:5:2147:5 | Arg(this) | this:r2147_1 | +| ir.cpp:2147:5:2147:5 | CallTarget | func:r2147_2 | +| ir.cpp:2147:5:2147:5 | ChiPartial | partial:m2147_4 | +| ir.cpp:2147:5:2147:5 | ChiPartial | partial:m2147_7 | +| ir.cpp:2147:5:2147:5 | ChiTotal | total:m2146_6 | +| ir.cpp:2147:5:2147:5 | ChiTotal | total:m2146_8 | +| ir.cpp:2147:5:2147:5 | SideEffect | m2146_8 | +| ir.cpp:2147:5:2147:5 | SideEffect | ~m2146_6 | +| ir.cpp:2149:5:2151:5 | Address | &:r2149_1 | +| ir.cpp:2149:5:2151:5 | Address | &:r2149_24 | +| ir.cpp:2149:5:2151:5 | Address | &:r2149_32 | +| ir.cpp:2149:5:2151:5 | Address | &:r2149_50 | +| ir.cpp:2149:5:2151:5 | Address | &:r2149_50 | +| ir.cpp:2149:5:2151:5 | Arg(this) | this:r2149_50 | +| ir.cpp:2149:16:2149:16 | CallTarget | func:r2149_52 | +| ir.cpp:2149:16:2149:16 | ChiPartial | partial:m2149_62 | +| ir.cpp:2149:16:2149:16 | ChiPartial | partial:m2149_65 | +| ir.cpp:2149:16:2149:16 | ChiTotal | total:m2149_51 | +| ir.cpp:2149:16:2149:16 | ChiTotal | total:m2149_57 | +| ir.cpp:2149:16:2149:16 | SideEffect | ~m2149_57 | +| ir.cpp:2149:20:2149:20 | Address | &:r2149_25 | +| ir.cpp:2149:20:2149:20 | Address | &:r2149_33 | +| ir.cpp:2149:20:2149:20 | Address | &:r2149_44 | +| ir.cpp:2149:20:2149:20 | Address | &:r2149_67 | +| ir.cpp:2149:20:2149:20 | Address | &:r2149_67 | +| ir.cpp:2149:20:2149:20 | Arg(0) | 0:r2149_45 | +| ir.cpp:2149:20:2149:20 | Arg(this) | this:r0_2 | +| ir.cpp:2149:20:2149:20 | Arg(this) | this:r0_5 | +| ir.cpp:2149:20:2149:20 | Arg(this) | this:r0_7 | +| ir.cpp:2149:20:2149:20 | Arg(this) | this:r0_9 | +| ir.cpp:2149:20:2149:20 | Arg(this) | this:r2149_67 | +| ir.cpp:2149:20:2149:20 | CallTarget | func:r2149_27 | +| ir.cpp:2149:20:2149:20 | CallTarget | func:r2149_35 | +| ir.cpp:2149:20:2149:20 | CallTarget | func:r2149_43 | +| ir.cpp:2149:20:2149:20 | CallTarget | func:r2149_54 | +| ir.cpp:2149:20:2149:20 | CallTarget | func:r2149_68 | +| ir.cpp:2149:20:2149:20 | ChiPartial | partial:m2149_29 | +| ir.cpp:2149:20:2149:20 | ChiPartial | partial:m2149_37 | +| ir.cpp:2149:20:2149:20 | ChiPartial | partial:m2149_47 | +| ir.cpp:2149:20:2149:20 | ChiPartial | partial:m2149_56 | +| ir.cpp:2149:20:2149:20 | ChiPartial | partial:m2149_70 | +| ir.cpp:2149:20:2149:20 | ChiPartial | partial:m2149_73 | +| ir.cpp:2149:20:2149:20 | ChiTotal | total:m2149_19 | +| ir.cpp:2149:20:2149:20 | ChiTotal | total:m2149_30 | +| ir.cpp:2149:20:2149:20 | ChiTotal | total:m2149_40 | +| ir.cpp:2149:20:2149:20 | ChiTotal | total:m2149_41 | +| ir.cpp:2149:20:2149:20 | ChiTotal | total:m2149_48 | +| ir.cpp:2149:20:2149:20 | ChiTotal | total:m2151_5 | +| ir.cpp:2149:20:2149:20 | Condition | r2149_46 | +| ir.cpp:2149:20:2149:20 | Load | m2149_23 | +| ir.cpp:2149:20:2149:20 | Load | m2149_23 | +| ir.cpp:2149:20:2149:20 | Load | m2149_39 | +| ir.cpp:2149:20:2149:20 | Phi | from 3:m2149_31 | +| ir.cpp:2149:20:2149:20 | Phi | from 3:~m2149_38 | +| ir.cpp:2149:20:2149:20 | Phi | from 5:m2149_74 | +| ir.cpp:2149:20:2149:20 | Phi | from 5:~m2149_71 | +| ir.cpp:2149:20:2149:20 | SideEffect | m2149_40 | +| ir.cpp:2149:20:2149:20 | SideEffect | ~m2149_19 | +| ir.cpp:2149:20:2149:20 | SideEffect | ~m2149_30 | +| ir.cpp:2149:20:2149:20 | SideEffect | ~m2149_41 | +| ir.cpp:2149:20:2149:20 | SideEffect | ~m2149_48 | +| ir.cpp:2149:20:2149:20 | SideEffect | ~m2151_5 | +| ir.cpp:2149:20:2149:20 | StoreValue | r2149_28 | +| ir.cpp:2149:20:2149:20 | StoreValue | r2149_36 | +| ir.cpp:2149:20:2149:20 | Unary | r2149_26 | +| ir.cpp:2149:20:2149:20 | Unary | r2149_34 | +| ir.cpp:2149:20:2149:20 | Unary | r2149_42 | +| ir.cpp:2149:20:2149:20 | Unary | r2149_53 | +| ir.cpp:2149:20:2149:20 | Unary | r2149_55 | +| ir.cpp:2149:20:2149:20 | Unary | r2149_69 | +| ir.cpp:2149:20:2149:50 | Address | &:r2149_2 | +| ir.cpp:2149:20:2149:50 | Address | &:r2149_2 | +| ir.cpp:2149:20:2149:50 | Arg(this) | this:r2149_2 | +| ir.cpp:2149:20:2149:50 | CallTarget | func:r2149_4 | +| ir.cpp:2149:20:2149:50 | ChiPartial | partial:m2149_18 | +| ir.cpp:2149:20:2149:50 | ChiPartial | partial:m2149_20 | +| ir.cpp:2149:20:2149:50 | ChiTotal | total:m2149_3 | +| ir.cpp:2149:20:2149:50 | ChiTotal | total:m2149_12 | +| ir.cpp:2149:20:2149:50 | SideEffect | ~m2149_12 | +| ir.cpp:2149:20:2149:50 | StoreValue | r2149_22 | +| ir.cpp:2149:20:2149:50 | Unary | r2149_2 | +| ir.cpp:2149:20:2149:51 | Address | &:r2149_60 | +| ir.cpp:2149:20:2149:51 | Arg(0) | 0:r2149_60 | +| ir.cpp:2149:20:2149:51 | SideEffect | ~m2149_63 | +| ir.cpp:2149:20:2149:51 | Unary | r2149_58 | +| ir.cpp:2149:20:2149:51 | Unary | r2149_59 | +| ir.cpp:2149:35:2149:49 | Address | &:r2149_5 | +| ir.cpp:2149:35:2149:49 | Address | &:r2149_5 | +| ir.cpp:2149:35:2149:49 | Address | &:r2149_5 | +| ir.cpp:2149:35:2149:49 | Arg(0) | 0:r2149_16 | +| ir.cpp:2149:35:2149:49 | Arg(this) | this:r2149_5 | +| ir.cpp:2149:35:2149:49 | CallTarget | func:r2149_7 | +| ir.cpp:2149:35:2149:49 | ChiPartial | partial:m2149_11 | +| ir.cpp:2149:35:2149:49 | ChiPartial | partial:m2149_14 | +| ir.cpp:2149:35:2149:49 | ChiTotal | total:m2145_35 | +| ir.cpp:2149:35:2149:49 | ChiTotal | total:m2149_6 | +| ir.cpp:2149:35:2149:49 | Load | m2149_15 | +| ir.cpp:2149:35:2149:49 | SideEffect | ~m2145_35 | +| ir.cpp:2149:42:2149:48 | Address | &:r2149_9 | +| ir.cpp:2149:42:2149:48 | Arg(0) | 0:r2149_9 | +| ir.cpp:2149:42:2149:48 | SideEffect | ~m2143_3 | +| ir.cpp:2149:42:2149:48 | Unary | r2149_8 | +| ir.cpp:2150:16:2150:17 | Address | &:r2150_1 | +| ir.cpp:2150:16:2150:17 | Address | &:r2150_1 | +| ir.cpp:2150:16:2150:17 | Arg(this) | this:r2150_1 | +| ir.cpp:2150:16:2150:17 | CallTarget | func:r2150_3 | +| ir.cpp:2150:16:2150:17 | ChiPartial | partial:m2150_5 | +| ir.cpp:2150:16:2150:17 | ChiPartial | partial:m2150_7 | +| ir.cpp:2150:16:2150:17 | ChiTotal | total:m2149_63 | +| ir.cpp:2150:16:2150:17 | ChiTotal | total:m2150_2 | +| ir.cpp:2150:16:2150:17 | SideEffect | ~m2149_63 | +| ir.cpp:2151:5:2151:5 | Address | &:r2151_1 | +| ir.cpp:2151:5:2151:5 | Address | &:r2151_1 | +| ir.cpp:2151:5:2151:5 | Arg(this) | this:r2151_1 | +| ir.cpp:2151:5:2151:5 | CallTarget | func:r2151_2 | +| ir.cpp:2151:5:2151:5 | ChiPartial | partial:m2151_4 | +| ir.cpp:2151:5:2151:5 | ChiPartial | partial:m2151_7 | +| ir.cpp:2151:5:2151:5 | ChiTotal | total:m2150_6 | +| ir.cpp:2151:5:2151:5 | ChiTotal | total:m2150_8 | +| ir.cpp:2151:5:2151:5 | SideEffect | m2150_8 | +| ir.cpp:2151:5:2151:5 | SideEffect | ~m2150_6 | +| ir.cpp:2154:6:2154:19 | ChiPartial | partial:m2154_3 | +| ir.cpp:2154:6:2154:19 | ChiTotal | total:m2154_2 | +| ir.cpp:2154:6:2154:19 | SideEffect | ~m2159_5 | +| ir.cpp:2154:26:2154:26 | Address | &:r2154_5 | +| ir.cpp:2155:15:2155:15 | Address | &:r2155_1 | +| ir.cpp:2155:15:2155:15 | Address | &:r2155_1 | +| ir.cpp:2155:15:2155:15 | Arg(this) | this:r2155_1 | +| ir.cpp:2155:18:2155:33 | CallTarget | func:r2155_3 | +| ir.cpp:2155:18:2155:33 | ChiPartial | partial:m2155_7 | +| ir.cpp:2155:18:2155:33 | ChiPartial | partial:m2155_10 | +| ir.cpp:2155:18:2155:33 | ChiTotal | total:m2154_4 | +| ir.cpp:2155:18:2155:33 | ChiTotal | total:m2155_2 | +| ir.cpp:2155:18:2155:33 | SideEffect | ~m2154_4 | +| ir.cpp:2155:26:2155:32 | Address | &:r2155_5 | +| ir.cpp:2155:26:2155:32 | Arg(0) | 0:r2155_5 | +| ir.cpp:2155:26:2155:32 | SideEffect | ~m2154_3 | +| ir.cpp:2155:26:2155:32 | Unary | r2155_4 | +| ir.cpp:2155:36:2155:36 | Address | &:r2155_12 | +| ir.cpp:2155:36:2155:36 | Condition | r2155_13 | +| ir.cpp:2155:36:2155:36 | Load | m2154_6 | +| ir.cpp:2156:13:2156:13 | Address | &:r2156_1 | +| ir.cpp:2156:16:2156:17 | StoreValue | r2156_2 | +| ir.cpp:2158:13:2158:13 | Address | &:r2158_1 | +| ir.cpp:2158:16:2158:17 | StoreValue | r2158_2 | +| ir.cpp:2159:5:2159:5 | Address | &:r2159_1 | +| ir.cpp:2159:5:2159:5 | Address | &:r2159_1 | +| ir.cpp:2159:5:2159:5 | Arg(this) | this:r2159_1 | +| ir.cpp:2159:5:2159:5 | CallTarget | func:r2159_2 | +| ir.cpp:2159:5:2159:5 | ChiPartial | partial:m2159_4 | +| ir.cpp:2159:5:2159:5 | ChiPartial | partial:m2159_7 | +| ir.cpp:2159:5:2159:5 | ChiTotal | total:m2155_8 | +| ir.cpp:2159:5:2159:5 | ChiTotal | total:m2155_11 | +| ir.cpp:2159:5:2159:5 | SideEffect | m2155_11 | +| ir.cpp:2159:5:2159:5 | SideEffect | ~m2155_8 | +| ir.cpp:2169:6:2169:19 | ChiPartial | partial:m2169_3 | +| ir.cpp:2169:6:2169:19 | ChiTotal | total:m2169_2 | +| ir.cpp:2169:26:2169:26 | Address | &:r2169_5 | +| ir.cpp:2170:8:2170:23 | Address | &:r2170_1 | +| ir.cpp:2170:8:2170:23 | Address | &:r2170_1 | +| ir.cpp:2170:8:2170:23 | Arg(this) | this:r2170_1 | +| ir.cpp:2170:16:2170:23 | CallTarget | func:r2170_3 | +| ir.cpp:2170:16:2170:23 | ChiPartial | partial:m2170_7 | +| ir.cpp:2170:16:2170:23 | ChiPartial | partial:m2170_9 | +| ir.cpp:2170:16:2170:23 | ChiTotal | total:m2169_4 | +| ir.cpp:2170:16:2170:23 | ChiTotal | total:m2170_2 | +| ir.cpp:2170:16:2170:23 | SideEffect | ~m2169_4 | +| ir.cpp:2170:22:2170:22 | Address | &:r2170_4 | +| ir.cpp:2170:22:2170:22 | Arg(0) | 0:r2170_5 | +| ir.cpp:2170:22:2170:22 | Load | m2169_6 | +| ir.cpp:2185:6:2185:32 | ChiPartial | partial:m2185_3 | +| ir.cpp:2185:6:2185:32 | ChiTotal | total:m2185_2 | +| ir.cpp:2185:39:2185:39 | Address | &:r2185_5 | +| ir.cpp:2186:8:2186:25 | Address | &:r2186_1 | +| ir.cpp:2186:8:2186:25 | Address | &:r2186_1 | +| ir.cpp:2186:8:2186:25 | Arg(this) | this:r2186_1 | +| ir.cpp:2186:17:2186:25 | CallTarget | func:r2186_3 | +| ir.cpp:2186:17:2186:25 | ChiPartial | partial:m2186_7 | +| ir.cpp:2186:17:2186:25 | ChiPartial | partial:m2186_9 | +| ir.cpp:2186:17:2186:25 | ChiTotal | total:m2185_4 | +| ir.cpp:2186:17:2186:25 | ChiTotal | total:m2186_2 | +| ir.cpp:2186:17:2186:25 | SideEffect | ~m2185_4 | +| ir.cpp:2186:24:2186:24 | Address | &:r2186_4 | +| ir.cpp:2186:24:2186:24 | Arg(0) | 0:r2186_5 | +| ir.cpp:2186:24:2186:24 | Load | m2185_6 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | @@ -10112,13 +10735,13 @@ | perf-regression.cpp:12:10:12:10 | StoreValue | r12_2 | | smart_ptr.cpp:10:6:10:24 | ChiPartial | partial:m10_3 | | smart_ptr.cpp:10:6:10:24 | ChiTotal | total:m10_2 | -| smart_ptr.cpp:10:6:10:24 | SideEffect | ~m12_12 | +| smart_ptr.cpp:10:6:10:24 | SideEffect | ~m13_6 | | smart_ptr.cpp:10:31:10:31 | Address | &:r10_5 | | smart_ptr.cpp:10:31:10:31 | Address | &:r10_5 | | smart_ptr.cpp:10:31:10:31 | Address | &:r10_7 | | smart_ptr.cpp:10:31:10:31 | Address | &:r10_7 | | smart_ptr.cpp:10:31:10:31 | Load | m10_6 | -| smart_ptr.cpp:10:31:10:31 | SideEffect | m12_15 | +| smart_ptr.cpp:10:31:10:31 | SideEffect | m10_8 | | smart_ptr.cpp:11:21:11:22 | Address | &:r11_1 | | smart_ptr.cpp:11:21:11:22 | Address | &:r11_1 | | smart_ptr.cpp:11:21:11:22 | Arg(this) | this:r11_1 | @@ -10141,22 +10764,32 @@ | smart_ptr.cpp:12:20:12:27 | Address | &:r12_9 | | smart_ptr.cpp:12:20:12:27 | Arg(0) | 0:r12_9 | | smart_ptr.cpp:12:20:12:27 | ChiPartial | partial:m12_14 | -| smart_ptr.cpp:12:20:12:27 | ChiTotal | total:m10_8 | +| smart_ptr.cpp:12:20:12:27 | ChiTotal | total:m12_12 | | smart_ptr.cpp:12:20:12:27 | Load | m12_8 | -| smart_ptr.cpp:12:20:12:27 | SideEffect | ~m10_8 | +| smart_ptr.cpp:12:20:12:27 | SideEffect | ~m12_12 | | smart_ptr.cpp:12:24:12:28 | Load | m11_9 | | smart_ptr.cpp:12:24:12:28 | StoreValue | r12_7 | | smart_ptr.cpp:12:25:12:26 | Arg(0) | 0:r12_5 | | smart_ptr.cpp:12:25:12:26 | Unary | r12_4 | +| smart_ptr.cpp:13:1:13:1 | Address | &:r13_2 | +| smart_ptr.cpp:13:1:13:1 | Address | &:r13_2 | +| smart_ptr.cpp:13:1:13:1 | Arg(this) | this:r13_2 | +| smart_ptr.cpp:13:1:13:1 | CallTarget | func:r13_3 | +| smart_ptr.cpp:13:1:13:1 | ChiPartial | partial:m13_5 | +| smart_ptr.cpp:13:1:13:1 | ChiPartial | partial:m13_8 | +| smart_ptr.cpp:13:1:13:1 | ChiTotal | total:m11_9 | +| smart_ptr.cpp:13:1:13:1 | ChiTotal | total:m12_15 | +| smart_ptr.cpp:13:1:13:1 | SideEffect | m11_9 | +| smart_ptr.cpp:13:1:13:1 | SideEffect | ~m12_15 | | smart_ptr.cpp:17:6:17:24 | ChiPartial | partial:m17_3 | | smart_ptr.cpp:17:6:17:24 | ChiTotal | total:m17_2 | -| smart_ptr.cpp:17:6:17:24 | SideEffect | ~m19_16 | +| smart_ptr.cpp:17:6:17:24 | SideEffect | ~m20_6 | | smart_ptr.cpp:17:33:17:33 | Address | &:r17_5 | | smart_ptr.cpp:17:33:17:33 | Address | &:r17_5 | | smart_ptr.cpp:17:33:17:33 | Address | &:r17_7 | | smart_ptr.cpp:17:33:17:33 | Address | &:r17_7 | | smart_ptr.cpp:17:33:17:33 | Load | m17_6 | -| smart_ptr.cpp:17:33:17:33 | SideEffect | m19_19 | +| smart_ptr.cpp:17:33:17:33 | SideEffect | m17_8 | | smart_ptr.cpp:18:23:18:24 | Address | &:r18_1 | | smart_ptr.cpp:18:23:18:24 | Address | &:r18_1 | | smart_ptr.cpp:18:23:18:24 | Arg(this) | this:r18_1 | @@ -10183,17 +10816,27 @@ | smart_ptr.cpp:19:20:19:21 | CallTarget | func:r19_4 | | smart_ptr.cpp:19:20:19:21 | ChiPartial | partial:m19_9 | | smart_ptr.cpp:19:20:19:21 | ChiPartial | partial:m19_18 | -| smart_ptr.cpp:19:20:19:21 | ChiTotal | total:m17_8 | | smart_ptr.cpp:19:20:19:21 | ChiTotal | total:m18_8 | +| smart_ptr.cpp:19:20:19:21 | ChiTotal | total:m19_16 | | smart_ptr.cpp:19:20:19:21 | Load | m19_12 | | smart_ptr.cpp:19:20:19:21 | SideEffect | m18_9 | -| smart_ptr.cpp:19:20:19:21 | SideEffect | ~m17_8 | | smart_ptr.cpp:19:20:19:21 | SideEffect | ~m18_8 | +| smart_ptr.cpp:19:20:19:21 | SideEffect | ~m19_16 | | smart_ptr.cpp:19:20:19:21 | Unary | r19_5 | | smart_ptr.cpp:19:20:19:21 | Unary | r19_6 | +| smart_ptr.cpp:20:1:20:1 | Address | &:r20_2 | +| smart_ptr.cpp:20:1:20:1 | Address | &:r20_2 | +| smart_ptr.cpp:20:1:20:1 | Arg(this) | this:r20_2 | +| smart_ptr.cpp:20:1:20:1 | CallTarget | func:r20_3 | +| smart_ptr.cpp:20:1:20:1 | ChiPartial | partial:m20_5 | +| smart_ptr.cpp:20:1:20:1 | ChiPartial | partial:m20_8 | +| smart_ptr.cpp:20:1:20:1 | ChiTotal | total:m18_9 | +| smart_ptr.cpp:20:1:20:1 | ChiTotal | total:m19_19 | +| smart_ptr.cpp:20:1:20:1 | SideEffect | m18_9 | +| smart_ptr.cpp:20:1:20:1 | SideEffect | ~m19_19 | | smart_ptr.cpp:28:6:28:27 | ChiPartial | partial:m28_3 | | smart_ptr.cpp:28:6:28:27 | ChiTotal | total:m28_2 | -| smart_ptr.cpp:28:6:28:27 | SideEffect | ~m47_16 | +| smart_ptr.cpp:28:6:28:27 | SideEffect | ~m48_38 | | smart_ptr.cpp:29:27:29:38 | Address | &:r29_1 | | smart_ptr.cpp:31:5:31:24 | CallTarget | func:r31_1 | | smart_ptr.cpp:31:5:31:24 | ChiPartial | partial:m31_15 | @@ -10313,6 +10956,56 @@ | smart_ptr.cpp:47:43:47:63 | SideEffect | ~m47_16 | | smart_ptr.cpp:47:43:47:63 | Unary | r47_5 | | smart_ptr.cpp:47:43:47:63 | Unary | r47_6 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_2 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_2 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_10 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_10 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_18 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_18 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_26 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_26 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_34 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_34 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_2 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_10 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_18 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_26 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_34 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_3 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_11 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_19 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_27 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_35 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_5 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_8 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_13 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_16 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_21 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_24 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_29 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_32 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_37 | +| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_40 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m29_2 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m33_2 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m37_2 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m41_2 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m45_2 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m47_16 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m48_6 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m48_14 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m48_22 | +| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m48_30 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m29_2 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m33_2 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m37_2 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m41_2 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | m45_2 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m47_16 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m48_6 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m48_14 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m48_22 | +| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m48_30 | | struct_init.cpp:9:13:9:25 | Left | r9_3 | | struct_init.cpp:9:13:9:25 | Left | r9_3 | | struct_init.cpp:9:13:9:25 | SideEffect | ~m11_10 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index d2a11541fd1..7a87226651a 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,4 +1,6 @@ missingOperand +| ir.cpp:2170:8:2170:23 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | +| ir.cpp:2186:8:2186:25 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | unexpectedOperand duplicateOperand missingPhiOperand @@ -6,6 +8,10 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2170:13:2170:13 | IndirectMayWriteSideEffect: B | Instruction 'IndirectMayWriteSideEffect: B' has no successors in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | +| ir.cpp:2170:16:2170:23 | IndirectMayWriteSideEffect: call to Bool | Instruction 'IndirectMayWriteSideEffect: call to Bool' has no successors in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | +| ir.cpp:2186:14:2186:14 | IndirectMayWriteSideEffect: B | Instruction 'IndirectMayWriteSideEffect: B' has no successors in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | +| ir.cpp:2186:17:2186:25 | IndirectMayWriteSideEffect: call to Bool2 | Instruction 'IndirectMayWriteSideEffect: call to Bool2' has no successors in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 79887fffc1f..3dfa7bf2dce 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,13 +6,19 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2170:16:2170:23 | IndirectMayWriteSideEffect: call to Bool | Instruction 'IndirectMayWriteSideEffect: call to Bool' has no successors in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | +| ir.cpp:2186:17:2186:25 | IndirectMayWriteSideEffect: call to Bool2 | Instruction 'IndirectMayWriteSideEffect: call to Bool2' has no successors in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition @@ -24,8 +30,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 79887fffc1f..3dfa7bf2dce 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,13 +6,19 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2170:16:2170:23 | IndirectMayWriteSideEffect: call to Bool | Instruction 'IndirectMayWriteSideEffect: call to Bool' has no successors in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | +| ir.cpp:2186:17:2186:25 | IndirectMayWriteSideEffect: call to Bool2 | Instruction 'IndirectMayWriteSideEffect: call to Bool2' has no successors in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition @@ -24,8 +30,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType From 8fc4fae7d27ba52eba29222e59a8e5a528dc4838 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 9 Feb 2024 14:43:36 +0100 Subject: [PATCH 014/207] Java: Cache interpretElement. --- java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll index 1666413db76..ded0606956f 100644 --- a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll @@ -430,6 +430,7 @@ private Element interpretElement0( } /** Gets the source/sink/summary/neutral element corresponding to the supplied parameters. */ +cached Element interpretElement( string package, string type, boolean subtypes, string name, string signature, string ext ) { From 1b571f8992e85909c7485e8f5831b1176a6b7a3d Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Fri, 9 Feb 2024 22:32:08 +0000 Subject: [PATCH 015/207] C++: Accept test changes --- .../library-tests/ir/ir/raw_consistency.expected | 6 ------ .../library-tests/ir/points_to/points_to.expected | 14 +++++++++++++- .../syntax-zoo/aliased_ssa_consistency.expected | 2 ++ .../syntax-zoo/raw_consistency.expected | 5 +++++ .../syntax-zoo/unaliased_ssa_consistency.expected | 2 ++ 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 7a87226651a..d2a11541fd1 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,6 +1,4 @@ missingOperand -| ir.cpp:2170:8:2170:23 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | -| ir.cpp:2186:8:2186:25 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | unexpectedOperand duplicateOperand missingPhiOperand @@ -8,10 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2170:13:2170:13 | IndirectMayWriteSideEffect: B | Instruction 'IndirectMayWriteSideEffect: B' has no successors in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | -| ir.cpp:2170:16:2170:23 | IndirectMayWriteSideEffect: call to Bool | Instruction 'IndirectMayWriteSideEffect: call to Bool' has no successors in function '$@'. | ir.cpp:2169:6:2169:19 | void IfDestructors3(bool) | void IfDestructors3(bool) | -| ir.cpp:2186:14:2186:14 | IndirectMayWriteSideEffect: B | Instruction 'IndirectMayWriteSideEffect: B' has no successors in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | -| ir.cpp:2186:17:2186:25 | IndirectMayWriteSideEffect: call to Bool2 | Instruction 'IndirectMayWriteSideEffect: call to Bool2' has no successors in function '$@'. | ir.cpp:2185:6:2185:32 | void IfInitiaiizationConstructor(bool) | void IfInitiaiizationConstructor(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/points_to/points_to.expected b/cpp/ql/test/library-tests/ir/points_to/points_to.expected index 48de9172b36..f5afc27ea0f 100644 --- a/cpp/ql/test/library-tests/ir/points_to/points_to.expected +++ b/cpp/ql/test/library-tests/ir/points_to/points_to.expected @@ -1,2 +1,14 @@ -failures testFailures +| smart_pointer.cpp:13:21:13:49 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:14:14:14:40 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:16:22:16:48 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:18:15:18:43 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:19:13:19:39 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:20:21:20:47 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:25:21:25:49 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:26:14:26:40 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:28:22:28:48 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:30:15:30:43 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:31:13:31:39 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +| smart_pointer.cpp:32:21:32:47 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | +failures diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index c2e0783d70f..f90d037319f 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -8,8 +8,10 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | +| condition_decls.cpp:50:3:50:3 | Chi: bi | Instruction 'Chi: bi' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | +| statements.cpp:25:5:25:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | ambiguousSuccessors unexplainedLoop diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index caff6369ad9..649d13c69f1 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -11,8 +11,13 @@ instructionWithoutSuccessor | VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | VacuousDestructorCall.cpp:3:3:3:3 | VariableAddress: x | Instruction 'VariableAddress: x' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | VacuousDestructorCall.cpp:4:3:4:3 | Load: y | Instruction 'Load: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | +| condition_decls.cpp:48:27:48:31 | IndirectMayWriteSideEffect: init2 | Instruction 'IndirectMayWriteSideEffect: init2' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | +| condition_decls.cpp:50:3:50:3 | IndirectMayWriteSideEffect: bi | Instruction 'IndirectMayWriteSideEffect: bi' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | +| statements.cpp:25:5:25:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | +| statements.cpp:26:3:26:3 | IndirectMayWriteSideEffect: inner | Instruction 'IndirectMayWriteSideEffect: inner' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | +| statements.cpp:28:1:28:1 | IndirectMayWriteSideEffect: before | Instruction 'IndirectMayWriteSideEffect: before' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | | stmt_expr.cpp:29:11:32:11 | CopyValue: (statement expression) | Instruction 'CopyValue: (statement expression)' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | | stmt_in_type.cpp:5:53:5:53 | Constant: 1 | Instruction 'Constant: 1' has no successors in function '$@'. | stmt_in_type.cpp:2:6:2:12 | void cpp_fun() | void cpp_fun() | diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index c2e0783d70f..795ca3656b0 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -8,8 +8,10 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | +| condition_decls.cpp:50:3:50:3 | IndirectMayWriteSideEffect: bi | Instruction 'IndirectMayWriteSideEffect: bi' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | +| statements.cpp:25:5:25:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | ambiguousSuccessors unexplainedLoop From d1160f86e198e79dfe7132076b5bb2d04d0f2a3e Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Fri, 9 Feb 2024 22:35:12 +0000 Subject: [PATCH 016/207] C++: Autoformat for named destructors in IR --- .../ir/implementation/raw/internal/IRConstruction.qll | 2 +- .../ir/implementation/raw/internal/TranslatedCall.qll | 4 +++- .../raw/internal/TranslatedCondition.qll | 8 ++++++-- .../raw/internal/TranslatedFunction.qll | 6 ++++-- .../raw/internal/TranslatedGlobalVar.qll | 4 +++- .../ir/implementation/raw/internal/TranslatedStmt.qll | 11 ++++++++--- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll index f8c2fb5ac88..96a01954d17 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll @@ -261,7 +261,7 @@ CppType getInstructionOperandType(Instruction instruction, TypedOperandTag tag) Instruction getPhiInstructionBlockStart(PhiInstruction instr) { none() } Instruction getInstructionSuccessor(Instruction instruction, EdgeKind kind) { - result = + result = getInstructionTranslatedElement(instruction) .getInstructionSuccessor(getInstructionTag(instruction), kind) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index 86cbc24d8ab..7e3dc3cd9e2 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -447,7 +447,9 @@ private int initializeAllocationGroup() { result = 3 } abstract class TranslatedSideEffect extends TranslatedElement { final override TranslatedElement getChild(int n) { none() } - final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(OnlyInstructionTag()) and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll index 5bc682803a0..77864969068 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll @@ -70,7 +70,9 @@ abstract class TranslatedFlexibleCondition extends TranslatedCondition, Conditio none() } - final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } abstract TranslatedCondition getOperand(); } @@ -96,7 +98,9 @@ class TranslatedParenthesisCondition extends TranslatedFlexibleCondition { abstract class TranslatedNativeCondition extends TranslatedCondition, TTranslatedNativeCondition { TranslatedNativeCondition() { this = TTranslatedNativeCondition(expr) } - final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } } abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeCondition, ConditionContext { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll index 137371cf90c..3e4e83965e2 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -407,7 +407,9 @@ abstract class TranslatedParameter extends TranslatedElement { result = this.getParent().getChildSuccessor(this, kind) } - final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + none() + } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = InitializerVariableAddressTag() and @@ -762,7 +764,7 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { .getFirstInstruction(any(GotoEdge goto)) else result = this.getParent().getChildSuccessor(this, any(GotoEdge goto)) } - + override TranslatedElement getLastChild() { result = this.getChild(max(int id | exists(this.getChild(id)))) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll index a188e98f9d1..50322927af9 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll @@ -27,7 +27,9 @@ class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement, kind instanceof GotoEdge } - override Instruction getALastInstructionInternal() { result = this.getInstruction(ExitFunctionTag()) } + override Instruction getALastInstructionInternal() { + result = this.getInstruction(ExitFunctionTag()) + } override TranslatedElement getChild(int n) { n = 1 and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 20a5d92268c..6037bf962e1 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -384,7 +384,9 @@ class TranslatedExprStmt extends TranslatedStmt { result = this.getExpr().getFirstInstruction(kind) } - override Instruction getALastInstructionInternal() { result = this.getExpr().getALastInstruction() } + override Instruction getALastInstructionInternal() { + result = this.getExpr().getALastInstruction() + } override TranslatedElement getLastChild() { result = this.getExpr() } @@ -997,7 +999,8 @@ class TranslatedForStmt extends TranslatedLoop { child = this.getUpdate() and result = this.getFirstConditionInstruction(kind) or exists(int lastDestructorIndex | - lastDestructorIndex = max(int n | exists(this.getChild(n)) and n >= this.getFirstDestructorCallIndex()) and + lastDestructorIndex = + max(int n | exists(this.getChild(n)) and n >= this.getFirstDestructorCallIndex()) and child = this.getChild(lastDestructorIndex) and result = this.getParent().getChildSuccessor(this, kind) ) @@ -1162,7 +1165,9 @@ class TranslatedSwitchStmt extends TranslatedStmt { else result = this.getFirstExprInstruction(kind) } - override Instruction getALastInstructionInternal() { result = this.getBody().getALastInstruction() } + override Instruction getALastInstructionInternal() { + result = this.getBody().getALastInstruction() + } override TranslatedElement getLastChild() { result = this.getBody() } From d814decc17e3cca6258fa2e80a2b515afbcb4203 Mon Sep 17 00:00:00 2001 From: Marcono1234 Date: Thu, 8 Feb 2024 23:34:14 +0100 Subject: [PATCH 017/207] Ruby: Fix formatting in changelog --- ruby/ql/lib/CHANGELOG.md | 2 +- ruby/ql/lib/change-notes/released/0.8.7.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 8a9e4e6c8b7..1302a023469 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -8,7 +8,7 @@ ### Minor Analysis Improvements -* Deleted many deprecated predicates and classes with uppercase `HTTP`, `CSRF`, ``, `` etc. in their names. Use the PascalCased versions instead. +* Deleted many deprecated predicates and classes with uppercase `HTTP`, `CSRF` etc. in their names. Use the PascalCased versions instead. * Deleted the deprecated `getAUse` and `getARhs` predicates from `API::Node`, use `getASource` and `getASink` instead. * Deleted the deprecated `disablesCertificateValidation` predicate from the `Http` module. * Deleted the deprecated `ParamsCall`, `CookiesCall`, and `ActionControllerControllerClass` classes from `ActionController.qll`, use the simarly named classes from `codeql.ruby.frameworks.Rails::Rails` instead. diff --git a/ruby/ql/lib/change-notes/released/0.8.7.md b/ruby/ql/lib/change-notes/released/0.8.7.md index 454ab2b2c97..a4b443e17ec 100644 --- a/ruby/ql/lib/change-notes/released/0.8.7.md +++ b/ruby/ql/lib/change-notes/released/0.8.7.md @@ -2,7 +2,7 @@ ### Minor Analysis Improvements -* Deleted many deprecated predicates and classes with uppercase `HTTP`, `CSRF`, ``, `` etc. in their names. Use the PascalCased versions instead. +* Deleted many deprecated predicates and classes with uppercase `HTTP`, `CSRF` etc. in their names. Use the PascalCased versions instead. * Deleted the deprecated `getAUse` and `getARhs` predicates from `API::Node`, use `getASource` and `getASink` instead. * Deleted the deprecated `disablesCertificateValidation` predicate from the `Http` module. * Deleted the deprecated `ParamsCall`, `CookiesCall`, and `ActionControllerControllerClass` classes from `ActionController.qll`, use the simarly named classes from `codeql.ruby.frameworks.Rails::Rails` instead. From 19bb8fe22dcb9d41bc5421e38e7d810bf132657b Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 12 Feb 2024 10:50:05 +0100 Subject: [PATCH 018/207] Bazel: use bzlmod --- .bazelrc | 2 +- MODULE.bazel | 33 ++++++++++++++ WORKSPACE.bazel | 8 ---- misc/bazel/workspace.bzl | 45 ------------------- misc/bazel/workspace_deps.bzl | 11 ----- .../{requirements.txt => requirements_in.txt} | 0 misc/codegen/requirements_lock.txt | 22 +++++++++ .../remapping/SwiftFileInterception.cpp | 1 + swift/third_party/load.bzl | 41 +++++------------ 9 files changed, 67 insertions(+), 96 deletions(-) create mode 100644 MODULE.bazel delete mode 100644 misc/bazel/workspace.bzl delete mode 100644 misc/bazel/workspace_deps.bzl rename misc/codegen/{requirements.txt => requirements_in.txt} (100%) create mode 100644 misc/codegen/requirements_lock.txt diff --git a/.bazelrc b/.bazelrc index 214258e775a..dcb73e90697 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,4 +1,4 @@ -common --enable_platform_specific_config +common --enable_platform_specific_config --experimental_enable_bzlmod build --repo_env=CC=clang --repo_env=CXX=clang++ diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 00000000000..e6ec421acbf --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,33 @@ +module( + name = "codeql", + version = "0.0", +) + +# see https://registry.bazel.build/ for a list of available packages + +bazel_dep(name = "platforms", version = "0.0.8") +bazel_dep(name = "rules_pkg", version = "0.9.1") +bazel_dep(name = "rules_python", version = "0.29.0") +bazel_dep(name = "bazel_skylib", version = "1.5.0") +bazel_dep(name = "abseil-cpp", version = "20240116.0", repo_name = "absl") +bazel_dep(name = "nlohmann_json", version = "3.11.3", repo_name = "json") +bazel_dep(name = "fmt", version = "10.0.0") + +pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") +pip.parse( + hub_name = "codegen_deps", + python_version = "3.11", + requirements_lock = "//misc/codegen:requirements_lock.txt", +) +use_repo(pip, "codegen_deps") + +swift_deps = use_extension("//swift/third_party:load.bzl", "swift_deps") +use_repo( + swift_deps, + "binlog", + "picosha2", + "swift_prebuilt_darwin_x86_64", + "swift_prebuilt_linux", + "swift_toolchain_linux", + "swift_toolchain_macos", +) diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 42b7f54c24c..12e40472055 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -2,11 +2,3 @@ # and for internal use only. workspace(name = "codeql") - -load("//misc/bazel:workspace.bzl", "codeql_workspace") - -codeql_workspace() - -load("//misc/bazel:workspace_deps.bzl", "codeql_workspace_deps") - -codeql_workspace_deps() diff --git a/misc/bazel/workspace.bzl b/misc/bazel/workspace.bzl deleted file mode 100644 index 428ca93fa2c..00000000000 --- a/misc/bazel/workspace.bzl +++ /dev/null @@ -1,45 +0,0 @@ -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") -load("//swift/third_party:load.bzl", load_swift_dependencies = "load_dependencies") - -def codeql_workspace(repository_name = "codeql"): - load_swift_dependencies(repository_name) - maybe( - repo_rule = http_archive, - name = "rules_pkg", - sha256 = "8f9ee2dc10c1ae514ee599a8b42ed99fa262b757058f65ad3c384289ff70c4b8", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz", - "https://github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz", - ], - ) - - maybe( - repo_rule = http_archive, - name = "platforms", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", - "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", - ], - sha256 = "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74", - ) - - maybe( - repo_rule = http_archive, - name = "rules_python", - sha256 = "cdf6b84084aad8f10bf20b46b77cb48d83c319ebe6458a18e9d2cebf57807cdd", - strip_prefix = "rules_python-0.8.1", - urls = [ - "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.8.1.tar.gz", - ], - ) - - maybe( - repo_rule = http_archive, - name = "bazel_skylib", - sha256 = "b8a1527901774180afc798aeb28c4634bdccf19c4d98e7bdd1ce79d1fe9aaad7", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz", - ], - ) diff --git a/misc/bazel/workspace_deps.bzl b/misc/bazel/workspace_deps.bzl deleted file mode 100644 index ce91ee3959d..00000000000 --- a/misc/bazel/workspace_deps.bzl +++ /dev/null @@ -1,11 +0,0 @@ -load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") -load("@rules_python//python:pip.bzl", "pip_install") -load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") - -def codeql_workspace_deps(repository_name = "codeql"): - pip_install( - name = "codegen_deps", - requirements = "@%s//misc/codegen:requirements.txt" % repository_name, - ) - bazel_skylib_workspace() - rules_pkg_dependencies() diff --git a/misc/codegen/requirements.txt b/misc/codegen/requirements_in.txt similarity index 100% rename from misc/codegen/requirements.txt rename to misc/codegen/requirements_in.txt diff --git a/misc/codegen/requirements_lock.txt b/misc/codegen/requirements_lock.txt new file mode 100644 index 00000000000..f0ae5d82ba7 --- /dev/null +++ b/misc/codegen/requirements_lock.txt @@ -0,0 +1,22 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --output-file=misc/codegen/requirements_lock.txt misc/codegen/requirements_in.txt +# +inflection==0.5.1 + # via -r misc/codegen/requirements_in.txt +iniconfig==2.0.0 + # via pytest +packaging==23.2 + # via pytest +pluggy==1.4.0 + # via pytest +pystache==0.6.5 + # via -r misc/codegen/requirements_in.txt +pytest==8.0.0 + # via -r misc/codegen/requirements_in.txt +pyyaml==6.0.1 + # via -r misc/codegen/requirements_in.txt +toposort==1.10 + # via -r misc/codegen/requirements_in.txt diff --git a/swift/extractor/remapping/SwiftFileInterception.cpp b/swift/extractor/remapping/SwiftFileInterception.cpp index c83049bcbcc..168132941ad 100644 --- a/swift/extractor/remapping/SwiftFileInterception.cpp +++ b/swift/extractor/remapping/SwiftFileInterception.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include diff --git a/swift/third_party/load.bzl b/swift/third_party/load.bzl index 6e2eb6075fe..b32262e2b9f 100644 --- a/swift/third_party/load.bzl +++ b/swift/third_party/load.bzl @@ -40,7 +40,7 @@ def _get_toolchain_url(info): info.extension, ) -def _toolchains(workspace_name): +def _toolchains(): rules = { "tar.gz": http_archive, "pkg": _pkg_archive, @@ -51,7 +51,7 @@ def _toolchains(workspace_name): name = "swift_toolchain_%s" % arch, url = _get_toolchain_url(info), sha256 = info.sha, - build_file = _build(workspace_name, "swift-toolchain-%s" % arch), + build_file = _build % ("swift-toolchain-%s" % arch), strip_prefix = "%s-%s" % (_swift_version, info.suffix), ) @@ -109,10 +109,9 @@ def _github_archive(*, name, repository, commit, build_file = None, sha256 = Non sha256 = sha256, ) -def _build(workspace_name, package): - return "@%s//swift/third_party:BUILD.%s.bazel" % (workspace_name, package) +_build = "@codeql//swift/third_party:BUILD.%s.bazel" -def load_dependencies(workspace_name): +def _load_dependencies(_): for repo_arch, arch in _swift_arch_map.items(): sha256 = _swift_sha_map[repo_arch] @@ -122,11 +121,11 @@ def load_dependencies(workspace_name): _swift_prebuilt_version, repo_arch, ), - build_file = _build(workspace_name, "swift-llvm-support"), + build_file = _build % "swift-llvm-support", sha256 = sha256, patch_args = ["-p1"], patches = [ - "@%s//swift/third_party/swift-llvm-support:patches/%s.patch" % (workspace_name, patch_name) + "@codeql//swift/third_party/swift-llvm-support:patches/%s.patch" % patch_name for patch_name in ( "remove-redundant-operators", "add-constructor-to-Compilation", @@ -134,11 +133,11 @@ def load_dependencies(workspace_name): ], ) - _toolchains(workspace_name) + _toolchains() _github_archive( name = "picosha2", - build_file = _build(workspace_name, "picosha2"), + build_file = _build % "picosha2", repository = "okdshin/PicoSHA2", commit = "27fcf6979298949e8a462e16d09a0351c18fcaf2", sha256 = "d6647ca45a8b7bdaf027ecb68d041b22a899a0218b7206dee755c558a2725abb", @@ -146,30 +145,10 @@ def load_dependencies(workspace_name): _github_archive( name = "binlog", - build_file = _build(workspace_name, "binlog"), + build_file = _build % "binlog", repository = "morganstanley/binlog", commit = "3fef8846f5ef98e64211e7982c2ead67e0b185a6", sha256 = "f5c61d90a6eff341bf91771f2f465be391fd85397023e1b391c17214f9cbd045", ) - _github_archive( - name = "absl", - repository = "abseil/abseil-cpp", - commit = "d2c5297a3c3948de765100cb7e5cccca1210d23c", - sha256 = "735a9efc673f30b3212bfd57f38d5deb152b543e35cd58b412d1363b15242049", - ) - - _github_archive( - name = "json", - repository = "nlohmann/json", - commit = "6af826d0bdb55e4b69e3ad817576745335f243ca", - sha256 = "702bb0231a5e21c0374230fed86c8ae3d07ee50f34ffd420e7f8249854b7d85b", - ) - - _github_archive( - name = "fmt", - repository = "fmtlib/fmt", - build_file = _build(workspace_name, "fmt"), - commit = "a0b8a92e3d1532361c2f7feb63babc5c18d00ef2", - sha256 = "ccf872fd4aa9ab3d030d62cffcb258ca27f021b2023a0244b2cf476f984be955", - ) +swift_deps = module_extension(_load_dependencies) From 53539226a8ef71396ff216957453f4c1713f1e4b Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 12 Feb 2024 14:27:55 +0100 Subject: [PATCH 019/207] Bazel: use internal codeql module --- MODULE.bazel | 18 +++++++ javascript/BUILD.bazel | 6 +-- javascript/downgrades/BUILD.bazel | 2 +- javascript/externs/BUILD.bazel | 2 +- javascript/extractor/BUILD.bazel | 48 +++++++++---------- .../extractor/lib/typescript/BUILD.bazel | 2 +- .../com/semmle/js/extractor/test/BUILD.bazel | 2 +- 7 files changed, 49 insertions(+), 31 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index e6ec421acbf..dd8021dcfb0 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -3,10 +3,17 @@ module( version = "0.0", ) +bazel_dep(name = "codeql_internal", version = "0.0") +local_path_override( + module_name = "codeql_internal", + path = "..", +) + # see https://registry.bazel.build/ for a list of available packages bazel_dep(name = "platforms", version = "0.0.8") bazel_dep(name = "rules_pkg", version = "0.9.1") +bazel_dep(name = "rules_nodejs", version = "6.0.3") bazel_dep(name = "rules_python", version = "0.29.0") bazel_dep(name = "bazel_skylib", version = "1.5.0") bazel_dep(name = "abseil-cpp", version = "20240116.0", repo_name = "absl") @@ -31,3 +38,14 @@ use_repo( "swift_toolchain_linux", "swift_toolchain_macos", ) + +node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node") +node.toolchain( + name = "nodejs", + node_version = "18.15.0", +) +use_repo(node, "nodejs", "nodejs_toolchains") + +register_toolchains( + "@nodejs_toolchains//:all", +) diff --git a/javascript/BUILD.bazel b/javascript/BUILD.bazel index ce1d8b5578a..d0469367741 100644 --- a/javascript/BUILD.bazel +++ b/javascript/BUILD.bazel @@ -1,6 +1,6 @@ -load("@//:dist.bzl", "dist") +load("@codeql_internal//:dist.bzl", "dist") load("@rules_pkg//pkg:mappings.bzl", "pkg_files") -load("@//buildutils-internal:zipmerge.bzl", "zipmerge") +load("@codeql_internal//buildutils-internal:zipmerge.bzl", "zipmerge") package(default_visibility = ["//visibility:public"]) @@ -30,7 +30,7 @@ dist( "//javascript/downgrades", "//javascript/externs", "//javascript/extractor:tools-extractor", - "@//language-packs/javascript:resources", + "@codeql_internal//language-packs/javascript:resources", ], prefix = "javascript", ) diff --git a/javascript/downgrades/BUILD.bazel b/javascript/downgrades/BUILD.bazel index 3e3d9a17d94..73cc099d08e 100644 --- a/javascript/downgrades/BUILD.bazel +++ b/javascript/downgrades/BUILD.bazel @@ -1,4 +1,4 @@ -load("@//:dist.bzl", "pack_zip") +load("@codeql_internal//:dist.bzl", "pack_zip") pack_zip( name = "downgrades", diff --git a/javascript/externs/BUILD.bazel b/javascript/externs/BUILD.bazel index 882f90e8d29..5ee0c396b6e 100644 --- a/javascript/externs/BUILD.bazel +++ b/javascript/externs/BUILD.bazel @@ -1,4 +1,4 @@ -load("@//:dist.bzl", "pack_zip") +load("@codeql_internal//:dist.bzl", "pack_zip") pack_zip( name = "externs", diff --git a/javascript/extractor/BUILD.bazel b/javascript/extractor/BUILD.bazel index 96a1288da20..433d70a815e 100644 --- a/javascript/extractor/BUILD.bazel +++ b/javascript/extractor/BUILD.bazel @@ -1,21 +1,21 @@ -load("@//:common.bzl", "codeql_fat_jar", "codeql_java_project") +load("@codeql_internal//:common.bzl", "codeql_fat_jar", "codeql_java_project") load("@rules_pkg//pkg:mappings.bzl", "pkg_files") java_library( name = "deps", visibility = [":__subpackages__"], exports = [ - "@//extractor:html", - "@//extractor:yaml", - "@//resources/lib/java:commons-compress", - "@//resources/lib/java:gson", - "@//resources/lib/java:jericho-html", - "@//resources/lib/java:slf4j-api", - "@//resources/lib/java:snakeyaml", - "@//third_party:jackson", - "@//third_party:logback", - "@//util-java7", - "@//util-java8", + "@codeql_internal//extractor:html", + "@codeql_internal//extractor:yaml", + "@codeql_internal//resources/lib/java:commons-compress", + "@codeql_internal//resources/lib/java:gson", + "@codeql_internal//resources/lib/java:jericho-html", + "@codeql_internal//resources/lib/java:slf4j-api", + "@codeql_internal//resources/lib/java:snakeyaml", + "@codeql_internal//third_party:jackson", + "@codeql_internal//third_party:logback", + "@codeql_internal//util-java7", + "@codeql_internal//util-java8", ], ) @@ -36,18 +36,18 @@ codeql_fat_jar( name = "extractor-javascript", srcs = [ ":extractor", - "@//extractor:html", - "@//extractor:xml-trap-writer", - "@//extractor:yaml", - "@//resources/lib/java:commons-compress", - "@//resources/lib/java:gson", - "@//resources/lib/java:jericho-html", - "@//resources/lib/java:slf4j-api", - "@//resources/lib/java:snakeyaml", - "@//third_party:jackson", - "@//third_party:logback", - "@//util-java7", - "@//util-java8", + "@codeql_internal//extractor:html", + "@codeql_internal//extractor:xml-trap-writer", + "@codeql_internal//extractor:yaml", + "@codeql_internal//resources/lib/java:commons-compress", + "@codeql_internal//resources/lib/java:gson", + "@codeql_internal//resources/lib/java:jericho-html", + "@codeql_internal//resources/lib/java:slf4j-api", + "@codeql_internal//resources/lib/java:snakeyaml", + "@codeql_internal//third_party:jackson", + "@codeql_internal//third_party:logback", + "@codeql_internal//util-java7", + "@codeql_internal//util-java8", ], files = [":javascript-extractor-resources"], main_class = "com.semmle.js.extractor.Main", diff --git a/javascript/extractor/lib/typescript/BUILD.bazel b/javascript/extractor/lib/typescript/BUILD.bazel index 660514d3de2..4bee768f93b 100644 --- a/javascript/extractor/lib/typescript/BUILD.bazel +++ b/javascript/extractor/lib/typescript/BUILD.bazel @@ -1,4 +1,4 @@ -load("@//:common.bzl", "on_windows") +load("@codeql_internal//:common.bzl", "on_windows") # Builds a zip file of the compiled typscript-parser-wrapper and its dependencies. genrule( diff --git a/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel b/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel index 57305838039..c2f9b4164cd 100644 --- a/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel +++ b/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel @@ -5,7 +5,7 @@ java_test( deps = [ "//javascript/extractor", "//javascript/extractor:deps", - "@//resources/lib/java/DO_NOT_DISTRIBUTE:junit", + "@codeql_internal//resources/lib/java/DO_NOT_DISTRIBUTE:junit", ], ) From c79a3eb6aece78ec4d7a230d9e6ab303851f7a03 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Wed, 7 Feb 2024 16:37:40 +0000 Subject: [PATCH 020/207] Add query for insecure key generation --- .../java/security/AndroidLocalAuthQuery.qll | 19 +++++++++++++++++ .../CWE/CWE-287/AndroidInsecureKeys.ql | 21 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql diff --git a/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll b/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll index ca725a041d5..14476e737d9 100644 --- a/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll +++ b/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll @@ -1,6 +1,7 @@ /** Definitions for the insecure local authentication query. */ import java +import semmle.code.java.dataflow.DataFlow /** A base class that is used as a callback for biometric authentication. */ private class AuthenticationCallbackClass extends Class { @@ -40,3 +41,21 @@ class AuthenticationSuccessCallback extends Method { not result = this.getASuperResultUse() } } + +/** A call that sets a parameter for key generation that is insecure for use with biometric authentication. */ +class InsecureBiometricKeyParam extends MethodCall { + InsecureBiometricKeyParam() { + exists(string name, CompileTimeConstantExpr val | + this.getMethod() + .hasQualifiedName("android.security.keystore", "KeyGenParameterSpec$Builder", name) and + DataFlow::localExprFlow(val, this.getArgument(0)) and + ( + name = ["setUserAuthenticationRequired", "setInvalidatedByBiometricEnrollment"] and + val.getBooleanValue() = false + or + name = "setUserAuthenticationValidityDurationSeconds" and + val.getIntValue() != -1 + ) + ) + } +} diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql new file mode 100644 index 00000000000..00156283045 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql @@ -0,0 +1,21 @@ +/** + * @name Insecurely generated keys for local authentication + * @description Keys used for local biometric authentication should be generated with secure parameters. + * @kind problem + * @problem.severity warning + * @security-severity 9.3 + * @precision medium + * @id java/android/insecure-local-key-gen + * @tags security + * external/cwe/cwe-287 + */ + +import java +import semmle.code.java.security.AndroidLocalAuthQuery + +/** Holds if the application contains an instance of a key being used for local biometric authentication. */ +predicate usesLocalAuth() { exists(AuthenticationSuccessCallback cb | exists(cb.getAResultUse())) } + +from InsecureBiometricKeyParam call +where usesLocalAuth() +select call, "This key is not secure for biometric authentication." From d8985f9f5bc489f2c15049249e00a7d4ea34a945 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 8 Feb 2024 10:32:56 +0000 Subject: [PATCH 021/207] Move tests for local auth to a folder --- java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll | 2 +- .../CWE-287/{ => InsecureLocalAuth}/InsecureLocalAuth.expected | 0 .../CWE-287/{ => InsecureLocalAuth}/InsecureLocalAuth.ql | 0 .../security/CWE-287/{ => InsecureLocalAuth}/Test.java | 0 .../security/CWE-287/{ => InsecureLocalAuth}/Test2.java | 0 .../security/CWE-287/{ => InsecureLocalAuth}/options | 2 +- 6 files changed, 2 insertions(+), 2 deletions(-) rename java/ql/test/query-tests/security/CWE-287/{ => InsecureLocalAuth}/InsecureLocalAuth.expected (100%) rename java/ql/test/query-tests/security/CWE-287/{ => InsecureLocalAuth}/InsecureLocalAuth.ql (100%) rename java/ql/test/query-tests/security/CWE-287/{ => InsecureLocalAuth}/Test.java (100%) rename java/ql/test/query-tests/security/CWE-287/{ => InsecureLocalAuth}/Test2.java (100%) rename java/ql/test/query-tests/security/CWE-287/{ => InsecureLocalAuth}/options (67%) diff --git a/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll b/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll index 14476e737d9..004741aabfc 100644 --- a/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll +++ b/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll @@ -1,7 +1,7 @@ /** Definitions for the insecure local authentication query. */ import java -import semmle.code.java.dataflow.DataFlow +private import semmle.code.java.dataflow.DataFlow /** A base class that is used as a callback for biometric authentication. */ private class AuthenticationCallbackClass extends Class { diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth.expected b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.expected similarity index 100% rename from java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth.expected rename to java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.expected diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth.ql b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.ql similarity index 100% rename from java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth.ql rename to java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.ql diff --git a/java/ql/test/query-tests/security/CWE-287/Test.java b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/Test.java similarity index 100% rename from java/ql/test/query-tests/security/CWE-287/Test.java rename to java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/Test.java diff --git a/java/ql/test/query-tests/security/CWE-287/Test2.java b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/Test2.java similarity index 100% rename from java/ql/test/query-tests/security/CWE-287/Test2.java rename to java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/Test2.java diff --git a/java/ql/test/query-tests/security/CWE-287/options b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/options similarity index 67% rename from java/ql/test/query-tests/security/CWE-287/options rename to java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/options index dacd3cb21df..33cdc1ea940 100644 --- a/java/ql/test/query-tests/security/CWE-287/options +++ b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/google-android-9.0.0 +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/google-android-9.0.0 From 2eb93b7a3b5875bc1186d686a7ab60aa94bd13f1 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 8 Feb 2024 11:11:48 +0000 Subject: [PATCH 022/207] Add unit tests --- .../java/security/AndroidLocalAuthQuery.qll | 7 +- .../CWE/CWE-287/AndroidInsecureKeys.ql | 5 +- .../InsecureKeys/Test1/InsecureKeys.expected | 2 + .../InsecureKeys/Test1/InsecureKeys.ql | 19 +++++ .../CWE-287/InsecureKeys/Test1/Test.java | 21 +++++ .../CWE-287/InsecureKeys/Test1/options | 1 + .../InsecureKeys/Test2/InsecureKeys.expected | 2 + .../InsecureKeys/Test2/InsecureKeys.ql | 19 +++++ .../CWE-287/InsecureKeys/Test2/Test.java | 13 ++++ .../CWE-287/InsecureKeys/Test2/options | 1 + .../keystore/KeyGenParameterSpec.java | 76 +++++++++++++++++++ .../security/keystore/KeyProperties.java | 54 +++++++++++++ 12 files changed, 214 insertions(+), 6 deletions(-) create mode 100644 java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected create mode 100644 java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.ql create mode 100644 java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java create mode 100644 java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/options create mode 100644 java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected create mode 100644 java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.ql create mode 100644 java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/Test.java create mode 100644 java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/options create mode 100644 java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyGenParameterSpec.java create mode 100644 java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyProperties.java diff --git a/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll b/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll index 004741aabfc..4a31dc2568d 100644 --- a/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll +++ b/java/ql/lib/semmle/code/java/security/AndroidLocalAuthQuery.qll @@ -43,8 +43,8 @@ class AuthenticationSuccessCallback extends Method { } /** A call that sets a parameter for key generation that is insecure for use with biometric authentication. */ -class InsecureBiometricKeyParam extends MethodCall { - InsecureBiometricKeyParam() { +class InsecureBiometricKeyParamCall extends MethodCall { + InsecureBiometricKeyParamCall() { exists(string name, CompileTimeConstantExpr val | this.getMethod() .hasQualifiedName("android.security.keystore", "KeyGenParameterSpec$Builder", name) and @@ -59,3 +59,6 @@ class InsecureBiometricKeyParam extends MethodCall { ) } } + +/** Holds if the application contains an instance of a key being used for local biometric authentication. */ +predicate usesLocalAuth() { exists(AuthenticationSuccessCallback cb | exists(cb.getAResultUse())) } diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql index 00156283045..0e85229c29b 100644 --- a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql @@ -13,9 +13,6 @@ import java import semmle.code.java.security.AndroidLocalAuthQuery -/** Holds if the application contains an instance of a key being used for local biometric authentication. */ -predicate usesLocalAuth() { exists(AuthenticationSuccessCallback cb | exists(cb.getAResultUse())) } - -from InsecureBiometricKeyParam call +from InsecureBiometricKeyParamCall call where usesLocalAuth() select call, "This key is not secure for biometric authentication." diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected new file mode 100644 index 00000000000..8ec8033d086 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected @@ -0,0 +1,2 @@ +testFailures +failures diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.ql b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.ql new file mode 100644 index 00000000000..eec3b62dfc2 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.ql @@ -0,0 +1,19 @@ +import java +import TestUtilities.InlineExpectationsTest +import semmle.code.java.dataflow.DataFlow +import semmle.code.java.security.AndroidLocalAuthQuery + +module InsecureKeysTest implements TestSig { + string getARelevantTag() { result = "insecure-key" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + tag = "insecure-key" and + exists(InsecureBiometricKeyParamCall call | usesLocalAuth() | + call.getLocation() = location and + element = call.toString() and + value = "" + ) + } +} + +import MakeTest diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java new file mode 100644 index 00000000000..5fc2c83eea9 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java @@ -0,0 +1,21 @@ +import android.security.keystore.KeyGenParameterSpec; +import android.hardware.biometrics.BiometricPrompt; +import android.security.keystore.KeyProperties; + +class Test { + void test() { + KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("MySecretKey", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT); + builder.setUserAuthenticationRequired(false); // $insecure-key + builder.setInvalidatedByBiometricEnrollment(false); // $insecure-key + builder.setUserAuthenticationValidityDurationSeconds(30); // $insecure-key + } +} + +class Callback extends BiometricPrompt.AuthenticationCallback { + public static void useKey(BiometricPrompt.CryptoObject key) {} + + @Override + public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { + useKey(result.getCryptoObject()); + } +} \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/options b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/options new file mode 100644 index 00000000000..7039c596a23 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/google-android-9.0.0 diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected new file mode 100644 index 00000000000..8ec8033d086 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected @@ -0,0 +1,2 @@ +testFailures +failures diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.ql b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.ql new file mode 100644 index 00000000000..eec3b62dfc2 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.ql @@ -0,0 +1,19 @@ +import java +import TestUtilities.InlineExpectationsTest +import semmle.code.java.dataflow.DataFlow +import semmle.code.java.security.AndroidLocalAuthQuery + +module InsecureKeysTest implements TestSig { + string getARelevantTag() { result = "insecure-key" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + tag = "insecure-key" and + exists(InsecureBiometricKeyParamCall call | usesLocalAuth() | + call.getLocation() = location and + element = call.toString() and + value = "" + ) + } +} + +import MakeTest diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/Test.java b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/Test.java new file mode 100644 index 00000000000..e65b50da888 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/Test.java @@ -0,0 +1,13 @@ +import android.security.keystore.KeyGenParameterSpec; +import android.hardware.biometrics.BiometricPrompt; +import android.security.keystore.KeyProperties; + +class Test { + void test() { + KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("MySecretKey", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT); + // No alert as there is no use of biometric authentication in this application. + builder.setUserAuthenticationRequired(false); + builder.setInvalidatedByBiometricEnrollment(false); + builder.setUserAuthenticationValidityDurationSeconds(30); + } +} \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/options b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/options new file mode 100644 index 00000000000..7039c596a23 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/google-android-9.0.0 diff --git a/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyGenParameterSpec.java b/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyGenParameterSpec.java new file mode 100644 index 00000000000..7998d48428e --- /dev/null +++ b/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyGenParameterSpec.java @@ -0,0 +1,76 @@ +// Generated automatically from android.security.keystore.KeyGenParameterSpec for testing purposes + +package android.security.keystore; + +import java.math.BigInteger; +import java.security.spec.AlgorithmParameterSpec; +import java.util.Date; +import javax.security.auth.x500.X500Principal; + +public class KeyGenParameterSpec implements AlgorithmParameterSpec +{ + public AlgorithmParameterSpec getAlgorithmParameterSpec(){ return null; } + public BigInteger getCertificateSerialNumber(){ return null; } + public Date getCertificateNotAfter(){ return null; } + public Date getCertificateNotBefore(){ return null; } + public Date getKeyValidityForConsumptionEnd(){ return null; } + public Date getKeyValidityForOriginationEnd(){ return null; } + public Date getKeyValidityStart(){ return null; } + public String getAttestKeyAlias(){ return null; } + public String getKeystoreAlias(){ return null; } + public String[] getBlockModes(){ return null; } + public String[] getDigests(){ return null; } + public String[] getEncryptionPaddings(){ return null; } + public String[] getSignaturePaddings(){ return null; } + public X500Principal getCertificateSubject(){ return null; } + public boolean isDevicePropertiesAttestationIncluded(){ return false; } + public boolean isDigestsSpecified(){ return false; } + public boolean isInvalidatedByBiometricEnrollment(){ return false; } + public boolean isRandomizedEncryptionRequired(){ return false; } + public boolean isStrongBoxBacked(){ return false; } + public boolean isUnlockedDeviceRequired(){ return false; } + public boolean isUserAuthenticationRequired(){ return false; } + public boolean isUserAuthenticationValidWhileOnBody(){ return false; } + public boolean isUserConfirmationRequired(){ return false; } + public boolean isUserPresenceRequired(){ return false; } + public byte[] getAttestationChallenge(){ return null; } + public int getKeySize(){ return 0; } + public int getMaxUsageCount(){ return 0; } + public int getPurposes(){ return 0; } + public int getUserAuthenticationType(){ return 0; } + public int getUserAuthenticationValidityDurationSeconds(){ return 0; } + static public class Builder + { + protected Builder() {} + public Builder(String p0, int p1){} + public KeyGenParameterSpec build(){ return null; } + public KeyGenParameterSpec.Builder setAlgorithmParameterSpec(AlgorithmParameterSpec p0){ return null; } + public KeyGenParameterSpec.Builder setAttestKeyAlias(String p0){ return null; } + public KeyGenParameterSpec.Builder setAttestationChallenge(byte[] p0){ return null; } + public KeyGenParameterSpec.Builder setBlockModes(String... p0){ return null; } + public KeyGenParameterSpec.Builder setCertificateNotAfter(Date p0){ return null; } + public KeyGenParameterSpec.Builder setCertificateNotBefore(Date p0){ return null; } + public KeyGenParameterSpec.Builder setCertificateSerialNumber(BigInteger p0){ return null; } + public KeyGenParameterSpec.Builder setCertificateSubject(X500Principal p0){ return null; } + public KeyGenParameterSpec.Builder setDevicePropertiesAttestationIncluded(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setDigests(String... p0){ return null; } + public KeyGenParameterSpec.Builder setEncryptionPaddings(String... p0){ return null; } + public KeyGenParameterSpec.Builder setInvalidatedByBiometricEnrollment(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setIsStrongBoxBacked(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setKeySize(int p0){ return null; } + public KeyGenParameterSpec.Builder setKeyValidityEnd(Date p0){ return null; } + public KeyGenParameterSpec.Builder setKeyValidityForConsumptionEnd(Date p0){ return null; } + public KeyGenParameterSpec.Builder setKeyValidityForOriginationEnd(Date p0){ return null; } + public KeyGenParameterSpec.Builder setKeyValidityStart(Date p0){ return null; } + public KeyGenParameterSpec.Builder setMaxUsageCount(int p0){ return null; } + public KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setSignaturePaddings(String... p0){ return null; } + public KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setUserAuthenticationParameters(int p0, int p1){ return null; } + public KeyGenParameterSpec.Builder setUserAuthenticationRequired(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds(int p0){ return null; } + public KeyGenParameterSpec.Builder setUserConfirmationRequired(boolean p0){ return null; } + public KeyGenParameterSpec.Builder setUserPresenceRequired(boolean p0){ return null; } + } +} diff --git a/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyProperties.java b/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyProperties.java new file mode 100644 index 00000000000..b9e7a912698 --- /dev/null +++ b/java/ql/test/stubs/google-android-9.0.0/android/security/keystore/KeyProperties.java @@ -0,0 +1,54 @@ +// Generated automatically from android.security.keystore.KeyProperties for testing purposes + +package android.security.keystore; + + +abstract public class KeyProperties +{ + protected KeyProperties() {} + public static String BLOCK_MODE_CBC = null; + public static String BLOCK_MODE_CTR = null; + public static String BLOCK_MODE_ECB = null; + public static String BLOCK_MODE_GCM = null; + public static String DIGEST_MD5 = null; + public static String DIGEST_NONE = null; + public static String DIGEST_SHA1 = null; + public static String DIGEST_SHA224 = null; + public static String DIGEST_SHA256 = null; + public static String DIGEST_SHA384 = null; + public static String DIGEST_SHA512 = null; + public static String ENCRYPTION_PADDING_NONE = null; + public static String ENCRYPTION_PADDING_PKCS7 = null; + public static String ENCRYPTION_PADDING_RSA_OAEP = null; + public static String ENCRYPTION_PADDING_RSA_PKCS1 = null; + public static String KEY_ALGORITHM_3DES = null; + public static String KEY_ALGORITHM_AES = null; + public static String KEY_ALGORITHM_EC = null; + public static String KEY_ALGORITHM_HMAC_SHA1 = null; + public static String KEY_ALGORITHM_HMAC_SHA224 = null; + public static String KEY_ALGORITHM_HMAC_SHA256 = null; + public static String KEY_ALGORITHM_HMAC_SHA384 = null; + public static String KEY_ALGORITHM_HMAC_SHA512 = null; + public static String KEY_ALGORITHM_RSA = null; + public static String SIGNATURE_PADDING_RSA_PKCS1 = null; + public static String SIGNATURE_PADDING_RSA_PSS = null; + public static int AUTH_BIOMETRIC_STRONG = 0; + public static int AUTH_DEVICE_CREDENTIAL = 0; + public static int ORIGIN_GENERATED = 0; + public static int ORIGIN_IMPORTED = 0; + public static int ORIGIN_SECURELY_IMPORTED = 0; + public static int ORIGIN_UNKNOWN = 0; + public static int PURPOSE_AGREE_KEY = 0; + public static int PURPOSE_ATTEST_KEY = 0; + public static int PURPOSE_DECRYPT = 0; + public static int PURPOSE_ENCRYPT = 0; + public static int PURPOSE_SIGN = 0; + public static int PURPOSE_VERIFY = 0; + public static int PURPOSE_WRAP_KEY = 0; + public static int SECURITY_LEVEL_SOFTWARE = 0; + public static int SECURITY_LEVEL_STRONGBOX = 0; + public static int SECURITY_LEVEL_TRUSTED_ENVIRONMENT = 0; + public static int SECURITY_LEVEL_UNKNOWN = 0; + public static int SECURITY_LEVEL_UNKNOWN_SECURE = 0; + public static int UNRESTRICTED_USAGE_COUNT = 0; +} From 16a7d68780180cf36835c5659c5506a5c31ba94b Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 12 Feb 2024 13:57:31 +0000 Subject: [PATCH 023/207] Add documentation --- .../CWE/CWE-287/AndroidInsecureKeys.qhelp | 40 +++++++++++++++++++ .../CWE/CWE-287/AndroidInsecureKeysGood.java | 16 ++++++++ 2 files changed, 56 insertions(+) create mode 100644 java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp create mode 100644 java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp new file mode 100644 index 00000000000..7b7a86ca667 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp @@ -0,0 +1,40 @@ + + + + +

+Biometric authentication such as fingerprint recognition can be used alongside cryptographic keys stored in the Android KeyStore to protect sensitive parts of the application. However, +when a key generated for this purpose has certain parameters set insecurely, it can allow an attacker with physical access to bypass the +authentication check, using application hooking tools such as Frida. +

+
+ + +

+When generating a key for use with biometric authentication, ensure that the following parameters of KeyGenParameterSpec.Builder are set: +

+
    +
  • setUserAuthenticationRequired should be set to true; otherwise the key can be used without user authentication.
  • +
  • setInvalidatedByBiometricEnrollment should be set to true (the default); otherwise an attacker can use the key by enrolling additional biometrics on the device.
  • +
  • setUserAuthenticationValidityDurationSeconds, if used, should be set to -1; otherwise non-biometric (less secure) credentials can be used to access the key. setUserAuthenticationParameters is instead recommended to explicitly set both the timeout and the types of credentials that may be used.
  • +
+ +
+ + +

The following example demonstrates a key that is configured with secure paramaters:

+ +
+ + +
  • +WithSecure: How Secure is your Android Keystore Authentication? +
  • +
  • +Android Developers: KeyGenParameterSpec.Builder +
  • + +
    +
    diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java new file mode 100644 index 00000000000..843f020fdbe --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java @@ -0,0 +1,16 @@ +private void generateSecretKey() { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + // GOOD: Secure parameters are used to generate a key for biometric authentication. + .setUserAuthenticationRequired(true) + .setInvalidatedByBiometricEnrollment(true) + .setUserAuthenticationParamters(0, KeyProperties.AUTH_BIOMETRIC_STRONG) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); +} \ No newline at end of file From 3a4a841844d66263adb051d07afb8a0ea0bb5041 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 12 Feb 2024 14:01:27 +0000 Subject: [PATCH 024/207] Add change note + update severity --- java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql | 2 +- java/ql/src/change-notes/2024-02-12-android-insecure-keys.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 java/ql/src/change-notes/2024-02-12-android-insecure-keys.md diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql index 0e85229c29b..c8090f23c1d 100644 --- a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql @@ -3,7 +3,7 @@ * @description Keys used for local biometric authentication should be generated with secure parameters. * @kind problem * @problem.severity warning - * @security-severity 9.3 + * @security-severity 4.4 * @precision medium * @id java/android/insecure-local-key-gen * @tags security diff --git a/java/ql/src/change-notes/2024-02-12-android-insecure-keys.md b/java/ql/src/change-notes/2024-02-12-android-insecure-keys.md new file mode 100644 index 00000000000..1de07727796 --- /dev/null +++ b/java/ql/src/change-notes/2024-02-12-android-insecure-keys.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* Added a new query `java/android/insecure-local-key-gen` for finding instances of keys generated for biometric authentication in an insecure way. \ No newline at end of file From c0eeb7a34eb72bc89fa9bea08898911a4dad4c0f Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 12 Feb 2024 15:58:43 +0100 Subject: [PATCH 025/207] Bazel: reference (and locally stub) internal module --- .bazelrc | 4 ++++ MODULE.bazel | 2 ++ misc/bazel/cmake/cmake.bzl | 5 +++-- misc/bazel/cmake/setup.cmake | 3 +-- misc/bazel/codeql_internal_stub/MODULE.bazel | 4 ++++ misc/bazel/codeql_internal_stub/WORKSPACE.bazel | 0 6 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 misc/bazel/codeql_internal_stub/MODULE.bazel create mode 100644 misc/bazel/codeql_internal_stub/WORKSPACE.bazel diff --git a/.bazelrc b/.bazelrc index dcb73e90697..af3769c38ff 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,5 +1,9 @@ common --enable_platform_specific_config --experimental_enable_bzlmod +# when using repo standalone, we want still to unlock loading the internal repository module +# actually using things from that module will obviously end up in an error +common --override_module=codeql_internal=%workspace%/misc/bazel/codeql_internal_stub + build --repo_env=CC=clang --repo_env=CXX=clang++ build:linux --cxxopt=-std=c++20 diff --git a/MODULE.bazel b/MODULE.bazel index dd8021dcfb0..02cd6a8baa4 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -3,6 +3,8 @@ module( version = "0.0", ) +# this points to our internal repository when `codeql` is checked out as a submodule thereof +# when building things from `codeql` independently this is stubbed out in `.bazelrc` bazel_dep(name = "codeql_internal", version = "0.0") local_path_override( module_name = "codeql_internal", diff --git a/misc/bazel/cmake/cmake.bzl b/misc/bazel/cmake/cmake.bzl index cba271dc517..7d50c7fcdee 100644 --- a/misc/bazel/cmake/cmake.bzl +++ b/misc/bazel/cmake/cmake.bzl @@ -22,7 +22,9 @@ CmakeInfo = provider( ) def _cmake_name(label): - ret = ("%s_%s_%s" % (label.workspace_name, label.package, label.name)).replace("/", "_") + # strip away the bzlmod module version for now + workspace_name, _, _ = label.workspace_name.partition("~") + ret = ("%s_%s_%s" % (workspace_name, label.package, label.name)).replace("/", "_") internal_transition_suffix = "_INTERNAL_TRANSITION" if ret.endswith(internal_transition_suffix): ret = ret[:-len(internal_transition_suffix)] @@ -120,7 +122,6 @@ def _cmake_aspect_impl(target, ctx): prefix, # source "${BAZEL_EXEC_ROOT}/%s/%s" % (ctx.var["BINDIR"], prefix), # generated ] - deps = [dep[CmakeInfo] for dep in deps if CmakeInfo in dep] # by the book this should be done with depsets, but so far the performance implication is negligible diff --git a/misc/bazel/cmake/setup.cmake b/misc/bazel/cmake/setup.cmake index 79314d76f85..439bfbb59d7 100644 --- a/misc/bazel/cmake/setup.cmake +++ b/misc/bazel/cmake/setup.cmake @@ -19,8 +19,7 @@ endmacro() bazel(info workspace OUTPUT_VARIABLE BAZEL_WORKSPACE) bazel(info output_base OUTPUT_VARIABLE BAZEL_OUTPUT_BASE) -string(REPLACE "-" "_" BAZEL_EXEC_ROOT ${PROJECT_NAME}) -set(BAZEL_EXEC_ROOT ${BAZEL_OUTPUT_BASE}/execroot/${BAZEL_EXEC_ROOT}) +set(BAZEL_EXEC_ROOT ${BAZEL_OUTPUT_BASE}/execroot/_main) macro(include_generated BAZEL_TARGET) bazel(build ${BAZEL_TARGET}) diff --git a/misc/bazel/codeql_internal_stub/MODULE.bazel b/misc/bazel/codeql_internal_stub/MODULE.bazel new file mode 100644 index 00000000000..412f621a5ae --- /dev/null +++ b/misc/bazel/codeql_internal_stub/MODULE.bazel @@ -0,0 +1,4 @@ +module( + name = "codeql_internal", + version = "0.0", +) diff --git a/misc/bazel/codeql_internal_stub/WORKSPACE.bazel b/misc/bazel/codeql_internal_stub/WORKSPACE.bazel new file mode 100644 index 00000000000..e69de29bb2d From 90f3670f3d5a89f63b0820ae6c93977c4c71d3d4 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 23 Jan 2024 09:13:58 +0100 Subject: [PATCH 026/207] C#: Remove all DB stats --- .../ql/lib/semmlecode.csharp.dbscheme.stats | 41725 +--------------- 1 file changed, 2 insertions(+), 41723 deletions(-) diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme.stats b/csharp/ql/lib/semmlecode.csharp.dbscheme.stats index e217f9cea60..82714bfe1d0 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme.stats +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme.stats @@ -1,41725 +1,4 @@ - - - @compilation - 1607 - - - @diagnostic - 138224 - - - @extractor_message - 11378 - - - @externalDataElement - 0 - - - @assembly - 14527 - - - @file - 92261 - - - @folder - 34263 - - - @namespace - 206514 - - - @namespace_declaration - 37444 - - - @using_static_directive - 1202 - - - @directive_if - 20769 - - - @using_namespace_directive - 286854 - - - @directive_elif - 293 - - - @directive_else - 6744 - - - @directive_endif - 20338 - - - @directive_region - 38812 - - - @directive_endregion - 38812 - - - @directive_line - 539550 - - - @directive_nullable - 467925 - - - @directive_warning - 23 - - - @directive_error - 45 - - - @directive_undefine - 68 - - - @pragma_checksum - 9570 - - - @directive_define - 83 - - - @pragma_warning - 57623 - - - @typeref - 4008699 - - - @bool_type - 60 - - - @char_type - 60 - - - @decimal_type - 60 - - - @sbyte_type - 60 - - - @short_type - 60 - - - @int_type - 60 - - - @long_type - 60 - - - @byte_type - 60 - - - @ushort_type - 60 - - - @uint_type - 60 - - - @ulong_type - 60 - - - @float_type - 60 - - - @double_type - 60 - - - @enum_type - 163759 - - - @struct_type - 716372 - - - @class_type - 4319716 - - - @interface_type - 2787078 - - - @delegate_type - 834351 - - - @null_type - 60 - - - @type_parameter - 897781 - - - @pointer_type - 11632 - - - @nullable_type - 24628 - - - @array_type - 95572 - - - @void_type - 60 - - - @int_ptr_type - 60 - - - @arglist_type - 25 - - - @unknown_type - 60 - - - @tuple_type - 47199 - - - @function_pointer_type - 47919 - - - @inline_array_type - 21 - - - @uint_ptr_type - 0 - - - @dynamic_type - 25 - - - @attribute_default - 13884733 - - - @attribute_return - 338135 - - - @attribute_assembly - 42996 - - - @attribute_module - 66 - - - @oblivious - 18476 - - - @not_annotated - 6903 - - - @annotated - 4922 - - - @type_mention - 3322420 - - - @type_parameter_constraints - 897781 - - - @location_default - 154005847 - - - @modifier - 1020 - - - @property - 5910563 - - - @indexer - 103350 - - - @getter - 6006897 - - - @setter - 895152 - - - @event - 60800 - - - @add_event_accessor - 60800 - - - @remove_event_accessor - 60800 - - - @operator - 146898 - - - @method - 17406043 - - - @constructor - 5023456 - - - @destructor - 4588 - - - @local_function - 4768 - - - @addressable_field - 9983437 - - - @constant - 3004004 - - - @addressable_local_variable - 617257 - - - @local_constant - 1960 - - - @local_variable_ref - 1708 - - - @parameter - 31463795 - - - @block_stmt - 797317 - - - @expr_stmt - 866006 - - - @if_stmt - 371632 - - - @switch_stmt - 12529 - - - @while_stmt - 23333 - - - @do_stmt - 2314 - - - @for_stmt - 22828 - - - @foreach_stmt - 32474 - - - @break_stmt - 115991 - - - @continue_stmt - 10334 - - - @goto_stmt - 6331 - - - @goto_case_stmt - 1397 - - - @goto_default_stmt - 261 - - - @throw_stmt - 175588 - - - @return_stmt - 374214 - - - @yield_stmt - 7198 - - - @try_stmt - 21811 - - - @checked_stmt - 487 - - - @unchecked_stmt - 194 - - - @lock_stmt - 9587 - - - @using_block_stmt - 9206 - - - @var_decl_stmt - 557023 - - - @const_decl_stmt - 1946 - - - @empty_stmt - 846 - - - @unsafe_stmt - 626 - - - @fixed_stmt - 3152 - - - @label_stmt - 2802 - - - @catch - 30233 - - - @case_stmt - 130471 - - - @local_function_stmt - 4652 - - - @using_decl_stmt - 13937 - - - @bool_literal_expr - 517984 - - - @char_literal_expr - 75977 - - - @decimal_literal_expr - 185559 - - - @int_literal_expr - 4873070 - - - @long_literal_expr - 10293 - - - @uint_literal_expr - 10265 - - - @ulong_literal_expr - 4223 - - - @float_literal_expr - 129369 - - - @double_literal_expr - 67946 - - - @utf16_string_literal_expr - 1936327 - - - @null_literal_expr - 249861 - - - @this_access_expr - 1139940 - - - @base_access_expr - 57393 - - - @local_variable_access_expr - 1800136 - - - @parameter_access_expr - 1043167 - - - @field_access_expr - 1361171 - - - @property_access_expr - 1468688 - - - @method_access_expr - 21420 - - - @event_access_expr - 14995 - - - @indexer_access_expr - 73964 - - - @array_access_expr - 95237 - - - @type_access_expr - 1319868 - - - @typeof_expr - 733326 - - - @method_invocation_expr - 1292925 - - - @delegate_invocation_expr - 14027 - - - @operator_invocation_expr - 53469 - - - @cast_expr - 666635 - - - @object_creation_expr - 232984 - - - @explicit_delegate_creation_expr - 3838 - - - @implicit_delegate_creation_expr - 13629 - - - @array_creation_expr - 842441 - - - @default_expr - 475094 - - - @plus_expr - 1494 - - - @minus_expr - 83947 - - - @bit_not_expr - 2592 - - - @log_not_expr - 69874 - - - @post_incr_expr - 34720 - - - @post_decr_expr - 4264 - - - @pre_incr_expr - 16259 - - - @pre_decr_expr - 1332 - - - @mul_expr - 13674 - - - @div_expr - 4708 - - - @rem_expr - 1733 - - - @add_expr - 89975 - - - @sub_expr - 32231 - - - @lshift_expr - 20397 - - - @rshift_expr - 6358 - - - @lt_expr - 42475 - - - @gt_expr - 26005 - - - @le_expr - 22303 - - - @ge_expr - 13933 - - - @eq_expr - 167777 - - - @ne_expr - 126219 - - - @bit_and_expr - 19733 - - - @bit_xor_expr - 3459 - - - @bit_or_expr - 37840 - - - @log_and_expr - 64040 - - - @log_or_expr - 40879 - - - @is_expr - 27099 - - - @as_expr - 25539 - - - @null_coalescing_expr - 12230 - - - @conditional_expr - 25477 - - - @simple_assign_expr - 1445815 - - - @assign_add_expr - 10985 - - - @assign_sub_expr - 3479 - - - @assign_mul_expr - 448 - - - @assign_div_expr - 224 - - - @assign_rem_expr - 54 - - - @assign_and_expr - 1371 - - - @assign_xor_expr - 1366 - - - @assign_or_expr - 5049 - - - @assign_lshift_expr - 312 - - - @assign_rshift_expr - 476 - - - @object_init_expr - 192703 - - - @collection_init_expr - 17877 - - - @array_init_expr - 836505 - - - @checked_expr - 1516 - - - @unchecked_expr - 2773 - - - @constructor_init_expr - 48759 - - - @add_event_expr - 4425 - - - @remove_event_expr - 2983 - - - @local_var_decl_expr - 619052 - - - @lambda_expr - 246837 - - - @anonymous_method_expr - 485 - - - @pointer_indirection_expr - 8987 - - - @address_of_expr - 3502 - - - @sizeof_expr - 4139 - - - @await_expr - 111125 - - - @nameof_expr - 60898 - - - @interpolated_string_expr - 45841 - - - @unknown_expr - 9 - - - @throw_expr - 6053 - - - @tuple_expr - 10147 - - - @local_function_invocation_expr - 16381 - - - @ref_expr - 3049 - - - @discard_expr - 3701 - - - @range_expr - 1288 - - - @index_expr - 308 - - - @switch_expr - 1803 - - - @recursive_pattern_expr - 4161 - - - @property_pattern_expr - 3675 - - - @positional_pattern_expr - 1021 - - - @switch_case_expr - 13128 - - - @assign_coalesce_expr - 6746 - - - @suppress_nullable_warning_expr - 49307 - - - @lt_pattern_expr - 67 - - - @gt_pattern_expr - 133 - - - @le_pattern_expr - 89 - - - @ge_pattern_expr - 102 - - - @not_pattern_expr - 4720 - - - @and_pattern_expr - 331 - - - @or_pattern_expr - 3131 - - - @function_pointer_invocation_expr - 182 - - - @with_expr - 291 - - - @list_pattern_expr - 291 - - - @slice_pattern_expr - 105 - - - @urshift_expr - 65 - - - @assign_urshift_expr - 2 - - - @utf8_string_literal_expr - 4006 - - - @collection_expr - 1900 - - - @define_symbol_expr - 40315 - - - @par_expr - 0 - - - @namespace_expr - 0 - - - @dynamic_element_access_expr - 222 - - - @dynamic_member_access_expr - 10662 - - - @namespace_access_expr - 117 - - - @spread_element_expr - 15 - - - @xmldtd - 72 - - - @xmlelement - 67055539 - - - @xmlattribute - 45628904 - - - @xmlnamespace - 429 - - - @xmlcomment - 12809 - - - @xmlcharacters - 50180784 - - - @singlelinecomment - 835522 - - - @xmldoccomment - 1480593 - - - @multilinecomment - 102852 - - - @commentblock - 452748 - - - @asp_close_tag - 24357 - - - @asp_code - 1371 - - - @asp_comment - 290 - - - @asp_data_binding - 586 - - - @asp_directive - 3329 - - - @asp_open_tag - 33601 - - - @asp_quoted_string - 58509 - - - @asp_text - 60436 - - - @asp_xml_directive - 1530 - - - @cil_nop - 0 - - - @cil_break - 0 - - - @cil_ldarg_0 - 0 - - - @cil_ldarg_1 - 0 - - - @cil_ldarg_2 - 0 - - - @cil_ldarg_3 - 0 - - - @cil_ldloc_0 - 0 - - - @cil_ldloc_1 - 0 - - - @cil_ldloc_2 - 0 - - - @cil_ldloc_3 - 0 - - - @cil_stloc_0 - 0 - - - @cil_stloc_1 - 0 - - - @cil_stloc_2 - 0 - - - @cil_stloc_3 - 0 - - - @cil_ldarg_s - 0 - - - @cil_ldarga_s - 0 - - - @cil_starg_s - 0 - - - @cil_ldloc_s - 0 - - - @cil_ldloca_s - 0 - - - @cil_stloc_s - 0 - - - @cil_ldnull - 0 - - - @cil_ldc_i4_m1 - 0 - - - @cil_ldc_i4_0 - 0 - - - @cil_ldc_i4_1 - 0 - - - @cil_ldc_i4_2 - 0 - - - @cil_ldc_i4_3 - 0 - - - @cil_ldc_i4_4 - 0 - - - @cil_ldc_i4_5 - 0 - - - @cil_ldc_i4_6 - 0 - - - @cil_ldc_i4_7 - 0 - - - @cil_ldc_i4_8 - 0 - - - @cil_ldc_i4_s - 0 - - - @cil_ldc_i4 - 0 - - - @cil_ldc_i8 - 0 - - - @cil_ldc_r4 - 0 - - - @cil_ldc_r8 - 0 - - - @cil_dup - 0 - - - @cil_pop - 0 - - - @cil_jmp - 0 - - - @cil_call - 0 - - - @cil_calli - 0 - - - @cil_ret - 0 - - - @cil_br_s - 0 - - - @cil_brfalse_s - 0 - - - @cil_brtrue_s - 0 - - - @cil_beq_s - 0 - - - @cil_bge_s - 0 - - - @cil_bgt_s - 0 - - - @cil_ble_s - 0 - - - @cil_blt_s - 0 - - - @cil_bne_un_s - 0 - - - @cil_bge_un_s - 0 - - - @cil_bgt_un_s - 0 - - - @cil_ble_un_s - 0 - - - @cil_blt_un_s - 0 - - - @cil_br - 0 - - - @cil_brfalse - 0 - - - @cil_brtrue - 0 - - - @cil_beq - 0 - - - @cil_bge - 0 - - - @cil_bgt - 0 - - - @cil_ble - 0 - - - @cil_blt - 0 - - - @cil_bne_un - 0 - - - @cil_bge_un - 0 - - - @cil_bgt_un - 0 - - - @cil_ble_un - 0 - - - @cil_blt_un - 0 - - - @cil_switch - 0 - - - @cil_ldind_i1 - 0 - - - @cil_ldind_u1 - 0 - - - @cil_ldind_i2 - 0 - - - @cil_ldind_u2 - 0 - - - @cil_ldind_i4 - 0 - - - @cil_ldind_u4 - 0 - - - @cil_ldind_i8 - 0 - - - @cil_ldind_i - 0 - - - @cil_ldind_r4 - 0 - - - @cil_ldind_r8 - 0 - - - @cil_ldind_ref - 0 - - - @cil_stind_ref - 0 - - - @cil_stind_i1 - 0 - - - @cil_stind_i2 - 0 - - - @cil_stind_i4 - 0 - - - @cil_stind_i8 - 0 - - - @cil_stind_r4 - 0 - - - @cil_stind_r8 - 0 - - - @cil_add - 0 - - - @cil_sub - 0 - - - @cil_mul - 0 - - - @cil_div - 0 - - - @cil_div_un - 0 - - - @cil_rem - 0 - - - @cil_rem_un - 0 - - - @cil_and - 0 - - - @cil_or - 0 - - - @cil_xor - 0 - - - @cil_shl - 0 - - - @cil_shr - 0 - - - @cil_shr_un - 0 - - - @cil_neg - 0 - - - @cil_not - 0 - - - @cil_conv_i1 - 0 - - - @cil_conv_i2 - 0 - - - @cil_conv_i4 - 0 - - - @cil_conv_i8 - 0 - - - @cil_conv_r4 - 0 - - - @cil_conv_r8 - 0 - - - @cil_conv_u4 - 0 - - - @cil_conv_u8 - 0 - - - @cil_callvirt - 0 - - - @cil_cpobj - 0 - - - @cil_ldobj - 0 - - - @cil_ldstr - 0 - - - @cil_newobj - 0 - - - @cil_castclass - 0 - - - @cil_isinst - 0 - - - @cil_conv_r_un - 0 - - - @cil_unbox - 0 - - - @cil_throw - 0 - - - @cil_ldfld - 0 - - - @cil_ldflda - 0 - - - @cil_stfld - 0 - - - @cil_ldsfld - 0 - - - @cil_ldsflda - 0 - - - @cil_stsfld - 0 - - - @cil_stobj - 0 - - - @cil_conv_ovf_i1_un - 0 - - - @cil_conv_ovf_i2_un - 0 - - - @cil_conv_ovf_i4_un - 0 - - - @cil_conv_ovf_i8_un - 0 - - - @cil_conv_ovf_u1_un - 0 - - - @cil_conv_ovf_u2_un - 0 - - - @cil_conv_ovf_u4_un - 0 - - - @cil_conv_ovf_u8_un - 0 - - - @cil_conv_ovf_i_un - 0 - - - @cil_conv_ovf_u_un - 0 - - - @cil_box - 0 - - - @cil_newarr - 0 - - - @cil_ldlen - 0 - - - @cil_ldelema - 0 - - - @cil_ldelem_i1 - 0 - - - @cil_ldelem_u1 - 0 - - - @cil_ldelem_i2 - 0 - - - @cil_ldelem_u2 - 0 - - - @cil_ldelem_i4 - 0 - - - @cil_ldelem_u4 - 0 - - - @cil_ldelem_i8 - 0 - - - @cil_ldelem_i - 0 - - - @cil_ldelem_r4 - 0 - - - @cil_ldelem_r8 - 0 - - - @cil_ldelem_ref - 0 - - - @cil_stelem_i - 0 - - - @cil_stelem_i1 - 0 - - - @cil_stelem_i2 - 0 - - - @cil_stelem_i4 - 0 - - - @cil_stelem_i8 - 0 - - - @cil_stelem_r4 - 0 - - - @cil_stelem_r8 - 0 - - - @cil_stelem_ref - 0 - - - @cil_ldelem - 0 - - - @cil_stelem - 0 - - - @cil_unbox_any - 0 - - - @cil_conv_ovf_i1 - 0 - - - @cil_conv_ovf_u1 - 0 - - - @cil_conv_ovf_i2 - 0 - - - @cil_conv_ovf_u2 - 0 - - - @cil_conv_ovf_i4 - 0 - - - @cil_conv_ovf_u4 - 0 - - - @cil_conv_ovf_i8 - 0 - - - @cil_conv_ovf_u8 - 0 - - - @cil_refanyval - 0 - - - @cil_ckinfinite - 0 - - - @cil_mkrefany - 0 - - - @cil_ldtoken - 0 - - - @cil_conv_u2 - 0 - - - @cil_conv_u1 - 0 - - - @cil_conv_i - 0 - - - @cil_conv_ovf_i - 0 - - - @cil_conv_ovf_u - 0 - - - @cil_add_ovf - 0 - - - @cil_add_ovf_un - 0 - - - @cil_mul_ovf - 0 - - - @cil_mul_ovf_un - 0 - - - @cil_sub_ovf - 0 - - - @cil_sub_ovf_un - 0 - - - @cil_endfinally - 0 - - - @cil_leave - 0 - - - @cil_leave_s - 0 - - - @cil_stind_i - 0 - - - @cil_conv_u - 0 - - - @cil_arglist - 0 - - - @cil_ceq - 0 - - - @cil_cgt - 0 - - - @cil_cgt_un - 0 - - - @cil_clt - 0 - - - @cil_clt_un - 0 - - - @cil_ldftn - 0 - - - @cil_ldvirtftn - 0 - - - @cil_ldarg - 0 - - - @cil_ldarga - 0 - - - @cil_starg - 0 - - - @cil_ldloc - 0 - - - @cil_ldloca - 0 - - - @cil_stloc - 0 - - - @cil_localloc - 0 - - - @cil_endfilter - 0 - - - @cil_unaligned - 0 - - - @cil_volatile - 0 - - - @cil_tail - 0 - - - @cil_initobj - 0 - - - @cil_constrained - 0 - - - @cil_cpblk - 0 - - - @cil_initblk - 0 - - - @cil_rethrow - 0 - - - @cil_sizeof - 0 - - - @cil_refanytype - 0 - - - @cil_readonly - 0 - - - @cil_valueorreftype - 0 - - - @cil_typeparameter - 0 - - - @cil_array_type - 0 - - - @cil_pointer_type - 0 - - - @cil_function_pointer_type - 0 - - - @cil_method - 0 - - - @cil_method_implementation - 0 - - - @cil_parameter - 0 - - - @cil_field - 0 - - - @cil_property - 0 - - - @cil_event - 0 - - - @cil_local_variable - 0 - - - @cil_catch_handler - 0 - - - @cil_filter_handler - 0 - - - @cil_finally_handler - 0 - - - @cil_fault_handler - 0 - - - @cil_attribute - 0 - - - - - compilations - 1607 - - - id - 1607 - - - cwd - 1353 - - - - - id - cwd - - - 12 - - - 1 - 2 - 1607 - - - - - - - cwd - id - - - 12 - - - 1 - 2 - 1208 - - - 2 - 3 - 55 - - - 3 - 7 - 90 - - - - - - - - - compilation_info - 0 - - - id - 0 - - - info_key - 0 - - - info_value - 0 - - - - - id - info_key - - - 12 - - - - - - id - info_value - - - 12 - - - - - - info_key - id - - - 12 - - - - - - info_key - info_value - - - 12 - - - - - - info_value - id - - - 12 - - - - - - info_value - info_key - - - 12 - - - - - - - - compilation_args - 17990 - - - id - 777 - - - num - 166 - - - arg - 2580 - - - - - id - num - - - 12 - - - 7 - 20 - 36 - - - 20 - 21 - 115 - - - 21 - 22 - 277 - - - 22 - 23 - 108 - - - 23 - 24 - 55 - - - 24 - 26 - 59 - - - 26 - 30 - 64 - - - 30 - 93 - 59 - - - - - - - id - arg - - - 12 - - - 7 - 20 - 36 - - - 20 - 21 - 115 - - - 21 - 22 - 279 - - - 22 - 23 - 108 - - - 23 - 24 - 54 - - - 24 - 26 - 59 - - - 26 - 30 - 64 - - - 30 - 93 - 59 - - - - - - - num - id - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 73 - - - 4 - 8 - 12 - - - 9 - 15 - 14 - - - 15 - 58 - 12 - - - 69 - 412 - 12 - - - 428 - 430 - 3 - - - 430 - 431 - 18 - - - 431 - 432 - 12 - - - - - - - num - arg - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 81 - - - 4 - 8 - 12 - - - 9 - 10 - 7 - - - 10 - 11 - 12 - - - 12 - 16 - 12 - - - 19 - 42 - 12 - - - 53 - 117 - 12 - - - 120 - 274 - 9 - - - - - - - arg - id - - - 12 - - - 1 - 2 - 2111 - - - 2 - 3 - 194 - - - 3 - 16 - 200 - - - 16 - 432 - 73 - - - - - - - arg - num - - - 12 - - - 1 - 2 - 2167 - - - 2 - 3 - 209 - - - 3 - 15 - 196 - - - 16 - 26 - 7 - - - - - - - - - compilation_expanded_args - 593382 - - - id - 1375 - - - num - 6110 - - - arg - 64718 - - - - - id - num - - - 12 - - - 12 - 356 - 121 - - - 356 - 361 - 114 - - - 361 - 365 - 94 - - - 365 - 374 - 114 - - - 374 - 380 - 67 - - - 381 - 394 - 114 - - - 394 - 412 - 107 - - - 412 - 428 - 107 - - - 429 - 443 - 107 - - - 444 - 472 - 107 - - - 472 - 505 - 107 - - - 512 - 558 - 107 - - - 559 - 907 - 101 - - - - - - - id - arg - - - 12 - - - 12 - 356 - 121 - - - 356 - 361 - 114 - - - 361 - 365 - 94 - - - 365 - 374 - 114 - - - 374 - 380 - 67 - - - 381 - 394 - 114 - - - 394 - 412 - 107 - - - 412 - 428 - 107 - - - 429 - 443 - 107 - - - 444 - 472 - 107 - - - 472 - 505 - 107 - - - 512 - 558 - 107 - - - 559 - 907 - 101 - - - - - - - num - id - - - 12 - - - 1 - 4 - 472 - - - 4 - 5 - 478 - - - 5 - 7 - 485 - - - 7 - 11 - 161 - - - 11 - 12 - 411 - - - 12 - 19 - 458 - - - 19 - 45 - 458 - - - 47 - 105 - 458 - - - 105 - 201 - 364 - - - 201 - 202 - 1018 - - - 203 - 204 - 1261 - - - 204 - 205 - 80 - - - - - - - num - arg - - - 12 - - - 1 - 4 - 532 - - - 4 - 5 - 478 - - - 5 - 7 - 492 - - - 7 - 11 - 175 - - - 11 - 12 - 397 - - - 12 - 18 - 451 - - - 18 - 22 - 472 - - - 22 - 28 - 418 - - - 28 - 40 - 492 - - - 40 - 59 - 465 - - - 59 - 63 - 438 - - - 63 - 66 - 458 - - - 66 - 85 - 472 - - - 85 - 198 - 364 - - - - - - - arg - id - - - 12 - - - 1 - 2 - 59241 - - - 2 - 204 - 5456 - - - 204 - 205 - 20 - - - - - - - arg - num - - - 12 - - - 1 - 2 - 59322 - - - 2 - 67 - 5132 - - - 67 - 122 - 263 - - - - - - - - - compilation_compiling_files - 49163 - - - id - 777 - - - num - 3512 - - - file - 33855 - - - - - id - num - - - 12 - - - 1 - 2 - 32 - - - 2 - 3 - 324 - - - 3 - 4 - 57 - - - 4 - 9 - 63 - - - 9 - 21 - 63 - - - 21 - 46 - 59 - - - 47 - 97 - 59 - - - 98 - 173 - 59 - - - 175 - 1947 - 57 - - - - - - - id - file - - - 12 - - - 1 - 2 - 32 - - - 2 - 3 - 324 - - - 3 - 4 - 57 - - - 4 - 9 - 63 - - - 9 - 21 - 63 - - - 21 - 46 - 59 - - - 47 - 97 - 59 - - - 98 - 173 - 59 - - - 175 - 1947 - 57 - - - - - - - num - id - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 918 - - - 3 - 5 - 140 - - - 5 - 6 - 729 - - - 6 - 7 - 83 - - - 7 - 8 - 328 - - - 8 - 9 - 102 - - - 10 - 11 - 315 - - - 11 - 17 - 276 - - - 17 - 29 - 294 - - - 29 - 112 - 265 - - - 113 - 432 - 55 - - - - - - - num - file - - - 12 - - - 1 - 2 - 14 - - - 2 - 3 - 905 - - - 3 - 5 - 144 - - - 5 - 6 - 725 - - - 6 - 7 - 83 - - - 7 - 8 - 328 - - - 8 - 10 - 202 - - - 10 - 13 - 281 - - - 13 - 19 - 274 - - - 19 - 35 - 267 - - - 35 - 140 - 263 - - - 140 - 343 - 21 - - - - - - - file - id - - - 12 - - - 1 - 2 - 21715 - - - 2 - 3 - 10785 - - - 3 - 171 - 1355 - - - - - - - file - num - - - 12 - - - 1 - 2 - 23185 - - - 2 - 3 - 9805 - - - 3 - 32 - 864 - - - - - - - - - compilation_referencing_files - 466138 - - - id - 1375 - - - num - 4491 - - - file - 4876 - - - - - id - num - - - 12 - - - 4 - 303 - 114 - - - 303 - 305 - 40 - - - 305 - 307 - 121 - - - 307 - 310 - 114 - - - 310 - 313 - 107 - - - 314 - 329 - 107 - - - 329 - 330 - 87 - - - 330 - 336 - 121 - - - 336 - 340 - 107 - - - 340 - 349 - 107 - - - 350 - 374 - 107 - - - 374 - 382 - 114 - - - 383 - 626 - 107 - - - 649 - 667 - 13 - - - - - - - id - file - - - 12 - - - 4 - 303 - 114 - - - 303 - 305 - 40 - - - 305 - 307 - 121 - - - 307 - 310 - 114 - - - 310 - 313 - 107 - - - 314 - 329 - 107 - - - 329 - 330 - 87 - - - 330 - 336 - 121 - - - 336 - 340 - 107 - - - 340 - 349 - 107 - - - 350 - 374 - 107 - - - 374 - 382 - 114 - - - 383 - 626 - 107 - - - 649 - 667 - 13 - - - - - - - num - id - - - 12 - - - 1 - 6 - 350 - - - 6 - 7 - 1382 - - - 7 - 49 - 337 - - - 49 - 147 - 337 - - - 152 - 191 - 53 - - - 201 - 202 - 930 - - - 203 - 204 - 1072 - - - 204 - 205 - 26 - - - - - - - num - file - - - 12 - - - 1 - 5 - 370 - - - 5 - 6 - 613 - - - 6 - 7 - 755 - - - 7 - 23 - 370 - - - 23 - 29 - 377 - - - 29 - 33 - 337 - - - 33 - 46 - 350 - - - 46 - 63 - 343 - - - 63 - 69 - 350 - - - 69 - 73 - 411 - - - 73 - 83 - 209 - - - - - - - file - id - - - 12 - - - 1 - 2 - 404 - - - 2 - 6 - 242 - - - 6 - 7 - 505 - - - 7 - 8 - 505 - - - 8 - 10 - 384 - - - 10 - 47 - 391 - - - 47 - 140 - 370 - - - 142 - 184 - 40 - - - 201 - 202 - 930 - - - 203 - 204 - 1099 - - - - - - - file - num - - - 12 - - - 1 - 2 - 418 - - - 2 - 5 - 323 - - - 5 - 6 - 296 - - - 6 - 7 - 593 - - - 7 - 9 - 418 - - - 9 - 19 - 370 - - - 19 - 26 - 418 - - - 26 - 33 - 411 - - - 33 - 40 - 384 - - - 40 - 69 - 370 - - - 69 - 71 - 343 - - - 71 - 74 - 377 - - - 74 - 82 - 148 - - - - - - - - - compilation_time - 11249 - - - id - 1607 - - - num - 2 - - - kind - 17 - - - seconds - 6580 - - - - - id - num - - - 12 - - - 1 - 2 - 1607 - - - - - - - id - kind - - - 12 - - - 7 - 8 - 1607 - - - - - - - id - seconds - - - 12 - - - 6 - 7 - 12 - - - 7 - 8 - 1594 - - - - - - - num - id - - - 12 - - - 641 - 642 - 2 - - - - - - - num - kind - - - 12 - - - 7 - 8 - 2 - - - - - - - num - seconds - - - 12 - - - 2625 - 2626 - 2 - - - - - - - kind - id - - - 12 - - - 641 - 642 - 17 - - - - - - - kind - num - - - 12 - - - 1 - 2 - 17 - - - - - - - kind - seconds - - - 12 - - - 280 - 281 - 2 - - - 290 - 291 - 2 - - - 372 - 373 - 2 - - - 382 - 383 - 2 - - - 639 - 640 - 5 - - - 640 - 641 - 2 - - - - - - - seconds - id - - - 12 - - - 1 - 2 - 5545 - - - 2 - 6 - 589 - - - 6 - 17 - 446 - - - - - - - seconds - num - - - 12 - - - 1 - 2 - 6580 - - - - - - - seconds - kind - - - 12 - - - 1 - 2 - 5648 - - - 2 - 3 - 468 - - - 3 - 5 - 463 - - - - - - - - - diagnostic_for - 138224 - - - diagnostic - 138224 - - - compilation - 1335 - - - file_number - 6 - - - file_number_diagnostic_number - 31165 - - - - - diagnostic - compilation - - - 12 - - - 1 - 2 - 138224 - - - - - - - diagnostic - file_number - - - 12 - - - 1 - 2 - 138224 - - - - - - - diagnostic - file_number_diagnostic_number - - - 12 - - - 1 - 2 - 138224 - - - - - - - compilation - diagnostic - - - 12 - - - 2 - 4 - 40 - - - 4 - 5 - 593 - - - 5 - 7 - 121 - - - 7 - 23 - 114 - - - 24 - 48 - 101 - - - 50 - 88 - 101 - - - 99 - 184 - 101 - - - 222 - 303 - 101 - - - 327 - 4622 - 60 - - - - - - - compilation - file_number - - - 12 - - - 1 - 2 - 1335 - - - - - - - compilation - file_number_diagnostic_number - - - 12 - - - 2 - 4 - 40 - - - 4 - 5 - 593 - - - 5 - 7 - 121 - - - 7 - 23 - 114 - - - 24 - 48 - 101 - - - 50 - 88 - 101 - - - 99 - 184 - 101 - - - 222 - 303 - 101 - - - 327 - 4622 - 60 - - - - - - - file_number - diagnostic - - - 12 - - - 20495 - 20496 - 6 - - - - - - - file_number - compilation - - - 12 - - - 198 - 199 - 6 - - - - - - - file_number - file_number_diagnostic_number - - - 12 - - - 4621 - 4622 - 6 - - - - - - - file_number_diagnostic_number - diagnostic - - - 12 - - - 1 - 2 - 12753 - - - 2 - 3 - 8875 - - - 3 - 4 - 1315 - - - 4 - 5 - 4060 - - - 5 - 15 - 2380 - - - 15 - 199 - 1780 - - - - - - - file_number_diagnostic_number - compilation - - - 12 - - - 1 - 2 - 12753 - - - 2 - 3 - 8875 - - - 3 - 4 - 1315 - - - 4 - 5 - 4060 - - - 5 - 15 - 2380 - - - 15 - 199 - 1780 - - - - - - - file_number_diagnostic_number - file_number - - - 12 - - - 1 - 2 - 31165 - - - - - - - - - diagnostics - 138224 - - - id - 138224 - - - severity - 6 - - - error_tag - 13 - - - error_message - 13 - - - full_error_message - 26 - - - location - 138224 - - - - - id - severity - - - 12 - - - 1 - 2 - 138224 - - - - - - - id - error_tag - - - 12 - - - 1 - 2 - 138224 - - - - - - - id - error_message - - - 12 - - - 1 - 2 - 138224 - - - - - - - id - full_error_message - - - 12 - - - 1 - 2 - 138224 - - - - - - - id - location - - - 12 - - - 1 - 2 - 138224 - - - - - - - severity - id - - - 12 - - - 20495 - 20496 - 6 - - - - - - - severity - error_tag - - - 12 - - - 2 - 3 - 6 - - - - - - - severity - error_message - - - 12 - - - 2 - 3 - 6 - - - - - - - severity - full_error_message - - - 12 - - - 4 - 5 - 6 - - - - - - - severity - location - - - 12 - - - 20495 - 20496 - 6 - - - - - - - error_tag - id - - - 12 - - - 17 - 18 - 6 - - - 20478 - 20479 - 6 - - - - - - - error_tag - severity - - - 12 - - - 1 - 2 - 13 - - - - - - - error_tag - error_message - - - 12 - - - 1 - 2 - 13 - - - - - - - error_tag - full_error_message - - - 12 - - - 1 - 2 - 6 - - - 3 - 4 - 6 - - - - - - - error_tag - location - - - 12 - - - 17 - 18 - 6 - - - 20478 - 20479 - 6 - - - - - - - error_message - id - - - 12 - - - 17 - 18 - 6 - - - 20478 - 20479 - 6 - - - - - - - error_message - severity - - - 12 - - - 1 - 2 - 13 - - - - - - - error_message - error_tag - - - 12 - - - 1 - 2 - 13 - - - - - - - error_message - full_error_message - - - 12 - - - 1 - 2 - 6 - - - 3 - 4 - 6 - - - - - - - error_message - location - - - 12 - - - 17 - 18 - 6 - - - 20478 - 20479 - 6 - - - - - - - full_error_message - id - - - 12 - - - 2 - 3 - 6 - - - 5 - 6 - 6 - - - 10 - 11 - 6 - - - 20478 - 20479 - 6 - - - - - - - full_error_message - severity - - - 12 - - - 1 - 2 - 26 - - - - - - - full_error_message - error_tag - - - 12 - - - 1 - 2 - 26 - - - - - - - full_error_message - error_message - - - 12 - - - 1 - 2 - 26 - - - - - - - full_error_message - location - - - 12 - - - 2 - 3 - 6 - - - 5 - 6 - 6 - - - 10 - 11 - 6 - - - 20478 - 20479 - 6 - - - - - - - location - id - - - 12 - - - 1 - 2 - 138224 - - - - - - - location - severity - - - 12 - - - 1 - 2 - 138224 - - - - - - - location - error_tag - - - 12 - - - 1 - 2 - 138224 - - - - - - - location - error_message - - - 12 - - - 1 - 2 - 138224 - - - - - - - location - full_error_message - - - 12 - - - 1 - 2 - 138224 - - - - - - - - - extractor_messages - 11378 - - - id - 11378 - - - severity - 2 - - - origin - 1 - - - text - 62 - - - entity - 4649 - - - location - 7633 - - - stack_trace - 282 - - - - - id - severity - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - origin - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - text - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - entity - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - location - - - 12 - - - 1 - 2 - 11378 - - - - - - - id - stack_trace - - - 12 - - - 1 - 2 - 11378 - - - - - - - severity - id - - - 12 - - - 171 - 172 - 1 - - - 11207 - 11208 - 1 - - - - - - - severity - origin - - - 12 - - - 1 - 2 - 2 - - - - - - - severity - text - - - 12 - - - 2 - 3 - 1 - - - 60 - 61 - 1 - - - - - - - severity - entity - - - 12 - - - 13 - 14 - 1 - - - 4637 - 4638 - 1 - - - - - - - severity - location - - - 12 - - - 145 - 146 - 1 - - - 7488 - 7489 - 1 - - - - - - - severity - stack_trace - - - 12 - - - 1 - 2 - 1 - - - 281 - 282 - 1 - - - - - - - origin - id - - - 12 - - - 11378 - 11379 - 1 - - - - - - - origin - severity - - - 12 - - - 2 - 3 - 1 - - - - - - - origin - text - - - 12 - - - 62 - 63 - 1 - - - - - - - origin - entity - - - 12 - - - 4649 - 4650 - 1 - - - - - - - origin - location - - - 12 - - - 7633 - 7634 - 1 - - - - - - - origin - stack_trace - - - 12 - - - 282 - 283 - 1 - - - - - - - text - id - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 50 - - - 62 - 1999 - 5 - - - 2443 - 4657 - 2 - - - - - - - text - severity - - - 12 - - - 1 - 2 - 62 - - - - - - - text - origin - - - 12 - - - 1 - 2 - 62 - - - - - - - text - entity - - - 12 - - - 1 - 2 - 56 - - - 12 - 1398 - 5 - - - 1631 - 1632 - 1 - - - - - - - text - location - - - 12 - - - 1 - 2 - 55 - - - 36 - 1894 - 5 - - - 2045 - 3033 - 2 - - - - - - - text - stack_trace - - - 12 - - - 1 - 2 - 57 - - - 3 - 193 - 5 - - - - - - - entity - id - - - 12 - - - 1 - 2 - 3385 - - - 2 - 3 - 260 - - - 3 - 4 - 369 - - - 4 - 6 - 91 - - - 6 - 7 - 384 - - - 7 - 214 - 160 - - - - - - - entity - severity - - - 12 - - - 1 - 2 - 4648 - - - 2 - 3 - 1 - - - - - - - entity - origin - - - 12 - - - 1 - 2 - 4649 - - - - - - - entity - text - - - 12 - - - 1 - 2 - 4642 - - - 2 - 56 - 7 - - - - - - - entity - location - - - 12 - - - 1 - 2 - 3986 - - - 2 - 4 - 423 - - - 4 - 164 - 240 - - - - - - - entity - stack_trace - - - 12 - - - 1 - 2 - 4028 - - - 2 - 3 - 518 - - - 3 - 12 - 103 - - - - - - - location - id - - - 12 - - - 1 - 2 - 6201 - - - 2 - 3 - 64 - - - 3 - 4 - 1053 - - - 6 - 7 - 315 - - - - - - - location - severity - - - 12 - - - 1 - 2 - 7633 - - - - - - - location - origin - - - 12 - - - 1 - 2 - 7633 - - - - - - - location - text - - - 12 - - - 1 - 2 - 7633 - - - - - - - location - entity - - - 12 - - - 1 - 2 - 7633 - - - - - - - location - stack_trace - - - 12 - - - 1 - 2 - 7254 - - - 2 - 4 - 379 - - - - - - - stack_trace - id - - - 12 - - - 1 - 2 - 79 - - - 2 - 3 - 44 - - - 3 - 4 - 24 - - - 4 - 6 - 26 - - - 6 - 9 - 23 - - - 9 - 16 - 22 - - - 16 - 34 - 24 - - - 35 - 80 - 22 - - - 85 - 2137 - 18 - - - - - - - stack_trace - severity - - - 12 - - - 1 - 2 - 282 - - - - - - - stack_trace - origin - - - 12 - - - 1 - 2 - 282 - - - - - - - stack_trace - text - - - 12 - - - 1 - 2 - 279 - - - 2 - 37 - 3 - - - - - - - stack_trace - entity - - - 12 - - - 1 - 2 - 95 - - - 2 - 3 - 47 - - - 3 - 4 - 28 - - - 4 - 5 - 15 - - - 5 - 7 - 26 - - - 7 - 17 - 24 - - - 18 - 37 - 24 - - - 37 - 609 - 22 - - - 809 - 810 - 1 - - - - - - - stack_trace - location - - - 12 - - - 1 - 2 - 85 - - - 2 - 3 - 47 - - - 3 - 4 - 23 - - - 4 - 5 - 16 - - - 5 - 7 - 26 - - - 7 - 14 - 22 - - - 14 - 30 - 23 - - - 31 - 62 - 22 - - - 63 - 1135 - 18 - - - - - - - - - compilation_finished - 1607 - - - id - 1607 - - - cpu_seconds - 1110 - - - elapsed_seconds - 1607 - - - - - id - cpu_seconds - - - 12 - - - 1 - 2 - 1607 - - - - - - - id - elapsed_seconds - - - 12 - - - 1 - 2 - 1607 - - - - - - - cpu_seconds - id - - - 12 - - - 1 - 2 - 772 - - - 2 - 3 - 220 - - - 3 - 4 - 87 - - - 4 - 7 - 30 - - - - - - - cpu_seconds - elapsed_seconds - - - 12 - - - 1 - 2 - 772 - - - 2 - 3 - 220 - - - 3 - 4 - 87 - - - 4 - 7 - 30 - - - - - - - elapsed_seconds - id - - - 12 - - - 1 - 2 - 1607 - - - - - - - elapsed_seconds - cpu_seconds - - - 12 - - - 1 - 2 - 1607 - - - - - - - - - compilation_assembly - 1607 - - - id - 1607 - - - assembly - 1607 - - - - - id - assembly - - - 12 - - - 1 - 2 - 1607 - - - - - - - assembly - id - - - 12 - - - 1 - 2 - 1607 - - - - - - - - - externalData - 0 - - - id - 0 - - - path - 0 - - - column - 0 - - - value - 0 - - - - - id - path - - - 12 - - - - - - id - column - - - 12 - - - - - - id - value - - - 12 - - - - - - path - id - - - 12 - - - - - - path - column - - - 12 - - - - - - path - value - - - 12 - - - - - - column - id - - - 12 - - - - - - column - path - - - 12 - - - - - - column - value - - - 12 - - - - - - value - id - - - 12 - - - - - - value - path - - - 12 - - - - - - value - column - - - 12 - - - - - - - - sourceLocationPrefix - 60 - - - prefix - 60 - - - - - - locations_default - 154005847 - - - id - 154005847 - - - file - 85462 - - - beginLine - 373077 - - - beginColumn - 11198 - - - endLine - 387748 - - - endColumn - 15839 - - - - - id - file - - - 12 - - - 1 - 2 - 154005847 - - - - - - - id - beginLine - - - 12 - - - 1 - 2 - 154005847 - - - - - - - id - beginColumn - - - 12 - - - 1 - 2 - 154005847 - - - - - - - id - endLine - - - 12 - - - 1 - 2 - 154005847 - - - - - - - id - endColumn - - - 12 - - - 1 - 2 - 154005847 - - - - - - - file - id - - - 12 - - - 1 - 14 - 6553 - - - 14 - 29 - 6445 - - - 29 - 56 - 6478 - - - 56 - 99 - 6540 - - - 99 - 147 - 6550 - - - 147 - 247 - 6418 - - - 247 - 383 - 6433 - - - 383 - 562 - 6478 - - - 562 - 887 - 6410 - - - 887 - 1560 - 6701 - - - 1561 - 2241 - 6658 - - - 2243 - 4570 - 6623 - - - 4570 - 25909 - 6420 - - - 26296 - 267080 - 749 - - - - - - - file - beginLine - - - 12 - - - 1 - 9 - 7099 - - - 9 - 17 - 6999 - - - 17 - 27 - 6801 - - - 27 - 44 - 6663 - - - 44 - 65 - 6428 - - - 65 - 101 - 6455 - - - 101 - 151 - 6999 - - - 151 - 229 - 6508 - - - 229 - 401 - 6538 - - - 401 - 674 - 6415 - - - 674 - 1032 - 7047 - - - 1032 - 2141 - 6425 - - - 2149 - 121882 - 5079 - - - - - - - file - beginColumn - - - 12 - - - 1 - 6 - 5974 - - - 6 - 10 - 6906 - - - 10 - 18 - 6701 - - - 18 - 27 - 7578 - - - 27 - 38 - 6846 - - - 38 - 51 - 6628 - - - 51 - 64 - 6513 - - - 64 - 82 - 6698 - - - 82 - 106 - 6651 - - - 106 - 126 - 7543 - - - 126 - 167 - 6435 - - - 167 - 229 - 6500 - - - 229 - 2578 - 4482 - - - - - - - file - endLine - - - 12 - - - 1 - 9 - 6954 - - - 9 - 18 - 6596 - - - 18 - 27 - 6703 - - - 27 - 43 - 6606 - - - 43 - 72 - 6523 - - - 72 - 112 - 6530 - - - 112 - 190 - 7237 - - - 190 - 285 - 6901 - - - 285 - 484 - 6593 - - - 484 - 841 - 6410 - - - 841 - 1381 - 7237 - - - 1381 - 2762 - 6433 - - - 2765 - 135652 - 4733 - - - - - - - file - endColumn - - - 12 - - - 1 - 12 - 7044 - - - 12 - 23 - 6831 - - - 23 - 37 - 6616 - - - 37 - 51 - 6490 - - - 51 - 66 - 6533 - - - 66 - 86 - 6726 - - - 86 - 107 - 6555 - - - 107 - 131 - 6633 - - - 131 - 153 - 6839 - - - 153 - 183 - 7049 - - - 183 - 226 - 7117 - - - 226 - 304 - 6423 - - - 304 - 4355 - 4600 - - - - - - - beginLine - id - - - 12 - - - 1 - 2 - 5856 - - - 2 - 3 - 30300 - - - 3 - 6 - 29573 - - - 6 - 7 - 18313 - - - 7 - 9 - 33659 - - - 9 - 11 - 28219 - - - 11 - 15 - 28334 - - - 15 - 21 - 29580 - - - 21 - 29 - 28557 - - - 29 - 47 - 28698 - - - 47 - 84 - 28141 - - - 84 - 146 - 28164 - - - 146 - 946 - 27991 - - - 946 - 61765 - 27687 - - - - - - - beginLine - file - - - 12 - - - 1 - 2 - 39445 - - - 2 - 3 - 14322 - - - 3 - 4 - 51905 - - - 4 - 5 - 40202 - - - 5 - 6 - 18775 - - - 6 - 7 - 17654 - - - 7 - 8 - 20018 - - - 8 - 11 - 32034 - - - 11 - 20 - 29196 - - - 20 - 35 - 29470 - - - 35 - 59 - 28076 - - - 59 - 366 - 28026 - - - 366 - 32788 - 23947 - - - - - - - beginLine - beginColumn - - - 12 - - - 1 - 2 - 22673 - - - 2 - 3 - 54618 - - - 3 - 4 - 40508 - - - 4 - 5 - 27918 - - - 5 - 7 - 32207 - - - 7 - 9 - 24087 - - - 9 - 12 - 28181 - - - 12 - 17 - 31495 - - - 17 - 26 - 29131 - - - 26 - 43 - 28891 - - - 43 - 89 - 28349 - - - 89 - 2349 - 25012 - - - - - - - beginLine - endLine - - - 12 - - - 1 - 2 - 58511 - - - 2 - 3 - 97596 - - - 3 - 4 - 60735 - - - 4 - 5 - 32338 - - - 5 - 6 - 21886 - - - 6 - 8 - 33205 - - - 8 - 11 - 30317 - - - 11 - 16 - 28219 - - - 16 - 1412 - 10266 - - - - - - - beginLine - endColumn - - - 12 - - - 1 - 2 - 6653 - - - 2 - 3 - 38525 - - - 3 - 4 - 21545 - - - 4 - 5 - 20663 - - - 5 - 6 - 27168 - - - 6 - 8 - 31892 - - - 8 - 11 - 29788 - - - 11 - 15 - 28344 - - - 15 - 22 - 31310 - - - 22 - 33 - 28339 - - - 33 - 53 - 28033 - - - 53 - 80 - 28698 - - - 80 - 146 - 28269 - - - 146 - 4143 - 23844 - - - - - - - beginColumn - id - - - 12 - - - 1 - 2 - 3928 - - - 2 - 3 - 857 - - - 3 - 4 - 1985 - - - 4 - 31 - 900 - - - 31 - 72 - 847 - - - 72 - 223 - 842 - - - 223 - 1906 - 842 - - - 1936 - 129644 - 842 - - - 130043 - 9382473 - 152 - - - - - - - beginColumn - file - - - 12 - - - 1 - 2 - 6495 - - - 2 - 17 - 935 - - - 17 - 45 - 847 - - - 45 - 113 - 842 - - - 113 - 403 - 842 - - - 404 - 6301 - 842 - - - 6367 - 33866 - 393 - - - - - - - beginColumn - beginLine - - - 12 - - - 1 - 2 - 6438 - - - 2 - 4 - 900 - - - 4 - 9 - 905 - - - 9 - 28 - 842 - - - 28 - 189 - 842 - - - 190 - 4498 - 842 - - - 4502 - 139673 - 428 - - - - - - - beginColumn - endLine - - - 12 - - - 1 - 2 - 6438 - - - 2 - 4 - 900 - - - 4 - 9 - 905 - - - 9 - 29 - 847 - - - 29 - 198 - 844 - - - 200 - 4659 - 842 - - - 4677 - 139725 - 421 - - - - - - - beginColumn - endColumn - - - 12 - - - 1 - 2 - 4387 - - - 2 - 3 - 1118 - - - 3 - 4 - 2203 - - - 4 - 9 - 962 - - - 9 - 25 - 859 - - - 25 - 97 - 842 - - - 97 - 1240 - 824 - - - - - - - endLine - id - - - 12 - - - 1 - 2 - 26328 - - - 2 - 4 - 28657 - - - 4 - 6 - 29379 - - - 6 - 7 - 14573 - - - 7 - 8 - 21560 - - - 8 - 10 - 32501 - - - 10 - 14 - 31969 - - - 14 - 20 - 29585 - - - 20 - 28 - 29495 - - - 28 - 45 - 29417 - - - 45 - 83 - 29720 - - - 83 - 147 - 29114 - - - 147 - 987 - 29099 - - - 987 - 60323 - 26343 - - - - - - - endLine - file - - - 12 - - - 1 - 2 - 44630 - - - 2 - 3 - 2587 - - - 3 - 4 - 39390 - - - 4 - 5 - 56857 - - - 5 - 7 - 31373 - - - 7 - 8 - 17253 - - - 8 - 9 - 23844 - - - 9 - 13 - 31914 - - - 13 - 26 - 29833 - - - 26 - 45 - 29708 - - - 45 - 78 - 29101 - - - 78 - 500 - 29121 - - - 500 - 32902 - 22132 - - - - - - - endLine - beginLine - - - 12 - - - 1 - 2 - 86407 - - - 2 - 3 - 84928 - - - 3 - 4 - 60986 - - - 4 - 5 - 31814 - - - 5 - 6 - 21342 - - - 6 - 8 - 33285 - - - 8 - 11 - 30377 - - - 11 - 17 - 30786 - - - 17 - 72 - 7819 - - - - - - - endLine - beginColumn - - - 12 - - - 1 - 2 - 31277 - - - 2 - 3 - 44216 - - - 3 - 4 - 46029 - - - 4 - 5 - 28271 - - - 5 - 7 - 35898 - - - 7 - 9 - 25599 - - - 9 - 12 - 30415 - - - 12 - 17 - 33566 - - - 17 - 26 - 29861 - - - 26 - 44 - 30192 - - - 44 - 93 - 29084 - - - 93 - 2350 - 23335 - - - - - - - endLine - endColumn - - - 12 - - - 1 - 2 - 33539 - - - 2 - 3 - 26050 - - - 3 - 4 - 10908 - - - 4 - 5 - 37242 - - - 5 - 6 - 21219 - - - 6 - 8 - 34328 - - - 8 - 11 - 28309 - - - 11 - 16 - 33376 - - - 16 - 24 - 31979 - - - 24 - 38 - 30365 - - - 38 - 62 - 29806 - - - 62 - 102 - 29252 - - - 102 - 183 - 29156 - - - 183 - 4143 - 12214 - - - - - - - endColumn - id - - - 12 - - - 1 - 2 - 10476 - - - 2 - 17 - 1215 - - - 17 - 70 - 1190 - - - 70 - 387 - 1188 - - - 389 - 21752 - 1188 - - - 21853 - 3512891 - 579 - - - - - - - endColumn - file - - - 12 - - - 1 - 2 - 10662 - - - 2 - 18 - 1233 - - - 18 - 72 - 1190 - - - 73 - 337 - 1190 - - - 337 - 11711 - 1190 - - - 11721 - 28029 - 371 - - - - - - - endColumn - beginLine - - - 12 - - - 1 - 2 - 10644 - - - 2 - 6 - 1366 - - - 6 - 20 - 1223 - - - 20 - 227 - 1188 - - - 227 - 25452 - 1188 - - - 25707 - 121783 - 228 - - - - - - - endColumn - beginColumn - - - 12 - - - 1 - 2 - 11171 - - - 2 - 6 - 1413 - - - 6 - 19 - 1238 - - - 19 - 123 - 1193 - - - 123 - 429 - 822 - - - - - - - endColumn - endLine - - - 12 - - - 1 - 2 - 10634 - - - 2 - 6 - 1371 - - - 6 - 19 - 1188 - - - 19 - 203 - 1190 - - - 205 - 22718 - 1188 - - - 22852 - 121781 - 265 - - - - - - - - - locations_mapped - 997878 - - - id - 997878 - - - mapped_to - 757768 - - - - - id - mapped_to - - - 12 - - - 1 - 2 - 997878 - - - - - - - mapped_to - id - - - 12 - - - 1 - 2 - 683587 - - - 2 - 4 - 58533 - - - 4 - 141 - 15646 - - - - - - - - - numlines - 67406913 - - - element_id - 67406743 - - - num_lines - 8225 - - - num_code - 8127 - - - num_comment - 641 - - - - - element_id - num_lines - - - 12 - - - 1 - 2 - 67406610 - - - 2 - 11 - 132 - - - - - - - element_id - num_code - - - 12 - - - 1 - 2 - 67406612 - - - 2 - 11 - 130 - - - - - - - element_id - num_comment - - - 12 - - - 1 - 2 - 67406730 - - - 2 - 3 - 12 - - - - - - - num_lines - element_id - - - 12 - - - 1 - 2 - 2705 - - - 2 - 3 - 1045 - - - 3 - 4 - 406 - - - 4 - 6 - 561 - - - 6 - 9 - 671 - - - 9 - 12 - 711 - - - 12 - 18 - 641 - - - 18 - 41 - 626 - - - 41 - 304 - 619 - - - 310 - 17523363 - 235 - - - - - - - num_lines - num_code - - - 12 - - - 1 - 2 - 6127 - - - 2 - 3 - 704 - - - 3 - 7 - 679 - - - 7 - 35 - 621 - - - 35 - 43 - 92 - - - - - - - num_lines - num_comment - - - 12 - - - 1 - 2 - 6119 - - - 2 - 3 - 722 - - - 3 - 7 - 701 - - - 7 - 30 - 636 - - - 30 - 107 - 45 - - - - - - - num_code - element_id - - - 12 - - - 1 - 2 - 2637 - - - 2 - 3 - 1035 - - - 3 - 4 - 426 - - - 4 - 6 - 576 - - - 6 - 9 - 636 - - - 9 - 12 - 709 - - - 12 - 18 - 654 - - - 18 - 41 - 621 - - - 41 - 324 - 611 - - - 324 - 17558507 - 218 - - - - - - - num_code - num_lines - - - 12 - - - 1 - 2 - 6317 - - - 2 - 3 - 596 - - - 3 - 8 - 629 - - - 8 - 111 - 584 - - - - - - - num_code - num_comment - - - 12 - - - 1 - 2 - 6307 - - - 2 - 3 - 624 - - - 3 - 7 - 611 - - - 7 - 107 - 584 - - - - - - - num_comment - element_id - - - 12 - - - 1 - 2 - 228 - - - 2 - 3 - 77 - - - 3 - 4 - 45 - - - 4 - 8 - 50 - - - 8 - 16 - 50 - - - 16 - 27 - 50 - - - 27 - 64 - 50 - - - 64 - 257 - 50 - - - 305 - 26794617 - 40 - - - - - - - num_comment - num_lines - - - 12 - - - 1 - 2 - 228 - - - 2 - 3 - 80 - - - 3 - 4 - 45 - - - 4 - 8 - 55 - - - 8 - 15 - 50 - - - 15 - 24 - 50 - - - 25 - 54 - 50 - - - 55 - 123 - 50 - - - 136 - 3069 - 32 - - - - - - - num_comment - num_code - - - 12 - - - 1 - 2 - 228 - - - 2 - 3 - 80 - - - 3 - 4 - 45 - - - 4 - 8 - 55 - - - 8 - 15 - 50 - - - 15 - 24 - 50 - - - 24 - 50 - 50 - - - 51 - 114 - 50 - - - 129 - 3063 - 32 - - - - - - - - - assemblies - 14527 - - - id - 14527 - - - file - 14527 - - - fullname - 14107 - - - name - 13867 - - - version - 1680 - - - - - id - file - - - 12 - - - 1 - 2 - 14527 - - - - - - - id - fullname - - - 12 - - - 1 - 2 - 14527 - - - - - - - id - name - - - 12 - - - 1 - 2 - 14527 - - - - - - - id - version - - - 12 - - - 1 - 2 - 14527 - - - - - - - file - id - - - 12 - - - 1 - 2 - 14527 - - - - - - - file - fullname - - - 12 - - - 1 - 2 - 14527 - - - - - - - file - name - - - 12 - - - 1 - 2 - 14527 - - - - - - - file - version - - - 12 - - - 1 - 2 - 14527 - - - - - - - fullname - id - - - 12 - - - 1 - 2 - 13687 - - - 2 - 3 - 420 - - - - - - - fullname - file - - - 12 - - - 1 - 2 - 13687 - - - 2 - 3 - 420 - - - - - - - fullname - name - - - 12 - - - 1 - 2 - 14107 - - - - - - - fullname - version - - - 12 - - - 1 - 2 - 14107 - - - - - - - name - id - - - 12 - - - 1 - 2 - 13267 - - - 2 - 4 - 600 - - - - - - - name - file - - - 12 - - - 1 - 2 - 13267 - - - 2 - 4 - 600 - - - - - - - name - fullname - - - 12 - - - 1 - 2 - 13687 - - - 2 - 4 - 180 - - - - - - - name - version - - - 12 - - - 1 - 2 - 13687 - - - 2 - 4 - 180 - - - - - - - version - id - - - 12 - - - 1 - 2 - 960 - - - 2 - 3 - 120 - - - 3 - 4 - 240 - - - 7 - 8 - 120 - - - 9 - 23 - 120 - - - 32 - 134 - 120 - - - - - - - version - file - - - 12 - - - 1 - 2 - 960 - - - 2 - 3 - 120 - - - 3 - 4 - 240 - - - 7 - 8 - 120 - - - 9 - 23 - 120 - - - 32 - 134 - 120 - - - - - - - version - fullname - - - 12 - - - 1 - 2 - 960 - - - 2 - 3 - 120 - - - 3 - 4 - 240 - - - 7 - 8 - 120 - - - 9 - 23 - 120 - - - 25 - 134 - 120 - - - - - - - version - name - - - 12 - - - 1 - 2 - 960 - - - 2 - 3 - 120 - - - 3 - 4 - 240 - - - 7 - 8 - 120 - - - 9 - 23 - 120 - - - 25 - 134 - 120 - - - - - - - - - files - 92261 - - - id - 92261 - - - name - 92261 - - - - - id - name - - - 12 - - - 1 - 2 - 92261 - - - - - - - name - id - - - 12 - - - 1 - 2 - 92261 - - - - - - - - - folders - 34263 - - - id - 34263 - - - name - 34263 - - - - - id - name - - - 12 - - - 1 - 2 - 34263 - - - - - - - name - id - - - 12 - - - 1 - 2 - 34263 - - - - - - - - - containerparent - 126520 - - - parent - 34263 - - - child - 126520 - - - - - parent - child - - - 12 - - - 1 - 2 - 20883 - - - 2 - 3 - 4735 - - - 3 - 4 - 1724 - - - 4 - 7 - 3108 - - - 7 - 17 - 2599 - - - 17 - 546 - 1210 - - - - - - - child - parent - - - 12 - - - 1 - 2 - 126520 - - - - - - - - - file_extraction_mode - 57602 - - - file - 57602 - - - mode - 6 - - - - - file - mode - - - 12 - - - 1 - 2 - 57602 - - - - - - - mode - file - - - 12 - - - 8541 - 8542 - 6 - - - - - - - - - namespaces - 206514 - - - id - 206514 - - - name - 67590 - - - - - id - name - - - 12 - - - 1 - 2 - 206514 - - - - - - - name - id - - - 12 - - - 1 - 2 - 40636 - - - 2 - 3 - 9485 - - - 3 - 4 - 6748 - - - 4 - 7 - 5267 - - - 7 - 47 - 5082 - - - 47 - 160 - 370 - - - - - - - - - namespace_declarations - 37444 - - - id - 37444 - - - namespace_id - 6649 - - - - - id - namespace_id - - - 12 - - - 1 - 2 - 37444 - - - - - - - namespace_id - id - - - 12 - - - 1 - 2 - 2340 - - - 2 - 3 - 1362 - - - 3 - 4 - 674 - - - 4 - 5 - 465 - - - 5 - 6 - 377 - - - 6 - 9 - 600 - - - 9 - 16 - 526 - - - 16 - 1420 - 303 - - - - - - - - - namespace_declaration_location - 37444 - - - id - 37444 - - - loc - 37444 - - - - - id - loc - - - 12 - - - 1 - 2 - 37444 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 37444 - - - - - - - - - parent_namespace - 8107683 - - - child_id - 8107683 - - - namespace_id - 204930 - - - - - child_id - namespace_id - - - 12 - - - 1 - 2 - 8107683 - - - - - - - namespace_id - child_id - - - 12 - - - 1 - 2 - 43208 - - - 2 - 3 - 28476 - - - 3 - 4 - 19320 - - - 4 - 5 - 13950 - - - 5 - 6 - 11892 - - - 6 - 8 - 17221 - - - 8 - 11 - 16501 - - - 11 - 16 - 15596 - - - 16 - 27 - 15925 - - - 27 - 76 - 15369 - - - 76 - 102770 - 7468 - - - - - - - - - parent_namespace_declaration - 185724 - - - child_id - 184422 - - - namespace_id - 37444 - - - - - child_id - namespace_id - - - 12 - - - 1 - 2 - 184119 - - - 2 - 76 - 303 - - - - - - - namespace_id - child_id - - - 12 - - - 1 - 2 - 25965 - - - 2 - 9 - 2866 - - - 9 - 14 - 2879 - - - 14 - 18 - 3324 - - - 18 - 39 - 2407 - - - - - - - - - using_global - 9371 - - - id - 9371 - - - - - - using_namespace_directives - 286854 - - - id - 286854 - - - namespace_id - 7263 - - - - - id - namespace_id - - - 12 - - - 1 - 2 - 286854 - - - - - - - namespace_id - id - - - 12 - - - 1 - 2 - 2535 - - - 2 - 3 - 910 - - - 3 - 4 - 526 - - - 4 - 6 - 627 - - - 6 - 9 - 593 - - - 9 - 19 - 606 - - - 19 - 39 - 566 - - - 40 - 148 - 546 - - - 149 - 3400 - 350 - - - - - - - - - using_static_directives - 1202 - - - id - 1202 - - - type_id - 134 - - - - - id - type_id - - - 12 - - - 1 - 2 - 1202 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 11 - - - 2 - 3 - 24 - - - 3 - 4 - 24 - - - 4 - 5 - 18 - - - 5 - 7 - 10 - - - 7 - 9 - 11 - - - 9 - 12 - 10 - - - 12 - 16 - 11 - - - 16 - 49 - 11 - - - 56 - 156 - 4 - - - - - - - - - using_directive_location - 286956 - - - id - 286956 - - - loc - 286888 - - - - - id - loc - - - 12 - - - 1 - 2 - 286956 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 286821 - - - 2 - 3 - 67 - - - - - - - - - directive_ifs - 20769 - - - id - 20769 - - - branchTaken - 3 - - - conditionValue - 3 - - - - - id - branchTaken - - - 12 - - - 1 - 2 - 20769 - - - - - - - id - conditionValue - - - 12 - - - 1 - 2 - 20769 - - - - - - - branchTaken - id - - - 12 - - - 5274 - 5275 - 1 - - - 6234 - 6235 - 1 - - - - - - - branchTaken - conditionValue - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - - - - - conditionValue - id - - - 12 - - - 5423 - 5424 - 1 - - - 6085 - 6086 - 1 - - - - - - - conditionValue - branchTaken - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - - - - - - - directive_elifs - 293 - - - id - 293 - - - branchTaken - 5 - - - conditionValue - 5 - - - parent - 177 - - - index - 17 - - - - - id - branchTaken - - - 12 - - - 1 - 2 - 293 - - - - - - - id - conditionValue - - - 12 - - - 1 - 2 - 293 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 293 - - - - - - - id - index - - - 12 - - - 1 - 2 - 293 - - - - - - - branchTaken - id - - - 12 - - - 21 - 22 - 2 - - - 96 - 97 - 2 - - - - - - - branchTaken - conditionValue - - - 12 - - - 1 - 2 - 5 - - - - - - - branchTaken - parent - - - 12 - - - 18 - 19 - 2 - - - 57 - 58 - 2 - - - - - - - branchTaken - index - - - 12 - - - 3 - 4 - 2 - - - 6 - 7 - 2 - - - - - - - conditionValue - id - - - 12 - - - 21 - 22 - 2 - - - 96 - 97 - 2 - - - - - - - conditionValue - branchTaken - - - 12 - - - 1 - 2 - 5 - - - - - - - conditionValue - parent - - - 12 - - - 18 - 19 - 2 - - - 57 - 58 - 2 - - - - - - - conditionValue - index - - - 12 - - - 3 - 4 - 2 - - - 6 - 7 - 2 - - - - - - - parent - id - - - 12 - - - 1 - 2 - 75 - - - 2 - 3 - 92 - - - 4 - 8 - 10 - - - - - - - parent - branchTaken - - - 12 - - - 1 - 2 - 167 - - - 2 - 3 - 10 - - - - - - - parent - conditionValue - - - 12 - - - 1 - 2 - 167 - - - 2 - 3 - 10 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 75 - - - 2 - 3 - 100 - - - 7 - 8 - 2 - - - - - - - index - id - - - 12 - - - 1 - 2 - 12 - - - 41 - 42 - 2 - - - 71 - 72 - 2 - - - - - - - index - branchTaken - - - 12 - - - 1 - 2 - 12 - - - 2 - 3 - 5 - - - - - - - index - conditionValue - - - 12 - - - 1 - 2 - 12 - - - 2 - 3 - 5 - - - - - - - index - parent - - - 12 - - - 1 - 2 - 12 - - - 41 - 42 - 2 - - - 71 - 72 - 2 - - - - - - - - - directive_elses - 6744 - - - id - 6744 - - - branchTaken - 3 - - - parent - 6746 - - - index - 10 - - - - - id - branchTaken - - - 12 - - - 1 - 2 - 6744 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 6744 - - - - - - - id - index - - - 12 - - - 1 - 2 - 6744 - - - - - - - branchTaken - id - - - 12 - - - 1686 - 1687 - 1 - - - 2051 - 2052 - 1 - - - - - - - branchTaken - parent - - - 12 - - - 1691 - 1692 - 1 - - - 2051 - 2052 - 1 - - - - - - - branchTaken - index - - - 12 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - - - - - parent - id - - - 12 - - - 1 - 2 - 6739 - - - 2 - 3 - 7 - - - - - - - parent - branchTaken - - - 12 - - - 1 - 2 - 6739 - - - 2 - 3 - 7 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 6746 - - - - - - - index - id - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 1 - - - 3 - 4 - 1 - - - 37 - 38 - 1 - - - 3693 - 3694 - 1 - - - - - - - index - branchTaken - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 5 - - - - - - - index - parent - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 1 - - - 3 - 4 - 1 - - - 38 - 39 - 1 - - - 3693 - 3694 - 1 - - - - - - - - - directive_endifs - 20338 - - - id - 20338 - - - start - 20769 - - - - - id - start - - - 12 - - - 1 - 2 - 20338 - - - - - - - start - id - - - 12 - - - 1 - 2 - 20769 - - - - - - - - - directive_define_symbols - 40315 - - - id - 40315 - - - name - 887 - - - - - id - name - - - 12 - - - 1 - 2 - 40315 - - - - - - - name - id - - - 12 - - - 1 - 2 - 102 - - - 2 - 3 - 151 - - - 3 - 4 - 45 - - - 4 - 5 - 64 - - - 5 - 7 - 77 - - - 7 - 10 - 66 - - - 10 - 13 - 68 - - - 13 - 21 - 66 - - - 21 - 40 - 66 - - - 40 - 77 - 66 - - - 78 - 174 - 66 - - - 178 - 2403 - 43 - - - - - - - - - directive_regions - 38812 - - - id - 38812 - - - name - 18812 - - - - - id - name - - - 12 - - - 1 - 2 - 38812 - - - - - - - name - id - - - 12 - - - 1 - 2 - 15529 - - - 2 - 3 - 1528 - - - 3 - 14 - 1414 - - - 14 - 111 - 339 - - - - - - - - - directive_endregions - 38812 - - - id - 38812 - - - start - 38812 - - - - - id - start - - - 12 - - - 1 - 2 - 38812 - - - - - - - start - id - - - 12 - - - 1 - 2 - 38812 - - - - - - - - - directive_lines - 539550 - - - id - 539550 - - - kind - 26 - - - - - id - kind - - - 12 - - - 1 - 2 - 539550 - - - - - - - kind - id - - - 12 - - - 8245 - 8246 - 6 - - - 17726 - 17727 - 6 - - - 25971 - 25972 - 6 - - - 28059 - 28060 - 6 - - - - - - - - - directive_line_value - 119549 - - - id - 119549 - - - line - 1706 - - - - - id - line - - - 12 - - - 1 - 2 - 119549 - - - - - - - line - id - - - 12 - - - 1 - 2 - 343 - - - 2 - 3 - 269 - - - 3 - 4 - 121 - - - 4 - 6 - 155 - - - 6 - 9 - 101 - - - 9 - 13 - 141 - - - 13 - 22 - 134 - - - 22 - 38 - 128 - - - 38 - 218 - 134 - - - 219 - 760 - 128 - - - 761 - 1105 - 47 - - - - - - - - - directive_line_file - 175155 - - - id - 175155 - - - file - 9246 - - - - - id - file - - - 12 - - - 1 - 2 - 175155 - - - - - - - file - id - - - 12 - - - 1 - 2 - 1119 - - - 2 - 3 - 1571 - - - 3 - 4 - 1031 - - - 4 - 6 - 809 - - - 6 - 8 - 843 - - - 8 - 11 - 714 - - - 11 - 14 - 775 - - - 14 - 21 - 701 - - - 21 - 36 - 755 - - - 36 - 78 - 694 - - - 78 - 3808 - 229 - - - - - - - - - directive_line_offset - 55606 - - - id - 55606 - - - offset - 60 - - - - - id - offset - - - 12 - - - 1 - 2 - 55606 - - - - - - - offset - id - - - 12 - - - 2 - 3 - 6 - - - 21 - 22 - 6 - - - 36 - 37 - 6 - - - 201 - 202 - 6 - - - 250 - 251 - 6 - - - 456 - 457 - 6 - - - 521 - 522 - 6 - - - 648 - 649 - 6 - - - 6110 - 6111 - 6 - - - - - - - - - directive_line_span - 55606 - - - id - 55606 - - - startLine - 2030 - - - startColumn - 2097 - - - endLine - 2030 - - - endColumn - 2306 - - - - - id - startLine - - - 12 - - - 1 - 2 - 55606 - - - - - - - id - startColumn - - - 12 - - - 1 - 2 - 55606 - - - - - - - id - endLine - - - 12 - - - 1 - 2 - 55606 - - - - - - - id - endColumn - - - 12 - - - 1 - 2 - 55606 - - - - - - - startLine - id - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 222 - - - 3 - 5 - 161 - - - 5 - 8 - 175 - - - 8 - 10 - 128 - - - 10 - 15 - 168 - - - 16 - 29 - 161 - - - 30 - 45 - 161 - - - 47 - 93 - 155 - - - 93 - 252 - 155 - - - 262 - 374 - 20 - - - - - - - startLine - startColumn - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 229 - - - 3 - 5 - 155 - - - 5 - 7 - 134 - - - 7 - 9 - 128 - - - 9 - 13 - 168 - - - 13 - 23 - 175 - - - 24 - 31 - 161 - - - 32 - 52 - 168 - - - 52 - 81 - 155 - - - 81 - 90 - 33 - - - - - - - startLine - endLine - - - 12 - - - 1 - 2 - 1996 - - - 2 - 3 - 33 - - - - - - - startLine - endColumn - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 229 - - - 3 - 5 - 161 - - - 5 - 7 - 114 - - - 7 - 9 - 155 - - - 9 - 14 - 161 - - - 14 - 24 - 161 - - - 24 - 34 - 161 - - - 34 - 58 - 155 - - - 58 - 94 - 161 - - - 94 - 124 - 47 - - - - - - - startColumn - id - - - 12 - - - 1 - 2 - 411 - - - 2 - 3 - 215 - - - 3 - 4 - 121 - - - 4 - 6 - 155 - - - 6 - 8 - 155 - - - 8 - 11 - 134 - - - 11 - 16 - 188 - - - 16 - 27 - 161 - - - 27 - 50 - 168 - - - 50 - 74 - 161 - - - 74 - 142 - 161 - - - 145 - 495 - 60 - - - - - - - startColumn - startLine - - - 12 - - - 1 - 2 - 418 - - - 2 - 3 - 229 - - - 3 - 4 - 128 - - - 4 - 5 - 74 - - - 5 - 6 - 121 - - - 6 - 9 - 182 - - - 9 - 12 - 188 - - - 12 - 19 - 175 - - - 19 - 29 - 168 - - - 29 - 44 - 168 - - - 44 - 58 - 161 - - - 58 - 103 - 80 - - - - - - - startColumn - endLine - - - 12 - - - 1 - 2 - 418 - - - 2 - 3 - 229 - - - 3 - 4 - 128 - - - 4 - 5 - 74 - - - 5 - 6 - 121 - - - 6 - 9 - 182 - - - 9 - 12 - 188 - - - 12 - 19 - 175 - - - 19 - 29 - 168 - - - 29 - 44 - 168 - - - 44 - 58 - 161 - - - 58 - 103 - 80 - - - - - - - startColumn - endColumn - - - 12 - - - 1 - 2 - 458 - - - 2 - 3 - 195 - - - 3 - 4 - 161 - - - 4 - 5 - 148 - - - 5 - 7 - 168 - - - 7 - 9 - 128 - - - 9 - 12 - 182 - - - 12 - 17 - 188 - - - 17 - 27 - 175 - - - 27 - 34 - 161 - - - 35 - 127 - 128 - - - - - - - endLine - id - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 222 - - - 3 - 5 - 161 - - - 5 - 8 - 175 - - - 8 - 10 - 128 - - - 10 - 15 - 168 - - - 16 - 29 - 161 - - - 30 - 45 - 161 - - - 47 - 93 - 155 - - - 93 - 251 - 155 - - - 261 - 374 - 20 - - - - - - - endLine - startLine - - - 12 - - - 1 - 2 - 2003 - - - 2 - 4 - 26 - - - - - - - endLine - startColumn - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 229 - - - 3 - 5 - 155 - - - 5 - 7 - 134 - - - 7 - 9 - 128 - - - 9 - 13 - 168 - - - 13 - 23 - 175 - - - 24 - 31 - 161 - - - 32 - 52 - 161 - - - 52 - 80 - 155 - - - 80 - 90 - 40 - - - - - - - endLine - endColumn - - - 12 - - - 1 - 2 - 519 - - - 2 - 3 - 229 - - - 3 - 5 - 161 - - - 5 - 7 - 114 - - - 7 - 9 - 155 - - - 9 - 14 - 161 - - - 14 - 24 - 161 - - - 24 - 34 - 161 - - - 34 - 59 - 161 - - - 59 - 94 - 155 - - - 94 - 124 - 47 - - - - - - - endColumn - id - - - 12 - - - 1 - 2 - 438 - - - 2 - 3 - 195 - - - 3 - 4 - 134 - - - 4 - 6 - 161 - - - 6 - 8 - 182 - - - 8 - 13 - 195 - - - 13 - 20 - 188 - - - 20 - 36 - 188 - - - 36 - 51 - 175 - - - 51 - 68 - 175 - - - 68 - 93 - 182 - - - 95 - 183 - 87 - - - - - - - endColumn - startLine - - - 12 - - - 1 - 2 - 465 - - - 2 - 3 - 175 - - - 3 - 4 - 155 - - - 4 - 6 - 209 - - - 6 - 8 - 182 - - - 8 - 12 - 182 - - - 12 - 20 - 209 - - - 20 - 28 - 188 - - - 28 - 39 - 175 - - - 39 - 48 - 175 - - - 48 - 64 - 175 - - - 67 - 69 - 13 - - - - - - - endColumn - startColumn - - - 12 - - - 1 - 2 - 492 - - - 2 - 3 - 222 - - - 3 - 4 - 148 - - - 4 - 5 - 141 - - - 5 - 7 - 202 - - - 7 - 11 - 195 - - - 11 - 15 - 202 - - - 15 - 20 - 195 - - - 20 - 26 - 188 - - - 26 - 29 - 175 - - - 29 - 37 - 141 - - - - - - - endColumn - endLine - - - 12 - - - 1 - 2 - 465 - - - 2 - 3 - 175 - - - 3 - 4 - 155 - - - 4 - 6 - 209 - - - 6 - 8 - 182 - - - 8 - 12 - 182 - - - 12 - 20 - 209 - - - 20 - 28 - 188 - - - 28 - 39 - 175 - - - 39 - 48 - 175 - - - 48 - 64 - 175 - - - 67 - 69 - 13 - - - - - - - - - directive_nullables - 467925 - - - id - 467925 - - - setting - 20 - - - target - 6 - - - - - id - setting - - - 12 - - - 1 - 2 - 467925 - - - - - - - id - target - - - 12 - - - 1 - 2 - 467925 - - - - - - - setting - id - - - 12 - - - 9 - 10 - 6 - - - 34686 - 34687 - 13 - - - - - - - setting - target - - - 12 - - - 1 - 2 - 20 - - - - - - - target - id - - - 12 - - - 69381 - 69382 - 6 - - - - - - - target - setting - - - 12 - - - 3 - 4 - 6 - - - - - - - - - directive_warnings - 23 - - - id - 23 - - - message - 14 - - - - - id - message - - - 12 - - - 1 - 2 - 23 - - - - - - - message - id - - - 12 - - - 1 - 2 - 5 - - - 2 - 3 - 9 - - - - - - - - - directive_errors - 45 - - - id - 45 - - - message - 15 - - - - - id - message - - - 12 - - - 1 - 2 - 45 - - - - - - - message - id - - - 12 - - - 1 - 2 - 7 - - - 2 - 3 - 2 - - - 5 - 6 - 2 - - - 8 - 9 - 2 - - - - - - - - - directive_undefines - 68 - - - id - 68 - - - name - 43 - - - - - id - name - - - 12 - - - 1 - 2 - 68 - - - - - - - name - id - - - 12 - - - 1 - 2 - 30 - - - 2 - 3 - 7 - - - 3 - 4 - 3 - - - 7 - 8 - 1 - - - - - - - - - directive_defines - 83 - - - id - 83 - - - name - 57 - - - - - id - name - - - 12 - - - 1 - 2 - 83 - - - - - - - name - id - - - 12 - - - 1 - 2 - 41 - - - 2 - 3 - 12 - - - 4 - 6 - 3 - - - - - - - - - pragma_checksums - 9570 - - - id - 9570 - - - file - 9570 - - - guid - 6 - - - bytes - 8949 - - - - - id - file - - - 12 - - - 1 - 2 - 9570 - - - - - - - id - guid - - - 12 - - - 1 - 2 - 9570 - - - - - - - id - bytes - - - 12 - - - 1 - 2 - 9570 - - - - - - - file - id - - - 12 - - - 1 - 2 - 9570 - - - - - - - file - guid - - - 12 - - - 1 - 2 - 9570 - - - - - - - file - bytes - - - 12 - - - 1 - 2 - 9570 - - - - - - - guid - id - - - 12 - - - 1419 - 1420 - 6 - - - - - - - guid - file - - - 12 - - - 1419 - 1420 - 6 - - - - - - - guid - bytes - - - 12 - - - 1327 - 1328 - 6 - - - - - - - bytes - id - - - 12 - - - 1 - 2 - 8754 - - - 2 - 21 - 195 - - - - - - - bytes - file - - - 12 - - - 1 - 2 - 8754 - - - 2 - 21 - 195 - - - - - - - bytes - guid - - - 12 - - - 1 - 2 - 8949 - - - - - - - - - pragma_warnings - 57623 - - - id - 57623 - - - kind - 13 - - - - - id - kind - - - 12 - - - 1 - 2 - 57623 - - - - - - - kind - id - - - 12 - - - 4272 - 4273 - 13 - - - - - - - - - pragma_warning_error_codes - 57636 - - - id - 57623 - - - errorCode - 148 - - - index - 13 - - - - - id - errorCode - - - 12 - - - 1 - 2 - 57609 - - - 2 - 3 - 13 - - - - - - - id - index - - - 12 - - - 1 - 2 - 57609 - - - 2 - 3 - 13 - - - - - - - errorCode - id - - - 12 - - - 2 - 3 - 47 - - - 4 - 5 - 33 - - - 6 - 7 - 6 - - - 10 - 11 - 13 - - - 14 - 37 - 13 - - - 84 - 85 - 6 - - - 1338 - 1339 - 13 - - - 2838 - 2839 - 13 - - - - - - - errorCode - index - - - 12 - - - 1 - 2 - 148 - - - - - - - index - id - - - 12 - - - 2 - 3 - 6 - - - 8544 - 8545 - 6 - - - - - - - index - errorCode - - - 12 - - - 1 - 2 - 6 - - - 21 - 22 - 6 - - - - - - - - - preprocessor_directive_location - 1075323 - - - id - 1075323 - - - loc - 1075323 - - - - - id - loc - - - 12 - - - 1 - 2 - 1075323 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 1075323 - - - - - - - - - preprocessor_directive_compilation - 1075323 - - - id - 1075323 - - - compilation - 660 - - - - - id - compilation - - - 12 - - - 1 - 2 - 1075323 - - - - - - - compilation - id - - - 12 - - - 2 - 4 - 47 - - - 4 - 11 - 53 - - - 12 - 72 - 53 - - - 79 - 187 - 53 - - - 199 - 335 - 60 - - - 365 - 465 - 53 - - - 476 - 714 - 53 - - - 761 - 1089 - 53 - - - 1256 - 1553 - 53 - - - 1559 - 2257 - 53 - - - 2312 - 3069 - 53 - - - 3691 - 12998 - 53 - - - 17866 - 27931 - 13 - - - - - - - - - preprocessor_directive_active - 1075323 - - - id - 1075323 - - - active - 13 - - - - - id - active - - - 12 - - - 1 - 2 - 1075323 - - - - - - - active - id - - - 12 - - - 7 - 8 - 6 - - - 159435 - 159436 - 6 - - - - - - - - - types - 9818978 - - - id - 9818978 - - - kind - 617 - - - name - 2815698 - - - - - id - kind - - - 12 - - - 1 - 2 - 9818978 - - - - - - - id - name - - - 12 - - - 1 - 2 - 9818978 - - - - - - - kind - id - - - 12 - - - 1 - 2 - 390 - - - 101 - 250 - 41 - - - 1197 - 2295 - 41 - - - 4645 - 7960 - 41 - - - 34817 - 39988 - 41 - - - 40551 - 135458 - 41 - - - 209946 - 209947 - 20 - - - - - - - kind - name - - - 12 - - - 1 - 2 - 411 - - - 101 - 242 - 41 - - - 1307 - 1615 - 41 - - - 1892 - 2930 - 41 - - - 6876 - 10426 - 41 - - - 13272 - 99339 - 41 - - - - - - - name - id - - - 12 - - - 1 - 2 - 2509722 - - - 2 - 4 - 213901 - - - 4 - 26166 - 92074 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 2793662 - - - 2 - 7 - 22036 - - - - - - - - - typerefs - 4008699 - - - id - 4008699 - - - name - 2703480 - - - - - id - name - - - 12 - - - 1 - 2 - 4008699 - - - - - - - name - id - - - 12 - - - 1 - 2 - 2495813 - - - 2 - 17 - 202811 - - - 17 - 14950 - 4855 - - - - - - - - - typeref_type - 3978165 - - - id - 3978165 - - - typeId - 3978165 - - - - - id - typeId - - - 12 - - - 1 - 2 - 3978165 - - - - - - - typeId - id - - - 12 - - - 1 - 2 - 3978165 - - - - - - - - - array_element_type - 95572 - - - array - 95572 - - - dimension - 61 - - - rank - 61 - - - element - 95263 - - - - - array - dimension - - - 12 - - - 1 - 2 - 95572 - - - - - - - array - rank - - - 12 - - - 1 - 2 - 95572 - - - - - - - array - element - - - 12 - - - 1 - 2 - 95572 - - - - - - - dimension - array - - - 12 - - - 2 - 3 - 20 - - - 66 - 67 - 20 - - - 4577 - 4578 - 20 - - - - - - - dimension - rank - - - 12 - - - 1 - 2 - 41 - - - 3 - 4 - 20 - - - - - - - dimension - element - - - 12 - - - 2 - 3 - 20 - - - 66 - 67 - 20 - - - 4562 - 4563 - 20 - - - - - - - rank - array - - - 12 - - - 4 - 5 - 20 - - - 19 - 20 - 20 - - - 4622 - 4623 - 20 - - - - - - - rank - dimension - - - 12 - - - 1 - 2 - 41 - - - 3 - 4 - 20 - - - - - - - rank - element - - - 12 - - - 4 - 5 - 20 - - - 19 - 20 - 20 - - - 4622 - 4623 - 20 - - - - - - - element - array - - - 12 - - - 1 - 2 - 94996 - - - 2 - 4 - 267 - - - - - - - element - dimension - - - 12 - - - 1 - 2 - 95263 - - - - - - - element - rank - - - 12 - - - 1 - 2 - 94996 - - - 2 - 4 - 267 - - - - - - - - - nullable_underlying_type - 24628 - - - nullable - 24628 - - - underlying - 24628 - - - - - nullable - underlying - - - 12 - - - 1 - 2 - 24628 - - - - - - - underlying - nullable - - - 12 - - - 1 - 2 - 24628 - - - - - - - - - pointer_referent_type - 11632 - - - pointer - 11632 - - - referent - 11632 - - - - - pointer - referent - - - 12 - - - 1 - 2 - 11632 - - - - - - - referent - pointer - - - 12 - - - 1 - 2 - 11632 - - - - - - - - - enum_underlying_type - 163759 - - - enum_id - 163759 - - - underlying_type_id - 164 - - - - - enum_id - underlying_type_id - - - 12 - - - 1 - 2 - 163759 - - - - - - - underlying_type_id - enum_id - - - 12 - - - 8 - 9 - 20 - - - 18 - 19 - 20 - - - 49 - 50 - 20 - - - 105 - 106 - 20 - - - 108 - 109 - 20 - - - 356 - 357 - 20 - - - 413 - 414 - 20 - - - 6902 - 6903 - 20 - - - - - - - - - delegate_return_type - 834351 - - - delegate_id - 834351 - - - return_type_id - 303795 - - - - - delegate_id - return_type_id - - - 12 - - - 1 - 2 - 834351 - - - - - - - return_type_id - delegate_id - - - 12 - - - 1 - 2 - 269763 - - - 2 - 4 - 24464 - - - 4 - 7800 - 9567 - - - - - - - - - function_pointer_return_type - 47919 - - - function_pointer_id - 47919 - - - return_type_id - 10013 - - - - - function_pointer_id - return_type_id - - - 12 - - - 1 - 2 - 47919 - - - - - - - return_type_id - function_pointer_id - - - 12 - - - 1 - 2 - 2933 - - - 2 - 3 - 3236 - - - 3 - 4 - 2326 - - - 4 - 7 - 809 - - - 7 - 569 - 708 - - - - - - - - - extend - 3329732 - - - sub - 3329136 - - - super - 487965 - - - - - sub - super - - - 12 - - - 1 - 2 - 3328539 - - - 2 - 3 - 596 - - - - - - - super - sub - - - 12 - - - 1 - 2 - 330584 - - - 2 - 3 - 75737 - - - 3 - 5 - 43784 - - - 5 - 97 - 36603 - - - 97 - 40552 - 1255 - - - - - - - - - anonymous_types - 6194 - - - id - 6194 - - - - - - implement - 11230469 - - - sub - 3882202 - - - super - 2387833 - - - - - sub - super - - - 12 - - - 1 - 2 - 1315836 - - - 2 - 3 - 1049097 - - - 3 - 4 - 724767 - - - 4 - 6 - 297643 - - - 6 - 9 - 320626 - - - 9 - 31 - 174232 - - - - - - - super - sub - - - 12 - - - 1 - 2 - 1138538 - - - 2 - 3 - 715570 - - - 3 - 5 - 204992 - - - 5 - 6 - 182009 - - - 6 - 109829 - 146722 - - - - - - - - - type_location - 5295009 - - - id - 5063104 - - - loc - 11460 - - - - - id - loc - - - 12 - - - 1 - 2 - 4974816 - - - 2 - 551 - 88288 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 2325 - - - 2 - 12 - 905 - - - 12 - 25 - 864 - - - 25 - 43 - 864 - - - 43 - 77 - 864 - - - 77 - 116 - 884 - - - 116 - 194 - 905 - - - 195 - 315 - 864 - - - 321 - 527 - 864 - - - 528 - 854 - 864 - - - 854 - 3409 - 864 - - - 3696 - 12084 - 390 - - - - - - - - - tuple_underlying_type - 47199 - - - tuple - 47199 - - - struct - 47199 - - - - - tuple - struct - - - 12 - - - 1 - 2 - 47199 - - - - - - - struct - tuple - - - 12 - - - 1 - 2 - 47199 - - - - - - - - - tuple_element - 115839 - - - tuple - 47179 - - - index - 432 - - - field - 115839 - - - - - tuple - index - - - 12 - - - 1 - 2 - 205 - - - 2 - 3 - 38866 - - - 3 - 4 - 4814 - - - 4 - 22 - 3292 - - - - - - - tuple - field - - - 12 - - - 1 - 2 - 205 - - - 2 - 3 - 38866 - - - 3 - 4 - 4814 - - - 4 - 22 - 3292 - - - - - - - index - tuple - - - 12 - - - 2 - 3 - 20 - - - 4 - 5 - 20 - - - 6 - 7 - 20 - - - 8 - 9 - 20 - - - 10 - 11 - 20 - - - 12 - 13 - 20 - - - 14 - 15 - 20 - - - 18 - 19 - 20 - - - 22 - 23 - 20 - - - 26 - 27 - 20 - - - 30 - 31 - 20 - - - 35 - 36 - 20 - - - 43 - 44 - 20 - - - 48 - 49 - 20 - - - 57 - 58 - 20 - - - 69 - 70 - 20 - - - 96 - 97 - 20 - - - 160 - 161 - 20 - - - 394 - 395 - 20 - - - 2283 - 2284 - 20 - - - 2293 - 2294 - 20 - - - - - - - index - field - - - 12 - - - 2 - 3 - 20 - - - 4 - 5 - 20 - - - 6 - 7 - 20 - - - 8 - 9 - 20 - - - 10 - 11 - 20 - - - 12 - 13 - 20 - - - 14 - 15 - 20 - - - 18 - 19 - 20 - - - 22 - 23 - 20 - - - 26 - 27 - 20 - - - 30 - 31 - 20 - - - 35 - 36 - 20 - - - 43 - 44 - 20 - - - 48 - 49 - 20 - - - 57 - 58 - 20 - - - 69 - 70 - 20 - - - 96 - 97 - 20 - - - 160 - 161 - 20 - - - 394 - 395 - 20 - - - 2283 - 2284 - 20 - - - 2293 - 2294 - 20 - - - - - - - field - tuple - - - 12 - - - 1 - 2 - 115839 - - - - - - - field - index - - - 12 - - - 1 - 2 - 115839 - - - - - - - - - attributes - 14223506 - - - id - 14223506 - - - kind - 61 - - - type_id - 14978 - - - target - 12264155 - - - - - id - kind - - - 12 - - - 1 - 2 - 14223506 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 14223506 - - - - - - - id - target - - - 12 - - - 1 - 2 - 14223506 - - - - - - - kind - id - - - 12 - - - 31 - 32 - 20 - - - 16434 - 16435 - 20 - - - 674823 - 674824 - 20 - - - - - - - kind - type_id - - - 12 - - - 9 - 10 - 20 - - - 11 - 12 - 20 - - - 726 - 727 - 20 - - - - - - - kind - target - - - 12 - - - 3 - 4 - 20 - - - 15476 - 15477 - 20 - - - 586278 - 586279 - 20 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 1543 - - - 2 - 3 - 1481 - - - 3 - 4 - 823 - - - 4 - 6 - 1172 - - - 6 - 9 - 1131 - - - 9 - 15 - 1316 - - - 15 - 24 - 1213 - - - 24 - 39 - 1152 - - - 39 - 70 - 1193 - - - 70 - 150 - 1131 - - - 150 - 430 - 1131 - - - 431 - 1781 - 1131 - - - 1807 - 207674 - 555 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 14608 - - - 2 - 3 - 370 - - - - - - - type_id - target - - - 12 - - - 1 - 2 - 1728 - - - 2 - 3 - 1481 - - - 3 - 4 - 843 - - - 4 - 6 - 1275 - - - 6 - 9 - 1172 - - - 9 - 15 - 1234 - - - 15 - 24 - 1152 - - - 24 - 40 - 1172 - - - 40 - 70 - 1172 - - - 72 - 153 - 1131 - - - 153 - 442 - 1152 - - - 442 - 2620 - 1131 - - - 2908 - 202968 - 329 - - - - - - - target - id - - - 12 - - - 1 - 2 - 11192302 - - - 2 - 4 - 963421 - - - 4 - 4012 - 108432 - - - - - - - target - kind - - - 12 - - - 1 - 2 - 12146937 - - - 2 - 3 - 117217 - - - - - - - target - type_id - - - 12 - - - 1 - 2 - 11400133 - - - 2 - 29 - 864021 - - - - - - - - - attribute_location - 14224247 - - - id - 14223506 - - - loc - 12098 - - - - - id - loc - - - 12 - - - 1 - 2 - 14222786 - - - 2 - 4 - 720 - - - - - - - loc - id - - - 12 - - - 1 - 10 - 802 - - - 10 - 11 - 1748 - - - 11 - 22 - 925 - - - 22 - 41 - 925 - - - 42 - 74 - 925 - - - 74 - 126 - 925 - - - 126 - 208 - 925 - - - 208 - 325 - 925 - - - 325 - 573 - 925 - - - 593 - 1056 - 925 - - - 1061 - 2081 - 925 - - - 2119 - 11182 - 925 - - - 11260 - 40492 - 288 - - - - - - - - - type_mention - 3322420 - - - id - 3322420 - - - type_id - 93831 - - - parent - 2594238 - - - - - id - type_id - - - 12 - - - 1 - 2 - 3322420 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 3322420 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 17301 - - - 2 - 3 - 18106 - - - 3 - 4 - 10207 - - - 4 - 5 - 7735 - - - 5 - 6 - 4991 - - - 6 - 7 - 6347 - - - 7 - 10 - 7628 - - - 10 - 16 - 7154 - - - 16 - 36 - 7080 - - - 36 - 1547 - 7038 - - - 1553 - 103831 - 240 - - - - - - - type_id - parent - - - 12 - - - 1 - 2 - 29400 - - - 2 - 3 - 15369 - - - 3 - 4 - 7878 - - - 4 - 5 - 6975 - - - 5 - 6 - 4977 - - - 6 - 8 - 7304 - - - 8 - 13 - 7530 - - - 13 - 30 - 7082 - - - 30 - 931 - 7038 - - - 949 - 78000 - 275 - - - - - - - parent - id - - - 12 - - - 1 - 2 - 2213261 - - - 2 - 3 - 271774 - - - 3 - 851 - 109202 - - - - - - - parent - type_id - - - 12 - - - 1 - 2 - 2538267 - - - 2 - 40 - 55971 - - - - - - - - - type_mention_location - 3322420 - - - id - 3322420 - - - loc - 2857079 - - - - - id - loc - - - 12 - - - 1 - 2 - 3322420 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 2673027 - - - 2 - 213 - 184052 - - - - - - - - - type_annotation - 924266 - - - id - 924266 - - - annotation - 61 - - - - - id - annotation - - - 12 - - - 1 - 2 - 924266 - - - - - - - annotation - id - - - 12 - - - 3236 - 3237 - 20 - - - 14983 - 14984 - 20 - - - 26702 - 26703 - 20 - - - - - - - - - nullability - 26089 - - - nullability - 26089 - - - kind - 61 - - - - - nullability - kind - - - 12 - - - 1 - 2 - 26089 - - - - - - - kind - nullability - - - 12 - - - 44 - 45 - 20 - - - 326 - 327 - 20 - - - 898 - 899 - 20 - - - - - - - - - nullability_parent - 83204 - - - nullability - 6183 - - - index - 1020 - - - parent - 24192 - - - - - nullability - index - - - 12 - - - 1 - 2 - 4622 - - - 2 - 3 - 960 - - - 3 - 9 - 480 - - - 17 - 18 - 120 - - - - - - - nullability - parent - - - 12 - - - 1 - 2 - 4022 - - - 2 - 3 - 780 - - - 3 - 5 - 540 - - - 5 - 14 - 480 - - - 19 - 219 - 360 - - - - - - - index - nullability - - - 12 - - - 2 - 3 - 540 - - - 3 - 4 - 240 - - - 5 - 6 - 60 - - - 10 - 11 - 60 - - - 59 - 60 - 60 - - - 70 - 71 - 60 - - - - - - - index - parent - - - 12 - - - 3 - 4 - 60 - - - 6 - 7 - 60 - - - 9 - 10 - 60 - - - 12 - 13 - 60 - - - 15 - 16 - 60 - - - 18 - 19 - 60 - - - 21 - 22 - 60 - - - 24 - 25 - 60 - - - 27 - 28 - 60 - - - 32 - 33 - 60 - - - 44 - 45 - 60 - - - 60 - 61 - 60 - - - 81 - 82 - 60 - - - 119 - 120 - 60 - - - 184 - 185 - 60 - - - 328 - 329 - 60 - - - 403 - 404 - 60 - - - - - - - parent - nullability - - - 12 - - - 1 - 2 - 7143 - - - 2 - 3 - 15488 - - - 3 - 5 - 1560 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 4502 - - - 2 - 3 - 8644 - - - 3 - 4 - 3902 - - - 4 - 5 - 2281 - - - 5 - 7 - 2221 - - - 7 - 14 - 1921 - - - 14 - 18 - 720 - - - - - - - - - type_nullability - 40401386 - - - id - 40393691 - - - nullability - 25739 - - - - - id - nullability - - - 12 - - - 1 - 2 - 40386490 - - - 2 - 5 - 7201 - - - - - - - nullability - id - - - 12 - - - 1 - 2 - 9114 - - - 2 - 3 - 3127 - - - 3 - 4 - 2551 - - - 4 - 5 - 1604 - - - 5 - 6 - 1399 - - - 6 - 9 - 1913 - - - 9 - 14 - 1934 - - - 14 - 41 - 1934 - - - 43 - 1603 - 1934 - - - 2271 - 1725181 - 226 - - - - - - - - - expr_flowstate - 6545248 - - - id - 6545248 - - - state - 4 - - - - - id - state - - - 12 - - - 1 - 2 - 6545248 - - - - - - - state - id - - - 12 - - - 238130 - 238131 - 2 - - - 2566670 - 2566671 - 2 - - - - - - - - - type_parameters - 897781 - - - id - 897781 - - - index - 1800 - - - generic_id - 486441 - - - variance - 180 - - - - - id - index - - - 12 - - - 1 - 2 - 897781 - - - - - - - id - generic_id - - - 12 - - - 1 - 2 - 897781 - - - - - - - id - variance - - - 12 - - - 1 - 2 - 897781 - - - - - - - index - id - - - 12 - - - 1 - 3 - 120 - - - 3 - 5 - 120 - - - 5 - 7 - 120 - - - 7 - 9 - 120 - - - 9 - 14 - 120 - - - 17 - 22 - 120 - - - 27 - 45 - 120 - - - 69 - 98 - 120 - - - 126 - 156 - 120 - - - 184 - 214 - 120 - - - 243 - 276 - 120 - - - 320 - 377 - 120 - - - 429 - 501 - 120 - - - 621 - 913 - 120 - - - 2165 - 8104 - 120 - - - - - - - index - generic_id - - - 12 - - - 1 - 3 - 120 - - - 3 - 5 - 120 - - - 5 - 7 - 120 - - - 7 - 9 - 120 - - - 9 - 14 - 120 - - - 17 - 22 - 120 - - - 27 - 45 - 120 - - - 69 - 98 - 120 - - - 126 - 156 - 120 - - - 184 - 214 - 120 - - - 243 - 276 - 120 - - - 320 - 377 - 120 - - - 429 - 501 - 120 - - - 621 - 913 - 120 - - - 2165 - 8104 - 120 - - - - - - - index - variance - - - 12 - - - 1 - 2 - 780 - - - 2 - 3 - 60 - - - 3 - 4 - 960 - - - - - - - generic_id - id - - - 12 - - - 1 - 2 - 356471 - - - 2 - 3 - 75220 - - - 3 - 9 - 38240 - - - 9 - 31 - 16508 - - - - - - - generic_id - index - - - 12 - - - 1 - 2 - 356471 - - - 2 - 3 - 75220 - - - 3 - 9 - 38240 - - - 9 - 31 - 16508 - - - - - - - generic_id - variance - - - 12 - - - 1 - 2 - 485240 - - - 2 - 3 - 1200 - - - - - - - variance - id - - - 12 - - - 52 - 53 - 60 - - - 289 - 290 - 60 - - - 14614 - 14615 - 60 - - - - - - - variance - index - - - 12 - - - 16 - 17 - 60 - - - 17 - 18 - 60 - - - 30 - 31 - 60 - - - - - - - variance - generic_id - - - 12 - - - 49 - 50 - 60 - - - 50 - 51 - 60 - - - 8024 - 8025 - 60 - - - - - - - - - type_arguments - 6159319 - - - id - 1600702 - - - index - 432 - - - constructed_id - 4581373 - - - - - id - index - - - 12 - - - 1 - 2 - 1361410 - - - 2 - 3 - 218983 - - - 3 - 13 - 20307 - - - - - - - id - constructed_id - - - 12 - - - 1 - 2 - 707031 - - - 2 - 3 - 283075 - - - 3 - 4 - 199375 - - - 4 - 5 - 99481 - - - 5 - 7 - 121826 - - - 7 - 11 - 126476 - - - 11 - 10327 - 63433 - - - - - - - index - id - - - 12 - - - 2 - 3 - 164 - - - 4 - 5 - 20 - - - 9 - 10 - 20 - - - 14 - 15 - 20 - - - 25 - 26 - 20 - - - 44 - 45 - 20 - - - 159 - 160 - 20 - - - 160 - 161 - 20 - - - 205 - 206 - 20 - - - 327 - 328 - 20 - - - 797 - 798 - 20 - - - 3259 - 3260 - 20 - - - 21100 - 21101 - 20 - - - 64692 - 64693 - 20 - - - - - - - index - constructed_id - - - 12 - - - 2 - 3 - 164 - - - 4 - 5 - 20 - - - 9 - 10 - 20 - - - 16 - 17 - 20 - - - 29 - 30 - 20 - - - 65 - 66 - 20 - - - 187 - 188 - 20 - - - 236 - 237 - 20 - - - 311 - 312 - 20 - - - 578 - 579 - 20 - - - 1749 - 1750 - 20 - - - 7001 - 7002 - 20 - - - 66490 - 66491 - 20 - - - 222663 - 222664 - 20 - - - - - - - constructed_id - id - - - 12 - - - 1 - 2 - 3249262 - - - 2 - 3 - 1220181 - - - 3 - 22 - 111930 - - - - - - - constructed_id - index - - - 12 - - - 1 - 2 - 3213317 - - - 2 - 3 - 1224008 - - - 3 - 22 - 144048 - - - - - - - - - constructed_generic - 4581373 - - - constructed - 4581373 - - - generic - 89832 - - - - - constructed - generic - - - 12 - - - 1 - 2 - 4581373 - - - - - - - generic - constructed - - - 12 - - - 1 - 2 - 26130 - - - 2 - 3 - 18723 - - - 3 - 4 - 8888 - - - 4 - 5 - 5596 - - - 5 - 7 - 6563 - - - 7 - 11 - 7036 - - - 11 - 23 - 7160 - - - 23 - 118 - 6769 - - - 126 - 23756 - 2962 - - - - - - - - - type_parameter_constraints - 897781 - - - id - 897781 - - - param_id - 897781 - - - - - id - param_id - - - 12 - - - 1 - 2 - 897781 - - - - - - - param_id - id - - - 12 - - - 1 - 2 - 897781 - - - - - - - - - type_parameter_constraints_location - 0 - - - id - 0 - - - loc - 0 - - - - - id - loc - - - 12 - - - - - - loc - id - - - 12 - - - - - - - - general_type_parameter_constraints - 345670 - - - id - 344368 - - - kind - 17 - - - - - id - kind - - - 12 - - - 1 - 2 - 343067 - - - 2 - 3 - 1301 - - - - - - - kind - id - - - 12 - - - 71 - 72 - 3 - - - 77 - 78 - 3 - - - 684 - 685 - 3 - - - 1350 - 1351 - 3 - - - 93972 - 93973 - 3 - - - - - - - - - specific_type_parameter_constraints - 250875 - - - id - 244702 - - - base_id - 45348 - - - - - id - base_id - - - 12 - - - 1 - 2 - 240114 - - - 2 - 9 - 4588 - - - - - - - base_id - id - - - 12 - - - 1 - 2 - 30533 - - - 2 - 3 - 4012 - - - 3 - 5 - 3806 - - - 5 - 10 - 3806 - - - 10 - 2494 - 3189 - - - - - - - - - specific_type_parameter_nullability - 44237 - - - id - 43990 - - - base_id - 9135 - - - nullability - 205 - - - - - id - base_id - - - 12 - - - 1 - 2 - 43743 - - - 2 - 3 - 246 - - - - - - - id - nullability - - - 12 - - - 1 - 2 - 43990 - - - - - - - base_id - id - - - 12 - - - 1 - 2 - 6234 - - - 2 - 3 - 1172 - - - 3 - 6 - 781 - - - 6 - 24 - 720 - - - 24 - 858 - 226 - - - - - - - base_id - nullability - - - 12 - - - 1 - 2 - 9073 - - - 2 - 3 - 61 - - - - - - - nullability - id - - - 12 - - - 1 - 2 - 61 - - - 3 - 4 - 20 - - - 4 - 5 - 20 - - - 6 - 7 - 20 - - - 16 - 17 - 20 - - - 35 - 36 - 20 - - - 68 - 69 - 20 - - - 2003 - 2004 - 20 - - - - - - - nullability - base_id - - - 12 - - - 1 - 2 - 61 - - - 3 - 4 - 41 - - - 4 - 5 - 20 - - - 8 - 9 - 20 - - - 35 - 36 - 20 - - - 68 - 69 - 20 - - - 323 - 324 - 20 - - - - - - - - - function_pointer_calling_conventions - 47919 - - - id - 47919 - - - kind - 50 - - - - - id - kind - - - 12 - - - 1 - 2 - 47919 - - - - - - - kind - id - - - 12 - - - 3 - 4 - 25 - - - 1892 - 1893 - 25 - - - - - - - - - has_unmanaged_calling_conventions - 0 - - - id - 0 - - - index - 0 - - - conv_id - 0 - - - - - id - index - - - 12 - - - - - - id - conv_id - - - 12 - - - - - - index - id - - - 12 - - - - - - index - conv_id - - - 12 - - - - - - conv_id - id - - - 12 - - - - - - conv_id - index - - - 12 - - - - - - - - modifiers - 1020 - - - id - 1020 - - - name - 1020 - - - - - id - name - - - 12 - - - 1 - 2 - 1020 - - - - - - - name - id - - - 12 - - - 1 - 2 - 1020 - - - - - - - - - has_modifiers - 87000980 - - - id - 57381746 - - - mod_id - 329 - - - - - id - mod_id - - - 12 - - - 1 - 2 - 29262107 - - - 2 - 3 - 26625311 - - - 3 - 5 - 1494327 - - - - - - - mod_id - id - - - 12 - - - 108 - 109 - 20 - - - 229 - 230 - 20 - - - 301 - 302 - 20 - - - 579 - 580 - 20 - - - 2937 - 2938 - 20 - - - 122171 - 122172 - 20 - - - 141164 - 141165 - 20 - - - 146000 - 146001 - 20 - - - 172050 - 172051 - 20 - - - 173508 - 173509 - 20 - - - 187757 - 187758 - 20 - - - 237126 - 237127 - 20 - - - 285248 - 285249 - 20 - - - 391584 - 391585 - 20 - - - 581112 - 581113 - 20 - - - 1786530 - 1786531 - 20 - - - - - - - - - compiler_generated - 479159 - - - id - 479159 - - - - - - exprorstmt_name - 10335 - - - parent_id - 10335 - - - name - 1213 - - - - - parent_id - name - - - 12 - - - 1 - 2 - 10335 - - - - - - - name - parent_id - - - 12 - - - 1 - 2 - 107 - - - 2 - 3 - 280 - - - 3 - 4 - 133 - - - 4 - 5 - 133 - - - 5 - 6 - 86 - - - 6 - 8 - 107 - - - 8 - 9 - 91 - - - 9 - 12 - 60 - - - 12 - 17 - 98 - - - 17 - 43 - 91 - - - 45 - 239 - 25 - - - - - - - - - nested_types - 1913920 - - - id - 1913920 - - - declaring_type_id - 774477 - - - unbound_id - 1613746 - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 1913920 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 1913920 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 455147 - - - 2 - 3 - 135879 - - - 3 - 4 - 62322 - - - 4 - 6 - 58084 - - - 6 - 22 - 58166 - - - 22 - 391 - 4876 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 456670 - - - 2 - 3 - 136250 - - - 3 - 4 - 61952 - - - 4 - 6 - 58043 - - - 6 - 24 - 58290 - - - 24 - 391 - 3271 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 1556444 - - - 2 - 691 - 57302 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 1565888 - - - 2 - 691 - 47858 - - - - - - - - - properties - 5910563 - - - id - 5910563 - - - name - 1743021 - - - declaring_type_id - 1511302 - - - type_id - 597529 - - - unbound_id - 5336551 - - - - - id - name - - - 12 - - - 1 - 2 - 5910563 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 5910563 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 5910563 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 5910563 - - - - - - - name - id - - - 12 - - - 1 - 2 - 1266311 - - - 2 - 3 - 219642 - - - 3 - 6 - 146640 - - - 6 - 9450 - 110428 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 1267298 - - - 2 - 3 - 219168 - - - 3 - 6 - 146908 - - - 6 - 5564 - 109646 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 1585126 - - - 2 - 6 - 137854 - - - 6 - 1544 - 20040 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 1273245 - - - 2 - 3 - 224374 - - - 3 - 6 - 144624 - - - 6 - 8011 - 100778 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 549794 - - - 2 - 3 - 348711 - - - 3 - 4 - 196247 - - - 4 - 5 - 130468 - - - 5 - 7 - 125365 - - - 7 - 14 - 113966 - - - 14 - 3362 - 46747 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 630059 - - - 2 - 3 - 270298 - - - 3 - 4 - 196659 - - - 4 - 5 - 132628 - - - 5 - 7 - 125201 - - - 7 - 15 - 117361 - - - 15 - 3362 - 39093 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 636499 - - - 2 - 3 - 426033 - - - 3 - 4 - 180898 - - - 4 - 5 - 100284 - - - 5 - 9 - 124254 - - - 9 - 56 - 43331 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 549794 - - - 2 - 3 - 348711 - - - 3 - 4 - 196247 - - - 4 - 5 - 130468 - - - 5 - 7 - 125365 - - - 7 - 14 - 113966 - - - 14 - 3362 - 46747 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 329617 - - - 2 - 3 - 122711 - - - 3 - 4 - 38805 - - - 4 - 7 - 51541 - - - 7 - 36 - 44957 - - - 36 - 74677 - 9896 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 477430 - - - 2 - 3 - 66540 - - - 3 - 11 - 44977 - - - 11 - 39359 - 8579 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 345666 - - - 2 - 3 - 117896 - - - 3 - 4 - 37796 - - - 4 - 7 - 46891 - - - 7 - 66 - 44833 - - - 66 - 22259 - 4444 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 331345 - - - 2 - 3 - 125077 - - - 3 - 4 - 38805 - - - 4 - 7 - 50491 - - - 7 - 45 - 44977 - - - 45 - 72507 - 6831 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 5254497 - - - 2 - 1890 - 82054 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 5336551 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 5254497 - - - 2 - 1890 - 82054 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 5319391 - - - 2 - 1414 - 17159 - - - - - - - - - property_location - 6046401 - - - id - 5910563 - - - loc - 8579 - - - - - id - loc - - - 12 - - - 1 - 2 - 5818282 - - - 2 - 34 - 92280 - - - - - - - loc - id - - - 12 - - - 1 - 8 - 740 - - - 8 - 15 - 699 - - - 15 - 25 - 658 - - - 25 - 41 - 678 - - - 41 - 58 - 658 - - - 59 - 95 - 658 - - - 98 - 159 - 658 - - - 163 - 249 - 658 - - - 259 - 344 - 658 - - - 346 - 473 - 658 - - - 475 - 933 - 658 - - - 934 - 2733 - 658 - - - 2736 - 13303 - 534 - - - - - - - - - indexers - 103350 - - - id - 103350 - - - name - 205 - - - declaring_type_id - 92630 - - - type_id - 21809 - - - unbound_id - 31315 - - - - - id - name - - - 12 - - - 1 - 2 - 103350 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 103350 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 103350 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 103350 - - - - - - - name - id - - - 12 - - - 1 - 2 - 61 - - - 2 - 3 - 41 - - - 3 - 4 - 20 - - - 10 - 11 - 20 - - - 14 - 15 - 20 - - - 16 - 17 - 20 - - - 4973 - 4974 - 20 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 82 - - - 2 - 3 - 20 - - - 3 - 4 - 20 - - - 6 - 7 - 20 - - - 14 - 15 - 20 - - - 16 - 17 - 20 - - - 4460 - 4461 - 20 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 164 - - - 6 - 7 - 20 - - - 1049 - 1050 - 20 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 82 - - - 2 - 3 - 41 - - - 7 - 8 - 20 - - - 10 - 11 - 20 - - - 16 - 17 - 20 - - - 1481 - 1482 - 20 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 83577 - - - 2 - 3 - 7612 - - - 3 - 7 - 1440 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 92568 - - - 2 - 3 - 61 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 87651 - - - 2 - 4 - 4979 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 83577 - - - 2 - 3 - 7612 - - - 3 - 7 - 1440 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 10061 - - - 2 - 3 - 6296 - - - 3 - 4 - 3436 - - - 4 - 8 - 1666 - - - 8 - 2702 - 349 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 21748 - - - 2 - 3 - 61 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 12715 - - - 2 - 3 - 4156 - - - 3 - 4 - 3189 - - - 4 - 17 - 1646 - - - 23 - 2667 - 102 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 10081 - - - 2 - 3 - 6337 - - - 3 - 4 - 3477 - - - 4 - 9 - 1646 - - - 9 - 248 - 267 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 29278 - - - 2 - 1890 - 2036 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 31315 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 29278 - - - 2 - 1890 - 2036 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 29896 - - - 2 - 203 - 1419 - - - - - - - - - indexer_location - 104749 - - - id - 103350 - - - loc - 2530 - - - - - id - loc - - - 12 - - - 1 - 2 - 101950 - - - 2 - 3 - 1399 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 884 - - - 2 - 3 - 349 - - - 3 - 5 - 205 - - - 5 - 8 - 185 - - - 8 - 16 - 226 - - - 16 - 23 - 205 - - - 23 - 47 - 205 - - - 50 - 124 - 205 - - - 127 - 3210 - 61 - - - - - - - - - accessors - 6902049 - - - id - 6902049 - - - kind - 41 - - - name - 2155599 - - - declaring_member_id - 6013131 - - - unbound_id - 6177364 - - - - - id - kind - - - 12 - - - 1 - 2 - 6902049 - - - - - - - id - name - - - 12 - - - 1 - 2 - 6902049 - - - - - - - id - declaring_member_id - - - 12 - - - 1 - 2 - 6902049 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 6902049 - - - - - - - kind - id - - - 12 - - - 43506 - 43507 - 20 - - - 291946 - 291947 - 20 - - - - - - - kind - name - - - 12 - - - 17152 - 17153 - 20 - - - 87622 - 87623 - 20 - - - - - - - kind - declaring_member_id - - - 12 - - - 43506 - 43507 - 20 - - - 291946 - 291947 - 20 - - - - - - - kind - unbound_id - - - 12 - - - 39666 - 39667 - 20 - - - 260565 - 260566 - 20 - - - - - - - name - id - - - 12 - - - 1 - 2 - 1548070 - - - 2 - 3 - 284454 - - - 3 - 6 - 187256 - - - 6 - 3848 - 135818 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 2155434 - - - 2 - 3 - 164 - - - - - - - name - declaring_member_id - - - 12 - - - 1 - 2 - 1548070 - - - 2 - 3 - 284454 - - - 3 - 6 - 187256 - - - 6 - 3848 - 135818 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 1560539 - - - 2 - 3 - 291388 - - - 3 - 6 - 181083 - - - 6 - 3822 - 122588 - - - - - - - declaring_member_id - id - - - 12 - - - 1 - 2 - 5124213 - - - 2 - 3 - 888917 - - - - - - - declaring_member_id - kind - - - 12 - - - 1 - 2 - 5124213 - - - 2 - 3 - 888917 - - - - - - - declaring_member_id - name - - - 12 - - - 1 - 2 - 5125139 - - - 2 - 3 - 887991 - - - - - - - declaring_member_id - unbound_id - - - 12 - - - 1 - 2 - 5124213 - - - 2 - 3 - 888917 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 6082223 - - - 2 - 1890 - 95140 - - - - - - - unbound_id - kind - - - 12 - - - 1 - 2 - 6177364 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 6177364 - - - - - - - unbound_id - declaring_member_id - - - 12 - - - 1 - 2 - 6082223 - - - 2 - 1890 - 95140 - - - - - - - - - init_only_accessors - 34504 - - - id - 34504 - - - - - - accessor_location - 7067248 - - - id - 6902049 - - - loc - 8579 - - - - - id - loc - - - 12 - - - 1 - 2 - 6784666 - - - 2 - 34 - 117382 - - - - - - - loc - id - - - 12 - - - 1 - 8 - 617 - - - 8 - 16 - 678 - - - 16 - 27 - 678 - - - 27 - 45 - 678 - - - 45 - 65 - 699 - - - 65 - 108 - 658 - - - 113 - 171 - 658 - - - 173 - 307 - 658 - - - 307 - 405 - 658 - - - 405 - 523 - 658 - - - 527 - 1068 - 658 - - - 1088 - 2613 - 658 - - - 2633 - 15945 - 617 - - - - - - - - - events - 60800 - - - id - 60800 - - - name - 25595 - - - declaring_type_id - 25225 - - - type_id - 15678 - - - unbound_id - 54030 - - - - - id - name - - - 12 - - - 1 - 2 - 60800 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 60800 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 60800 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 60800 - - - - - - - name - id - - - 12 - - - 1 - 2 - 14958 - - - 2 - 3 - 5226 - - - 3 - 4 - 2633 - - - 4 - 8 - 2098 - - - 8 - 240 - 678 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 14958 - - - 2 - 3 - 5226 - - - 3 - 4 - 2633 - - - 4 - 8 - 2098 - - - 8 - 228 - 678 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 22838 - - - 2 - 4 - 2098 - - - 4 - 10 - 658 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 15287 - - - 2 - 3 - 5473 - - - 3 - 4 - 2407 - - - 4 - 9 - 1995 - - - 9 - 165 - 432 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 13044 - - - 2 - 3 - 5164 - - - 3 - 4 - 2942 - - - 4 - 6 - 2283 - - - 6 - 75 - 1790 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 13106 - - - 2 - 3 - 5390 - - - 3 - 4 - 2674 - - - 4 - 6 - 2263 - - - 6 - 75 - 1790 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 15863 - - - 2 - 3 - 5246 - - - 3 - 4 - 2119 - - - 4 - 13 - 1892 - - - 14 - 52 - 102 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 13044 - - - 2 - 3 - 5164 - - - 3 - 4 - 2942 - - - 4 - 6 - 2283 - - - 6 - 75 - 1790 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 7798 - - - 2 - 3 - 3189 - - - 3 - 4 - 2530 - - - 4 - 7 - 1357 - - - 7 - 678 - 802 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 12427 - - - 2 - 3 - 1892 - - - 3 - 12 - 1213 - - - 12 - 276 - 144 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 9320 - - - 2 - 3 - 2695 - - - 3 - 4 - 2530 - - - 4 - 373 - 1131 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 7839 - - - 2 - 3 - 3312 - - - 3 - 4 - 2407 - - - 4 - 7 - 1440 - - - 7 - 605 - 678 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 52220 - - - 2 - 25 - 1810 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 54030 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 52220 - - - 2 - 25 - 1810 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 53701 - - - 2 - 6 - 329 - - - - - - - - - event_location - 73180 - - - id - 58236 - - - loc - 6675 - - - - - id - loc - - - 12 - - - 1 - 2 - 48677 - - - 2 - 3 - 4172 - - - 3 - 4 - 5386 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 5588 - - - 2 - 7 - 505 - - - 7 - 198 - 505 - - - 292 - 1024 - 75 - - - - - - - - - event_accessors - 121600 - - - id - 121600 - - - kind - 41 - - - name - 52137 - - - declaring_event_id - 60800 - - - unbound_id - 108061 - - - - - id - kind - - - 12 - - - 1 - 2 - 121600 - - - - - - - id - name - - - 12 - - - 1 - 2 - 121600 - - - - - - - id - declaring_event_id - - - 12 - - - 1 - 2 - 121600 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 121600 - - - - - - - kind - id - - - 12 - - - 2955 - 2956 - 41 - - - - - - - kind - name - - - 12 - - - 1267 - 1268 - 41 - - - - - - - kind - declaring_event_id - - - 12 - - - 2955 - 2956 - 41 - - - - - - - kind - unbound_id - - - 12 - - - 2626 - 2627 - 41 - - - - - - - name - id - - - 12 - - - 1 - 2 - 30492 - - - 2 - 3 - 10452 - - - 3 - 4 - 5308 - - - 4 - 8 - 4403 - - - 8 - 208 - 1481 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 52137 - - - - - - - name - declaring_event_id - - - 12 - - - 1 - 2 - 30492 - - - 2 - 3 - 10452 - - - 3 - 4 - 5308 - - - 4 - 8 - 4403 - - - 8 - 208 - 1481 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 31233 - - - 2 - 3 - 11069 - - - 3 - 4 - 5020 - - - 4 - 10 - 4073 - - - 10 - 146 - 740 - - - - - - - declaring_event_id - id - - - 12 - - - 2 - 3 - 60800 - - - - - - - declaring_event_id - kind - - - 12 - - - 2 - 3 - 60800 - - - - - - - declaring_event_id - name - - - 12 - - - 2 - 3 - 60800 - - - - - - - declaring_event_id - unbound_id - - - 12 - - - 2 - 3 - 60800 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 104440 - - - 2 - 25 - 3621 - - - - - - - unbound_id - kind - - - 12 - - - 1 - 2 - 108061 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 108061 - - - - - - - unbound_id - declaring_event_id - - - 12 - - - 1 - 2 - 104440 - - - 2 - 25 - 3621 - - - - - - - - - event_accessor_location - 146361 - - - id - 116472 - - - loc - 6675 - - - - - id - loc - - - 12 - - - 1 - 2 - 97355 - - - 2 - 3 - 8344 - - - 3 - 4 - 10772 - - - - - - - loc - id - - - 12 - - - 2 - 3 - 5588 - - - 4 - 13 - 505 - - - 14 - 395 - 505 - - - 584 - 2047 - 75 - - - - - - - - - operators - 146898 - - - id - 146898 - - - name - 1560 - - - symbol - 1440 - - - declaring_type_id - 31456 - - - type_id - 22452 - - - unbound_id - 119043 - - - - - id - name - - - 12 - - - 1 - 2 - 146898 - - - - - - - id - symbol - - - 12 - - - 1 - 2 - 146898 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 146898 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 146898 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 146898 - - - - - - - name - id - - - 12 - - - 1 - 2 - 240 - - - 3 - 4 - 60 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 20 - 120 - - - 26 - 34 - 120 - - - 36 - 38 - 120 - - - 38 - 39 - 120 - - - 39 - 40 - 120 - - - 41 - 43 - 120 - - - 58 - 323 - 120 - - - 324 - 486 - 120 - - - 834 - 835 - 60 - - - - - - - name - symbol - - - 12 - - - 1 - 2 - 1560 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 240 - - - 3 - 4 - 60 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 9 - 60 - - - 19 - 20 - 120 - - - 22 - 33 - 120 - - - 33 - 34 - 120 - - - 34 - 35 - 180 - - - 39 - 40 - 120 - - - 51 - 97 - 120 - - - 304 - 305 - 60 - - - 308 - 309 - 120 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 240 - - - 2 - 3 - 360 - - - 3 - 4 - 60 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 20 - 120 - - - 20 - 23 - 120 - - - 33 - 35 - 120 - - - 39 - 40 - 120 - - - 44 - 140 - 120 - - - 262 - 263 - 60 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 240 - - - 2 - 4 - 120 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 9 - 180 - - - 19 - 27 - 120 - - - 36 - 38 - 120 - - - 38 - 39 - 120 - - - 41 - 43 - 120 - - - 58 - 321 - 120 - - - 322 - 470 - 120 - - - 483 - 484 - 60 - - - - - - - symbol - id - - - 12 - - - 1 - 2 - 240 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 27 - 120 - - - 33 - 37 - 120 - - - 37 - 38 - 60 - - - 38 - 39 - 120 - - - 39 - 40 - 120 - - - 41 - 42 - 60 - - - 61 - 62 - 120 - - - 322 - 325 - 120 - - - 485 - 835 - 120 - - - - - - - symbol - name - - - 12 - - - 1 - 2 - 1320 - - - 2 - 3 - 120 - - - - - - - symbol - declaring_type_id - - - 12 - - - 1 - 2 - 240 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 20 - 120 - - - 22 - 33 - 120 - - - 33 - 34 - 120 - - - 34 - 35 - 180 - - - 39 - 40 - 120 - - - 51 - 97 - 120 - - - 304 - 305 - 60 - - - 308 - 309 - 120 - - - - - - - symbol - type_id - - - 12 - - - 1 - 2 - 240 - - - 2 - 3 - 360 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 21 - 120 - - - 22 - 34 - 120 - - - 34 - 35 - 60 - - - 39 - 40 - 120 - - - 44 - 140 - 120 - - - 262 - 263 - 60 - - - - - - - symbol - unbound_id - - - 12 - - - 1 - 2 - 240 - - - 2 - 3 - 60 - - - 4 - 5 - 120 - - - 6 - 8 - 120 - - - 8 - 9 - 180 - - - 26 - 37 - 120 - - - 37 - 38 - 60 - - - 38 - 39 - 120 - - - 41 - 42 - 60 - - - 61 - 62 - 120 - - - 320 - 323 - 120 - - - 469 - 484 - 120 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 1740 - - - 2 - 3 - 17589 - - - 3 - 4 - 2581 - - - 4 - 6 - 1680 - - - 6 - 7 - 4742 - - - 7 - 27 - 2401 - - - 27 - 73 - 720 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 8824 - - - 2 - 3 - 13507 - - - 3 - 4 - 1680 - - - 4 - 5 - 4442 - - - 5 - 14 - 2581 - - - 15 - 24 - 420 - - - - - - - declaring_type_id - symbol - - - 12 - - - 1 - 2 - 8824 - - - 2 - 3 - 13507 - - - 3 - 4 - 1680 - - - 4 - 5 - 4442 - - - 5 - 13 - 2581 - - - 15 - 22 - 420 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 22452 - - - 2 - 3 - 3962 - - - 3 - 4 - 1860 - - - 4 - 6 - 2401 - - - 8 - 39 - 780 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 1740 - - - 2 - 3 - 17589 - - - 3 - 4 - 2581 - - - 4 - 6 - 1680 - - - 6 - 7 - 4742 - - - 7 - 27 - 2401 - - - 27 - 73 - 720 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 6303 - - - 2 - 3 - 6903 - - - 3 - 4 - 1800 - - - 4 - 6 - 1380 - - - 6 - 7 - 2761 - - - 7 - 14 - 1740 - - - 14 - 731 - 1560 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 16989 - - - 2 - 4 - 1800 - - - 4 - 5 - 2221 - - - 5 - 18 - 1440 - - - - - - - type_id - symbol - - - 12 - - - 1 - 2 - 16989 - - - 2 - 4 - 1921 - - - 4 - 5 - 2221 - - - 5 - 16 - 1320 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 19090 - - - 2 - 7 - 1740 - - - 7 - 306 - 1620 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 6303 - - - 2 - 3 - 6903 - - - 3 - 4 - 1800 - - - 4 - 6 - 1380 - - - 6 - 7 - 2761 - - - 7 - 14 - 1740 - - - 14 - 727 - 1560 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 116102 - - - 2 - 33 - 2941 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 119043 - - - - - - - unbound_id - symbol - - - 12 - - - 1 - 2 - 119043 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 116102 - - - 2 - 33 - 2941 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 116282 - - - 2 - 33 - 2761 - - - - - - - - - operator_location - 238350 - - - id - 94949 - - - loc - 10928 - - - - - id - loc - - - 12 - - - 1 - 2 - 7222 - - - 2 - 3 - 76786 - - - 3 - 10 - 8699 - - - 10 - 23 - 2240 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 9159 - - - 2 - 5 - 870 - - - 5 - 321 - 821 - - - 352 - 34717 - 77 - - - - - - - - - constant_value - 3005300 - - - id - 3004004 - - - value - 955314 - - - - - id - value - - - 12 - - - 1 - 2 - 3003119 - - - 2 - 9 - 884 - - - - - - - value - id - - - 12 - - - 1 - 2 - 763572 - - - 2 - 3 - 102053 - - - 3 - 9 - 73063 - - - 9 - 9057 - 16624 - - - - - - - - - methods - 17406043 - - - id - 17406043 - - - name - 4654272 - - - declaring_type_id - 3635194 - - - type_id - 1167672 - - - unbound_id - 14310911 - - - - - id - name - - - 12 - - - 1 - 2 - 17406043 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 17406043 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 17406043 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 17406043 - - - - - - - name - id - - - 12 - - - 1 - 2 - 3332551 - - - 2 - 3 - 557181 - - - 3 - 5 - 372866 - - - 5 - 30 - 349554 - - - 30 - 24636 - 42117 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 3459439 - - - 2 - 3 - 498232 - - - 3 - 6 - 416445 - - - 6 - 15129 - 280154 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 4249739 - - - 2 - 7 - 349410 - - - 7 - 3080 - 55121 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 3392631 - - - 2 - 3 - 574052 - - - 3 - 5 - 366776 - - - 5 - 14243 - 320811 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 1267628 - - - 2 - 3 - 822006 - - - 3 - 4 - 350089 - - - 4 - 5 - 236925 - - - 5 - 6 - 207214 - - - 6 - 9 - 321099 - - - 9 - 17 - 281059 - - - 17 - 1325 - 149171 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 1315671 - - - 2 - 3 - 850771 - - - 3 - 4 - 360665 - - - 4 - 5 - 283219 - - - 5 - 6 - 241184 - - - 6 - 10 - 303857 - - - 10 - 89 - 272685 - - - 89 - 1325 - 7139 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 1738083 - - - 2 - 3 - 858651 - - - 3 - 4 - 372887 - - - 4 - 5 - 307560 - - - 5 - 10 - 283672 - - - 10 - 272 - 74338 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 1267628 - - - 2 - 3 - 822006 - - - 3 - 4 - 350089 - - - 4 - 5 - 236925 - - - 5 - 6 - 207214 - - - 6 - 9 - 321099 - - - 9 - 17 - 281059 - - - 17 - 1325 - 149171 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 670798 - - - 2 - 3 - 190219 - - - 3 - 4 - 84050 - - - 4 - 7 - 103123 - - - 7 - 25 - 88000 - - - 25 - 239280 - 31480 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 817891 - - - 2 - 3 - 156702 - - - 3 - 5 - 96827 - - - 5 - 33 - 87651 - - - 33 - 67058 - 8600 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 762399 - - - 2 - 3 - 184417 - - - 3 - 4 - 74277 - - - 4 - 9 - 91683 - - - 9 - 76756 - 54895 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 673884 - - - 2 - 3 - 191741 - - - 3 - 4 - 84523 - - - 4 - 7 - 102897 - - - 7 - 27 - 87959 - - - 27 - 209281 - 26665 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 13875865 - - - 2 - 4984 - 435045 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 14310911 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 13875865 - - - 2 - 4984 - 435045 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 14180813 - - - 2 - 1923 - 130098 - - - - - - - - - method_location - 17716731 - - - id - 17406043 - - - loc - 9012 - - - - - id - loc - - - 12 - - - 1 - 2 - 17203664 - - - 2 - 34 - 202379 - - - - - - - loc - id - - - 12 - - - 1 - 12 - 740 - - - 12 - 45 - 678 - - - 45 - 68 - 699 - - - 69 - 117 - 678 - - - 123 - 189 - 699 - - - 190 - 254 - 678 - - - 258 - 391 - 678 - - - 397 - 615 - 678 - - - 617 - 851 - 678 - - - 858 - 1319 - 678 - - - 1319 - 1995 - 678 - - - 2133 - 4934 - 678 - - - 4958 - 30306 - 678 - - - 32604 - 58862 - 82 - - - - - - - - - constructors - 5023456 - - - id - 5023456 - - - name - 2237756 - - - declaring_type_id - 3721919 - - - unbound_id - 4648902 - - - - - id - name - - - 12 - - - 1 - 2 - 5023456 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 5023456 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 5023456 - - - - - - - name - id - - - 12 - - - 1 - 2 - 1580599 - - - 2 - 3 - 438769 - - - 3 - 7 - 180013 - - - 7 - 29898 - 38373 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 2032661 - - - 2 - 5 - 178162 - - - 5 - 14950 - 26933 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 1604961 - - - 2 - 3 - 440251 - - - 3 - 8 - 171145 - - - 8 - 29898 - 21398 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 2716154 - - - 2 - 3 - 861470 - - - 3 - 55 - 144295 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 3721919 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 2716154 - - - 2 - 3 - 861470 - - - 3 - 55 - 144295 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 4603245 - - - 2 - 1890 - 45656 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 4648902 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 4603245 - - - 2 - 1890 - 45656 - - - - - - - - - constructor_location - 5171660 - - - id - 5023456 - - - loc - 9073 - - - - - id - loc - - - 12 - - - 1 - 2 - 4954672 - - - 2 - 306 - 68783 - - - - - - - loc - id - - - 12 - - - 1 - 8 - 699 - - - 8 - 21 - 720 - - - 21 - 34 - 740 - - - 34 - 51 - 761 - - - 51 - 81 - 699 - - - 81 - 109 - 720 - - - 109 - 156 - 740 - - - 156 - 250 - 720 - - - 250 - 365 - 720 - - - 381 - 573 - 699 - - - 575 - 936 - 699 - - - 940 - 3093 - 699 - - - 3321 - 11823 - 452 - - - - - - - - - destructors - 4588 - - - id - 4588 - - - name - 4341 - - - declaring_type_id - 4588 - - - unbound_id - 4485 - - - - - id - name - - - 12 - - - 1 - 2 - 4588 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 4588 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 4588 - - - - - - - name - id - - - 12 - - - 1 - 2 - 4156 - - - 2 - 5 - 185 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 4156 - - - 2 - 5 - 185 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 4197 - - - 2 - 3 - 144 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 4588 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 4588 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 4588 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 4444 - - - 3 - 5 - 41 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 4485 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 4444 - - - 3 - 5 - 41 - - - - - - - - - destructor_location - 4650 - - - id - 4588 - - - loc - 1090 - - - - - id - loc - - - 12 - - - 1 - 2 - 4526 - - - 2 - 3 - 61 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 555 - - - 2 - 3 - 82 - - - 3 - 4 - 205 - - - 4 - 8 - 82 - - - 8 - 13 - 82 - - - 16 - 48 - 82 - - - - - - - - - overrides - 3995078 - - - id - 3990366 - - - base_id - 1238308 - - - - - id - base_id - - - 12 - - - 1 - 2 - 3985655 - - - 2 - 3 - 4711 - - - - - - - base_id - id - - - 12 - - - 1 - 2 - 835956 - - - 2 - 3 - 192256 - - - 3 - 5 - 107958 - - - 5 - 28 - 93453 - - - 28 - 5964 - 8682 - - - - - - - - - explicitly_implements - 1640844 - - - id - 1640453 - - - interface_id - 107526 - - - - - id - interface_id - - - 12 - - - 1 - 2 - 1640062 - - - 2 - 3 - 390 - - - - - - - interface_id - id - - - 12 - - - 1 - 2 - 54895 - - - 2 - 3 - 17283 - - - 3 - 4 - 6831 - - - 4 - 5 - 6110 - - - 5 - 8 - 9258 - - - 8 - 19 - 8312 - - - 19 - 11268 - 4835 - - - - - - - - - local_functions - 4768 - - - id - 4768 - - - name - 2851 - - - return_type - 605 - - - unbound_id - 4652 - - - - - id - name - - - 12 - - - 1 - 2 - 4768 - - - - - - - id - return_type - - - 12 - - - 1 - 2 - 4768 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 4768 - - - - - - - name - id - - - 12 - - - 1 - 2 - 2385 - - - 2 - 3 - 314 - - - 3 - 437 - 152 - - - - - - - name - return_type - - - 12 - - - 1 - 2 - 2807 - - - 2 - 7 - 44 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 2410 - - - 2 - 3 - 315 - - - 3 - 420 - 126 - - - - - - - return_type - id - - - 12 - - - 1 - 2 - 399 - - - 2 - 3 - 101 - - - 3 - 5 - 50 - - - 5 - 22 - 46 - - - 22 - 2380 - 9 - - - - - - - return_type - name - - - 12 - - - 1 - 2 - 449 - - - 2 - 3 - 76 - - - 3 - 6 - 49 - - - 6 - 859 - 31 - - - - - - - return_type - unbound_id - - - 12 - - - 1 - 2 - 402 - - - 2 - 3 - 101 - - - 3 - 5 - 48 - - - 5 - 23 - 46 - - - 25 - 2319 - 8 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 4609 - - - 2 - 12 - 43 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 4652 - - - - - - - unbound_id - return_type - - - 12 - - - 1 - 2 - 4642 - - - 2 - 5 - 10 - - - - - - - - - local_function_stmts - 4652 - - - fn - 4652 - - - stmt - 4652 - - - - - fn - stmt - - - 12 - - - 1 - 2 - 4652 - - - - - - - stmt - fn - - - 12 - - - 1 - 2 - 4652 - - - - - - - - - fields - 12987441 - - - id - 12987441 - - - kind - 41 - - - name - 5002407 - - - declaring_type_id - 2950960 - - - type_id - 2616467 - - - unbound_id - 12547601 - - - - - id - kind - - - 12 - - - 1 - 2 - 12987441 - - - - - - - id - name - - - 12 - - - 1 - 2 - 12987441 - - - - - - - id - declaring_type_id - - - 12 - - - 1 - 2 - 12987441 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 12987441 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 12987441 - - - - - - - kind - id - - - 12 - - - 146000 - 146001 - 20 - - - 485213 - 485214 - 20 - - - - - - - kind - name - - - 12 - - - 98049 - 98050 - 20 - - - 150560 - 150561 - 20 - - - - - - - kind - declaring_type_id - - - 12 - - - 18259 - 18260 - 20 - - - 131629 - 131630 - 20 - - - - - - - kind - type_id - - - 12 - - - 7897 - 7898 - 20 - - - 122955 - 122956 - 20 - - - - - - - kind - unbound_id - - - 12 - - - 145585 - 145586 - 20 - - - 464251 - 464252 - 20 - - - - - - - name - id - - - 12 - - - 1 - 2 - 3909731 - - - 2 - 3 - 577859 - - - 3 - 8 - 381673 - - - 8 - 15557 - 133143 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 4889592 - - - 2 - 3 - 112814 - - - - - - - name - declaring_type_id - - - 12 - - - 1 - 2 - 3910781 - - - 2 - 3 - 578394 - - - 3 - 8 - 381549 - - - 8 - 15557 - 131682 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 4380578 - - - 2 - 3 - 372619 - - - 3 - 15557 - 249208 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 3938187 - - - 2 - 3 - 578229 - - - 3 - 9 - 380706 - - - 9 - 15557 - 105284 - - - - - - - declaring_type_id - id - - - 12 - - - 1 - 2 - 806657 - - - 2 - 3 - 748305 - - - 3 - 4 - 411630 - - - 4 - 5 - 257953 - - - 5 - 6 - 174293 - - - 6 - 8 - 222934 - - - 8 - 14 - 227110 - - - 14 - 6823 - 102074 - - - - - - - declaring_type_id - kind - - - 12 - - - 1 - 2 - 2817920 - - - 2 - 3 - 133040 - - - - - - - declaring_type_id - name - - - 12 - - - 1 - 2 - 806842 - - - 2 - 3 - 748285 - - - 3 - 4 - 411610 - - - 4 - 5 - 257994 - - - 5 - 6 - 174273 - - - 6 - 8 - 223057 - - - 8 - 14 - 226966 - - - 14 - 6823 - 101930 - - - - - - - declaring_type_id - type_id - - - 12 - - - 1 - 2 - 1103868 - - - 2 - 3 - 812418 - - - 3 - 4 - 381241 - - - 4 - 5 - 207975 - - - 5 - 7 - 225876 - - - 7 - 612 - 219580 - - - - - - - declaring_type_id - unbound_id - - - 12 - - - 1 - 2 - 806657 - - - 2 - 3 - 748305 - - - 3 - 4 - 411630 - - - 4 - 5 - 257953 - - - 5 - 6 - 174293 - - - 6 - 8 - 222934 - - - 8 - 14 - 227110 - - - 14 - 6823 - 102074 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 1788843 - - - 2 - 3 - 320667 - - - 3 - 5 - 237522 - - - 5 - 15 - 200568 - - - 15 - 68300 - 68865 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 2540605 - - - 2 - 3 - 75861 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 1915649 - - - 2 - 3 - 308898 - - - 3 - 5 - 202111 - - - 5 - 37646 - 189807 - - - - - - - type_id - declaring_type_id - - - 12 - - - 1 - 2 - 1970564 - - - 2 - 3 - 313115 - - - 3 - 6 - 205506 - - - 6 - 23118 - 127279 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 1793760 - - - 2 - 3 - 322333 - - - 3 - 5 - 235793 - - - 5 - 15 - 197420 - - - 15 - 67097 - 67158 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 12475176 - - - 2 - 1890 - 72425 - - - - - - - unbound_id - kind - - - 12 - - - 1 - 2 - 12547601 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 12547601 - - - - - - - unbound_id - declaring_type_id - - - 12 - - - 1 - 2 - 12475176 - - - 2 - 1890 - 72425 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 12525051 - - - 2 - 1339 - 22550 - - - - - - - - - field_location - 13100894 - - - id - 12872178 - - - loc - 8847 - - - - - id - loc - - - 12 - - - 1 - 2 - 12723624 - - - 2 - 283 - 148554 - - - - - - - loc - id - - - 12 - - - 1 - 13 - 740 - - - 13 - 36 - 678 - - - 38 - 64 - 699 - - - 64 - 107 - 678 - - - 107 - 183 - 678 - - - 183 - 257 - 678 - - - 258 - 361 - 678 - - - 368 - 551 - 678 - - - 555 - 845 - 678 - - - 854 - 1270 - 678 - - - 1296 - 2080 - 678 - - - 2119 - 5642 - 678 - - - 5811 - 25217 - 617 - - - - - - - - - localvars - 618977 - - - id - 618977 - - - kind - 50 - - - name - 113210 - - - implicitly_typed - 50 - - - type_id - 31962 - - - parent_id - 618977 - - - - - id - kind - - - 12 - - - 1 - 2 - 618977 - - - - - - - id - name - - - 12 - - - 1 - 2 - 618977 - - - - - - - id - implicitly_typed - - - 12 - - - 1 - 2 - 618977 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 618977 - - - - - - - id - parent_id - - - 12 - - - 1 - 2 - 618977 - - - - - - - kind - id - - - 12 - - - 68 - 69 - 25 - - - 24410 - 24411 - 25 - - - - - - - kind - name - - - 12 - - - 29 - 30 - 25 - - - 4457 - 4458 - 25 - - - - - - - kind - implicitly_typed - - - 12 - - - 1 - 2 - 25 - - - 2 - 3 - 25 - - - - - - - kind - type_id - - - 12 - - - 7 - 8 - 25 - - - 1262 - 1263 - 25 - - - - - - - kind - parent_id - - - 12 - - - 68 - 69 - 25 - - - 24410 - 24411 - 25 - - - - - - - name - id - - - 12 - - - 1 - 2 - 71663 - - - 2 - 3 - 17852 - - - 3 - 5 - 10443 - - - 5 - 12 - 8749 - - - 12 - 3783 - 4501 - - - - - - - name - kind - - - 12 - - - 1 - 2 - 112982 - - - 2 - 3 - 227 - - - - - - - name - implicitly_typed - - - 12 - - - 1 - 2 - 98442 - - - 2 - 3 - 14767 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 97835 - - - 2 - 3 - 8420 - - - 3 - 74 - 6953 - - - - - - - name - parent_id - - - 12 - - - 1 - 2 - 71663 - - - 2 - 3 - 17852 - - - 3 - 5 - 10443 - - - 5 - 12 - 8749 - - - 12 - 3783 - 4501 - - - - - - - implicitly_typed - id - - - 12 - - - 5418 - 5419 - 25 - - - 19060 - 19061 - 25 - - - - - - - implicitly_typed - kind - - - 12 - - - 1 - 2 - 25 - - - 2 - 3 - 25 - - - - - - - implicitly_typed - name - - - 12 - - - 2195 - 2196 - 25 - - - 2866 - 2867 - 25 - - - - - - - implicitly_typed - type_id - - - 12 - - - 649 - 650 - 25 - - - 956 - 957 - 25 - - - - - - - implicitly_typed - parent_id - - - 12 - - - 5418 - 5419 - 25 - - - 19060 - 19061 - 25 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 14312 - - - 2 - 3 - 5639 - - - 3 - 4 - 2579 - - - 4 - 6 - 2629 - - - 6 - 10 - 2478 - - - 10 - 26 - 2427 - - - 26 - 7125 - 1896 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 31836 - - - 2 - 3 - 126 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 18737 - - - 2 - 3 - 5057 - - - 3 - 4 - 2199 - - - 4 - 7 - 2781 - - - 7 - 24 - 2427 - - - 24 - 596 - 758 - - - - - - - type_id - implicitly_typed - - - 12 - - - 1 - 2 - 23339 - - - 2 - 3 - 8622 - - - - - - - type_id - parent_id - - - 12 - - - 1 - 2 - 14312 - - - 2 - 3 - 5639 - - - 3 - 4 - 2579 - - - 4 - 6 - 2629 - - - 6 - 10 - 2478 - - - 10 - 26 - 2427 - - - 26 - 7125 - 1896 - - - - - - - parent_id - id - - - 12 - - - 1 - 2 - 618977 - - - - - - - parent_id - kind - - - 12 - - - 1 - 2 - 618977 - - - - - - - parent_id - name - - - 12 - - - 1 - 2 - 618977 - - - - - - - parent_id - implicitly_typed - - - 12 - - - 1 - 2 - 618977 - - - - - - - parent_id - type_id - - - 12 - - - 1 - 2 - 618977 - - - - - - - - - localvar_location - 618977 - - - id - 618977 - - - loc - 618977 - - - - - id - loc - - - 12 - - - 1 - 2 - 618977 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 618977 - - - - - - - - - params - 31463795 - - - id - 31463795 - - - name - 1755593 - - - type_id - 2360159 - - - index - 1419 - - - mode - 123 - - - parent_id - 17474189 - - - unbound_id - 25163555 - - - - - id - name - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - index - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - mode - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - parent_id - - - 12 - - - 1 - 2 - 31463795 - - - - - - - id - unbound_id - - - 12 - - - 1 - 2 - 31463795 - - - - - - - name - id - - - 12 - - - 1 - 2 - 778572 - - - 2 - 3 - 321778 - - - 3 - 4 - 144356 - - - 4 - 6 - 159212 - - - 6 - 10 - 135097 - - - 10 - 26 - 133266 - - - 26 - 82408 - 83309 - - - - - - - name - type_id - - - 12 - - - 1 - 2 - 1424391 - - - 2 - 3 - 172668 - - - 3 - 12 - 132525 - - - 12 - 15932 - 26007 - - - - - - - name - index - - - 12 - - - 1 - 2 - 1213617 - - - 2 - 3 - 297581 - - - 3 - 4 - 115942 - - - 4 - 23 - 128452 - - - - - - - name - mode - - - 12 - - - 1 - 2 - 1598150 - - - 2 - 3 - 132052 - - - 3 - 7 - 25390 - - - - - - - name - parent_id - - - 12 - - - 1 - 2 - 778572 - - - 2 - 3 - 321778 - - - 3 - 4 - 144356 - - - 4 - 6 - 159212 - - - 6 - 10 - 135097 - - - 10 - 26 - 133266 - - - 26 - 82408 - 83309 - - - - - - - name - unbound_id - - - 12 - - - 1 - 2 - 795505 - - - 2 - 3 - 328094 - - - 3 - 4 - 155508 - - - 4 - 5 - 102856 - - - 5 - 8 - 139192 - - - 8 - 19 - 135632 - - - 19 - 69269 - 98802 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 1148640 - - - 2 - 3 - 332909 - - - 3 - 4 - 201144 - - - 4 - 5 - 156002 - - - 5 - 8 - 185034 - - - 8 - 18 - 178532 - - - 18 - 107768 - 157895 - - - - - - - type_id - name - - - 12 - - - 1 - 2 - 1573110 - - - 2 - 3 - 396137 - - - 3 - 4 - 179520 - - - 4 - 12 - 180898 - - - 12 - 11414 - 30492 - - - - - - - type_id - index - - - 12 - - - 1 - 2 - 1703558 - - - 2 - 3 - 413997 - - - 3 - 5 - 179499 - - - 5 - 70 - 63104 - - - - - - - type_id - mode - - - 12 - - - 1 - 2 - 2211872 - - - 2 - 6 - 148286 - - - - - - - type_id - parent_id - - - 12 - - - 1 - 2 - 1179771 - - - 2 - 3 - 314576 - - - 3 - 4 - 201021 - - - 4 - 5 - 156619 - - - 5 - 8 - 183079 - - - 8 - 19 - 178820 - - - 19 - 87339 - 146270 - - - - - - - type_id - unbound_id - - - 12 - - - 1 - 2 - 1156767 - - - 2 - 3 - 333711 - - - 3 - 4 - 213469 - - - 4 - 5 - 154623 - - - 5 - 8 - 193778 - - - 8 - 19 - 180507 - - - 19 - 100456 - 127299 - - - - - - - index - id - - - 12 - - - 2 - 3 - 164 - - - 3 - 4 - 102 - - - 4 - 5 - 246 - - - 5 - 10 - 82 - - - 10 - 13 - 123 - - - 14 - 33 - 123 - - - 38 - 72 - 123 - - - 85 - 224 - 123 - - - 302 - 1682 - 123 - - - 2493 - 36706 - 123 - - - 70171 - 849278 - 82 - - - - - - - index - name - - - 12 - - - 1 - 2 - 164 - - - 2 - 3 - 102 - - - 3 - 4 - 246 - - - 4 - 7 - 61 - - - 8 - 9 - 82 - - - 10 - 19 - 123 - - - 22 - 39 - 123 - - - 42 - 88 - 123 - - - 109 - 327 - 123 - - - 444 - 2590 - 123 - - - 3908 - 33082 - 123 - - - 38091 - 38092 - 20 - - - - - - - index - type_id - - - 12 - - - 1 - 2 - 473 - - - 2 - 5 - 102 - - - 6 - 8 - 102 - - - 8 - 17 - 123 - - - 20 - 36 - 123 - - - 41 - 96 - 123 - - - 104 - 358 - 123 - - - 477 - 2603 - 123 - - - 4110 - 76288 - 123 - - - - - - - index - mode - - - 12 - - - 2 - 3 - 1111 - - - 3 - 5 - 82 - - - 5 - 6 - 205 - - - 6 - 7 - 20 - - - - - - - index - parent_id - - - 12 - - - 2 - 3 - 164 - - - 3 - 4 - 102 - - - 4 - 5 - 246 - - - 5 - 10 - 82 - - - 10 - 13 - 123 - - - 14 - 33 - 123 - - - 38 - 72 - 123 - - - 85 - 224 - 123 - - - 302 - 1682 - 123 - - - 2493 - 36706 - 123 - - - 70171 - 849278 - 82 - - - - - - - index - unbound_id - - - 12 - - - 2 - 3 - 164 - - - 3 - 4 - 102 - - - 4 - 5 - 246 - - - 5 - 10 - 82 - - - 10 - 13 - 123 - - - 14 - 33 - 123 - - - 38 - 72 - 123 - - - 85 - 224 - 123 - - - 298 - 1634 - 123 - - - 2398 - 32495 - 123 - - - 61752 - 666467 - 82 - - - - - - - mode - id - - - 12 - - - 3182 - 3183 - 20 - - - 4460 - 4461 - 20 - - - 14929 - 14930 - 20 - - - 22552 - 22553 - 20 - - - 26702 - 26703 - 20 - - - 1457373 - 1457374 - 20 - - - - - - - mode - name - - - 12 - - - 326 - 327 - 20 - - - 590 - 591 - 20 - - - 2415 - 2416 - 20 - - - 2510 - 2511 - 20 - - - 8449 - 8450 - 20 - - - 80401 - 80402 - 20 - - - - - - - mode - type_id - - - 12 - - - 374 - 375 - 20 - - - 735 - 736 - 20 - - - 3241 - 3242 - 20 - - - 4690 - 4691 - 20 - - - 6825 - 6826 - 20 - - - 107299 - 107300 - 20 - - - - - - - mode - index - - - 12 - - - 1 - 2 - 20 - - - 12 - 13 - 20 - - - 13 - 14 - 20 - - - 15 - 16 - 20 - - - 69 - 70 - 41 - - - - - - - mode - parent_id - - - 12 - - - 2929 - 2930 - 20 - - - 4460 - 4461 - 20 - - - 12530 - 12531 - 20 - - - 18196 - 18197 - 20 - - - 22552 - 22553 - 20 - - - 829094 - 829095 - 20 - - - - - - - mode - unbound_id - - - 12 - - - 2889 - 2890 - 20 - - - 4031 - 4032 - 20 - - - 12465 - 12466 - 20 - - - 22552 - 22553 - 20 - - - 24088 - 24089 - 20 - - - 1156970 - 1156971 - 20 - - - - - - - parent_id - id - - - 12 - - - 1 - 2 - 9861816 - - - 2 - 3 - 4448724 - - - 3 - 4 - 1719854 - - - 4 - 8 - 1312173 - - - 8 - 70 - 131620 - - - - - - - parent_id - name - - - 12 - - - 1 - 2 - 9861795 - - - 2 - 3 - 4448724 - - - 3 - 4 - 1719854 - - - 4 - 8 - 1312194 - - - 8 - 70 - 131620 - - - - - - - parent_id - type_id - - - 12 - - - 1 - 2 - 10470044 - - - 2 - 3 - 4359859 - - - 3 - 4 - 1575867 - - - 4 - 43 - 1068417 - - - - - - - parent_id - index - - - 12 - - - 1 - 2 - 9861816 - - - 2 - 3 - 4448724 - - - 3 - 4 - 1719854 - - - 4 - 8 - 1312173 - - - 8 - 70 - 131620 - - - - - - - parent_id - mode - - - 12 - - - 1 - 2 - 16675453 - - - 2 - 5 - 798735 - - - - - - - parent_id - unbound_id - - - 12 - - - 1 - 2 - 9861816 - - - 2 - 3 - 4448724 - - - 3 - 4 - 1719854 - - - 4 - 8 - 1312173 - - - 8 - 70 - 131620 - - - - - - - unbound_id - id - - - 12 - - - 1 - 2 - 24344223 - - - 2 - 21044 - 819331 - - - - - - - unbound_id - name - - - 12 - - - 1 - 2 - 25163493 - - - 2 - 3 - 61 - - - - - - - unbound_id - type_id - - - 12 - - - 1 - 2 - 24924140 - - - 2 - 11733 - 239415 - - - - - - - unbound_id - index - - - 12 - - - 1 - 2 - 25163555 - - - - - - - unbound_id - mode - - - 12 - - - 1 - 2 - 25163534 - - - 2 - 3 - 20 - - - - - - - unbound_id - parent_id - - - 12 - - - 1 - 2 - 24344223 - - - 2 - 21044 - 819331 - - - - - - - - - param_location - 32044103 - - - id - 31456264 - - - loc - 9114 - - - - - id - loc - - - 12 - - - 1 - 2 - 31081793 - - - 2 - 283 - 374471 - - - - - - - loc - id - - - 12 - - - 1 - 24 - 699 - - - 24 - 64 - 720 - - - 65 - 111 - 699 - - - 111 - 197 - 699 - - - 199 - 289 - 699 - - - 295 - 459 - 699 - - - 464 - 683 - 699 - - - 698 - 1090 - 699 - - - 1100 - 1496 - 699 - - - 1518 - 2241 - 699 - - - 2322 - 4037 - 699 - - - 4172 - 10844 - 699 - - - 11544 - 122370 - 699 - - - - - - - - - scoped_annotation - 382475 - - - id - 382475 - - - kind - 20 - - - - - id - kind - - - 12 - - - 1 - 2 - 382475 - - - - - - - kind - id - - - 12 - - - 18589 - 18590 - 20 - - - - - - - - - statements - 3047725 - - - id - 3047725 - - - kind - 54 - - - - - id - kind - - - 12 - - - 1 - 2 - 3047725 - - - - - - - kind - id - - - 12 - - - 6 - 109 - 3 - - - 145 - 245 - 3 - - - 347 - 366 - 3 - - - 469 - 613 - 3 - - - 862 - 1025 - 3 - - - 1165 - 1263 - 3 - - - 1846 - 1883 - 3 - - - 2826 - 4737 - 3 - - - 5360 - 5866 - 3 - - - 6322 - 6522 - 3 - - - 11476 - 12650 - 3 - - - 34119 - 52069 - 3 - - - 70449 - 144614 - 3 - - - 205916 - 207348 - 3 - - - 441782 - 466315 - 3 - - - - - - - - - stmt_parent - 2600410 - - - stmt - 2600410 - - - index - 6148 - - - parent - 1245017 - - - - - stmt - index - - - 12 - - - 1 - 2 - 2600410 - - - - - - - stmt - parent - - - 12 - - - 1 - 2 - 2600410 - - - - - - - index - stmt - - - 12 - - - 1 - 2 - 1544 - - - 3 - 4 - 1155 - - - 4 - 5 - 564 - - - 5 - 6 - 50 - - - 6 - 7 - 927 - - - 7 - 9 - 512 - - - 9 - 54 - 476 - - - 54 - 79 - 490 - - - 79 - 442744 - 425 - - - - - - - index - parent - - - 12 - - - 1 - 2 - 1544 - - - 3 - 4 - 1155 - - - 4 - 5 - 564 - - - 5 - 6 - 50 - - - 6 - 7 - 927 - - - 7 - 9 - 512 - - - 9 - 54 - 476 - - - 54 - 79 - 490 - - - 79 - 442744 - 425 - - - - - - - parent - stmt - - - 12 - - - 1 - 2 - 802470 - - - 2 - 3 - 236411 - - - 3 - 4 - 77802 - - - 4 - 9 - 99408 - - - 9 - 3407 - 28925 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 802470 - - - 2 - 3 - 236411 - - - 3 - 4 - 77802 - - - 4 - 9 - 99408 - - - 9 - 3407 - 28925 - - - - - - - - - stmt_parent_top_level - 447315 - - - stmt - 447315 - - - index - 1 - - - parent - 422460 - - - - - stmt - index - - - 12 - - - 1 - 2 - 447315 - - - - - - - stmt - parent - - - 12 - - - 1 - 2 - 447315 - - - - - - - index - stmt - - - 12 - - - 247851 - 247852 - 1 - - - - - - - index - parent - - - 12 - - - 234079 - 234080 - 1 - - - - - - - parent - stmt - - - 12 - - - 1 - 2 - 399519 - - - 2 - 5 - 22940 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 422460 - - - - - - - - - stmt_location - 3047718 - - - id - 3047718 - - - loc - 2947201 - - - - - id - loc - - - 12 - - - 1 - 2 - 3047718 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 2852104 - - - 2 - 5 - 95097 - - - - - - - - - catch_type - 30233 - - - catch_id - 30233 - - - type_id - 1460 - - - kind - 22 - - - - - catch_id - type_id - - - 12 - - - 1 - 2 - 30233 - - - - - - - catch_id - kind - - - 12 - - - 1 - 2 - 30233 - - - - - - - type_id - catch_id - - - 12 - - - 1 - 2 - 384 - - - 2 - 3 - 169 - - - 3 - 4 - 135 - - - 4 - 6 - 124 - - - 6 - 9 - 113 - - - 10 - 14 - 113 - - - 14 - 23 - 124 - - - 23 - 54 - 113 - - - 55 - 84 - 124 - - - 87 - 586 - 56 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 1460 - - - - - - - kind - catch_id - - - 12 - - - 69 - 70 - 11 - - - 2602 - 2603 - 11 - - - - - - - kind - type_id - - - 12 - - - 1 - 2 - 11 - - - 128 - 129 - 11 - - - - - - - - - foreach_stmt_info - 32428 - - - id - 32428 - - - kind - 11 - - - - - id - kind - - - 12 - - - 1 - 2 - 32428 - - - - - - - kind - id - - - 12 - - - 2865 - 2866 - 11 - - - - - - - - - foreach_stmt_desugar - 162110 - - - id - 32428 - - - symbol - 19966 - - - kind - 56 - - - - - id - symbol - - - 12 - - - 4 - 5 - 33 - - - 5 - 6 - 32394 - - - - - - - id - kind - - - 12 - - - 4 - 5 - 33 - - - 5 - 6 - 32394 - - - - - - - symbol - id - - - 12 - - - 1 - 2 - 8908 - - - 2 - 3 - 3429 - - - 3 - 4 - 1924 - - - 4 - 5 - 1675 - - - 5 - 8 - 1799 - - - 8 - 17 - 1539 - - - 17 - 2863 - 690 - - - - - - - symbol - kind - - - 12 - - - 1 - 2 - 19966 - - - - - - - kind - id - - - 12 - - - 2862 - 2863 - 11 - - - 2865 - 2866 - 45 - - - - - - - kind - symbol - - - 12 - - - 1 - 2 - 11 - - - 275 - 276 - 11 - - - 437 - 438 - 11 - - - 489 - 490 - 11 - - - 562 - 563 - 11 - - - - - - - - - expressions - 12065274 - - - id - 12065274 - - - kind - 282 - - - type_id - 95429 - - - - - id - kind - - - 12 - - - 1 - 2 - 12065274 - - - - - - - id - type_id - - - 12 - - - 1 - 2 - 12065274 - - - - - - - kind - id - - - 12 - - - 1 - 37 - 25 - - - 47 - 133 - 23 - - - 134 - 544 - 23 - - - 570 - 985 - 23 - - - 1041 - 1502 - 23 - - - 1512 - 1811 - 23 - - - 1901 - 3636 - 23 - - - 4438 - 6455 - 23 - - - 7058 - 14022 - 23 - - - 14452 - 28402 - 23 - - - 32648 - 169673 - 23 - - - 172052 - 1144418 - 23 - - - - - - - kind - type_id - - - 12 - - - 1 - 2 - 91 - - - 2 - 7 - 25 - - - 8 - 12 - 23 - - - 12 - 27 - 23 - - - 29 - 102 - 23 - - - 162 - 320 - 23 - - - 320 - 863 - 23 - - - 915 - 4194 - 23 - - - 4905 - 13903 - 23 - - - 16571 - 16572 - 2 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 19361 - - - 2 - 3 - 13919 - - - 3 - 4 - 5455 - - - 4 - 5 - 8090 - - - 5 - 7 - 7637 - - - 7 - 11 - 8729 - - - 11 - 17 - 7698 - - - 17 - 30 - 7273 - - - 30 - 60 - 7182 - - - 60 - 238 - 7161 - - - 238 - 919701 - 2916 - - - - - - - type_id - kind - - - 12 - - - 1 - 2 - 34716 - - - 2 - 3 - 21172 - - - 3 - 4 - 11492 - - - 4 - 5 - 6989 - - - 5 - 6 - 5465 - - - 6 - 8 - 6872 - - - 8 - 13 - 7208 - - - 13 - 60 - 1512 - - - - - - - - - expr_parent - 11682627 - - - expr - 11682627 - - - index - 40690 - - - parent - 7823161 - - - - - expr - index - - - 12 - - - 1 - 2 - 11682627 - - - - - - - expr - parent - - - 12 - - - 1 - 2 - 11682627 - - - - - - - index - expr - - - 12 - - - 2 - 3 - 1 - - - 4 - 5 - 21177 - - - 5 - 6 - 6394 - - - 6 - 9 - 3219 - - - 10 - 11 - 5955 - - - 11 - 66 - 3059 - - - 66 - 3205889 - 882 - - - - - - - index - parent - - - 12 - - - 2 - 3 - 1 - - - 4 - 5 - 21177 - - - 5 - 6 - 6394 - - - 6 - 9 - 3219 - - - 10 - 11 - 5955 - - - 11 - 66 - 3059 - - - 66 - 3205889 - 882 - - - - - - - parent - expr - - - 12 - - - 1 - 2 - 5080905 - - - 2 - 3 - 2351683 - - - 3 - 22534 - 390573 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 5080905 - - - 2 - 3 - 2351683 - - - 3 - 22534 - 390573 - - - - - - - - - expr_parent_top_level - 6487352 - - - expr - 6487352 - - - index - 288 - - - parent - 4784226 - - - - - expr - index - - - 12 - - - 1 - 2 - 6487352 - - - - - - - expr - parent - - - 12 - - - 1 - 2 - 6487352 - - - - - - - index - expr - - - 12 - - - 3 - 4 - 20 - - - 311 - 312 - 20 - - - 1372 - 1373 - 20 - - - 1391 - 1392 - 20 - - - 1528 - 1529 - 20 - - - 1702 - 1703 - 20 - - - 1867 - 1868 - 20 - - - 4112 - 4113 - 20 - - - 5735 - 5736 - 20 - - - 7848 - 7849 - 20 - - - 9279 - 9280 - 20 - - - 15335 - 15336 - 20 - - - 31901 - 31902 - 20 - - - 232913 - 232914 - 20 - - - - - - - index - parent - - - 12 - - - 3 - 4 - 20 - - - 311 - 312 - 20 - - - 1372 - 1373 - 20 - - - 1391 - 1392 - 20 - - - 1528 - 1529 - 20 - - - 1702 - 1703 - 20 - - - 1867 - 1868 - 20 - - - 4112 - 4113 - 20 - - - 5735 - 5736 - 20 - - - 7848 - 7849 - 20 - - - 9279 - 9280 - 20 - - - 15335 - 15336 - 20 - - - 31901 - 31902 - 20 - - - 232522 - 232523 - 20 - - - - - - - parent - expr - - - 12 - - - 1 - 2 - 4124209 - - - 2 - 3 - 343485 - - - 3 - 15 - 316531 - - - - - - - parent - index - - - 12 - - - 1 - 2 - 4127851 - - - 2 - 3 - 340851 - - - 3 - 15 - 315523 - - - - - - - - - implicitly_typed_array_creation - 21805 - - - id - 21805 - - - - - - explicitly_sized_array_creation - 13319 - - - id - 13319 - - - - - - stackalloc_array_creation - 2321 - - - id - 2321 - - - - - - implicitly_typed_object_creation - 14530 - - - id - 14530 - - - - - - mutator_invocation_mode - 14 - - - id - 14 - - - mode - 4 - - - - - id - mode - - - 12 - - - 1 - 2 - 14 - - - - - - - mode - id - - - 12 - - - 2 - 3 - 2 - - - 4 - 5 - 2 - - - - - - - - - expr_compiler_generated - 12064553 - - - id - 12064553 - - - - - - expr_value - 8310351 - - - id - 8310351 - - - value - 718800 - - - - - id - value - - - 12 - - - 1 - 2 - 8310351 - - - - - - - value - id - - - 12 - - - 1 - 2 - 505578 - - - 2 - 3 - 110654 - - - 3 - 4 - 55368 - - - 4 - 80631 - 47199 - - - - - - - - - expr_call - 1966123 - - - caller_id - 1966123 - - - target_id - 257171 - - - - - caller_id - target_id - - - 12 - - - 1 - 2 - 1966123 - - - - - - - target_id - caller_id - - - 12 - - - 1 - 2 - 137518 - - - 2 - 3 - 51107 - - - 3 - 4 - 19300 - - - 4 - 6 - 19323 - - - 6 - 15 - 19385 - - - 15 - 46132 - 10536 - - - - - - - - - expr_access - 4484304 - - - accesser_id - 4484304 - - - target_id - 1084863 - - - - - accesser_id - target_id - - - 12 - - - 1 - 2 - 4484304 - - - - - - - target_id - accesser_id - - - 12 - - - 1 - 2 - 361965 - - - 2 - 3 - 236660 - - - 3 - 4 - 166914 - - - 4 - 5 - 102379 - - - 5 - 7 - 99569 - - - 7 - 15 - 84375 - - - 15 - 15109 - 32998 - - - - - - - - - expr_location - 12065274 - - - id - 12065274 - - - loc - 7880074 - - - - - id - loc - - - 12 - - - 1 - 2 - 12065274 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 6971739 - - - 2 - 3 - 852056 - - - 3 - 163205 - 56279 - - - - - - - - - dynamic_member_name - 22330 - - - id - 22330 - - - name - 2023 - - - - - id - name - - - 12 - - - 1 - 2 - 22330 - - - - - - - name - id - - - 12 - - - 1 - 2 - 620 - - - 2 - 3 - 310 - - - 3 - 4 - 229 - - - 4 - 5 - 168 - - - 5 - 7 - 168 - - - 7 - 11 - 155 - - - 11 - 22 - 155 - - - 22 - 52 - 155 - - - 61 - 437 - 60 - - - - - - - - - conditional_access - 11568 - - - id - 11568 - - - - - - expr_argument - 1774394 - - - id - 1774394 - - - mode - 75 - - - - - id - mode - - - 12 - - - 1 - 2 - 1774394 - - - - - - - mode - id - - - 12 - - - 954 - 955 - 25 - - - 1083 - 1084 - 25 - - - 68133 - 68134 - 25 - - - - - - - - - expr_argument_name - 840195 - - - id - 840195 - - - name - 4732 - - - - - id - name - - - 12 - - - 1 - 2 - 840195 - - - - - - - name - id - - - 12 - - - 1 - 2 - 514 - - - 2 - 3 - 390 - - - 3 - 5 - 390 - - - 5 - 8 - 370 - - - 8 - 12 - 349 - - - 12 - 19 - 432 - - - 19 - 27 - 370 - - - 27 - 57 - 370 - - - 57 - 112 - 432 - - - 130 - 202 - 370 - - - 202 - 478 - 370 - - - 602 - 4039 - 370 - - - - - - - - - lambda_expr_return_type - 92 - - - id - 92 - - - type_id - 37 - - - - - id - type_id - - - 12 - - - 1 - 2 - 92 - - - - - - - type_id - id - - - 12 - - - 1 - 2 - 7 - - - 2 - 3 - 17 - - - 3 - 4 - 5 - - - 4 - 5 - 5 - - - 6 - 7 - 2 - - - - - - - - - xmlEncoding - 51263 - - - id - 51263 - - - encoding - 2 - - - - - id - encoding - - - 12 - - - 1 - 2 - 51263 - - - - - - - encoding - id - - - 12 - - - 20448 - 20449 - 2 - - - - - - - - - xmlDTDs - 72 - - - id - 72 - - - root - 21 - - - publicId - 5 - - - systemId - 18 - - - fileid - 72 - - - - - id - root - - - 12 - - - 1 - 2 - 72 - - - - - - - id - publicId - - - 12 - - - 1 - 2 - 72 - - - - - - - id - systemId - - - 12 - - - 1 - 2 - 72 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 72 - - - - - - - root - id - - - 12 - - - 1 - 2 - 10 - - - 2 - 3 - 3 - - - 3 - 4 - 3 - - - 4 - 5 - 1 - - - 20 - 21 - 1 - - - - - - - root - publicId - - - 12 - - - 1 - 2 - 21 - - - - - - - root - systemId - - - 12 - - - 1 - 2 - 19 - - - 2 - 3 - 1 - - - - - - - root - fileid - - - 12 - - - 1 - 2 - 10 - - - 2 - 3 - 3 - - - 3 - 4 - 3 - - - 4 - 5 - 1 - - - 20 - 21 - 1 - - - - - - - publicId - id - - - 12 - - - 3 - 4 - 1 - - - 4 - 5 - 1 - - - 33 - 34 - 1 - - - - - - - publicId - root - - - 12 - - - 1 - 2 - 3 - - - 10 - 11 - 1 - - - - - - - publicId - systemId - - - 12 - - - 1 - 2 - 3 - - - 8 - 9 - 1 - - - - - - - publicId - fileid - - - 12 - - - 3 - 4 - 1 - - - 4 - 5 - 1 - - - 33 - 34 - 1 - - - - - - - systemId - id - - - 12 - - - 1 - 2 - 9 - - - 3 - 4 - 3 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - 20 - 21 - 1 - - - - - - - systemId - root - - - 12 - - - 1 - 2 - 16 - - - 4 - 5 - 1 - - - - - - - systemId - publicId - - - 12 - - - 1 - 2 - 18 - - - - - - - systemId - fileid - - - 12 - - - 1 - 2 - 9 - - - 3 - 4 - 3 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - 20 - 21 - 1 - - - - - - - fileid - id - - - 12 - - - 1 - 2 - 72 - - - - - - - fileid - root - - - 12 - - - 1 - 2 - 72 - - - - - - - fileid - publicId - - - 12 - - - 1 - 2 - 72 - - - - - - - fileid - systemId - - - 12 - - - 1 - 2 - 72 - - - - - - - - - xmlElements - 67055539 - - - id - 67055539 - - - name - 5081 - - - parentid - 27349180 - - - idx - 78608 - - - fileid - 51258 - - - - - id - name - - - 12 - - - 1 - 2 - 67055539 - - - - - - - id - parentid - - - 12 - - - 1 - 2 - 67055539 - - - - - - - id - idx - - - 12 - - - 1 - 2 - 67055539 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 67055539 - - - - - - - name - id - - - 12 - - - 1 - 2 - 2522 - - - 2 - 3 - 729 - - - 3 - 4 - 230 - - - 4 - 6 - 386 - - - 6 - 18 - 393 - - - 18 - 45 - 383 - - - 45 - 23438 - 383 - - - 29236 - 5652342 - 52 - - - - - - - name - parentid - - - 12 - - - 1 - 2 - 2890 - - - 2 - 3 - 631 - - - 3 - 5 - 411 - - - 5 - 16 - 391 - - - 16 - 48 - 383 - - - 48 - 4842281 - 373 - - - - - - - name - idx - - - 12 - - - 1 - 2 - 3407 - - - 2 - 3 - 787 - - - 3 - 5 - 396 - - - 5 - 20 - 386 - - - 20 - 31356 - 105 - - - - - - - name - fileid - - - 12 - - - 1 - 2 - 3086 - - - 2 - 3 - 579 - - - 3 - 5 - 416 - - - 5 - 17 - 393 - - - 17 - 71 - 383 - - - 75 - 18136 - 223 - - - - - - - parentid - id - - - 12 - - - 1 - 2 - 16073753 - - - 2 - 3 - 5276115 - - - 3 - 4 - 2404943 - - - 4 - 6 - 2304967 - - - 6 - 31356 - 1289399 - - - - - - - parentid - name - - - 12 - - - 1 - 2 - 19031401 - - - 2 - 3 - 4596698 - - - 3 - 4 - 2298745 - - - 4 - 121 - 1422335 - - - - - - - parentid - idx - - - 12 - - - 1 - 2 - 16073753 - - - 2 - 3 - 5276115 - - - 3 - 4 - 2404943 - - - 4 - 6 - 2304967 - - - 6 - 31356 - 1289399 - - - - - - - parentid - fileid - - - 12 - - - 1 - 2 - 27349180 - - - - - - - idx - id - - - 12 - - - 1 - 2 - 35499 - - - 2 - 4 - 6999 - - - 4 - 11 - 4863 - - - 12 - 15 - 3316 - - - 15 - 24 - 6202 - - - 25 - 42 - 5954 - - - 43 - 64 - 5914 - - - 64 - 506 - 5901 - - - 506 - 10908964 - 3956 - - - - - - - idx - name - - - 12 - - - 1 - 2 - 77665 - - - 2 - 820 - 942 - - - - - - - idx - parentid - - - 12 - - - 1 - 2 - 35499 - - - 2 - 4 - 6999 - - - 4 - 11 - 4863 - - - 12 - 15 - 3316 - - - 15 - 24 - 6202 - - - 25 - 42 - 5954 - - - 43 - 64 - 5914 - - - 64 - 506 - 5901 - - - 506 - 10908964 - 3956 - - - - - - - idx - fileid - - - 12 - - - 1 - 2 - 35499 - - - 2 - 4 - 6999 - - - 4 - 11 - 4863 - - - 12 - 15 - 3316 - - - 15 - 24 - 6202 - - - 25 - 42 - 5954 - - - 43 - 64 - 5914 - - - 64 - 506 - 5901 - - - 506 - 20447 - 3956 - - - - - - - fileid - id - - - 12 - - - 1 - 15 - 4344 - - - 15 - 54 - 3951 - - - 54 - 103 - 3991 - - - 103 - 172 - 4379 - - - 173 - 236 - 4048 - - - 237 - 351 - 4562 - - - 351 - 564 - 3885 - - - 564 - 804 - 3850 - - - 806 - 996 - 4221 - - - 997 - 1436 - 4329 - - - 1441 - 2336 - 3860 - - - 2342 - 5717 - 3848 - - - 5804 - 173229 - 1983 - - - - - - - fileid - name - - - 12 - - - 1 - 7 - 4620 - - - 7 - 11 - 4139 - - - 11 - 12 - 5811 - - - 12 - 13 - 4279 - - - 13 - 14 - 5981 - - - 14 - 15 - 7167 - - - 15 - 16 - 4580 - - - 16 - 17 - 4016 - - - 17 - 19 - 4615 - - - 19 - 24 - 4269 - - - 24 - 240 - 1777 - - - - - - - fileid - parentid - - - 12 - - - 1 - 6 - 4166 - - - 6 - 19 - 3973 - - - 19 - 48 - 3855 - - - 48 - 72 - 3928 - - - 72 - 94 - 4209 - - - 94 - 142 - 3850 - - - 142 - 208 - 3921 - - - 209 - 314 - 4374 - - - 314 - 426 - 3848 - - - 426 - 585 - 3848 - - - 592 - 903 - 3845 - - - 904 - 1647 - 3905 - - - 1647 - 45210 - 3529 - - - - - - - fileid - idx - - - 12 - - - 1 - 6 - 3921 - - - 6 - 13 - 3858 - - - 13 - 28 - 3966 - - - 28 - 41 - 3665 - - - 41 - 48 - 4149 - - - 48 - 67 - 3860 - - - 67 - 96 - 3926 - - - 96 - 152 - 3983 - - - 152 - 199 - 3850 - - - 199 - 283 - 4713 - - - 283 - 386 - 3858 - - - 386 - 762 - 4061 - - - 763 - 31356 - 3444 - - - - - - - - - xmlAttrs - 45628904 - - - id - 45628904 - - - elementid - 45269560 - - - name - 1208 - - - value - 1023272 - - - idx - 32 - - - fileid - 50822 - - - - - id - elementid - - - 12 - - - 1 - 2 - 45628904 - - - - - - - id - name - - - 12 - - - 1 - 2 - 45628904 - - - - - - - id - value - - - 12 - - - 1 - 2 - 45628904 - - - - - - - id - idx - - - 12 - - - 1 - 2 - 45628904 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 45628904 - - - - - - - elementid - id - - - 12 - - - 1 - 2 - 45077900 - - - 2 - 14 - 191660 - - - - - - - elementid - name - - - 12 - - - 1 - 2 - 45077900 - - - 2 - 14 - 191660 - - - - - - - elementid - value - - - 12 - - - 1 - 2 - 45078108 - - - 2 - 13 - 191452 - - - - - - - elementid - idx - - - 12 - - - 1 - 2 - 45077900 - - - 2 - 14 - 191660 - - - - - - - elementid - fileid - - - 12 - - - 1 - 2 - 45269560 - - - - - - - name - id - - - 12 - - - 1 - 2 - 120 - - - 2 - 3 - 145 - - - 3 - 4 - 75 - - - 4 - 5 - 92 - - - 5 - 9 - 102 - - - 9 - 17 - 107 - - - 17 - 23 - 100 - - - 23 - 37 - 95 - - - 38 - 51 - 95 - - - 51 - 126 - 95 - - - 126 - 1237 - 92 - - - 1288 - 11202688 - 85 - - - - - - - name - elementid - - - 12 - - - 1 - 2 - 120 - - - 2 - 3 - 145 - - - 3 - 4 - 75 - - - 4 - 5 - 92 - - - 5 - 9 - 102 - - - 9 - 17 - 107 - - - 17 - 23 - 100 - - - 23 - 37 - 95 - - - 38 - 51 - 95 - - - 51 - 126 - 95 - - - 126 - 1237 - 92 - - - 1288 - 11202688 - 85 - - - - - - - name - value - - - 12 - - - 1 - 2 - 554 - - - 2 - 3 - 172 - - - 3 - 4 - 92 - - - 4 - 6 - 82 - - - 6 - 10 - 110 - - - 10 - 20 - 100 - - - 23 - 47718 - 92 - - - 389503 - 389504 - 2 - - - - - - - name - idx - - - 12 - - - 1 - 2 - 842 - - - 2 - 3 - 245 - - - 3 - 5 - 110 - - - 5 - 7 - 10 - - - - - - - name - fileid - - - 12 - - - 1 - 2 - 358 - - - 2 - 3 - 205 - - - 3 - 4 - 50 - - - 4 - 5 - 130 - - - 5 - 10 - 95 - - - 10 - 19 - 97 - - - 19 - 27 - 110 - - - 27 - 96 - 92 - - - 96 - 18200 - 67 - - - - - - - value - id - - - 12 - - - 1 - 2 - 172777 - - - 2 - 3 - 292834 - - - 3 - 4 - 91955 - - - 4 - 5 - 61901 - - - 5 - 6 - 46741 - - - 6 - 8 - 84359 - - - 8 - 13 - 89335 - - - 13 - 37 - 77108 - - - 37 - 165 - 77294 - - - 165 - 509314 - 28963 - - - - - - - value - elementid - - - 12 - - - 1 - 2 - 172792 - - - 2 - 3 - 292844 - - - 3 - 4 - 91950 - - - 4 - 5 - 61908 - - - 5 - 6 - 46751 - - - 6 - 8 - 84366 - - - 8 - 13 - 89315 - - - 13 - 37 - 77083 - - - 37 - 165 - 77294 - - - 165 - 509314 - 28963 - - - - - - - value - name - - - 12 - - - 1 - 2 - 914005 - - - 2 - 3 - 108644 - - - 3 - 79 - 621 - - - - - - - value - idx - - - 12 - - - 1 - 2 - 1021432 - - - 2 - 11 - 1840 - - - - - - - value - fileid - - - 12 - - - 1 - 2 - 186355 - - - 2 - 3 - 344083 - - - 3 - 4 - 95269 - - - 4 - 5 - 44923 - - - 5 - 6 - 51597 - - - 6 - 8 - 77921 - - - 8 - 15 - 82373 - - - 15 - 68 - 77986 - - - 68 - 10155 - 62761 - - - - - - - idx - id - - - 12 - - - 18 - 19 - 2 - - - 25 - 26 - 2 - - - 53 - 54 - 2 - - - 66 - 67 - 2 - - - 80 - 81 - 2 - - - 167 - 168 - 2 - - - 488 - 489 - 2 - - - 3298 - 3299 - 2 - - - 3710 - 3711 - 2 - - - 5951 - 5952 - 2 - - - 53029 - 53030 - 2 - - - 76449 - 76450 - 2 - - - 18056993 - 18056994 - 2 - - - - - - - idx - elementid - - - 12 - - - 18 - 19 - 2 - - - 25 - 26 - 2 - - - 53 - 54 - 2 - - - 66 - 67 - 2 - - - 80 - 81 - 2 - - - 167 - 168 - 2 - - - 488 - 489 - 2 - - - 3298 - 3299 - 2 - - - 3710 - 3711 - 2 - - - 5951 - 5952 - 2 - - - 53029 - 53030 - 2 - - - 76449 - 76450 - 2 - - - 18056993 - 18056994 - 2 - - - - - - - idx - name - - - 12 - - - 1 - 2 - 2 - - - 2 - 3 - 2 - - - 4 - 5 - 2 - - - 6 - 7 - 5 - - - 10 - 11 - 2 - - - 23 - 24 - 2 - - - 33 - 34 - 2 - - - 51 - 52 - 2 - - - 86 - 87 - 2 - - - 140 - 141 - 2 - - - 155 - 156 - 2 - - - 181 - 182 - 2 - - - - - - - idx - value - - - 12 - - - 2 - 3 - 2 - - - 6 - 7 - 2 - - - 10 - 11 - 2 - - - 17 - 18 - 2 - - - 19 - 20 - 2 - - - 27 - 28 - 2 - - - 35 - 36 - 2 - - - 69 - 70 - 2 - - - 117 - 118 - 2 - - - 206 - 207 - 2 - - - 733 - 734 - 2 - - - 3245 - 3246 - 2 - - - 404557 - 404558 - 2 - - - - - - - idx - fileid - - - 12 - - - 1 - 2 - 2 - - - 2 - 3 - 2 - - - 3 - 4 - 5 - - - 7 - 8 - 2 - - - 31 - 32 - 2 - - - 51 - 52 - 2 - - - 73 - 74 - 2 - - - 126 - 127 - 2 - - - 582 - 583 - 2 - - - 1889 - 1890 - 2 - - - 3098 - 3099 - 2 - - - 20272 - 20273 - 2 - - - - - - - fileid - id - - - 12 - - - 1 - 12 - 3988 - - - 12 - 34 - 4169 - - - 34 - 64 - 3853 - - - 64 - 109 - 4595 - - - 110 - 165 - 4071 - - - 165 - 228 - 3848 - - - 228 - 406 - 3805 - - - 407 - 464 - 4289 - - - 465 - 654 - 3893 - - - 656 - 873 - 3953 - - - 873 - 1602 - 3833 - - - 1605 - 3016 - 3845 - - - 3021 - 96503 - 2675 - - - - - - - fileid - elementid - - - 12 - - - 1 - 10 - 3850 - - - 10 - 30 - 3915 - - - 30 - 61 - 3835 - - - 61 - 105 - 3923 - - - 105 - 146 - 4083 - - - 146 - 221 - 3820 - - - 222 - 343 - 3820 - - - 343 - 446 - 3815 - - - 446 - 623 - 3823 - - - 623 - 788 - 4570 - - - 789 - 1329 - 4384 - - - 1334 - 2799 - 3878 - - - 2814 - 96503 - 3098 - - - - - - - fileid - name - - - 12 - - - 1 - 2 - 3123 - - - 2 - 3 - 19559 - - - 3 - 4 - 13086 - - - 4 - 5 - 6159 - - - 5 - 6 - 4693 - - - 6 - 11 - 3873 - - - 11 - 71 - 325 - - - - - - - fileid - value - - - 12 - - - 1 - 10 - 3838 - - - 10 - 27 - 4078 - - - 27 - 43 - 4199 - - - 43 - 61 - 4266 - - - 61 - 79 - 4354 - - - 79 - 116 - 4322 - - - 116 - 180 - 3895 - - - 181 - 237 - 4154 - - - 237 - 315 - 4031 - - - 316 - 419 - 3858 - - - 422 - 600 - 3833 - - - 601 - 1116 - 3865 - - - 1117 - 31691 - 2123 - - - - - - - fileid - idx - - - 12 - - - 1 - 2 - 43055 - - - 2 - 3 - 3031 - - - 3 - 5 - 4419 - - - 5 - 14 - 315 - - - - - - - - - xmlNs - 7710 - - - id - 429 - - - prefixName - 209 - - - URI - 429 - - - fileid - 5340 - - - - - id - prefixName - - - 12 - - - 1 - 2 - 369 - - - 2 - 3 - 43 - - - 3 - 5 - 16 - - - - - - - id - URI - - - 12 - - - 1 - 2 - 429 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 216 - - - 2 - 3 - 39 - - - 3 - 4 - 30 - - - 4 - 6 - 30 - - - 6 - 10 - 32 - - - 10 - 23 - 32 - - - 26 - 53 - 32 - - - 60 - 1917 - 14 - - - - - - - prefixName - id - - - 12 - - - 1 - 2 - 167 - - - 2 - 3 - 19 - - - 3 - 7 - 16 - - - 7 - 113 - 5 - - - - - - - prefixName - URI - - - 12 - - - 1 - 2 - 167 - - - 2 - 3 - 19 - - - 3 - 7 - 16 - - - 7 - 113 - 5 - - - - - - - prefixName - fileid - - - 12 - - - 1 - 2 - 99 - - - 2 - 3 - 23 - - - 3 - 4 - 18 - - - 4 - 8 - 16 - - - 8 - 23 - 18 - - - 26 - 27 - 18 - - - 27 - 2848 - 16 - - - - - - - URI - id - - - 12 - - - 1 - 2 - 429 - - - - - - - URI - prefixName - - - 12 - - - 1 - 2 - 369 - - - 2 - 3 - 43 - - - 3 - 5 - 16 - - - - - - - URI - fileid - - - 12 - - - 1 - 2 - 216 - - - 2 - 3 - 39 - - - 3 - 4 - 30 - - - 4 - 6 - 30 - - - 6 - 10 - 32 - - - 10 - 23 - 32 - - - 26 - 53 - 32 - - - 60 - 1917 - 14 - - - - - - - fileid - id - - - 12 - - - 1 - 2 - 4589 - - - 2 - 4 - 420 - - - 4 - 21 - 330 - - - - - - - fileid - prefixName - - - 12 - - - 1 - 2 - 4620 - - - 2 - 3 - 323 - - - 3 - 21 - 397 - - - - - - - fileid - URI - - - 12 - - - 1 - 2 - 4589 - - - 2 - 4 - 420 - - - 4 - 21 - 330 - - - - - - - - - xmlHasNs - 357558 - - - elementId - 357558 - - - nsId - 61 - - - fileid - 1851 - - - - - elementId - nsId - - - 12 - - - 1 - 2 - 357558 - - - - - - - elementId - fileid - - - 12 - - - 1 - 2 - 357558 - - - - - - - nsId - elementId - - - 12 - - - 280 - 281 - 20 - - - 306 - 307 - 20 - - - 16792 - 16793 - 20 - - - - - - - nsId - fileid - - - 12 - - - 3 - 4 - 20 - - - 12 - 13 - 20 - - - 75 - 76 - 20 - - - - - - - fileid - elementId - - - 12 - - - 3 - 4 - 20 - - - 4 - 5 - 205 - - - 7 - 9 - 144 - - - 9 - 14 - 144 - - - 18 - 25 - 144 - - - 35 - 52 - 144 - - - 52 - 73 - 164 - - - 74 - 90 - 144 - - - 95 - 121 - 164 - - - 128 - 155 - 144 - - - 156 - 227 - 144 - - - 233 - 429 - 144 - - - 577 - 6115 - 144 - - - - - - - fileid - nsId - - - 12 - - - 1 - 2 - 1851 - - - - - - - - - xmlComments - 12809 - - - id - 12809 - - - text - 4879 - - - parentid - 9500 - - - fileid - 7255 - - - - - id - text - - - 12 - - - 1 - 2 - 12809 - - - - - - - id - parentid - - - 12 - - - 1 - 2 - 12809 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 12809 - - - - - - - text - id - - - 12 - - - 1 - 2 - 3642 - - - 2 - 3 - 774 - - - 3 - 9 - 371 - - - 10 - 567 - 91 - - - - - - - text - parentid - - - 12 - - - 1 - 2 - 3654 - - - 2 - 3 - 784 - - - 3 - 13 - 373 - - - 13 - 567 - 67 - - - - - - - text - fileid - - - 12 - - - 1 - 2 - 3687 - - - 2 - 3 - 791 - - - 3 - 20 - 366 - - - 24 - 567 - 35 - - - - - - - parentid - id - - - 12 - - - 1 - 2 - 7992 - - - 2 - 3 - 949 - - - 3 - 104 - 557 - - - - - - - parentid - text - - - 12 - - - 1 - 2 - 7997 - - - 2 - 3 - 954 - - - 3 - 99 - 548 - - - - - - - parentid - fileid - - - 12 - - - 1 - 2 - 9500 - - - - - - - fileid - id - - - 12 - - - 1 - 2 - 5210 - - - 2 - 3 - 1360 - - - 3 - 8 - 574 - - - 8 - 197 - 109 - - - - - - - fileid - text - - - 12 - - - 1 - 2 - 5581 - - - 2 - 3 - 998 - - - 3 - 8 - 569 - - - 8 - 162 - 105 - - - - - - - fileid - parentid - - - 12 - - - 1 - 2 - 5906 - - - 2 - 3 - 1059 - - - 3 - 69 - 289 - - - - - - - - - xmlChars - 50180784 - - - id - 50180784 - - - text - 1818216 - - - parentid - 31634472 - - - idx - 150 - - - isCDATA - 5 - - - fileid - 49067 - - - - - id - text - - - 12 - - - 1 - 2 - 50180784 - - - - - - - id - parentid - - - 12 - - - 1 - 2 - 50180784 - - - - - - - id - idx - - - 12 - - - 1 - 2 - 50180784 - - - - - - - id - isCDATA - - - 12 - - - 1 - 2 - 50180784 - - - - - - - id - fileid - - - 12 - - - 1 - 2 - 50180784 - - - - - - - text - id - - - 12 - - - 1 - 2 - 190086 - - - 2 - 3 - 423589 - - - 3 - 4 - 100439 - - - 4 - 5 - 177322 - - - 5 - 6 - 53806 - - - 6 - 8 - 152869 - - - 8 - 10 - 147478 - - - 10 - 12 - 103307 - - - 12 - 15 - 93299 - - - 15 - 21 - 150863 - - - 21 - 67 - 136894 - - - 67 - 1003068 - 88260 - - - - - - - text - parentid - - - 12 - - - 1 - 2 - 190221 - - - 2 - 3 - 423619 - - - 3 - 4 - 100462 - - - 4 - 5 - 177362 - - - 5 - 6 - 53816 - - - 6 - 8 - 152846 - - - 8 - 10 - 147494 - - - 10 - 12 - 103325 - - - 12 - 15 - 93372 - - - 15 - 21 - 150996 - - - 21 - 67 - 136666 - - - 67 - 1000575 - 88034 - - - - - - - text - idx - - - 12 - - - 1 - 2 - 1784454 - - - 2 - 33 - 33762 - - - - - - - text - isCDATA - - - 12 - - - 1 - 2 - 1818213 - - - 2 - 3 - 2 - - - - - - - text - fileid - - - 12 - - - 1 - 2 - 256810 - - - 2 - 3 - 492750 - - - 3 - 4 - 134141 - - - 4 - 5 - 137247 - - - 5 - 6 - 63550 - - - 6 - 8 - 148887 - - - 8 - 10 - 138656 - - - 10 - 12 - 119803 - - - 12 - 15 - 79127 - - - 15 - 20 - 138215 - - - 20 - 15105 - 109023 - - - - - - - parentid - id - - - 12 - - - 1 - 2 - 19072554 - - - 2 - 3 - 9102321 - - - 3 - 5 - 2902114 - - - 5 - 61 - 557482 - - - - - - - parentid - text - - - 12 - - - 1 - 2 - 19074795 - - - 2 - 3 - 9111041 - - - 3 - 4 - 2305313 - - - 4 - 47 - 1143321 - - - - - - - parentid - idx - - - 12 - - - 1 - 2 - 19072554 - - - 2 - 3 - 9102321 - - - 3 - 5 - 2902114 - - - 5 - 61 - 557482 - - - - - - - parentid - isCDATA - - - 12 - - - 1 - 2 - 31633875 - - - 2 - 3 - 596 - - - - - - - parentid - fileid - - - 12 - - - 1 - 2 - 31634472 - - - - - - - idx - id - - - 12 - - - 1 - 2 - 42 - - - 2 - 3 - 7 - - - 3 - 12 - 12 - - - 143 - 179 - 12 - - - 179 - 671 - 12 - - - 672 - 1026 - 12 - - - 1033 - 2152 - 12 - - - 3032 - 10769 - 12 - - - 16820 - 119828 - 12 - - - 222367 - 12618269 - 12 - - - - - - - idx - text - - - 12 - - - 1 - 2 - 42 - - - 2 - 3 - 7 - - - 3 - 9 - 12 - - - 11 - 20 - 12 - - - 23 - 48 - 12 - - - 48 - 72 - 10 - - - 76 - 119 - 12 - - - 164 - 395 - 12 - - - 487 - 2261 - 12 - - - 3391 - 137772 - 12 - - - 546508 - 546509 - 2 - - - - - - - idx - parentid - - - 12 - - - 1 - 2 - 42 - - - 2 - 3 - 7 - - - 3 - 12 - 12 - - - 143 - 179 - 12 - - - 179 - 671 - 12 - - - 672 - 1026 - 12 - - - 1033 - 2152 - 12 - - - 3032 - 10769 - 12 - - - 16820 - 119828 - 12 - - - 222367 - 12618269 - 12 - - - - - - - idx - isCDATA - - - 12 - - - 1 - 2 - 137 - - - 2 - 3 - 12 - - - - - - - idx - fileid - - - 12 - - - 1 - 2 - 42 - - - 2 - 3 - 7 - - - 3 - 9 - 12 - - - 130 - 161 - 12 - - - 161 - 306 - 7 - - - 309 - 310 - 10 - - - 318 - 485 - 12 - - - 574 - 902 - 12 - - - 1021 - 2926 - 12 - - - 3636 - 14031 - 12 - - - 16349 - 19573 - 7 - - - - - - - isCDATA - id - - - 12 - - - 8497 - 8498 - 2 - - - 20007471 - 20007472 - 2 - - - - - - - isCDATA - text - - - 12 - - - 578 - 579 - 2 - - - 724668 - 724669 - 2 - - - - - - - isCDATA - parentid - - - 12 - - - 8442 - 8443 - 2 - - - 12610064 - 12610065 - 2 - - - - - - - isCDATA - idx - - - 12 - - - 5 - 6 - 2 - - - 60 - 61 - 2 - - - - - - - isCDATA - fileid - - - 12 - - - 91 - 92 - 2 - - - 19572 - 19573 - 2 - - - - - - - fileid - id - - - 12 - - - 1 - 9 - 3773 - - - 9 - 38 - 4083 - - - 38 - 85 - 4011 - - - 88 - 131 - 3783 - - - 133 - 179 - 3765 - - - 179 - 265 - 3986 - - - 266 - 408 - 3753 - - - 409 - 578 - 3828 - - - 578 - 710 - 3895 - - - 712 - 1057 - 3690 - - - 1057 - 1658 - 3680 - - - 1664 - 3328 - 3690 - - - 3346 - 98239 - 3126 - - - - - - - fileid - text - - - 12 - - - 1 - 8 - 3883 - - - 8 - 27 - 3858 - - - 27 - 53 - 3702 - - - 53 - 70 - 4144 - - - 70 - 95 - 3941 - - - 95 - 144 - 4389 - - - 145 - 208 - 4016 - - - 208 - 310 - 4424 - - - 311 - 416 - 4287 - - - 417 - 564 - 3717 - - - 564 - 900 - 4144 - - - 901 - 2855 - 3710 - - - 2857 - 30223 - 847 - - - - - - - fileid - parentid - - - 12 - - - 1 - 9 - 3800 - - - 9 - 31 - 3690 - - - 31 - 56 - 3825 - - - 56 - 84 - 3855 - - - 84 - 111 - 3890 - - - 111 - 166 - 3938 - - - 166 - 273 - 3725 - - - 273 - 394 - 3908 - - - 395 - 509 - 4477 - - - 510 - 699 - 3750 - - - 700 - 1079 - 3697 - - - 1083 - 1973 - 3732 - - - 1984 - 61987 - 2772 - - - - - - - fileid - idx - - - 12 - - - 1 - 2 - 5663 - - - 2 - 3 - 2416 - - - 3 - 4 - 5813 - - - 4 - 5 - 10697 - - - 5 - 6 - 7972 - - - 6 - 7 - 5264 - - - 7 - 9 - 3905 - - - 9 - 12 - 4294 - - - 12 - 61 - 3038 - - - - - - - fileid - isCDATA - - - 12 - - - 1 - 2 - 48839 - - - 2 - 3 - 228 - - - - - - - - - xmllocations - 162926731 - - - xmlElement - 162922041 - - - location - 142828357 - - - - - xmlElement - location - - - 12 - - - 1 - 2 - 162921993 - - - 2 - 1057 - 47 - - - - - - - location - xmlElement - - - 12 - - - 1 - 2 - 123073773 - - - 2 - 3 - 19573590 - - - 3 - 15 - 180993 - - - - - - - - - commentline - 1860741 - - - id - 1860741 - - - kind - 33 - - - text - 694930 - - - rawtext - 701268 - - - - - id - kind - - - 12 - - - 1 - 2 - 1860741 - - - - - - - id - text - - - 12 - - - 1 - 2 - 1860741 - - - - - - - id - rawtext - - - 12 - - - 1 - 2 - 1860741 - - - - - - - kind - id - - - 12 - - - 2462 - 2463 - 11 - - - 31123 - 31124 - 11 - - - 130806 - 130807 - 11 - - - - - - - kind - text - - - 12 - - - 1003 - 1004 - 11 - - - 22421 - 22422 - 11 - - - 38180 - 38181 - 11 - - - - - - - kind - rawtext - - - 12 - - - 1088 - 1089 - 11 - - - 22533 - 22534 - 11 - - - 38334 - 38335 - 11 - - - - - - - text - id - - - 12 - - - 1 - 2 - 581264 - - - 2 - 3 - 64405 - - - 3 - 21238 - 49260 - - - - - - - text - kind - - - 12 - - - 1 - 2 - 692688 - - - 2 - 4 - 2241 - - - - - - - text - rawtext - - - 12 - - - 1 - 2 - 690719 - - - 2 - 40 - 4210 - - - - - - - rawtext - id - - - 12 - - - 1 - 2 - 588146 - - - 2 - 3 - 63714 - - - 3 - 21237 - 49407 - - - - - - - rawtext - kind - - - 12 - - - 1 - 2 - 701268 - - - - - - - rawtext - text - - - 12 - - - 1 - 2 - 701268 - - - - - - - - - commentline_location - 1860741 - - - id - 1860741 - - - loc - 1860741 - - - - - id - loc - - - 12 - - - 1 - 2 - 1860741 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 1860741 - - - - - - - - - commentblock - 452748 - - - id - 452748 - - - - - - commentblock_location - 452748 - - - id - 452748 - - - loc - 452748 - - - - - id - loc - - - 12 - - - 1 - 2 - 452748 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 452748 - - - - - - - - - commentblock_binding - 1636184 - - - id - 452748 - - - entity - 706226 - - - bindtype - 45 - - - - - id - entity - - - 12 - - - 1 - 2 - 28772 - - - 2 - 3 - 104417 - - - 3 - 4 - 319558 - - - - - - - id - bindtype - - - 12 - - - 1 - 3 - 29089 - - - 3 - 4 - 104100 - - - 4 - 5 - 319558 - - - - - - - entity - id - - - 12 - - - 1 - 2 - 498273 - - - 2 - 3 - 169535 - - - 3 - 526 - 38416 - - - - - - - entity - bindtype - - - 12 - - - 1 - 2 - 267400 - - - 2 - 3 - 275934 - - - 3 - 4 - 151312 - - - 4 - 5 - 11579 - - - - - - - bindtype - id - - - 12 - - - 29783 - 29784 - 11 - - - 36938 - 36939 - 11 - - - 38861 - 38862 - 11 - - - 38970 - 38971 - 11 - - - - - - - bindtype - entity - - - 12 - - - 12587 - 12588 - 11 - - - 29493 - 29494 - 11 - - - 36905 - 36906 - 11 - - - 37591 - 37592 - 11 - - - - - - - - - commentblock_child - 2293999 - - - id - 452748 - - - commentline - 1859983 - - - index - 3656 - - - - - id - commentline - - - 12 - - - 1 - 2 - 140797 - - - 2 - 3 - 43747 - - - 3 - 4 - 103829 - - - 4 - 5 - 35303 - - - 5 - 6 - 58462 - - - 6 - 10 - 39525 - - - 10 - 323 - 31081 - - - - - - - id - index - - - 12 - - - 1 - 2 - 4629 - - - 2 - 3 - 137322 - - - 3 - 4 - 49735 - - - 4 - 5 - 98656 - - - 5 - 6 - 34092 - - - 6 - 7 - 58213 - - - 7 - 11 - 39254 - - - 11 - 324 - 30844 - - - - - - - commentline - id - - - 12 - - - 1 - 2 - 1859983 - - - - - - - commentline - index - - - 12 - - - 1 - 2 - 1425967 - - - 2 - 3 - 434015 - - - - - - - index - id - - - 12 - - - 1 - 2 - 1822 - - - 2 - 3 - 373 - - - 3 - 9 - 271 - - - 11 - 19 - 282 - - - 19 - 46 - 282 - - - 51 - 418 - 282 - - - 445 - 11337 - 282 - - - 14348 - 40000 - 56 - - - - - - - index - commentline - - - 12 - - - 1 - 2 - 1822 - - - 2 - 3 - 373 - - - 3 - 9 - 271 - - - 11 - 19 - 282 - - - 19 - 46 - 282 - - - 51 - 418 - 282 - - - 445 - 11337 - 282 - - - 14348 - 40000 - 56 - - - - - - - - - asp_elements - 184013 - - - id - 184013 - - - kind - 16 - - - loc - 184013 - - - - - id - kind - - - 12 - - - 1 - 2 - 184013 - - - - - - - id - loc - - - 12 - - - 1 - 2 - 184013 - - - - - - - kind - id - - - 12 - - - 161 - 162 - 1 - - - 325 - 326 - 1 - - - 760 - 761 - 1 - - - 848 - 849 - 1 - - - 1845 - 1846 - 1 - - - 13496 - 13497 - 1 - - - 18618 - 18619 - 1 - - - 32419 - 32420 - 1 - - - 33487 - 33488 - 1 - - - - - - - kind - loc - - - 12 - - - 161 - 162 - 1 - - - 325 - 326 - 1 - - - 760 - 761 - 1 - - - 848 - 849 - 1 - - - 1845 - 1846 - 1 - - - 13496 - 13497 - 1 - - - 18618 - 18619 - 1 - - - 32419 - 32420 - 1 - - - 33487 - 33488 - 1 - - - - - - - loc - id - - - 12 - - - 1 - 2 - 184013 - - - - - - - loc - kind - - - 12 - - - 1 - 2 - 184013 - - - - - - - - - asp_comment_server - 21 - - - comment - 21 - - - - - - asp_code_inline - 893 - - - code - 893 - - - - - - asp_directive_attribute - 9235 - - - directive - 3328 - - - index - 12 - - - name - 75 - - - value - 9235 - - - - - directive - index - - - 12 - - - 1 - 2 - 832 - - - 2 - 3 - 258 - - - 3 - 4 - 1113 - - - 4 - 5 - 1081 - - - 5 - 8 - 43 - - - - - - - directive - name - - - 12 - - - 1 - 2 - 832 - - - 2 - 3 - 258 - - - 3 - 4 - 1113 - - - 4 - 5 - 1081 - - - 5 - 8 - 43 - - - - - - - directive - value - - - 12 - - - 1 - 2 - 832 - - - 2 - 3 - 258 - - - 3 - 4 - 1113 - - - 4 - 5 - 1081 - - - 5 - 8 - 43 - - - - - - - index - directive - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - 24 - 25 - 1 - - - 623 - 624 - 1 - - - 1240 - 1241 - 1 - - - 1383 - 1384 - 1 - - - 1844 - 1845 - 1 - - - - - - - index - name - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - 7 - 8 - 3 - - - 19 - 20 - 3 - - - 26 - 27 - 1 - - - - - - - index - value - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - 24 - 25 - 1 - - - 623 - 624 - 1 - - - 1240 - 1241 - 1 - - - 1383 - 1384 - 1 - - - 1844 - 1845 - 1 - - - - - - - name - directive - - - 12 - - - 1 - 2 - 18 - - - 2 - 3 - 3 - - - 3 - 4 - 5 - - - 4 - 5 - 7 - - - 5 - 6 - 3 - - - 6 - 7 - 3 - - - 7 - 8 - 5 - - - 9 - 22 - 5 - - - 22 - 24 - 5 - - - 35 - 165 - 5 - - - 496 - 527 - 5 - - - 692 - 713 - 5 - - - 1049 - 1050 - 1 - - - - - - - name - index - - - 12 - - - 1 - 2 - 39 - - - 2 - 3 - 14 - - - 3 - 4 - 14 - - - 4 - 6 - 5 - - - 6 - 7 - 1 - - - - - - - name - value - - - 12 - - - 1 - 2 - 18 - - - 2 - 3 - 3 - - - 3 - 4 - 5 - - - 4 - 5 - 7 - - - 5 - 6 - 3 - - - 6 - 7 - 3 - - - 7 - 8 - 5 - - - 9 - 22 - 5 - - - 22 - 24 - 5 - - - 35 - 165 - 5 - - - 496 - 527 - 5 - - - 692 - 713 - 5 - - - 1049 - 1050 - 1 - - - - - - - value - directive - - - 12 - - - 1 - 2 - 9235 - - - - - - - value - index - - - 12 - - - 1 - 2 - 9235 - - - - - - - value - name - - - 12 - - - 1 - 2 - 9235 - - - - - - - - - asp_directive_name - 3329 - - - directive - 3329 - - - name - 16 - - - - - directive - name - - - 12 - - - 1 - 2 - 3329 - - - - - - - name - directive - - - 12 - - - 2 - 3 - 3 - - - 6 - 7 - 5 - - - 83 - 84 - 1 - - - 195 - 196 - 1 - - - 530 - 531 - 1 - - - 1015 - 1016 - 1 - - - - - - - - - asp_element_body - 147082 - - - element - 147082 - - - body - 12449 - - - - - element - body - - - 12 - - - 1 - 2 - 147082 - - - - - - - body - element - - - 12 - - - 1 - 2 - 8191 - - - 2 - 3 - 1436 - - - 3 - 5 - 922 - - - 5 - 10 - 947 - - - 10 - 1007 - 934 - - - 1095 - 5694 - 16 - - - - - - - - - asp_tag_attribute - 49274 - - - tag - 20204 - - - index - 37 - - - name - 716 - - - attribute - 49274 - - - - - tag - index - - - 12 - - - 1 - 2 - 5724 - - - 2 - 3 - 7269 - - - 3 - 4 - 3266 - - - 4 - 5 - 2008 - - - 5 - 7 - 1586 - - - 7 - 22 - 348 - - - - - - - tag - name - - - 12 - - - 1 - 2 - 5724 - - - 2 - 3 - 7269 - - - 3 - 4 - 3266 - - - 4 - 5 - 2008 - - - 5 - 7 - 1586 - - - 7 - 22 - 348 - - - - - - - tag - attribute - - - 12 - - - 1 - 2 - 5724 - - - 2 - 3 - 7269 - - - 3 - 4 - 3266 - - - 4 - 5 - 2008 - - - 5 - 7 - 1586 - - - 7 - 22 - 348 - - - - - - - index - tag - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 3 - - - 3 - 4 - 1 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - 8 - 9 - 1 - - - 9 - 10 - 1 - - - 15 - 16 - 1 - - - 26 - 27 - 1 - - - 47 - 48 - 1 - - - 83 - 84 - 1 - - - 137 - 138 - 1 - - - 193 - 194 - 1 - - - 296 - 297 - 1 - - - 1072 - 1073 - 1 - - - 2185 - 2186 - 1 - - - 3995 - 3996 - 1 - - - 8023 - 8024 - 1 - - - 11195 - 11196 - 1 - - - - - - - index - name - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 3 - - - 3 - 4 - 1 - - - 4 - 5 - 3 - - - 7 - 8 - 3 - - - 9 - 10 - 1 - - - 18 - 19 - 1 - - - 22 - 23 - 1 - - - 33 - 34 - 1 - - - 47 - 48 - 1 - - - 58 - 59 - 1 - - - 73 - 74 - 1 - - - 106 - 107 - 1 - - - 107 - 108 - 1 - - - 140 - 141 - 1 - - - 159 - 160 - 1 - - - 195 - 196 - 1 - - - - - - - index - attribute - - - 12 - - - 1 - 2 - 3 - - - 2 - 3 - 3 - - - 3 - 4 - 1 - - - 4 - 5 - 1 - - - 5 - 6 - 1 - - - 8 - 9 - 1 - - - 9 - 10 - 1 - - - 15 - 16 - 1 - - - 26 - 27 - 1 - - - 47 - 48 - 1 - - - 83 - 84 - 1 - - - 137 - 138 - 1 - - - 193 - 194 - 1 - - - 296 - 297 - 1 - - - 1072 - 1073 - 1 - - - 2185 - 2186 - 1 - - - 3995 - 3996 - 1 - - - 8023 - 8024 - 1 - - - 11195 - 11196 - 1 - - - - - - - name - tag - - - 12 - - - 1 - 2 - 216 - - - 2 - 3 - 77 - - - 3 - 4 - 39 - - - 4 - 5 - 45 - - - 5 - 8 - 61 - - - 8 - 12 - 55 - - - 12 - 18 - 59 - - - 18 - 35 - 54 - - - 35 - 109 - 54 - - - 110 - 5718 - 52 - - - - - - - name - index - - - 12 - - - 1 - 2 - 335 - - - 2 - 3 - 164 - - - 3 - 4 - 75 - - - 4 - 5 - 34 - - - 5 - 7 - 54 - - - 7 - 13 - 52 - - - - - - - name - attribute - - - 12 - - - 1 - 2 - 216 - - - 2 - 3 - 77 - - - 3 - 4 - 39 - - - 4 - 5 - 45 - - - 5 - 8 - 61 - - - 8 - 12 - 55 - - - 12 - 18 - 59 - - - 18 - 35 - 54 - - - 35 - 109 - 54 - - - 110 - 5718 - 52 - - - - - - - attribute - tag - - - 12 - - - 1 - 2 - 49274 - - - - - - - attribute - index - - - 12 - - - 1 - 2 - 49274 - - - - - - - attribute - name - - - 12 - - - 1 - 2 - 49274 - - - - - - - - - asp_tag_name - 33601 - - - tag - 33601 - - - name - 545 - - - - - tag - name - - - 12 - - - 1 - 2 - 33601 - - - - - - - name - tag - - - 12 - - - 1 - 2 - 138 - - - 2 - 3 - 57 - - - 3 - 5 - 41 - - - 5 - 8 - 48 - - - 8 - 12 - 43 - - - 12 - 19 - 41 - - - 19 - 31 - 45 - - - 32 - 53 - 41 - - - 53 - 161 - 41 - - - 170 - 996 - 41 - - - 1223 - 1970 - 3 - - - - - - - - - asp_tag_isempty - 4203 - - - tag - 4203 - - - - - - cil_instruction - 0 - - - id - 0 - - - opcode - 0 - - - index - 0 - - - impl - 0 - - - - - id - opcode - - - 12 - - - 1 - 2 - 2 - - - - - - - id - index - - - 12 - - - 1 - 2 - 2 - - - - - - - id - impl - - - 12 - - - 1 - 2 - 2 - - - - - - - opcode - id - - - 12 - - - - - - opcode - index - - - 12 - - - - - - opcode - impl - - - 12 - - - - - - index - id - - - 12 - - - - - - index - opcode - - - 12 - - - - - - index - impl - - - 12 - - - - - - impl - id - - - 12 - - - - - - impl - opcode - - - 12 - - - - - - impl - index - - - 12 - - - - - - - - cil_jump - 0 - - - instruction - 0 - - - target - 0 - - - - - instruction - target - - - 12 - - - 1 - 2 - 2 - - - - - - - target - instruction - - - 12 - - - - - - - - cil_access - 0 - - - instruction - 0 - - - target - 0 - - - - - instruction - target - - - 12 - - - 1 - 2 - 2 - - - - - - - target - instruction - - - 12 - - - - - - - - cil_value - 0 - - - instruction - 0 - - - value - 0 - - - - - instruction - value - - - 12 - - - 1 - 2 - 2 - - - - - - - value - instruction - - - 12 - - - - - - - - cil_switch - 0 - - - instruction - 0 - - - index - 0 - - - target - 0 - - - - - instruction - index - - - 12 - - - - - - instruction - target - - - 12 - - - - - - index - instruction - - - 12 - - - - - - index - target - - - 12 - - - - - - target - instruction - - - 12 - - - - - - target - index - - - 12 - - - - - - - - cil_instruction_location - 0 - - - id - 0 - - - loc - 0 - - - - - id - loc - - - 12 - - - 1 - 2 - 2 - - - - - - - loc - id - - - 12 - - - - - - - - cil_type_location - 0 - - - id - 0 - - - loc - 0 - - - - - id - loc - - - 12 - - - - - - loc - id - - - 12 - - - - - - - - cil_method_location - 0 - - - id - 0 - - - loc - 0 - - - - - id - loc - - - 12 - - - - - - loc - id - - - 12 - - - - - - - - cil_type - 0 - - - id - 0 - - - name - 0 - - - kind - 0 - - - parent - 0 - - - sourceDecl - 0 - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - kind - - - 12 - - - 1 - 2 - 2 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - sourceDecl - - - 12 - - - 1 - 2 - 2 - - - - - - - name - id - - - 12 - - - - - - name - kind - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - sourceDecl - - - 12 - - - - - - kind - id - - - 12 - - - - - - kind - name - - - 12 - - - - - - kind - parent - - - 12 - - - - - - kind - sourceDecl - - - 12 - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - kind - - - 12 - - - - - - parent - sourceDecl - - - 12 - - - - - - sourceDecl - id - - - 12 - - - - - - sourceDecl - name - - - 12 - - - - - - sourceDecl - kind - - - 12 - - - - - - sourceDecl - parent - - - 12 - - - - - - - - cil_pointer_type - 0 - - - id - 0 - - - pointee - 0 - - - - - id - pointee - - - 12 - - - 1 - 2 - 2 - - - - - - - pointee - id - - - 12 - - - - - - - - cil_array_type - 0 - - - id - 0 - - - element_type - 0 - - - rank - 0 - - - - - id - element_type - - - 12 - - - 1 - 2 - 2 - - - - - - - id - rank - - - 12 - - - 1 - 2 - 2 - - - - - - - element_type - id - - - 12 - - - - - - element_type - rank - - - 12 - - - - - - rank - id - - - 12 - - - - - - rank - element_type - - - 12 - - - - - - - - cil_function_pointer_return_type - 0 - - - id - 0 - - - return_type - 0 - - - - - id - return_type - - - 12 - - - 1 - 2 - 2 - - - - - - - return_type - id - - - 12 - - - - - - - - cil_method - 0 - - - id - 0 - - - name - 0 - - - parent - 0 - - - return_type - 0 - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - return_type - - - 12 - - - 1 - 2 - 2 - - - - - - - name - id - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - return_type - - - 12 - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - return_type - - - 12 - - - - - - return_type - id - - - 12 - - - - - - return_type - name - - - 12 - - - - - - return_type - parent - - - 12 - - - - - - - - cil_method_source_declaration - 0 - - - method - 0 - - - source - 0 - - - - - method - source - - - 12 - - - 1 - 2 - 2 - - - - - - - source - method - - - 12 - - - - - - - - cil_method_implementation - 0 - - - id - 0 - - - method - 0 - - - location - 0 - - - - - id - method - - - 12 - - - 1 - 2 - 2 - - - - - - - id - location - - - 12 - - - 1 - 2 - 2 - - - - - - - method - id - - - 12 - - - - - - method - location - - - 12 - - - - - - location - id - - - 12 - - - - - - location - method - - - 12 - - - - - - - - cil_implements - 0 - - - id - 0 - - - decl - 0 - - - - - id - decl - - - 12 - - - - - - decl - id - - - 12 - - - - - - - - cil_field - 0 - - - id - 0 - - - parent - 0 - - - name - 0 - - - field_type - 0 - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - field_type - - - 12 - - - 1 - 2 - 2 - - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - field_type - - - 12 - - - - - - name - id - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - field_type - - - 12 - - - - - - field_type - id - - - 12 - - - - - - field_type - parent - - - 12 - - - - - - field_type - name - - - 12 - - - - - - - - cil_parameter - 0 - - - id - 0 - - - parameterizable - 0 - - - index - 0 - - - param_type - 0 - - - - - id - parameterizable - - - 12 - - - 1 - 2 - 2 - - - - - - - id - index - - - 12 - - - 1 - 2 - 2 - - - - - - - id - param_type - - - 12 - - - 1 - 2 - 2 - - - - - - - parameterizable - id - - - 12 - - - - - - parameterizable - index - - - 12 - - - - - - parameterizable - param_type - - - 12 - - - - - - index - id - - - 12 - - - - - - index - parameterizable - - - 12 - - - - - - index - param_type - - - 12 - - - - - - param_type - id - - - 12 - - - - - - param_type - parameterizable - - - 12 - - - - - - param_type - index - - - 12 - - - - - - - - cil_parameter_in - 0 - - - id - 0 - - - - - - cil_parameter_out - 0 - - - id - 0 - - - - - - cil_setter - 0 - - - prop - 0 - - - method - 0 - - - - - prop - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - prop - - - 12 - - - - - - - - cil_custom_modifiers - 0 - - - id - 0 - - - modifier - 0 - - - kind - 0 - - - - - id - modifier - - - 12 - - - - - - id - kind - - - 12 - - - - - - modifier - id - - - 12 - - - - - - modifier - kind - - - 12 - - - - - - kind - id - - - 12 - - - - - - kind - modifier - - - 12 - - - - - - - - cil_type_annotation - 0 - - - id - 0 - - - annotation - 0 - - - - - id - annotation - - - 12 - - - - - - annotation - id - - - 12 - - - - - - - - cil_getter - 0 - - - prop - 0 - - - method - 0 - - - - - prop - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - prop - - - 12 - - - - - - - - cil_adder - 0 - - - event - 0 - - - method - 0 - - - - - event - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - event - - - 12 - - - - - - - - cil_remover - 0 - - - event - 0 - - - method - 0 - - - - - event - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - event - - - 12 - - - - - - - - cil_raiser - 0 - - - event - 0 - - - method - 0 - - - - - event - method - - - 12 - - - 1 - 2 - 2 - - - - - - - method - event - - - 12 - - - - - - - - cil_property - 0 - - - id - 0 - - - parent - 0 - - - name - 0 - - - property_type - 0 - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - property_type - - - 12 - - - 1 - 2 - 2 - - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - property_type - - - 12 - - - - - - name - id - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - property_type - - - 12 - - - - - - property_type - id - - - 12 - - - - - - property_type - parent - - - 12 - - - - - - property_type - name - - - 12 - - - - - - - - cil_event - 0 - - - id - 0 - - - parent - 0 - - - name - 0 - - - event_type - 0 - - - - - id - parent - - - 12 - - - 1 - 2 - 2 - - - - - - - id - name - - - 12 - - - 1 - 2 - 2 - - - - - - - id - event_type - - - 12 - - - 1 - 2 - 2 - - - - - - - parent - id - - - 12 - - - - - - parent - name - - - 12 - - - - - - parent - event_type - - - 12 - - - - - - name - id - - - 12 - - - - - - name - parent - - - 12 - - - - - - name - event_type - - - 12 - - - - - - event_type - id - - - 12 - - - - - - event_type - parent - - - 12 - - - - - - event_type - name - - - 12 - - - - - - - - cil_local_variable - 0 - - - id - 0 - - - impl - 0 - - - index - 0 - - - var_type - 0 - - - - - id - impl - - - 12 - - - 1 - 2 - 2 - - - - - - - id - index - - - 12 - - - 1 - 2 - 2 - - - - - - - id - var_type - - - 12 - - - 1 - 2 - 2 - - - - - - - impl - id - - - 12 - - - - - - impl - index - - - 12 - - - - - - impl - var_type - - - 12 - - - - - - index - id - - - 12 - - - - - - index - impl - - - 12 - - - - - - index - var_type - - - 12 - - - - - - var_type - id - - - 12 - - - - - - var_type - impl - - - 12 - - - - - - var_type - index - - - 12 - - - - - - - - cil_function_pointer_calling_conventions - 0 - - - id - 0 - - - kind - 0 - - - - - id - kind - - - 12 - - - - - - kind - id - - - 12 - - - - - - - - cil_handler - 0 - - - id - 0 - - - impl - 0 - - - index - 0 - - - kind - 0 - - - try_start - 0 - - - try_end - 0 - - - handler_start - 0 - - - - - id - impl - - - 12 - - - 1 - 2 - 2 - - - - - - - id - index - - - 12 - - - 1 - 2 - 2 - - - - - - - id - kind - - - 12 - - - 1 - 2 - 2 - - - - - - - id - try_start - - - 12 - - - 1 - 2 - 2 - - - - - - - id - try_end - - - 12 - - - 1 - 2 - 2 - - - - - - - id - handler_start - - - 12 - - - 1 - 2 - 2 - - - - - - - impl - id - - - 12 - - - - - - impl - index - - - 12 - - - - - - impl - kind - - - 12 - - - - - - impl - try_start - - - 12 - - - - - - impl - try_end - - - 12 - - - - - - impl - handler_start - - - 12 - - - - - - index - id - - - 12 - - - - - - index - impl - - - 12 - - - - - - index - kind - - - 12 - - - - - - index - try_start - - - 12 - - - - - - index - try_end - - - 12 - - - - - - index - handler_start - - - 12 - - - - - - kind - id - - - 12 - - - - - - kind - impl - - - 12 - - - - - - kind - index - - - 12 - - - - - - kind - try_start - - - 12 - - - - - - kind - try_end - - - 12 - - - - - - kind - handler_start - - - 12 - - - - - - try_start - id - - - 12 - - - - - - try_start - impl - - - 12 - - - - - - try_start - index - - - 12 - - - - - - try_start - kind - - - 12 - - - - - - try_start - try_end - - - 12 - - - - - - try_start - handler_start - - - 12 - - - - - - try_end - id - - - 12 - - - - - - try_end - impl - - - 12 - - - - - - try_end - index - - - 12 - - - - - - try_end - kind - - - 12 - - - - - - try_end - try_start - - - 12 - - - - - - try_end - handler_start - - - 12 - - - - - - handler_start - id - - - 12 - - - - - - handler_start - impl - - - 12 - - - - - - handler_start - index - - - 12 - - - - - - handler_start - kind - - - 12 - - - - - - handler_start - try_start - - - 12 - - - - - - handler_start - try_end - - - 12 - - - - - - - - cil_handler_filter - 0 - - - id - 0 - - - filter_start - 0 - - - - - id - filter_start - - - 12 - - - 1 - 2 - 2 - - - - - - - filter_start - id - - - 12 - - - - - - - - cil_handler_type - 0 - - - id - 0 - - - catch_type - 0 - - - - - id - catch_type - - - 12 - - - 1 - 2 - 2 - - - - - - - catch_type - id - - - 12 - - - - - - - - cil_method_stack_size - 0 - - - method - 0 - - - size - 0 - - - - - method - size - - - 12 - - - 1 - 2 - 2 - - - - - - - size - method - - - 12 - - - - - - - - cil_public - 0 - - - id - 0 - - - - - - cil_private - 0 - - - id - 0 - - - - - - cil_protected - 0 - - - id - 0 - - - - - - cil_internal - 0 - - - id - 0 - - - - - - cil_static - 0 - - - id - 0 - - - - - - cil_sealed - 0 - - - id - 0 - - - - - - cil_virtual - 0 - - - id - 0 - - - - - - cil_abstract - 0 - - - id - 0 - - - - - - cil_class - 0 - - - id - 0 - - - - - - cil_interface - 0 - - - id - 0 - - - - - - cil_security - 0 - - - id - 0 - - - - - - cil_requiresecobject - 0 - - - id - 0 - - - - - - cil_specialname - 0 - - - id - 0 - - - - - - cil_newslot - 0 - - - id - 0 - - - - - - cil_base_class - 0 - - - id - 0 - - - base - 0 - - - - - id - base - - - 12 - - - 1 - 2 - 2 - - - - - - - base - id - - - 12 - - - - - - - - cil_base_interface - 0 - - - id - 0 - - - base - 0 - - - - - id - base - - - 12 - - - - - - base - id - - - 12 - - - - - - - - cil_enum_underlying_type - 0 - - - id - 0 - - - underlying - 0 - - - - - id - underlying - - - 12 - - - 1 - 2 - 2 - - - - - - - underlying - id - - - 12 - - - - - - - - cil_type_parameter - 0 - - - unbound - 0 - - - index - 0 - - - param - 0 - - - - - unbound - index - - - 12 - - - - - - unbound - param - - - 12 - - - - - - index - unbound - - - 12 - - - - - - index - param - - - 12 - - - - - - param - unbound - - - 12 - - - - - - param - index - - - 12 - - - - - - - - cil_type_argument - 0 - - - bound - 0 - - - index - 0 - - - t - 0 - - - - - bound - index - - - 12 - - - - - - bound - t - - - 12 - - - - - - index - bound - - - 12 - - - - - - index - t - - - 12 - - - - - - t - bound - - - 12 - - - - - - t - index - - - 12 - - - - - - - - cil_typeparam_covariant - 0 - - - tp - 0 - - - - - - cil_typeparam_contravariant - 0 - - - tp - 0 - - - - - - cil_typeparam_class - 0 - - - tp - 0 - - - - - - cil_typeparam_struct - 0 - - - tp - 0 - - - - - - cil_typeparam_new - 0 - - - tp - 0 - - - - - - cil_typeparam_constraint - 0 - - - tp - 0 - - - supertype - 0 - - - - - tp - supertype - - - 12 - - - - - - supertype - tp - - - 12 - - - - - - - - cil_attribute - 0 - - - attributeid - 0 - - - element - 0 - - - constructor - 0 - - - - - attributeid - element - - - 12 - - - 1 - 2 - 2 - - - - - - - attributeid - constructor - - - 12 - - - 1 - 2 - 2 - - - - - - - element - attributeid - - - 12 - - - - - - element - constructor - - - 12 - - - - - - constructor - attributeid - - - 12 - - - - - - constructor - element - - - 12 - - - - - - - - cil_attribute_named_argument - 0 - - - attribute_id - 0 - - - param - 0 - - - value - 0 - - - - - attribute_id - param - - - 12 - - - - - - attribute_id - value - - - 12 - - - - - - param - attribute_id - - - 12 - - - - - - param - value - - - 12 - - - - - - value - attribute_id - - - 12 - - - - - - value - param - - - 12 - - - - - - - - cil_attribute_positional_argument - 0 - - - attribute_id - 0 - - - index - 0 - - - value - 0 - - - - - attribute_id - index - - - 12 - - - - - - attribute_id - value - - - 12 - - - - - - index - attribute_id - - - 12 - - - - - - index - value - - - 12 - - - - - - value - attribute_id - - - 12 - - - - - - value - index - - - 12 - - - - - - - - metadata_handle - 47748481 - - - entity - 46753394 - - - location - 11316 - - - handle - 2013773 - - - - - entity - location - - - 12 - - - 1 - 2 - 46105352 - - - 2 - 551 - 648041 - - - - - - - entity - handle - - - 12 - - - 1 - 2 - 46140083 - - - 2 - 124 - 613310 - - - - - - - location - entity - - - 12 - - - 1 - 2 - 2201 - - - 2 - 77 - 864 - - - 78 - 189 - 864 - - - 194 - 346 - 864 - - - 356 - 558 - 864 - - - 566 - 910 - 864 - - - 917 - 1459 - 864 - - - 1476 - 2465 - 864 - - - 2493 - 3983 - 864 - - - 4037 - 7491 - 864 - - - 7549 - 28482 - 864 - - - 29128 - 92959 - 473 - - - - - - - location - handle - - - 12 - - - 1 - 2 - 2201 - - - 2 - 77 - 864 - - - 78 - 189 - 864 - - - 194 - 346 - 864 - - - 356 - 558 - 864 - - - 566 - 910 - 864 - - - 917 - 1459 - 864 - - - 1476 - 2465 - 864 - - - 2493 - 3983 - 864 - - - 4037 - 7491 - 864 - - - 7549 - 28482 - 864 - - - 29128 - 92959 - 473 - - - - - - - handle - entity - - - 12 - - - 1 - 2 - 285400 - - - 2 - 3 - 118205 - - - 3 - 5 - 172524 - - - 5 - 7 - 143574 - - - 7 - 9 - 149438 - - - 9 - 11 - 99132 - - - 11 - 14 - 182256 - - - 14 - 19 - 159479 - - - 19 - 25 - 178635 - - - 25 - 35 - 152628 - - - 35 - 48 - 152586 - - - 48 - 120 - 151743 - - - 120 - 401 - 68166 - - - - - - - handle - location - - - 12 - - - 1 - 2 - 285380 - - - 2 - 3 - 118205 - - - 3 - 5 - 172524 - - - 5 - 7 - 143574 - - - 7 - 9 - 149438 - - - 9 - 11 - 99132 - - - 11 - 14 - 182256 - - - 14 - 19 - 159479 - - - 19 - 25 - 178635 - - - 25 - 35 - 152628 - - - 35 - 48 - 152586 - - - 48 - 120 - 151722 - - - 120 - 551 - 68207 - - - - - - - - + + From 15cf6951880898b05069a1ede4f0cb459d7e77d7 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 23 Jan 2024 09:53:32 +0100 Subject: [PATCH 027/207] C#: Fix various bad joins --- .../lib/semmle/code/csharp/AnnotatedType.qll | 19 ++++++-- csharp/ql/lib/semmle/code/csharp/Generics.qll | 12 +++-- .../ql/lib/semmle/code/csharp/Implements.qll | 26 +++++----- .../code/csharp/commons/QualifiedName.qll | 11 ++++- .../csharp/commons/StructuralComparison.qll | 8 ++-- .../semmle/code/csharp/controlflow/Guards.qll | 47 +++++++++++++------ .../controlflow/internal/Completion.qll | 7 ++- .../controlflow/internal/PreBasicBlocks.qll | 3 ++ .../csharp/dispatch/OverridableCallable.qll | 12 +++-- .../UnsafeDeserializationUntrustedInput.ql | 8 +++- 10 files changed, 107 insertions(+), 46 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll b/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll index b45b743c40c..ae0f36f0a26 100644 --- a/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll +++ b/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll @@ -159,6 +159,11 @@ private module Annotations { getNoFlagsNullability(result) = getChildNullability(annotations.getNullability(), i) } + pragma[nomagic] + private Nullability getChildNullability0(Nullability n, int i) { + nullability_parent(getNullability(result), i, getNullability(n)) + } + /** * Gets the `i`th child of nullability `n`. * Returns `n` if the nullability is not explicitly @@ -167,9 +172,10 @@ private module Annotations { */ bindingset[i] Nullability getChildNullability(Nullability n, int i) { - if nullability_parent(_, i, getNullability(n)) - then nullability_parent(getNullability(result), i, getNullability(n)) - else result = n + result = getChildNullability0(n, i) + or + not exists(getChildNullability0(n, _)) and + result = n } /** @@ -276,6 +282,11 @@ private Annotations::Nullability getElementNullability(@has_type_annotation elem else result instanceof Annotations::NoNullability } +pragma[nomagic] +private predicate isNoFlagsNoNullability(Annotations::TypeAnnotations annotations) { + Annotations::getNoFlagsNullability(annotations) instanceof Annotations::NoNullability +} + private newtype TAnnotatedType = TAnnotatedTypeNullability(Type type, Annotations::TypeAnnotations annotations) { Annotations::elementTypeAnnotations(_, type, annotations) @@ -288,7 +299,7 @@ private newtype TAnnotatedType = Annotations::getNoFlagsNullability(annotations) = getTypeParameterNullability(_, type) or // All types have at least one annotated type - Annotations::getNoFlagsNullability(annotations) instanceof Annotations::NoNullability + isNoFlagsNoNullability(annotations) and exists(type) or exists(AnnotatedArrayType at | type = at.getType().(ArrayType).getElementType() and diff --git a/csharp/ql/lib/semmle/code/csharp/Generics.qll b/csharp/ql/lib/semmle/code/csharp/Generics.qll index 858f37eab3c..c4c2363f1d1 100644 --- a/csharp/ql/lib/semmle/code/csharp/Generics.qll +++ b/csharp/ql/lib/semmle/code/csharp/Generics.qll @@ -95,10 +95,16 @@ private string getTypeArgumentsToString(ConstructedGeneric cg) { strictconcat(Type t, int i | t = cg.getTypeArgument(i) | t.toStringWithTypes(), ", " order by i) } +pragma[nomagic] +private string getTypeArgumentName(ConstructedGeneric cg, int i) { + result = cg.getTypeArgument(i).getName() +} + /** Gets the concatenation of the `getName()` of type arguments. */ language[monotonicAggregates] private string getTypeArgumentsNames(ConstructedGeneric cg) { - result = strictconcat(Type t, int i | t = cg.getTypeArgument(i) | t.getName(), "," order by i) + result = + strictconcat(int i | exists(cg.getTypeArgument(i)) | getTypeArgumentName(cg, i), "," order by i) } /** @@ -197,9 +203,9 @@ class TypeParameter extends DotNet::TypeParameter, Type, @type_parameter { // A.B is a partially constructed UnboundGenericClass and // A.B is a ConstructedGenericClass. exists(ConstructedGeneric c, UnboundGeneric u, int tpi | - this = u.getTypeParameter(tpi) and + this = u.getTypeParameter(pragma[only_bind_into](tpi)) and (u = c.getUnboundGeneric() or u = c.getUnboundDeclaration()) and - result = c.getTypeArgument(tpi) + result = c.getTypeArgument(pragma[only_bind_into](tpi)) ) } diff --git a/csharp/ql/lib/semmle/code/csharp/Implements.qll b/csharp/ql/lib/semmle/code/csharp/Implements.qll index 96556293a9d..36cc06c4546 100644 --- a/csharp/ql/lib/semmle/code/csharp/Implements.qll +++ b/csharp/ql/lib/semmle/code/csharp/Implements.qll @@ -108,28 +108,29 @@ private predicate hasMemberCompatibleWithInterfaceMember(ValueOrRefType t, Virtu */ pragma[nomagic] private Virtualizable getACompatibleInterfaceMember(Virtualizable m) { - result = getACompatibleInterfaceMemberAux(m) and - ( + exists(ValueOrRefType declType | result = getACompatibleInterfaceMemberAux(m, declType) | // If there is both an implicit and an explicit compatible member // in the same type, then the explicit implementation must be used - not result = getACompatibleExplicitInterfaceMember(_, m.getDeclaringType()) + not result = getACompatibleExplicitInterfaceMember(_, declType) or - result = getACompatibleExplicitInterfaceMember(m, m.getDeclaringType()) + result = getACompatibleExplicitInterfaceMember(m, declType) ) } pragma[nomagic] private Virtualizable getACompatibleExplicitInterfaceMember(Virtualizable m, ValueOrRefType declType) { - result = getACompatibleInterfaceMemberAux(m) and - declType = m.getDeclaringType() and + result = getACompatibleInterfaceMemberAux(m, declType) and m.implementsExplicitInterface() } pragma[nomagic] -private Virtualizable getACompatibleInterfaceMemberAux(Virtualizable m) { - result = getACompatibleInterfaceAccessor(m) or - result = getACompatibleInterfaceIndexer(m) or - result = getACompatibleRelevantInterfaceMember(m) +private Virtualizable getACompatibleInterfaceMemberAux(Virtualizable m, ValueOrRefType declType) { + ( + result = getACompatibleInterfaceAccessor(m) or + result = getACompatibleInterfaceIndexer(m) or + result = getACompatibleRelevantInterfaceMember(m) + ) and + declType = m.getDeclaringType() } /** @@ -182,13 +183,16 @@ ValueOrRefType getAPossibleImplementor(Interface i) { not result instanceof Interface } +pragma[nomagic] +private Type getParameterType(Parameterizable p, int i) { result = p.getParameter(i).getType() } + private Indexer getACompatibleInterfaceIndexer0(Indexer i, int j) { result = getACompatibleInterfaceIndexerCandidate(i) and convIdentity(i.getType(), result.getType()) and j = -1 or result = getACompatibleInterfaceIndexer0(i, j - 1) and - convIdentity(i.getParameter(j).getType(), result.getParameter(j).getType()) + convIdentity(getParameterType(i, j), getParameterType(result, j)) } /** diff --git a/csharp/ql/lib/semmle/code/csharp/commons/QualifiedName.qll b/csharp/ql/lib/semmle/code/csharp/commons/QualifiedName.qll index 5e05a865640..e67c46f5de8 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/QualifiedName.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/QualifiedName.qll @@ -49,11 +49,20 @@ module QualifiedName { ) } + pragma[nomagic] + private string getTypeArgumentsQualifiedName(ConstructedGeneric cg, int i) { + result = getFullName(cg.getTypeArgument(i)) + } + /** Gets the concatenation of the `getFullName` of type arguments. */ language[monotonicAggregates] private string getTypeArgumentsQualifiedNames(ConstructedGeneric cg) { result = - strictconcat(Type t, int i | t = cg.getTypeArgument(i) | getFullName(t), "," order by i) + strictconcat(int i | + exists(cg.getTypeArgument(i)) + | + getTypeArgumentsQualifiedName(cg, i), "," order by i + ) } /** Holds if declaration `d` has the qualified name `qualifier`.`name`. */ diff --git a/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll b/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll index ca009448c10..63e37d56295 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll @@ -195,8 +195,6 @@ predicate toGvn = toGvnCached/1; /** * Holds if the control flow elements `x` and `y` are structurally equal. */ -pragma[inline] -predicate sameGvn(ControlFlowElement x, ControlFlowElement y) { - pragma[only_bind_into](toGvn(pragma[only_bind_out](x))) = - pragma[only_bind_into](toGvn(pragma[only_bind_out](y))) -} +bindingset[x, y] +pragma[inline_late] +predicate sameGvn(ControlFlowElement x, ControlFlowElement y) { toGvn(x) = toGvn(y) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 7accdb1fe64..1e6a06f1fe3 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -1013,12 +1013,18 @@ module Internal { * Holds if pre-basic-block `bb` only is reached when guard `g` has abstract value `v`, * not taking implications into account. */ + pragma[nomagic] private predicate preControlsDirect(Guard g, PreBasicBlocks::PreBasicBlock bb, AbstractValue v) { exists(PreBasicBlocks::ConditionBlock cb, ConditionalSuccessor s | cb.controls(bb, s) | v.branch(cb.getLastElement(), s, g) ) } + pragma[nomagic] + private predicate preControlsDefDirect(Guard g, PreSsa::Definition def, AbstractValue v) { + preControlsDirect(g, def.getBasicBlock(), v) + } + /** Holds if pre-basic-block `bb` only is reached when guard `g` has abstract value `v`. */ predicate preControls(Guard g, PreBasicBlocks::PreBasicBlock bb, AbstractValue v) { preControlsDirect(g, bb, v) @@ -1111,36 +1117,47 @@ module Internal { ) } - pragma[noinline] + pragma[nomagic] private predicate conditionalAssign0( Guard guard, AbstractValue vGuard, PreSsa::PhiNode phi, Expr e, PreSsa::Definition upd, - PreBasicBlocks::PreBasicBlock bbGuard + PreBasicBlocks::PreBasicBlock bbGuard, PreBasicBlocks::PreBasicBlock bbPhi ) { e = upd.getDefinition().getSource() and upd = phi.getAnInput() and - preControlsDirect(guard, upd.getBasicBlock(), vGuard) and + preControlsDefDirect(guard, upd, vGuard) and bbGuard.getAnElement() = guard and - bbGuard.strictlyDominates(phi.getBasicBlock()) and - not preControlsDirect(guard, phi.getBasicBlock(), vGuard) + bbPhi = phi.getBasicBlock() } pragma[noinline] private predicate conditionalAssign1( + Guard guard, AbstractValue vGuard, PreSsa::PhiNode phi, Expr e, PreSsa::Definition upd, + PreBasicBlocks::PreBasicBlock bbGuard + ) { + exists(PreBasicBlocks::PreBasicBlock bbPhi | + conditionalAssign0(guard, vGuard, phi, e, upd, bbGuard, bbPhi) and + bbGuard.strictlyDominates(bbPhi) and + not preControlsDefDirect(guard, phi, vGuard) + ) + } + + pragma[noinline] + private predicate conditionalAssign2( Guard guard, AbstractValue vGuard, PreSsa::PhiNode phi, Expr e, PreSsa::Definition upd, PreBasicBlocks::PreBasicBlock bbGuard, PreSsa::Definition other ) { - conditionalAssign0(guard, vGuard, phi, e, upd, bbGuard) and + conditionalAssign1(guard, vGuard, phi, e, upd, bbGuard) and other != upd and other = phi.getAnInput() } pragma[noinline] - private predicate conditionalAssign2( + private predicate conditionalAssign3( Guard guard, AbstractValue vGuard, PreSsa::Definition def, Expr e, PreSsa::Definition upd, PreBasicBlocks::PreBasicBlock bbGuard, PreSsa::Definition other ) { - conditionalAssign1(guard, vGuard, def, e, upd, bbGuard, other) and - preControlsDirect(guard, other.getBasicBlock(), vGuard.getDualValue()) + conditionalAssign2(guard, vGuard, def, e, upd, bbGuard, other) and + preControlsDefDirect(guard, other, vGuard.getDualValue()) } /** Gets the successor block that is reached when guard `g` has abstract value `v`. */ @@ -1153,11 +1170,11 @@ module Internal { } pragma[noinline] - private predicate conditionalAssign3( + private predicate conditionalAssign4( Guard guard, AbstractValue vGuard, PreSsa::Definition def, Expr e, PreSsa::Definition upd, PreBasicBlocks::PreBasicBlock bbGuard, PreSsa::Definition other ) { - conditionalAssign1(guard, vGuard, def, e, upd, bbGuard, other) and + conditionalAssign2(guard, vGuard, def, e, upd, bbGuard, other) and other.getBasicBlock().dominates(bbGuard) and not other.isLiveAtEndOfBlock(getConditionalSuccessor(guard, vGuard)) } @@ -1184,10 +1201,10 @@ module Internal { ) or exists(PreSsa::Definition upd, PreBasicBlocks::PreBasicBlock bbGuard | - conditionalAssign0(guard, vGuard, def, e, upd, bbGuard) + conditionalAssign1(guard, vGuard, def, e, upd, bbGuard) | forall(PreSsa::Definition other | - conditionalAssign1(guard, vGuard, def, e, upd, bbGuard, other) + conditionalAssign2(guard, vGuard, def, e, upd, bbGuard, other) | // For example: // if (guard) @@ -1195,14 +1212,14 @@ module Internal { // else // other = b; // def = phi(upd, other) - conditionalAssign2(guard, vGuard, def, e, upd, bbGuard, other) + conditionalAssign3(guard, vGuard, def, e, upd, bbGuard, other) or // For example: // other = a; // if (guard) // upd = b; // def = phi(other, upd) - conditionalAssign3(guard, vGuard, def, e, upd, bbGuard, other) + conditionalAssign4(guard, vGuard, def, e, upd, bbGuard, other) ) ) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll index cf72b9a6991..a470d0c4b8a 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll @@ -49,7 +49,10 @@ private newtype TCompletion = nestedFinallyCompletion(outer, nestLevel) } -pragma[noinline] +pragma[nomagic] +private int getAFinallyNestLevel() { result = any(Statements::TryStmtTree t).nestLevel() } + +pragma[nomagic] private predicate nestedFinallyCompletion(Completion outer, int nestLevel) { ( outer = TReturnCompletion() @@ -64,7 +67,7 @@ private predicate nestedFinallyCompletion(Completion outer, int nestLevel) { or outer = TExitCompletion() ) and - nestLevel = any(Statements::TryStmtTree t).nestLevel() + nestLevel = getAFinallyNestLevel() } pragma[noinline] diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll index 6a507fb8014..08debc21c0d 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll @@ -75,8 +75,10 @@ class PreBasicBlock extends ControlFlowElement { predicate immediatelyDominates(PreBasicBlock bb) { bbIDominates(this, bb) } + pragma[inline] predicate strictlyDominates(PreBasicBlock bb) { this.immediatelyDominates+(bb) } + pragma[inline] predicate dominates(PreBasicBlock bb) { bb = this or @@ -97,6 +99,7 @@ class ConditionBlock extends PreBasicBlock { ) } + pragma[nomagic] private predicate immediatelyControls(PreBasicBlock succ, ConditionalCompletion cc) { exists(ControlFlowElement last, Completion c | last = this.getLastElement() and diff --git a/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll index 9905f4939b3..282bd98ef34 100644 --- a/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll +++ b/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll @@ -121,12 +121,19 @@ class OverridableCallable extends Callable, Overridable { result = c.getDeclaringType() } + pragma[nomagic] private predicate isDeclaringSubType(ValueOrRefType t) { t = this.getDeclaringType() or exists(ValueOrRefType mid | this.isDeclaringSubType(mid) | t = mid.getASubType()) } + pragma[nomagic] + private predicate isDeclaringSubType(ValueOrRefType t, ValueOrRefType sub) { + this.isDeclaringSubType(t) and + t = sub.getABaseType() + } + pragma[noinline] private Callable getAnOverrider0(ValueOrRefType t) { // A (transitive) overrider @@ -155,10 +162,7 @@ class OverridableCallable extends Callable, Overridable { Callable getAnOverrider(ValueOrRefType t) { result = this.getAnOverrider0(t) or - exists(ValueOrRefType mid | result = this.getAnOverrider(mid) | - t = mid.getABaseType() and - this.isDeclaringSubType(t) - ) + exists(ValueOrRefType mid | result = this.getAnOverrider(mid) | this.isDeclaringSubType(t, mid)) } } diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql index c7a5579cf33..ad5c0a71227 100644 --- a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql +++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql @@ -15,6 +15,12 @@ import csharp import semmle.code.csharp.security.dataflow.UnsafeDeserializationQuery import Flow::PathGraph +bindingset[e1, e2] +pragma[inline_late] +private predicate sameParent(DataFlow::Node e1, DataFlow::Node e2) { + e1.asExpr().getParent() = e2.asExpr().getParent() +} + module Flow = DataFlow::MergePathGraph3 Date: Mon, 12 Feb 2024 23:55:42 +0000 Subject: [PATCH 028/207] C++: tests for destructors after a while-loop condition --- .../library-tests/ir/ir/PrintAST.expected | 71 +++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 89 +++++++++++++++++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 14 +++ .../ir/ir/operand_locations.expected | 70 +++++++++++++++ .../test/library-tests/ir/ir/raw_ir.expected | 84 +++++++++++++++++ 5 files changed, 328 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 7dfa4e52d46..a61b76798b7 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -16580,6 +16580,77 @@ ir.cpp: # 2189| : # 2190| [Destructor] void Bool2::~Bool2() # 2190| : +# 2193| [TopLevelFunction] void WhileLoopDestructors(bool) +# 2193| : +# 2193| getParameter(0): [Parameter] b +# 2193| Type = [BoolType] bool +# 2193| getEntryPoint(): [BlockStmt] { ... } +# 2194| getStmt(0): [BlockStmt] { ... } +# 2195| getStmt(0): [DeclStmt] declaration +# 2195| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2195| Type = [Struct] String +# 2195| getVariable().getInitializer(): [Initializer] initializer for s +# 2195| getExpr(): [ConstructorCall] call to String +# 2195| Type = [VoidType] void +# 2195| ValueCategory = prvalue +# 2196| getStmt(1): [WhileStmt] while (...) ... +# 2196| getCondition(): [VariableAccess] b +# 2196| Type = [BoolType] bool +# 2196| ValueCategory = prvalue(load) +# 2196| getStmt(): [BlockStmt] { ... } +# 2197| getStmt(0): [ExprStmt] ExprStmt +# 2197| getExpr(): [AssignExpr] ... = ... +# 2197| Type = [BoolType] bool +# 2197| ValueCategory = lvalue +# 2197| getLValue(): [VariableAccess] b +# 2197| Type = [BoolType] bool +# 2197| ValueCategory = lvalue +# 2197| getRValue(): [Literal] 0 +# 2197| Type = [BoolType] bool +# 2197| Value = [Literal] 0 +# 2197| ValueCategory = prvalue +# 2199| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2199| Type = [VoidType] void +# 2199| ValueCategory = prvalue +# 2199| getQualifier(): [VariableAccess] s +# 2199| Type = [Struct] String +# 2199| ValueCategory = lvalue +# 2201| getStmt(1): [BlockStmt] { ... } +# 2202| getStmt(0): [WhileStmt] while (...) ... +# 2202| getCondition(): [ConditionDeclExpr] (condition decl) +# 2202| Type = [BoolType] bool +# 2202| ValueCategory = prvalue +# 2202| getChild(0): [FunctionCall] call to operator bool +# 2202| Type = [BoolType] bool +# 2202| ValueCategory = prvalue +# 2202| getQualifier(): [VariableAccess] B +# 2202| Type = [Class] Bool +# 2202| ValueCategory = prvalue(load) +# 2202| getStmt(): [BlockStmt] { ... } +# 2203| getStmt(0): [ExprStmt] ExprStmt +# 2203| getExpr(): [AssignExpr] ... = ... +# 2203| Type = [BoolType] bool +# 2203| ValueCategory = lvalue +# 2203| getLValue(): [VariableAccess] b +# 2203| Type = [BoolType] bool +# 2203| ValueCategory = lvalue +# 2203| getRValue(): [Literal] 0 +# 2203| Type = [BoolType] bool +# 2203| Value = [Literal] 0 +# 2203| ValueCategory = prvalue +# 2204| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool +# 2204| Type = [VoidType] void +# 2204| ValueCategory = prvalue +# 2204| getQualifier(): [VariableAccess] B +# 2204| Type = [Class] Bool +# 2204| ValueCategory = lvalue +# 2204| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool +# 2204| Type = [VoidType] void +# 2204| ValueCategory = prvalue +# 2204| getQualifier(): [VariableAccess] B +# 2204| Type = [Class] Bool +# 2204| ValueCategory = lvalue +# 2206| getStmt(2): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 5a65ae3fe75..5fa4671b5c9 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -13163,6 +13163,95 @@ ir.cpp: # 2177| v2177_8(void) = AliasedUse : ~m2182_14 # 2177| v2177_9(void) = ExitFunction : +# 2193| void WhileLoopDestructors(bool) +# 2193| Block 0 +# 2193| v2193_1(void) = EnterFunction : +# 2193| m2193_2(unknown) = AliasedDefinition : +# 2193| m2193_3(unknown) = InitializeNonLocal : +# 2193| m2193_4(unknown) = Chi : total:m2193_2, partial:m2193_3 +# 2193| r2193_5(glval) = VariableAddress[b] : +# 2193| m2193_6(bool) = InitializeParameter[b] : &:r2193_5 +# 2195| r2195_1(glval) = VariableAddress[s] : +# 2195| m2195_2(String) = Uninitialized[s] : &:r2195_1 +# 2195| r2195_3(glval) = FunctionAddress[String] : +# 2195| v2195_4(void) = Call[String] : func:r2195_3, this:r2195_1 +# 2195| m2195_5(unknown) = ^CallSideEffect : ~m2193_4 +# 2195| m2195_6(unknown) = Chi : total:m2193_4, partial:m2195_5 +# 2195| m2195_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2195_1 +# 2195| m2195_8(String) = Chi : total:m2195_2, partial:m2195_7 +#-----| Goto -> Block 1 + +# 2196| Block 1 +# 2196| m2196_1(bool) = Phi : from 0:m2193_6, from 2:m2197_3 +# 2196| r2196_2(glval) = VariableAddress[b] : +# 2196| r2196_3(bool) = Load[b] : &:r2196_2, m2196_1 +# 2196| v2196_4(void) = ConditionalBranch : r2196_3 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2197| Block 2 +# 2197| r2197_1(bool) = Constant[0] : +# 2197| r2197_2(glval) = VariableAddress[b] : +# 2197| m2197_3(bool) = Store[b] : &:r2197_2, r2197_1 +#-----| Goto (back edge) -> Block 1 + +# 2199| Block 3 +# 2199| r2199_1(glval) = VariableAddress[s] : +# 2199| r2199_2(glval) = FunctionAddress[~String] : +# 2199| v2199_3(void) = Call[~String] : func:r2199_2, this:r2199_1 +# 2199| m2199_4(unknown) = ^CallSideEffect : ~m2195_6 +# 2199| m2199_5(unknown) = Chi : total:m2195_6, partial:m2199_4 +# 2199| v2199_6(void) = ^IndirectReadSideEffect[-1] : &:r2199_1, m2195_8 +# 2199| m2199_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2199_1 +# 2199| m2199_8(String) = Chi : total:m2195_8, partial:m2199_7 +#-----| Goto -> Block 4 + +# 2202| Block 4 +# 2202| m2202_1(unknown) = Phi : from 3:~m2199_5, from 5:~m2204_5 +# 2202| m2202_2(bool) = Phi : from 3:m2196_1, from 5:m2203_3 +# 2202| r2202_3(glval) = VariableAddress[B] : +# 2202| m2202_4(Bool) = Uninitialized[B] : &:r2202_3 +# 2202| r2202_5(glval) = FunctionAddress[Bool] : +# 2202| r2202_6(glval) = VariableAddress[b] : +# 2202| r2202_7(bool) = Load[b] : &:r2202_6, m2202_2 +# 2202| v2202_8(void) = Call[Bool] : func:r2202_5, this:r2202_3, 0:r2202_7 +# 2202| m2202_9(unknown) = ^CallSideEffect : ~m2202_1 +# 2202| m2202_10(unknown) = Chi : total:m2202_1, partial:m2202_9 +# 2202| m2202_11(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2202_3 +# 2202| m2202_12(Bool) = Chi : total:m2202_4, partial:m2202_11 +# 2202| r2202_13(glval) = VariableAddress[B] : +# 2202| r2202_14(glval) = FunctionAddress[operator bool] : +# 2202| r2202_15(bool) = Call[operator bool] : func:r2202_14, this:r2202_13 +# 2202| m2202_16(unknown) = ^CallSideEffect : ~m2202_10 +# 2202| m2202_17(unknown) = Chi : total:m2202_10, partial:m2202_16 +# 2202| v2202_18(void) = ^IndirectReadSideEffect[-1] : &:r2202_13, m2202_12 +# 2202| m2202_19(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2202_13 +# 2202| m2202_20(Bool) = Chi : total:m2202_12, partial:m2202_19 +# 2202| r2202_21(bool) = CopyValue : r2202_15 +# 2202| v2202_22(void) = ConditionalBranch : r2202_21 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 2203| Block 5 +# 2203| r2203_1(bool) = Constant[0] : +# 2203| r2203_2(glval) = VariableAddress[b] : +# 2203| m2203_3(bool) = Store[b] : &:r2203_2, r2203_1 +# 2204| r2204_1(glval) = VariableAddress[B] : +# 2204| r2204_2(glval) = FunctionAddress[~Bool] : +# 2204| v2204_3(void) = Call[~Bool] : func:r2204_2, this:r2204_1 +# 2204| m2204_4(unknown) = ^CallSideEffect : ~m2202_17 +# 2204| m2204_5(unknown) = Chi : total:m2202_17, partial:m2204_4 +# 2204| v2204_6(void) = ^IndirectReadSideEffect[-1] : &:r2204_1, m2202_20 +# 2204| m2204_7(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2204_1 +# 2204| m2204_8(Bool) = Chi : total:m2202_20, partial:m2204_7 +#-----| Goto (back edge) -> Block 4 + +# 2206| Block 6 +# 2206| v2206_1(void) = NoOp : +# 2193| v2193_7(void) = ReturnVoid : +# 2193| v2193_8(void) = AliasedUse : ~m2202_17 +# 2193| v2193_9(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 1b0eba0be8d..8f5fd9d888b 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2190,4 +2190,18 @@ class Bool2 { ~Bool2(); }; +void WhileLoopDestructors(bool b) { + { + String s; + while(b) { + b = false; + } + } + + { + while (Bool B = Bool(b)) { + b = false; + } + } +} // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 87b2476d68a..95de6158990 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -10758,6 +10758,76 @@ | ir.cpp:2182:5:2182:5 | SideEffect | m2181_8 | | ir.cpp:2182:5:2182:5 | SideEffect | ~m2181_6 | | ir.cpp:2182:5:2182:5 | SideEffect | ~m2182_9 | +| ir.cpp:2193:6:2193:25 | ChiPartial | partial:m2193_3 | +| ir.cpp:2193:6:2193:25 | ChiTotal | total:m2193_2 | +| ir.cpp:2193:6:2193:25 | SideEffect | ~m2202_17 | +| ir.cpp:2193:32:2193:32 | Address | &:r2193_5 | +| ir.cpp:2195:16:2195:16 | Address | &:r2195_1 | +| ir.cpp:2195:16:2195:16 | Address | &:r2195_1 | +| ir.cpp:2195:16:2195:16 | Arg(this) | this:r2195_1 | +| ir.cpp:2195:16:2195:16 | CallTarget | func:r2195_3 | +| ir.cpp:2195:16:2195:16 | ChiPartial | partial:m2195_5 | +| ir.cpp:2195:16:2195:16 | ChiPartial | partial:m2195_7 | +| ir.cpp:2195:16:2195:16 | ChiTotal | total:m2193_4 | +| ir.cpp:2195:16:2195:16 | ChiTotal | total:m2195_2 | +| ir.cpp:2195:16:2195:16 | SideEffect | ~m2193_4 | +| ir.cpp:2196:15:2196:15 | Address | &:r2196_2 | +| ir.cpp:2196:15:2196:15 | Condition | r2196_3 | +| ir.cpp:2196:15:2196:15 | Load | m2196_1 | +| ir.cpp:2196:15:2196:15 | Phi | from 0:m2193_6 | +| ir.cpp:2196:15:2196:15 | Phi | from 2:m2197_3 | +| ir.cpp:2197:13:2197:13 | Address | &:r2197_2 | +| ir.cpp:2197:17:2197:21 | StoreValue | r2197_1 | +| ir.cpp:2199:5:2199:5 | Address | &:r2199_1 | +| ir.cpp:2199:5:2199:5 | Address | &:r2199_1 | +| ir.cpp:2199:5:2199:5 | Arg(this) | this:r2199_1 | +| ir.cpp:2199:5:2199:5 | CallTarget | func:r2199_2 | +| ir.cpp:2199:5:2199:5 | ChiPartial | partial:m2199_4 | +| ir.cpp:2199:5:2199:5 | ChiPartial | partial:m2199_7 | +| ir.cpp:2199:5:2199:5 | ChiTotal | total:m2195_6 | +| ir.cpp:2199:5:2199:5 | ChiTotal | total:m2195_8 | +| ir.cpp:2199:5:2199:5 | SideEffect | m2195_8 | +| ir.cpp:2199:5:2199:5 | SideEffect | ~m2195_6 | +| ir.cpp:2202:16:2202:31 | Address | &:r2202_3 | +| ir.cpp:2202:16:2202:31 | Address | &:r2202_3 | +| ir.cpp:2202:16:2202:31 | Arg(this) | this:r2202_3 | +| ir.cpp:2202:16:2202:31 | Condition | r2202_21 | +| ir.cpp:2202:16:2202:31 | Phi | from 3:m2196_1 | +| ir.cpp:2202:16:2202:31 | Phi | from 3:~m2199_5 | +| ir.cpp:2202:16:2202:31 | Phi | from 5:m2203_3 | +| ir.cpp:2202:16:2202:31 | Phi | from 5:~m2204_5 | +| ir.cpp:2202:21:2202:21 | Address | &:r2202_13 | +| ir.cpp:2202:21:2202:21 | Address | &:r2202_13 | +| ir.cpp:2202:21:2202:21 | Arg(this) | this:r2202_13 | +| ir.cpp:2202:21:2202:21 | CallTarget | func:r2202_14 | +| ir.cpp:2202:21:2202:21 | ChiPartial | partial:m2202_16 | +| ir.cpp:2202:21:2202:21 | ChiPartial | partial:m2202_19 | +| ir.cpp:2202:21:2202:21 | ChiTotal | total:m2202_10 | +| ir.cpp:2202:21:2202:21 | ChiTotal | total:m2202_12 | +| ir.cpp:2202:21:2202:21 | SideEffect | m2202_12 | +| ir.cpp:2202:21:2202:21 | SideEffect | ~m2202_10 | +| ir.cpp:2202:21:2202:21 | Unary | r2202_15 | +| ir.cpp:2202:24:2202:31 | CallTarget | func:r2202_5 | +| ir.cpp:2202:24:2202:31 | ChiPartial | partial:m2202_9 | +| ir.cpp:2202:24:2202:31 | ChiPartial | partial:m2202_11 | +| ir.cpp:2202:24:2202:31 | ChiTotal | total:m2202_1 | +| ir.cpp:2202:24:2202:31 | ChiTotal | total:m2202_4 | +| ir.cpp:2202:24:2202:31 | SideEffect | ~m2202_1 | +| ir.cpp:2202:30:2202:30 | Address | &:r2202_6 | +| ir.cpp:2202:30:2202:30 | Arg(0) | 0:r2202_7 | +| ir.cpp:2202:30:2202:30 | Load | m2202_2 | +| ir.cpp:2203:13:2203:13 | Address | &:r2203_2 | +| ir.cpp:2203:17:2203:21 | StoreValue | r2203_1 | +| ir.cpp:2204:9:2204:9 | Address | &:r2204_1 | +| ir.cpp:2204:9:2204:9 | Address | &:r2204_1 | +| ir.cpp:2204:9:2204:9 | Arg(this) | this:r2204_1 | +| ir.cpp:2204:9:2204:9 | CallTarget | func:r2204_2 | +| ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_4 | +| ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_7 | +| ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_17 | +| ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_20 | +| ir.cpp:2204:9:2204:9 | SideEffect | m2202_20 | +| ir.cpp:2204:9:2204:9 | SideEffect | ~m2202_17 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index f7b2f3e9131..683bd5dfe20 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12250,6 +12250,90 @@ ir.cpp: # 2177| v2177_7(void) = AliasedUse : ~m? # 2177| v2177_8(void) = ExitFunction : +# 2193| void WhileLoopDestructors(bool) +# 2193| Block 0 +# 2193| v2193_1(void) = EnterFunction : +# 2193| mu2193_2(unknown) = AliasedDefinition : +# 2193| mu2193_3(unknown) = InitializeNonLocal : +# 2193| r2193_4(glval) = VariableAddress[b] : +# 2193| mu2193_5(bool) = InitializeParameter[b] : &:r2193_4 +# 2195| r2195_1(glval) = VariableAddress[s] : +# 2195| mu2195_2(String) = Uninitialized[s] : &:r2195_1 +# 2195| r2195_3(glval) = FunctionAddress[String] : +# 2195| v2195_4(void) = Call[String] : func:r2195_3, this:r2195_1 +# 2195| mu2195_5(unknown) = ^CallSideEffect : ~m? +# 2195| mu2195_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2195_1 +#-----| Goto -> Block 1 + +# 2196| Block 1 +# 2196| r2196_1(glval) = VariableAddress[b] : +# 2196| r2196_2(bool) = Load[b] : &:r2196_1, ~m? +# 2196| v2196_3(void) = ConditionalBranch : r2196_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2197| Block 2 +# 2197| r2197_1(bool) = Constant[0] : +# 2197| r2197_2(glval) = VariableAddress[b] : +# 2197| mu2197_3(bool) = Store[b] : &:r2197_2, r2197_1 +#-----| Goto (back edge) -> Block 1 + +# 2199| Block 3 +# 2199| r2199_1(glval) = VariableAddress[s] : +# 2199| r2199_2(glval) = FunctionAddress[~String] : +# 2199| v2199_3(void) = Call[~String] : func:r2199_2, this:r2199_1 +# 2199| mu2199_4(unknown) = ^CallSideEffect : ~m? +# 2199| v2199_5(void) = ^IndirectReadSideEffect[-1] : &:r2199_1, ~m? +# 2199| mu2199_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2199_1 +#-----| Goto -> Block 4 + +# 2202| Block 4 +# 2202| r2202_1(glval) = VariableAddress[B] : +# 2202| mu2202_2(Bool) = Uninitialized[B] : &:r2202_1 +# 2202| r2202_3(glval) = FunctionAddress[Bool] : +# 2202| r2202_4(glval) = VariableAddress[b] : +# 2202| r2202_5(bool) = Load[b] : &:r2202_4, ~m? +# 2202| v2202_6(void) = Call[Bool] : func:r2202_3, this:r2202_1, 0:r2202_5 +# 2202| mu2202_7(unknown) = ^CallSideEffect : ~m? +# 2202| mu2202_8(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1 +# 2202| r2202_9(glval) = VariableAddress[B] : +# 2202| r2202_10(glval) = FunctionAddress[operator bool] : +# 2202| r2202_11(bool) = Call[operator bool] : func:r2202_10, this:r2202_9 +# 2202| mu2202_12(unknown) = ^CallSideEffect : ~m? +# 2202| v2202_13(void) = ^IndirectReadSideEffect[-1] : &:r2202_9, ~m? +# 2202| mu2202_14(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2202_9 +# 2202| r2202_15(bool) = CopyValue : r2202_11 +# 2202| v2202_16(void) = ConditionalBranch : r2202_15 +#-----| False -> Block 7 +#-----| True -> Block 5 + +# 2203| Block 5 +# 2203| r2203_1(bool) = Constant[0] : +# 2203| r2203_2(glval) = VariableAddress[b] : +# 2203| mu2203_3(bool) = Store[b] : &:r2203_2, r2203_1 +# 2204| r2204_1(glval) = VariableAddress[B] : +# 2204| r2204_2(glval) = FunctionAddress[~Bool] : +# 2204| v2204_3(void) = Call[~Bool] : func:r2204_2, this:r2204_1 +# 2204| mu2204_4(unknown) = ^CallSideEffect : ~m? +# 2204| v2204_5(void) = ^IndirectReadSideEffect[-1] : &:r2204_1, ~m? +# 2204| mu2204_6(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2204_1 +#-----| Goto (back edge) -> Block 4 + +# 2204| Block 6 +# 2204| r2204_7(glval) = VariableAddress[B] : +# 2204| r2204_8(glval) = FunctionAddress[~Bool] : +# 2204| v2204_9(void) = Call[~Bool] : func:r2204_8, this:r2204_7 +# 2204| mu2204_10(unknown) = ^CallSideEffect : ~m? +# 2204| v2204_11(void) = ^IndirectReadSideEffect[-1] : &:r2204_7, ~m? +# 2204| mu2204_12(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2204_7 +#-----| Goto -> Block 7 + +# 2206| Block 7 +# 2206| v2206_1(void) = NoOp : +# 2193| v2193_6(void) = ReturnVoid : +# 2193| v2193_7(void) = AliasedUse : ~m? +# 2193| v2193_8(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 From b94c4a6e1b1142ed20128ba76b2ddf3ee8d1c842 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 13 Feb 2024 00:13:22 +0000 Subject: [PATCH 029/207] C++: fix for destructor of while-loop condition --- .../raw/internal/TranslatedStmt.qll | 31 ++++++++++++++++--- .../library-tests/ir/ir/aliased_ir.expected | 18 ++++++++--- .../ir/ir/operand_locations.expected | 12 ++++++- .../test/library-tests/ir/ir/raw_ir.expected | 13 +++----- 4 files changed, 55 insertions(+), 19 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 6037bf962e1..a1844e4bd6b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -805,12 +805,10 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { } override Instruction getALastInstructionInternal() { - result = this.getElse().getALastInstruction() or result = this.getThen().getALastInstruction() // FIXME: how do we handle the CFG merge here + result = this.getElse().getALastInstruction() or result = this.getThen().getALastInstruction() } - override TranslatedElement getLastChild() { - result = this.getElse() or result = this.getThen() // FIXME: how do we handle the CFG merge here - } + override TranslatedElement getLastChild() { result = this.getElse() or result = this.getThen() } override TranslatedElement getChildInternal(int id) { id = 0 and result = this.getInitialization() @@ -873,7 +871,7 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { override Loop stmt; override Instruction getALastInstructionInternal() { - result = this.getCondition().getALastInstruction() // FIXME: how do we handle the branch here + result = this.getCondition().getALastInstruction() } override TranslatedElement getLastChild() { result = this.getCondition() } @@ -919,6 +917,26 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { class TranslatedWhileStmt extends TranslatedLoop { TranslatedWhileStmt() { stmt instanceof WhileStmt } + override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getCondition() + or + id = 1 and result = this.getBody() + or + exists(int n | + result.getAst() = stmt.getImplicitDestructorCall(n) and + id = 2 + n + ) + } + + override predicate handlesDestructorsExplicitly() { any() } + + final override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { + child = this.getCondition() and + if this.hasAnImplicitDestructorCall() + then result = this.getChild(this.getFirstDestructorCallIndex()).getFirstInstruction(kind) + else result = this.getParent().getChildSuccessor(this, kind) + } + override Instruction getFirstInstruction(EdgeKind kind) { result = this.getFirstConditionInstruction(kind) } @@ -926,6 +944,9 @@ class TranslatedWhileStmt extends TranslatedLoop { override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getBody() and result = this.getFirstConditionInstruction(kind) + or + child = this.getChild(this.getFirstDestructorCallIndex()) and + result = this.getParent().getChildSuccessor(this, kind) } } diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 5fa4671b5c9..fc43321652f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -13246,11 +13246,19 @@ ir.cpp: # 2204| m2204_8(Bool) = Chi : total:m2202_20, partial:m2204_7 #-----| Goto (back edge) -> Block 4 -# 2206| Block 6 -# 2206| v2206_1(void) = NoOp : -# 2193| v2193_7(void) = ReturnVoid : -# 2193| v2193_8(void) = AliasedUse : ~m2202_17 -# 2193| v2193_9(void) = ExitFunction : +# 2204| Block 6 +# 2204| r2204_9(glval) = VariableAddress[B] : +# 2204| r2204_10(glval) = FunctionAddress[~Bool] : +# 2204| v2204_11(void) = Call[~Bool] : func:r2204_10, this:r2204_9 +# 2204| m2204_12(unknown) = ^CallSideEffect : ~m2202_17 +# 2204| m2204_13(unknown) = Chi : total:m2202_17, partial:m2204_12 +# 2204| v2204_14(void) = ^IndirectReadSideEffect[-1] : &:r2204_9, m2202_20 +# 2204| m2204_15(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2204_9 +# 2204| m2204_16(Bool) = Chi : total:m2202_20, partial:m2204_15 +# 2206| v2206_1(void) = NoOp : +# 2193| v2193_7(void) = ReturnVoid : +# 2193| v2193_8(void) = AliasedUse : ~m2204_13 +# 2193| v2193_9(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 95de6158990..b6ebd5f2dc0 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -10760,7 +10760,7 @@ | ir.cpp:2182:5:2182:5 | SideEffect | ~m2182_9 | | ir.cpp:2193:6:2193:25 | ChiPartial | partial:m2193_3 | | ir.cpp:2193:6:2193:25 | ChiTotal | total:m2193_2 | -| ir.cpp:2193:6:2193:25 | SideEffect | ~m2202_17 | +| ir.cpp:2193:6:2193:25 | SideEffect | ~m2204_13 | | ir.cpp:2193:32:2193:32 | Address | &:r2193_5 | | ir.cpp:2195:16:2195:16 | Address | &:r2195_1 | | ir.cpp:2195:16:2195:16 | Address | &:r2195_1 | @@ -10820,13 +10820,23 @@ | ir.cpp:2203:17:2203:21 | StoreValue | r2203_1 | | ir.cpp:2204:9:2204:9 | Address | &:r2204_1 | | ir.cpp:2204:9:2204:9 | Address | &:r2204_1 | +| ir.cpp:2204:9:2204:9 | Address | &:r2204_9 | +| ir.cpp:2204:9:2204:9 | Address | &:r2204_9 | | ir.cpp:2204:9:2204:9 | Arg(this) | this:r2204_1 | +| ir.cpp:2204:9:2204:9 | Arg(this) | this:r2204_9 | | ir.cpp:2204:9:2204:9 | CallTarget | func:r2204_2 | +| ir.cpp:2204:9:2204:9 | CallTarget | func:r2204_10 | | ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_4 | | ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_7 | +| ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_12 | +| ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_15 | +| ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_17 | | ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_17 | | ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_20 | +| ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_20 | | ir.cpp:2204:9:2204:9 | SideEffect | m2202_20 | +| ir.cpp:2204:9:2204:9 | SideEffect | m2202_20 | +| ir.cpp:2204:9:2204:9 | SideEffect | ~m2202_17 | | ir.cpp:2204:9:2204:9 | SideEffect | ~m2202_17 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 683bd5dfe20..c474fe2f77d 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12304,7 +12304,7 @@ ir.cpp: # 2202| mu2202_14(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2202_9 # 2202| r2202_15(bool) = CopyValue : r2202_11 # 2202| v2202_16(void) = ConditionalBranch : r2202_15 -#-----| False -> Block 7 +#-----| False -> Block 6 #-----| True -> Block 5 # 2203| Block 5 @@ -12326,13 +12326,10 @@ ir.cpp: # 2204| mu2204_10(unknown) = ^CallSideEffect : ~m? # 2204| v2204_11(void) = ^IndirectReadSideEffect[-1] : &:r2204_7, ~m? # 2204| mu2204_12(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2204_7 -#-----| Goto -> Block 7 - -# 2206| Block 7 -# 2206| v2206_1(void) = NoOp : -# 2193| v2193_6(void) = ReturnVoid : -# 2193| v2193_7(void) = AliasedUse : ~m? -# 2193| v2193_8(void) = ExitFunction : +# 2206| v2206_1(void) = NoOp : +# 2193| v2193_6(void) = ReturnVoid : +# 2193| v2193_7(void) = AliasedUse : ~m? +# 2193| v2193_8(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() From 6663420d39bd741c01f1809cf7d2b82d9bebf5b5 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 13 Feb 2024 00:35:56 +0000 Subject: [PATCH 030/207] C++: test for multiple for loop variables with destructors --- .../library-tests/ir/ir/PrintAST.expected | 473 ++++++++++------- .../library-tests/ir/ir/aliased_ir.expected | 478 ++++++++++-------- .../ir/ir/aliased_ssa_consistency.expected | 1 + .../aliased_ssa_consistency_unsound.expected | 1 + cpp/ql/test/library-tests/ir/ir/ir.cpp | 4 + .../ir/ir/operand_locations.expected | 447 +++++++++------- .../ir/ir/raw_consistency.expected | 1 + .../test/library-tests/ir/ir/raw_ir.expected | 405 ++++++++------- .../ir/ir/unaliased_ssa_consistency.expected | 1 + ...unaliased_ssa_consistency_unsound.expected | 1 + 10 files changed, 1041 insertions(+), 771 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index a61b76798b7..655c6134c92 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -16449,208 +16449,291 @@ ir.cpp: # 2157| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2157| Type = [NestedStruct] iterator # 2157| ValueCategory = lvalue -# 2160| getStmt(3): [ReturnStmt] return ... -# 2162| [TopLevelFunction] void IfDestructors2(bool) -# 2162| : -# 2162| getParameter(0): [Parameter] b -# 2162| Type = [BoolType] bool -# 2162| getEntryPoint(): [BlockStmt] { ... } -# 2163| getStmt(0): [IfStmt] if (...) ... -# 2163| getInitialization(): [DeclStmt] declaration -# 2163| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s -# 2163| Type = [Struct] String -# 2163| getVariable().getInitializer(): [Initializer] initializer for s -# 2163| getExpr(): [ConstructorCall] call to String -# 2163| Type = [VoidType] void -# 2163| ValueCategory = prvalue -# 2163| getArgument(0): hello -# 2163| Type = [ArrayType] const char[6] -# 2163| Value = [StringLiteral] "hello" -# 2163| ValueCategory = lvalue -# 2163| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion -# 2163| Type = [PointerType] const char * -# 2163| ValueCategory = prvalue -# 2163| getCondition(): [VariableAccess] b -# 2163| Type = [BoolType] bool -# 2163| ValueCategory = prvalue(load) -# 2163| getThen(): [BlockStmt] { ... } -# 2164| getStmt(0): [DeclStmt] declaration -# 2164| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x -# 2164| Type = [IntType] int -# 2164| getVariable().getInitializer(): [Initializer] initializer for x -# 2164| getExpr(): [Literal] 0 -# 2164| Type = [IntType] int -# 2164| Value = [Literal] 0 -# 2164| ValueCategory = prvalue -# 2165| getElse(): [BlockStmt] { ... } -# 2166| getStmt(0): [DeclStmt] declaration -# 2166| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y -# 2166| Type = [IntType] int -# 2166| getVariable().getInitializer(): [Initializer] initializer for y -# 2166| getExpr(): [Literal] 0 -# 2166| Type = [IntType] int -# 2166| Value = [Literal] 0 -# 2166| ValueCategory = prvalue -# 2167| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 2167| Type = [VoidType] void -# 2167| ValueCategory = prvalue -# 2167| getQualifier(): [VariableAccess] s +# 2161| getStmt(3): [ForStmt] for(...;...;...) ... +# 2161| getInitialization(): [DeclStmt] declaration +# 2161| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2161| Type = [Struct] String +# 2161| getVariable().getInitializer(): [Initializer] initializer for s +# 2161| getExpr(): [ConstructorCall] call to String +# 2161| Type = [VoidType] void +# 2161| ValueCategory = prvalue +# 2161| getArgument(0): hello +# 2161| Type = [ArrayType] const char[6] +# 2161| Value = [StringLiteral] "hello" +# 2161| ValueCategory = lvalue +# 2161| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2161| Type = [PointerType] const char * +# 2161| ValueCategory = prvalue +# 2161| getDeclarationEntry(1): [VariableDeclarationEntry] definition of s2 +# 2161| Type = [Struct] String +# 2161| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2161| getExpr(): [ConstructorCall] call to String +# 2161| Type = [VoidType] void +# 2161| ValueCategory = prvalue +# 2161| getArgument(0): world +# 2161| Type = [ArrayType] const char[6] +# 2161| Value = [StringLiteral] "world" +# 2161| ValueCategory = lvalue +# 2161| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2161| Type = [PointerType] const char * +# 2161| ValueCategory = prvalue +# 2161| getCondition(): [NEExpr] ... != ... +# 2161| Type = [BoolType] bool +# 2161| ValueCategory = prvalue +# 2161| getLeftOperand(): [VariableAccess] c +# 2161| Type = [PlainCharType] char +# 2161| ValueCategory = prvalue(load) +# 2161| getRightOperand(): [Literal] 0 +# 2161| Type = [IntType] int +# 2161| Value = [Literal] 0 +# 2161| ValueCategory = prvalue +# 2161| getLeftOperand().getFullyConverted(): [CStyleCast] (int)... +# 2161| Conversion = [IntegralConversion] integral conversion +# 2161| Type = [IntType] int +# 2161| ValueCategory = prvalue +# 2161| getUpdate(): [AssignExpr] ... = ... +# 2161| Type = [PlainCharType] char +# 2161| ValueCategory = lvalue +# 2161| getLValue(): [VariableAccess] c +# 2161| Type = [PlainCharType] char +# 2161| ValueCategory = lvalue +# 2161| getRValue(): [FunctionCall] call to pop_back +# 2161| Type = [PlainCharType] char +# 2161| ValueCategory = prvalue +# 2161| getQualifier(): [VariableAccess] s +# 2161| Type = [Struct] String +# 2161| ValueCategory = lvalue +# 2161| getStmt(): [BlockStmt] { ... } +# 2162| getStmt(0): [ExprStmt] ExprStmt +# 2162| getExpr(): [AssignExpr] ... = ... +# 2162| Type = [PlainCharType] char +# 2162| ValueCategory = lvalue +# 2162| getLValue(): [VariableAccess] c +# 2162| Type = [PlainCharType] char +# 2162| ValueCategory = lvalue +# 2162| getRValue(): [Literal] 0 +# 2162| Type = [IntType] int +# 2162| Value = [Literal] 0 +# 2162| ValueCategory = prvalue +# 2162| getRValue().getFullyConverted(): [CStyleCast] (char)... +# 2162| Conversion = [IntegralConversion] integral conversion +# 2162| Type = [PlainCharType] char +# 2162| Value = [CStyleCast] 0 +# 2162| ValueCategory = prvalue +# 2161| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2161| Type = [VoidType] void +# 2161| ValueCategory = prvalue +# 2161| getQualifier(): [VariableAccess] s2 +# 2161| Type = [Struct] String +# 2161| ValueCategory = lvalue +# 2161| getImplicitDestructorCall(1): [DestructorCall] call to ~String +# 2161| Type = [VoidType] void +# 2161| ValueCategory = prvalue +# 2161| getQualifier(): [VariableAccess] s +# 2161| Type = [Struct] String +# 2161| ValueCategory = lvalue +# 2164| getStmt(4): [ReturnStmt] return ... +# 2166| [TopLevelFunction] void IfDestructors2(bool) +# 2166| : +# 2166| getParameter(0): [Parameter] b +# 2166| Type = [BoolType] bool +# 2166| getEntryPoint(): [BlockStmt] { ... } +# 2167| getStmt(0): [IfStmt] if (...) ... +# 2167| getInitialization(): [DeclStmt] declaration +# 2167| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s # 2167| Type = [Struct] String -# 2167| ValueCategory = lvalue -# 2168| getStmt(1): [ReturnStmt] return ... -# 2170| [CopyAssignmentOperator] Bool& Bool::operator=(Bool const&) -# 2170| : -#-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const Bool & -# 2170| [CopyConstructor] void Bool::Bool(Bool const&) -# 2170| : -#-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const Bool & -# 2172| [Constructor] void Bool::Bool(bool) -# 2172| : -# 2172| getParameter(0): [Parameter] b_ -# 2172| Type = [BoolType] bool -# 2173| [ConversionOperator] bool Bool::operator bool() -# 2173| : -# 2174| [Destructor] void Bool::~Bool() +# 2167| getVariable().getInitializer(): [Initializer] initializer for s +# 2167| getExpr(): [ConstructorCall] call to String +# 2167| Type = [VoidType] void +# 2167| ValueCategory = prvalue +# 2167| getArgument(0): hello +# 2167| Type = [ArrayType] const char[6] +# 2167| Value = [StringLiteral] "hello" +# 2167| ValueCategory = lvalue +# 2167| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2167| Type = [PointerType] const char * +# 2167| ValueCategory = prvalue +# 2167| getCondition(): [VariableAccess] b +# 2167| Type = [BoolType] bool +# 2167| ValueCategory = prvalue(load) +# 2167| getThen(): [BlockStmt] { ... } +# 2168| getStmt(0): [DeclStmt] declaration +# 2168| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 2168| Type = [IntType] int +# 2168| getVariable().getInitializer(): [Initializer] initializer for x +# 2168| getExpr(): [Literal] 0 +# 2168| Type = [IntType] int +# 2168| Value = [Literal] 0 +# 2168| ValueCategory = prvalue +# 2169| getElse(): [BlockStmt] { ... } +# 2170| getStmt(0): [DeclStmt] declaration +# 2170| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2170| Type = [IntType] int +# 2170| getVariable().getInitializer(): [Initializer] initializer for y +# 2170| getExpr(): [Literal] 0 +# 2170| Type = [IntType] int +# 2170| Value = [Literal] 0 +# 2170| ValueCategory = prvalue +# 2171| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2171| Type = [VoidType] void +# 2171| ValueCategory = prvalue +# 2171| getQualifier(): [VariableAccess] s +# 2171| Type = [Struct] String +# 2171| ValueCategory = lvalue +# 2172| getStmt(1): [ReturnStmt] return ... +# 2174| [CopyAssignmentOperator] Bool& Bool::operator=(Bool const&) # 2174| : -# 2177| [TopLevelFunction] void IfDestructors3(bool) +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool & +# 2174| [CopyConstructor] void Bool::Bool(Bool const&) +# 2174| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool & +# 2176| [Constructor] void Bool::Bool(bool) +# 2176| : +# 2176| getParameter(0): [Parameter] b_ +# 2176| Type = [BoolType] bool +# 2177| [ConversionOperator] bool Bool::operator bool() # 2177| : -# 2177| getParameter(0): [Parameter] b -# 2177| Type = [BoolType] bool -# 2177| getEntryPoint(): [BlockStmt] { ... } -# 2178| getStmt(0): [IfStmt] if (...) ... -# 2178| getCondition(): [ConditionDeclExpr] (condition decl) -# 2178| Type = [BoolType] bool -# 2178| ValueCategory = prvalue -# 2178| getChild(0): [FunctionCall] call to operator bool -# 2178| Type = [BoolType] bool -# 2178| ValueCategory = prvalue -# 2178| getQualifier(): [VariableAccess] B -# 2178| Type = [Class] Bool -# 2178| ValueCategory = prvalue(load) -# 2178| getThen(): [BlockStmt] { ... } -# 2179| getStmt(0): [DeclStmt] declaration -# 2179| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1 -# 2179| Type = [Struct] String -# 2179| getVariable().getInitializer(): [Initializer] initializer for s1 -# 2179| getExpr(): [ConstructorCall] call to String -# 2179| Type = [VoidType] void -# 2179| ValueCategory = prvalue -# 2180| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 2180| Type = [VoidType] void -# 2180| ValueCategory = prvalue -# 2180| getQualifier(): [VariableAccess] s1 -# 2180| Type = [Struct] String -# 2180| ValueCategory = lvalue -# 2180| getElse(): [BlockStmt] { ... } -# 2181| getStmt(0): [DeclStmt] declaration -# 2181| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 -# 2181| Type = [Struct] String -# 2181| getVariable().getInitializer(): [Initializer] initializer for s2 -# 2181| getExpr(): [ConstructorCall] call to String -# 2181| Type = [VoidType] void -# 2181| ValueCategory = prvalue -# 2182| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 2182| Type = [VoidType] void -# 2182| ValueCategory = prvalue -# 2182| getQualifier(): [VariableAccess] s2 -# 2182| Type = [Struct] String -# 2182| ValueCategory = lvalue -# 2182| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool -# 2182| Type = [VoidType] void +# 2178| [Destructor] void Bool::~Bool() +# 2178| : +# 2181| [TopLevelFunction] void IfDestructors3(bool) +# 2181| : +# 2181| getParameter(0): [Parameter] b +# 2181| Type = [BoolType] bool +# 2181| getEntryPoint(): [BlockStmt] { ... } +# 2182| getStmt(0): [IfStmt] if (...) ... +# 2182| getCondition(): [ConditionDeclExpr] (condition decl) +# 2182| Type = [BoolType] bool # 2182| ValueCategory = prvalue -# 2182| getQualifier(): [VariableAccess] B -# 2182| Type = [Class] Bool -# 2182| ValueCategory = lvalue -# 2183| getStmt(1): [ReturnStmt] return ... -# 2186| [CopyAssignmentOperator] Bool2& Bool2::operator=(Bool2 const&) -# 2186| : -#-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const Bool2 & -# 2186| [CopyConstructor] void Bool2::Bool2(Bool2 const&) -# 2186| : -#-----| getParameter(0): [Parameter] (unnamed parameter 0) -#-----| Type = [LValueReferenceType] const Bool2 & -# 2188| [Constructor] void Bool2::Bool2(bool) -# 2188| : -# 2188| getParameter(0): [Parameter] b_ -# 2188| Type = [BoolType] bool -# 2189| [ConversionOperator] bool Bool2::operator bool() -# 2189| : -# 2190| [Destructor] void Bool2::~Bool2() +# 2182| getChild(0): [FunctionCall] call to operator bool +# 2182| Type = [BoolType] bool +# 2182| ValueCategory = prvalue +# 2182| getQualifier(): [VariableAccess] B +# 2182| Type = [Class] Bool +# 2182| ValueCategory = prvalue(load) +# 2182| getThen(): [BlockStmt] { ... } +# 2183| getStmt(0): [DeclStmt] declaration +# 2183| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s1 +# 2183| Type = [Struct] String +# 2183| getVariable().getInitializer(): [Initializer] initializer for s1 +# 2183| getExpr(): [ConstructorCall] call to String +# 2183| Type = [VoidType] void +# 2183| ValueCategory = prvalue +# 2184| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2184| Type = [VoidType] void +# 2184| ValueCategory = prvalue +# 2184| getQualifier(): [VariableAccess] s1 +# 2184| Type = [Struct] String +# 2184| ValueCategory = lvalue +# 2184| getElse(): [BlockStmt] { ... } +# 2185| getStmt(0): [DeclStmt] declaration +# 2185| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 +# 2185| Type = [Struct] String +# 2185| getVariable().getInitializer(): [Initializer] initializer for s2 +# 2185| getExpr(): [ConstructorCall] call to String +# 2185| Type = [VoidType] void +# 2185| ValueCategory = prvalue +# 2186| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2186| Type = [VoidType] void +# 2186| ValueCategory = prvalue +# 2186| getQualifier(): [VariableAccess] s2 +# 2186| Type = [Struct] String +# 2186| ValueCategory = lvalue +# 2186| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool +# 2186| Type = [VoidType] void +# 2186| ValueCategory = prvalue +# 2186| getQualifier(): [VariableAccess] B +# 2186| Type = [Class] Bool +# 2186| ValueCategory = lvalue +# 2187| getStmt(1): [ReturnStmt] return ... +# 2190| [CopyAssignmentOperator] Bool2& Bool2::operator=(Bool2 const&) # 2190| : -# 2193| [TopLevelFunction] void WhileLoopDestructors(bool) +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool2 & +# 2190| [CopyConstructor] void Bool2::Bool2(Bool2 const&) +# 2190| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const Bool2 & +# 2192| [Constructor] void Bool2::Bool2(bool) +# 2192| : +# 2192| getParameter(0): [Parameter] b_ +# 2192| Type = [BoolType] bool +# 2193| [ConversionOperator] bool Bool2::operator bool() # 2193| : -# 2193| getParameter(0): [Parameter] b -# 2193| Type = [BoolType] bool -# 2193| getEntryPoint(): [BlockStmt] { ... } -# 2194| getStmt(0): [BlockStmt] { ... } -# 2195| getStmt(0): [DeclStmt] declaration -# 2195| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s -# 2195| Type = [Struct] String -# 2195| getVariable().getInitializer(): [Initializer] initializer for s -# 2195| getExpr(): [ConstructorCall] call to String -# 2195| Type = [VoidType] void -# 2195| ValueCategory = prvalue -# 2196| getStmt(1): [WhileStmt] while (...) ... -# 2196| getCondition(): [VariableAccess] b -# 2196| Type = [BoolType] bool -# 2196| ValueCategory = prvalue(load) -# 2196| getStmt(): [BlockStmt] { ... } -# 2197| getStmt(0): [ExprStmt] ExprStmt -# 2197| getExpr(): [AssignExpr] ... = ... -# 2197| Type = [BoolType] bool -# 2197| ValueCategory = lvalue -# 2197| getLValue(): [VariableAccess] b -# 2197| Type = [BoolType] bool -# 2197| ValueCategory = lvalue -# 2197| getRValue(): [Literal] 0 -# 2197| Type = [BoolType] bool -# 2197| Value = [Literal] 0 -# 2197| ValueCategory = prvalue -# 2199| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 2199| Type = [VoidType] void -# 2199| ValueCategory = prvalue -# 2199| getQualifier(): [VariableAccess] s +# 2194| [Destructor] void Bool2::~Bool2() +# 2194| : +# 2197| [TopLevelFunction] void WhileLoopDestructors(bool) +# 2197| : +# 2197| getParameter(0): [Parameter] b +# 2197| Type = [BoolType] bool +# 2197| getEntryPoint(): [BlockStmt] { ... } +# 2198| getStmt(0): [BlockStmt] { ... } +# 2199| getStmt(0): [DeclStmt] declaration +# 2199| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s # 2199| Type = [Struct] String -# 2199| ValueCategory = lvalue -# 2201| getStmt(1): [BlockStmt] { ... } -# 2202| getStmt(0): [WhileStmt] while (...) ... -# 2202| getCondition(): [ConditionDeclExpr] (condition decl) -# 2202| Type = [BoolType] bool -# 2202| ValueCategory = prvalue -# 2202| getChild(0): [FunctionCall] call to operator bool -# 2202| Type = [BoolType] bool -# 2202| ValueCategory = prvalue -# 2202| getQualifier(): [VariableAccess] B -# 2202| Type = [Class] Bool -# 2202| ValueCategory = prvalue(load) -# 2202| getStmt(): [BlockStmt] { ... } -# 2203| getStmt(0): [ExprStmt] ExprStmt -# 2203| getExpr(): [AssignExpr] ... = ... -# 2203| Type = [BoolType] bool -# 2203| ValueCategory = lvalue -# 2203| getLValue(): [VariableAccess] b -# 2203| Type = [BoolType] bool -# 2203| ValueCategory = lvalue -# 2203| getRValue(): [Literal] 0 -# 2203| Type = [BoolType] bool -# 2203| Value = [Literal] 0 -# 2203| ValueCategory = prvalue -# 2204| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool -# 2204| Type = [VoidType] void -# 2204| ValueCategory = prvalue -# 2204| getQualifier(): [VariableAccess] B -# 2204| Type = [Class] Bool -# 2204| ValueCategory = lvalue -# 2204| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool -# 2204| Type = [VoidType] void -# 2204| ValueCategory = prvalue -# 2204| getQualifier(): [VariableAccess] B -# 2204| Type = [Class] Bool -# 2204| ValueCategory = lvalue -# 2206| getStmt(2): [ReturnStmt] return ... +# 2199| getVariable().getInitializer(): [Initializer] initializer for s +# 2199| getExpr(): [ConstructorCall] call to String +# 2199| Type = [VoidType] void +# 2199| ValueCategory = prvalue +# 2200| getStmt(1): [WhileStmt] while (...) ... +# 2200| getCondition(): [VariableAccess] b +# 2200| Type = [BoolType] bool +# 2200| ValueCategory = prvalue(load) +# 2200| getStmt(): [BlockStmt] { ... } +# 2201| getStmt(0): [ExprStmt] ExprStmt +# 2201| getExpr(): [AssignExpr] ... = ... +# 2201| Type = [BoolType] bool +# 2201| ValueCategory = lvalue +# 2201| getLValue(): [VariableAccess] b +# 2201| Type = [BoolType] bool +# 2201| ValueCategory = lvalue +# 2201| getRValue(): [Literal] 0 +# 2201| Type = [BoolType] bool +# 2201| Value = [Literal] 0 +# 2201| ValueCategory = prvalue +# 2203| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2203| Type = [VoidType] void +# 2203| ValueCategory = prvalue +# 2203| getQualifier(): [VariableAccess] s +# 2203| Type = [Struct] String +# 2203| ValueCategory = lvalue +# 2205| getStmt(1): [BlockStmt] { ... } +# 2206| getStmt(0): [WhileStmt] while (...) ... +# 2206| getCondition(): [ConditionDeclExpr] (condition decl) +# 2206| Type = [BoolType] bool +# 2206| ValueCategory = prvalue +# 2206| getChild(0): [FunctionCall] call to operator bool +# 2206| Type = [BoolType] bool +# 2206| ValueCategory = prvalue +# 2206| getQualifier(): [VariableAccess] B +# 2206| Type = [Class] Bool +# 2206| ValueCategory = prvalue(load) +# 2206| getStmt(): [BlockStmt] { ... } +# 2207| getStmt(0): [ExprStmt] ExprStmt +# 2207| getExpr(): [AssignExpr] ... = ... +# 2207| Type = [BoolType] bool +# 2207| ValueCategory = lvalue +# 2207| getLValue(): [VariableAccess] b +# 2207| Type = [BoolType] bool +# 2207| ValueCategory = lvalue +# 2207| getRValue(): [Literal] 0 +# 2207| Type = [BoolType] bool +# 2207| Value = [Literal] 0 +# 2207| ValueCategory = prvalue +# 2208| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool +# 2208| Type = [VoidType] void +# 2208| ValueCategory = prvalue +# 2208| getQualifier(): [VariableAccess] B +# 2208| Type = [Class] Bool +# 2208| ValueCategory = lvalue +# 2208| getImplicitDestructorCall(0): [DestructorCall] call to ~Bool +# 2208| Type = [VoidType] void +# 2208| ValueCategory = prvalue +# 2208| getQualifier(): [VariableAccess] B +# 2208| Type = [Class] Bool +# 2208| ValueCategory = lvalue +# 2210| getStmt(2): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index fc43321652f..8232a69acea 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -13022,243 +13022,301 @@ ir.cpp: # 2157| r2157_75(glval) = CopyValue : r2157_69 #-----| Goto (back edge) -> Block 4 -# 2160| Block 6 -# 2160| v2160_1(void) = NoOp : -# 2151| v2151_5(void) = ReturnVoid : -# 2151| v2151_6(void) = AliasedUse : ~m2157_48 -# 2151| v2151_7(void) = ExitFunction : +# 2161| Block 6 +# 2161| r2161_1(glval) = VariableAddress[s] : +# 2161| m2161_2(String) = Uninitialized[s] : &:r2161_1 +# 2161| r2161_3(glval) = FunctionAddress[String] : +# 2161| r2161_4(glval) = StringConstant["hello"] : +# 2161| r2161_5(char *) = Convert : r2161_4 +# 2161| v2161_6(void) = Call[String] : func:r2161_3, this:r2161_1, 0:r2161_5 +# 2161| m2161_7(unknown) = ^CallSideEffect : ~m2157_48 +# 2161| m2161_8(unknown) = Chi : total:m2157_48, partial:m2161_7 +# 2161| v2161_9(void) = ^BufferReadSideEffect[0] : &:r2161_5, ~m2151_3 +# 2161| m2161_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_1 +# 2161| m2161_11(String) = Chi : total:m2161_2, partial:m2161_10 +# 2161| r2161_12(glval) = VariableAddress[s2] : +# 2161| m2161_13(String) = Uninitialized[s2] : &:r2161_12 +# 2161| r2161_14(glval) = FunctionAddress[String] : +# 2161| r2161_15(glval) = StringConstant["world"] : +# 2161| r2161_16(char *) = Convert : r2161_15 +# 2161| v2161_17(void) = Call[String] : func:r2161_14, this:r2161_12, 0:r2161_16 +# 2161| m2161_18(unknown) = ^CallSideEffect : ~m2161_8 +# 2161| m2161_19(unknown) = Chi : total:m2161_8, partial:m2161_18 +# 2161| v2161_20(void) = ^BufferReadSideEffect[0] : &:r2161_16, ~m2151_3 +# 2161| m2161_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_12 +# 2161| m2161_22(String) = Chi : total:m2161_13, partial:m2161_21 +#-----| Goto -> Block 7 -# 2162| void IfDestructors2(bool) -# 2162| Block 0 -# 2162| v2162_1(void) = EnterFunction : -# 2162| m2162_2(unknown) = AliasedDefinition : -# 2162| m2162_3(unknown) = InitializeNonLocal : -# 2162| m2162_4(unknown) = Chi : total:m2162_2, partial:m2162_3 -# 2162| r2162_5(glval) = VariableAddress[b] : -# 2162| m2162_6(bool) = InitializeParameter[b] : &:r2162_5 -# 2163| r2163_1(glval) = VariableAddress[s] : -# 2163| m2163_2(String) = Uninitialized[s] : &:r2163_1 -# 2163| r2163_3(glval) = FunctionAddress[String] : -# 2163| r2163_4(glval) = StringConstant["hello"] : -# 2163| r2163_5(char *) = Convert : r2163_4 -# 2163| v2163_6(void) = Call[String] : func:r2163_3, this:r2163_1, 0:r2163_5 -# 2163| m2163_7(unknown) = ^CallSideEffect : ~m2162_4 -# 2163| m2163_8(unknown) = Chi : total:m2162_4, partial:m2163_7 -# 2163| v2163_9(void) = ^BufferReadSideEffect[0] : &:r2163_5, ~m2162_3 -# 2163| m2163_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2163_1 -# 2163| m2163_11(String) = Chi : total:m2163_2, partial:m2163_10 -# 2163| r2163_12(glval) = VariableAddress[b] : -# 2163| r2163_13(bool) = Load[b] : &:r2163_12, m2162_6 -# 2163| v2163_14(void) = ConditionalBranch : r2163_13 -#-----| False -> Block 2 -#-----| True -> Block 1 +# 2161| Block 7 +# 2161| m2161_23(String) = Phi : from 6:m2161_11, from 8:m2161_39 +# 2161| m2161_24(unknown) = Phi : from 6:~m2161_19, from 8:~m2161_36 +# 2161| m2161_25(char) = Phi : from 6:m2153_14, from 8:m2161_41 +# 2161| r2161_26(glval) = VariableAddress[c] : +# 2161| r2161_27(char) = Load[c] : &:r2161_26, m2161_25 +# 2161| r2161_28(int) = Convert : r2161_27 +# 2161| r2161_29(int) = Constant[0] : +# 2161| r2161_30(bool) = CompareNE : r2161_28, r2161_29 +# 2161| v2161_31(void) = ConditionalBranch : r2161_30 +#-----| False -> Block 9 +#-----| True -> Block 8 -# 2164| Block 1 -# 2164| r2164_1(glval) = VariableAddress[x] : -# 2164| r2164_2(int) = Constant[0] : -# 2164| m2164_3(int) = Store[x] : &:r2164_1, r2164_2 -#-----| Goto -> Block 3 +# 2162| Block 8 +# 2162| r2162_1(char) = Constant[0] : +# 2162| r2162_2(glval) = VariableAddress[c] : +# 2162| m2162_3(char) = Store[c] : &:r2162_2, r2162_1 +# 2161| r2161_32(glval) = VariableAddress[s] : +# 2161| r2161_33(glval) = FunctionAddress[pop_back] : +# 2161| r2161_34(char) = Call[pop_back] : func:r2161_33, this:r2161_32 +# 2161| m2161_35(unknown) = ^CallSideEffect : ~m2161_24 +# 2161| m2161_36(unknown) = Chi : total:m2161_24, partial:m2161_35 +# 2161| v2161_37(void) = ^IndirectReadSideEffect[-1] : &:r2161_32, m2161_23 +# 2161| m2161_38(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_32 +# 2161| m2161_39(String) = Chi : total:m2161_23, partial:m2161_38 +# 2161| r2161_40(glval) = VariableAddress[c] : +# 2161| m2161_41(char) = Store[c] : &:r2161_40, r2161_34 +#-----| Goto (back edge) -> Block 7 -# 2166| Block 2 -# 2166| r2166_1(glval) = VariableAddress[y] : -# 2166| r2166_2(int) = Constant[0] : -# 2166| m2166_3(int) = Store[y] : &:r2166_1, r2166_2 -#-----| Goto -> Block 3 +# 2161| Block 9 +# 2161| r2161_42(glval) = VariableAddress[s2] : +# 2161| r2161_43(glval) = FunctionAddress[~String] : +# 2161| v2161_44(void) = Call[~String] : func:r2161_43, this:r2161_42 +# 2161| m2161_45(unknown) = ^CallSideEffect : ~m2161_24 +# 2161| m2161_46(unknown) = Chi : total:m2161_24, partial:m2161_45 +# 2161| v2161_47(void) = ^IndirectReadSideEffect[-1] : &:r2161_42, m2161_22 +# 2161| m2161_48(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_42 +# 2161| m2161_49(String) = Chi : total:m2161_22, partial:m2161_48 -# 2167| Block 3 +# 2166| void IfDestructors2(bool) +# 2166| Block 0 +# 2166| v2166_1(void) = EnterFunction : +# 2166| m2166_2(unknown) = AliasedDefinition : +# 2166| m2166_3(unknown) = InitializeNonLocal : +# 2166| m2166_4(unknown) = Chi : total:m2166_2, partial:m2166_3 +# 2166| r2166_5(glval) = VariableAddress[b] : +# 2166| m2166_6(bool) = InitializeParameter[b] : &:r2166_5 # 2167| r2167_1(glval) = VariableAddress[s] : -# 2167| r2167_2(glval) = FunctionAddress[~String] : -# 2167| v2167_3(void) = Call[~String] : func:r2167_2, this:r2167_1 -# 2167| m2167_4(unknown) = ^CallSideEffect : ~m2163_8 -# 2167| m2167_5(unknown) = Chi : total:m2163_8, partial:m2167_4 -# 2167| v2167_6(void) = ^IndirectReadSideEffect[-1] : &:r2167_1, m2163_11 -# 2167| m2167_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2167_1 -# 2167| m2167_8(String) = Chi : total:m2163_11, partial:m2167_7 -# 2168| v2168_1(void) = NoOp : -# 2162| v2162_7(void) = ReturnVoid : -# 2162| v2162_8(void) = AliasedUse : ~m2167_5 -# 2162| v2162_9(void) = ExitFunction : - -# 2177| void IfDestructors3(bool) -# 2177| Block 0 -# 2177| v2177_1(void) = EnterFunction : -# 2177| m2177_2(unknown) = AliasedDefinition : -# 2177| m2177_3(unknown) = InitializeNonLocal : -# 2177| m2177_4(unknown) = Chi : total:m2177_2, partial:m2177_3 -# 2177| r2177_5(glval) = VariableAddress[b] : -# 2177| m2177_6(bool) = InitializeParameter[b] : &:r2177_5 -# 2178| r2178_1(glval) = VariableAddress[B] : -# 2178| m2178_2(Bool) = Uninitialized[B] : &:r2178_1 -# 2178| r2178_3(glval) = FunctionAddress[Bool] : -# 2178| r2178_4(glval) = VariableAddress[b] : -# 2178| r2178_5(bool) = Load[b] : &:r2178_4, m2177_6 -# 2178| v2178_6(void) = Call[Bool] : func:r2178_3, this:r2178_1, 0:r2178_5 -# 2178| m2178_7(unknown) = ^CallSideEffect : ~m2177_4 -# 2178| m2178_8(unknown) = Chi : total:m2177_4, partial:m2178_7 -# 2178| m2178_9(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2178_1 -# 2178| m2178_10(Bool) = Chi : total:m2178_2, partial:m2178_9 -# 2178| r2178_11(glval) = VariableAddress[B] : -# 2178| r2178_12(glval) = FunctionAddress[operator bool] : -# 2178| r2178_13(bool) = Call[operator bool] : func:r2178_12, this:r2178_11 -# 2178| m2178_14(unknown) = ^CallSideEffect : ~m2178_8 -# 2178| m2178_15(unknown) = Chi : total:m2178_8, partial:m2178_14 -# 2178| v2178_16(void) = ^IndirectReadSideEffect[-1] : &:r2178_11, m2178_10 -# 2178| m2178_17(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2178_11 -# 2178| m2178_18(Bool) = Chi : total:m2178_10, partial:m2178_17 -# 2178| r2178_19(bool) = CopyValue : r2178_13 -# 2178| v2178_20(void) = ConditionalBranch : r2178_19 +# 2167| m2167_2(String) = Uninitialized[s] : &:r2167_1 +# 2167| r2167_3(glval) = FunctionAddress[String] : +# 2167| r2167_4(glval) = StringConstant["hello"] : +# 2167| r2167_5(char *) = Convert : r2167_4 +# 2167| v2167_6(void) = Call[String] : func:r2167_3, this:r2167_1, 0:r2167_5 +# 2167| m2167_7(unknown) = ^CallSideEffect : ~m2166_4 +# 2167| m2167_8(unknown) = Chi : total:m2166_4, partial:m2167_7 +# 2167| v2167_9(void) = ^BufferReadSideEffect[0] : &:r2167_5, ~m2166_3 +# 2167| m2167_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2167_1 +# 2167| m2167_11(String) = Chi : total:m2167_2, partial:m2167_10 +# 2167| r2167_12(glval) = VariableAddress[b] : +# 2167| r2167_13(bool) = Load[b] : &:r2167_12, m2166_6 +# 2167| v2167_14(void) = ConditionalBranch : r2167_13 #-----| False -> Block 2 #-----| True -> Block 1 -# 2179| Block 1 -# 2179| r2179_1(glval) = VariableAddress[s1] : -# 2179| m2179_2(String) = Uninitialized[s1] : &:r2179_1 -# 2179| r2179_3(glval) = FunctionAddress[String] : -# 2179| v2179_4(void) = Call[String] : func:r2179_3, this:r2179_1 -# 2179| m2179_5(unknown) = ^CallSideEffect : ~m2178_15 -# 2179| m2179_6(unknown) = Chi : total:m2178_15, partial:m2179_5 -# 2179| m2179_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2179_1 -# 2179| m2179_8(String) = Chi : total:m2179_2, partial:m2179_7 -# 2180| r2180_1(glval) = VariableAddress[s1] : -# 2180| r2180_2(glval) = FunctionAddress[~String] : -# 2180| v2180_3(void) = Call[~String] : func:r2180_2, this:r2180_1 -# 2180| m2180_4(unknown) = ^CallSideEffect : ~m2179_6 -# 2180| m2180_5(unknown) = Chi : total:m2179_6, partial:m2180_4 -# 2180| v2180_6(void) = ^IndirectReadSideEffect[-1] : &:r2180_1, m2179_8 -# 2180| m2180_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2180_1 -# 2180| m2180_8(String) = Chi : total:m2179_8, partial:m2180_7 +# 2168| Block 1 +# 2168| r2168_1(glval) = VariableAddress[x] : +# 2168| r2168_2(int) = Constant[0] : +# 2168| m2168_3(int) = Store[x] : &:r2168_1, r2168_2 #-----| Goto -> Block 3 -# 2181| Block 2 -# 2181| r2181_1(glval) = VariableAddress[s2] : -# 2181| m2181_2(String) = Uninitialized[s2] : &:r2181_1 -# 2181| r2181_3(glval) = FunctionAddress[String] : -# 2181| v2181_4(void) = Call[String] : func:r2181_3, this:r2181_1 -# 2181| m2181_5(unknown) = ^CallSideEffect : ~m2178_15 -# 2181| m2181_6(unknown) = Chi : total:m2178_15, partial:m2181_5 -# 2181| m2181_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2181_1 -# 2181| m2181_8(String) = Chi : total:m2181_2, partial:m2181_7 -# 2182| r2182_1(glval) = VariableAddress[s2] : -# 2182| r2182_2(glval) = FunctionAddress[~String] : -# 2182| v2182_3(void) = Call[~String] : func:r2182_2, this:r2182_1 -# 2182| m2182_4(unknown) = ^CallSideEffect : ~m2181_6 -# 2182| m2182_5(unknown) = Chi : total:m2181_6, partial:m2182_4 -# 2182| v2182_6(void) = ^IndirectReadSideEffect[-1] : &:r2182_1, m2181_8 -# 2182| m2182_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2182_1 -# 2182| m2182_8(String) = Chi : total:m2181_8, partial:m2182_7 +# 2170| Block 2 +# 2170| r2170_1(glval) = VariableAddress[y] : +# 2170| r2170_2(int) = Constant[0] : +# 2170| m2170_3(int) = Store[y] : &:r2170_1, r2170_2 #-----| Goto -> Block 3 -# 2182| Block 3 -# 2182| m2182_9(unknown) = Phi : from 1:~m2180_5, from 2:~m2182_5 -# 2182| r2182_10(glval) = VariableAddress[B] : -# 2182| r2182_11(glval) = FunctionAddress[~Bool] : -# 2182| v2182_12(void) = Call[~Bool] : func:r2182_11, this:r2182_10 -# 2182| m2182_13(unknown) = ^CallSideEffect : ~m2182_9 -# 2182| m2182_14(unknown) = Chi : total:m2182_9, partial:m2182_13 -# 2182| v2182_15(void) = ^IndirectReadSideEffect[-1] : &:r2182_10, m2178_18 -# 2182| m2182_16(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2182_10 -# 2182| m2182_17(Bool) = Chi : total:m2178_18, partial:m2182_16 -# 2183| v2183_1(void) = NoOp : -# 2177| v2177_7(void) = ReturnVoid : -# 2177| v2177_8(void) = AliasedUse : ~m2182_14 -# 2177| v2177_9(void) = ExitFunction : +# 2171| Block 3 +# 2171| r2171_1(glval) = VariableAddress[s] : +# 2171| r2171_2(glval) = FunctionAddress[~String] : +# 2171| v2171_3(void) = Call[~String] : func:r2171_2, this:r2171_1 +# 2171| m2171_4(unknown) = ^CallSideEffect : ~m2167_8 +# 2171| m2171_5(unknown) = Chi : total:m2167_8, partial:m2171_4 +# 2171| v2171_6(void) = ^IndirectReadSideEffect[-1] : &:r2171_1, m2167_11 +# 2171| m2171_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2171_1 +# 2171| m2171_8(String) = Chi : total:m2167_11, partial:m2171_7 +# 2172| v2172_1(void) = NoOp : +# 2166| v2166_7(void) = ReturnVoid : +# 2166| v2166_8(void) = AliasedUse : ~m2171_5 +# 2166| v2166_9(void) = ExitFunction : -# 2193| void WhileLoopDestructors(bool) -# 2193| Block 0 -# 2193| v2193_1(void) = EnterFunction : -# 2193| m2193_2(unknown) = AliasedDefinition : -# 2193| m2193_3(unknown) = InitializeNonLocal : -# 2193| m2193_4(unknown) = Chi : total:m2193_2, partial:m2193_3 -# 2193| r2193_5(glval) = VariableAddress[b] : -# 2193| m2193_6(bool) = InitializeParameter[b] : &:r2193_5 -# 2195| r2195_1(glval) = VariableAddress[s] : -# 2195| m2195_2(String) = Uninitialized[s] : &:r2195_1 -# 2195| r2195_3(glval) = FunctionAddress[String] : -# 2195| v2195_4(void) = Call[String] : func:r2195_3, this:r2195_1 -# 2195| m2195_5(unknown) = ^CallSideEffect : ~m2193_4 -# 2195| m2195_6(unknown) = Chi : total:m2193_4, partial:m2195_5 -# 2195| m2195_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2195_1 -# 2195| m2195_8(String) = Chi : total:m2195_2, partial:m2195_7 +# 2181| void IfDestructors3(bool) +# 2181| Block 0 +# 2181| v2181_1(void) = EnterFunction : +# 2181| m2181_2(unknown) = AliasedDefinition : +# 2181| m2181_3(unknown) = InitializeNonLocal : +# 2181| m2181_4(unknown) = Chi : total:m2181_2, partial:m2181_3 +# 2181| r2181_5(glval) = VariableAddress[b] : +# 2181| m2181_6(bool) = InitializeParameter[b] : &:r2181_5 +# 2182| r2182_1(glval) = VariableAddress[B] : +# 2182| m2182_2(Bool) = Uninitialized[B] : &:r2182_1 +# 2182| r2182_3(glval) = FunctionAddress[Bool] : +# 2182| r2182_4(glval) = VariableAddress[b] : +# 2182| r2182_5(bool) = Load[b] : &:r2182_4, m2181_6 +# 2182| v2182_6(void) = Call[Bool] : func:r2182_3, this:r2182_1, 0:r2182_5 +# 2182| m2182_7(unknown) = ^CallSideEffect : ~m2181_4 +# 2182| m2182_8(unknown) = Chi : total:m2181_4, partial:m2182_7 +# 2182| m2182_9(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2182_1 +# 2182| m2182_10(Bool) = Chi : total:m2182_2, partial:m2182_9 +# 2182| r2182_11(glval) = VariableAddress[B] : +# 2182| r2182_12(glval) = FunctionAddress[operator bool] : +# 2182| r2182_13(bool) = Call[operator bool] : func:r2182_12, this:r2182_11 +# 2182| m2182_14(unknown) = ^CallSideEffect : ~m2182_8 +# 2182| m2182_15(unknown) = Chi : total:m2182_8, partial:m2182_14 +# 2182| v2182_16(void) = ^IndirectReadSideEffect[-1] : &:r2182_11, m2182_10 +# 2182| m2182_17(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2182_11 +# 2182| m2182_18(Bool) = Chi : total:m2182_10, partial:m2182_17 +# 2182| r2182_19(bool) = CopyValue : r2182_13 +# 2182| v2182_20(void) = ConditionalBranch : r2182_19 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2183| Block 1 +# 2183| r2183_1(glval) = VariableAddress[s1] : +# 2183| m2183_2(String) = Uninitialized[s1] : &:r2183_1 +# 2183| r2183_3(glval) = FunctionAddress[String] : +# 2183| v2183_4(void) = Call[String] : func:r2183_3, this:r2183_1 +# 2183| m2183_5(unknown) = ^CallSideEffect : ~m2182_15 +# 2183| m2183_6(unknown) = Chi : total:m2182_15, partial:m2183_5 +# 2183| m2183_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2183_1 +# 2183| m2183_8(String) = Chi : total:m2183_2, partial:m2183_7 +# 2184| r2184_1(glval) = VariableAddress[s1] : +# 2184| r2184_2(glval) = FunctionAddress[~String] : +# 2184| v2184_3(void) = Call[~String] : func:r2184_2, this:r2184_1 +# 2184| m2184_4(unknown) = ^CallSideEffect : ~m2183_6 +# 2184| m2184_5(unknown) = Chi : total:m2183_6, partial:m2184_4 +# 2184| v2184_6(void) = ^IndirectReadSideEffect[-1] : &:r2184_1, m2183_8 +# 2184| m2184_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2184_1 +# 2184| m2184_8(String) = Chi : total:m2183_8, partial:m2184_7 +#-----| Goto -> Block 3 + +# 2185| Block 2 +# 2185| r2185_1(glval) = VariableAddress[s2] : +# 2185| m2185_2(String) = Uninitialized[s2] : &:r2185_1 +# 2185| r2185_3(glval) = FunctionAddress[String] : +# 2185| v2185_4(void) = Call[String] : func:r2185_3, this:r2185_1 +# 2185| m2185_5(unknown) = ^CallSideEffect : ~m2182_15 +# 2185| m2185_6(unknown) = Chi : total:m2182_15, partial:m2185_5 +# 2185| m2185_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2185_1 +# 2185| m2185_8(String) = Chi : total:m2185_2, partial:m2185_7 +# 2186| r2186_1(glval) = VariableAddress[s2] : +# 2186| r2186_2(glval) = FunctionAddress[~String] : +# 2186| v2186_3(void) = Call[~String] : func:r2186_2, this:r2186_1 +# 2186| m2186_4(unknown) = ^CallSideEffect : ~m2185_6 +# 2186| m2186_5(unknown) = Chi : total:m2185_6, partial:m2186_4 +# 2186| v2186_6(void) = ^IndirectReadSideEffect[-1] : &:r2186_1, m2185_8 +# 2186| m2186_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2186_1 +# 2186| m2186_8(String) = Chi : total:m2185_8, partial:m2186_7 +#-----| Goto -> Block 3 + +# 2186| Block 3 +# 2186| m2186_9(unknown) = Phi : from 1:~m2184_5, from 2:~m2186_5 +# 2186| r2186_10(glval) = VariableAddress[B] : +# 2186| r2186_11(glval) = FunctionAddress[~Bool] : +# 2186| v2186_12(void) = Call[~Bool] : func:r2186_11, this:r2186_10 +# 2186| m2186_13(unknown) = ^CallSideEffect : ~m2186_9 +# 2186| m2186_14(unknown) = Chi : total:m2186_9, partial:m2186_13 +# 2186| v2186_15(void) = ^IndirectReadSideEffect[-1] : &:r2186_10, m2182_18 +# 2186| m2186_16(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2186_10 +# 2186| m2186_17(Bool) = Chi : total:m2182_18, partial:m2186_16 +# 2187| v2187_1(void) = NoOp : +# 2181| v2181_7(void) = ReturnVoid : +# 2181| v2181_8(void) = AliasedUse : ~m2186_14 +# 2181| v2181_9(void) = ExitFunction : + +# 2197| void WhileLoopDestructors(bool) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| m2197_2(unknown) = AliasedDefinition : +# 2197| m2197_3(unknown) = InitializeNonLocal : +# 2197| m2197_4(unknown) = Chi : total:m2197_2, partial:m2197_3 +# 2197| r2197_5(glval) = VariableAddress[b] : +# 2197| m2197_6(bool) = InitializeParameter[b] : &:r2197_5 +# 2199| r2199_1(glval) = VariableAddress[s] : +# 2199| m2199_2(String) = Uninitialized[s] : &:r2199_1 +# 2199| r2199_3(glval) = FunctionAddress[String] : +# 2199| v2199_4(void) = Call[String] : func:r2199_3, this:r2199_1 +# 2199| m2199_5(unknown) = ^CallSideEffect : ~m2197_4 +# 2199| m2199_6(unknown) = Chi : total:m2197_4, partial:m2199_5 +# 2199| m2199_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2199_1 +# 2199| m2199_8(String) = Chi : total:m2199_2, partial:m2199_7 #-----| Goto -> Block 1 -# 2196| Block 1 -# 2196| m2196_1(bool) = Phi : from 0:m2193_6, from 2:m2197_3 -# 2196| r2196_2(glval) = VariableAddress[b] : -# 2196| r2196_3(bool) = Load[b] : &:r2196_2, m2196_1 -# 2196| v2196_4(void) = ConditionalBranch : r2196_3 +# 2200| Block 1 +# 2200| m2200_1(bool) = Phi : from 0:m2197_6, from 2:m2201_3 +# 2200| r2200_2(glval) = VariableAddress[b] : +# 2200| r2200_3(bool) = Load[b] : &:r2200_2, m2200_1 +# 2200| v2200_4(void) = ConditionalBranch : r2200_3 #-----| False -> Block 3 #-----| True -> Block 2 -# 2197| Block 2 -# 2197| r2197_1(bool) = Constant[0] : -# 2197| r2197_2(glval) = VariableAddress[b] : -# 2197| m2197_3(bool) = Store[b] : &:r2197_2, r2197_1 +# 2201| Block 2 +# 2201| r2201_1(bool) = Constant[0] : +# 2201| r2201_2(glval) = VariableAddress[b] : +# 2201| m2201_3(bool) = Store[b] : &:r2201_2, r2201_1 #-----| Goto (back edge) -> Block 1 -# 2199| Block 3 -# 2199| r2199_1(glval) = VariableAddress[s] : -# 2199| r2199_2(glval) = FunctionAddress[~String] : -# 2199| v2199_3(void) = Call[~String] : func:r2199_2, this:r2199_1 -# 2199| m2199_4(unknown) = ^CallSideEffect : ~m2195_6 -# 2199| m2199_5(unknown) = Chi : total:m2195_6, partial:m2199_4 -# 2199| v2199_6(void) = ^IndirectReadSideEffect[-1] : &:r2199_1, m2195_8 -# 2199| m2199_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2199_1 -# 2199| m2199_8(String) = Chi : total:m2195_8, partial:m2199_7 +# 2203| Block 3 +# 2203| r2203_1(glval) = VariableAddress[s] : +# 2203| r2203_2(glval) = FunctionAddress[~String] : +# 2203| v2203_3(void) = Call[~String] : func:r2203_2, this:r2203_1 +# 2203| m2203_4(unknown) = ^CallSideEffect : ~m2199_6 +# 2203| m2203_5(unknown) = Chi : total:m2199_6, partial:m2203_4 +# 2203| v2203_6(void) = ^IndirectReadSideEffect[-1] : &:r2203_1, m2199_8 +# 2203| m2203_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2203_1 +# 2203| m2203_8(String) = Chi : total:m2199_8, partial:m2203_7 #-----| Goto -> Block 4 -# 2202| Block 4 -# 2202| m2202_1(unknown) = Phi : from 3:~m2199_5, from 5:~m2204_5 -# 2202| m2202_2(bool) = Phi : from 3:m2196_1, from 5:m2203_3 -# 2202| r2202_3(glval) = VariableAddress[B] : -# 2202| m2202_4(Bool) = Uninitialized[B] : &:r2202_3 -# 2202| r2202_5(glval) = FunctionAddress[Bool] : -# 2202| r2202_6(glval) = VariableAddress[b] : -# 2202| r2202_7(bool) = Load[b] : &:r2202_6, m2202_2 -# 2202| v2202_8(void) = Call[Bool] : func:r2202_5, this:r2202_3, 0:r2202_7 -# 2202| m2202_9(unknown) = ^CallSideEffect : ~m2202_1 -# 2202| m2202_10(unknown) = Chi : total:m2202_1, partial:m2202_9 -# 2202| m2202_11(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2202_3 -# 2202| m2202_12(Bool) = Chi : total:m2202_4, partial:m2202_11 -# 2202| r2202_13(glval) = VariableAddress[B] : -# 2202| r2202_14(glval) = FunctionAddress[operator bool] : -# 2202| r2202_15(bool) = Call[operator bool] : func:r2202_14, this:r2202_13 -# 2202| m2202_16(unknown) = ^CallSideEffect : ~m2202_10 -# 2202| m2202_17(unknown) = Chi : total:m2202_10, partial:m2202_16 -# 2202| v2202_18(void) = ^IndirectReadSideEffect[-1] : &:r2202_13, m2202_12 -# 2202| m2202_19(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2202_13 -# 2202| m2202_20(Bool) = Chi : total:m2202_12, partial:m2202_19 -# 2202| r2202_21(bool) = CopyValue : r2202_15 -# 2202| v2202_22(void) = ConditionalBranch : r2202_21 +# 2206| Block 4 +# 2206| m2206_1(unknown) = Phi : from 3:~m2203_5, from 5:~m2208_5 +# 2206| m2206_2(bool) = Phi : from 3:m2200_1, from 5:m2207_3 +# 2206| r2206_3(glval) = VariableAddress[B] : +# 2206| m2206_4(Bool) = Uninitialized[B] : &:r2206_3 +# 2206| r2206_5(glval) = FunctionAddress[Bool] : +# 2206| r2206_6(glval) = VariableAddress[b] : +# 2206| r2206_7(bool) = Load[b] : &:r2206_6, m2206_2 +# 2206| v2206_8(void) = Call[Bool] : func:r2206_5, this:r2206_3, 0:r2206_7 +# 2206| m2206_9(unknown) = ^CallSideEffect : ~m2206_1 +# 2206| m2206_10(unknown) = Chi : total:m2206_1, partial:m2206_9 +# 2206| m2206_11(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2206_3 +# 2206| m2206_12(Bool) = Chi : total:m2206_4, partial:m2206_11 +# 2206| r2206_13(glval) = VariableAddress[B] : +# 2206| r2206_14(glval) = FunctionAddress[operator bool] : +# 2206| r2206_15(bool) = Call[operator bool] : func:r2206_14, this:r2206_13 +# 2206| m2206_16(unknown) = ^CallSideEffect : ~m2206_10 +# 2206| m2206_17(unknown) = Chi : total:m2206_10, partial:m2206_16 +# 2206| v2206_18(void) = ^IndirectReadSideEffect[-1] : &:r2206_13, m2206_12 +# 2206| m2206_19(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2206_13 +# 2206| m2206_20(Bool) = Chi : total:m2206_12, partial:m2206_19 +# 2206| r2206_21(bool) = CopyValue : r2206_15 +# 2206| v2206_22(void) = ConditionalBranch : r2206_21 #-----| False -> Block 6 #-----| True -> Block 5 -# 2203| Block 5 -# 2203| r2203_1(bool) = Constant[0] : -# 2203| r2203_2(glval) = VariableAddress[b] : -# 2203| m2203_3(bool) = Store[b] : &:r2203_2, r2203_1 -# 2204| r2204_1(glval) = VariableAddress[B] : -# 2204| r2204_2(glval) = FunctionAddress[~Bool] : -# 2204| v2204_3(void) = Call[~Bool] : func:r2204_2, this:r2204_1 -# 2204| m2204_4(unknown) = ^CallSideEffect : ~m2202_17 -# 2204| m2204_5(unknown) = Chi : total:m2202_17, partial:m2204_4 -# 2204| v2204_6(void) = ^IndirectReadSideEffect[-1] : &:r2204_1, m2202_20 -# 2204| m2204_7(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2204_1 -# 2204| m2204_8(Bool) = Chi : total:m2202_20, partial:m2204_7 +# 2207| Block 5 +# 2207| r2207_1(bool) = Constant[0] : +# 2207| r2207_2(glval) = VariableAddress[b] : +# 2207| m2207_3(bool) = Store[b] : &:r2207_2, r2207_1 +# 2208| r2208_1(glval) = VariableAddress[B] : +# 2208| r2208_2(glval) = FunctionAddress[~Bool] : +# 2208| v2208_3(void) = Call[~Bool] : func:r2208_2, this:r2208_1 +# 2208| m2208_4(unknown) = ^CallSideEffect : ~m2206_17 +# 2208| m2208_5(unknown) = Chi : total:m2206_17, partial:m2208_4 +# 2208| v2208_6(void) = ^IndirectReadSideEffect[-1] : &:r2208_1, m2206_20 +# 2208| m2208_7(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2208_1 +# 2208| m2208_8(Bool) = Chi : total:m2206_20, partial:m2208_7 #-----| Goto (back edge) -> Block 4 -# 2204| Block 6 -# 2204| r2204_9(glval) = VariableAddress[B] : -# 2204| r2204_10(glval) = FunctionAddress[~Bool] : -# 2204| v2204_11(void) = Call[~Bool] : func:r2204_10, this:r2204_9 -# 2204| m2204_12(unknown) = ^CallSideEffect : ~m2202_17 -# 2204| m2204_13(unknown) = Chi : total:m2202_17, partial:m2204_12 -# 2204| v2204_14(void) = ^IndirectReadSideEffect[-1] : &:r2204_9, m2202_20 -# 2204| m2204_15(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2204_9 -# 2204| m2204_16(Bool) = Chi : total:m2202_20, partial:m2204_15 -# 2206| v2206_1(void) = NoOp : -# 2193| v2193_7(void) = ReturnVoid : -# 2193| v2193_8(void) = AliasedUse : ~m2204_13 -# 2193| v2193_9(void) = ExitFunction : +# 2208| Block 6 +# 2208| r2208_9(glval) = VariableAddress[B] : +# 2208| r2208_10(glval) = FunctionAddress[~Bool] : +# 2208| v2208_11(void) = Call[~Bool] : func:r2208_10, this:r2208_9 +# 2208| m2208_12(unknown) = ^CallSideEffect : ~m2206_17 +# 2208| m2208_13(unknown) = Chi : total:m2206_17, partial:m2208_12 +# 2208| v2208_14(void) = ^IndirectReadSideEffect[-1] : &:r2208_9, m2206_20 +# 2208| m2208_15(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2208_9 +# 2208| m2208_16(Bool) = Chi : total:m2206_20, partial:m2208_15 +# 2210| v2210_1(void) = NoOp : +# 2197| v2197_7(void) = ReturnVoid : +# 2197| v2197_8(void) = AliasedUse : ~m2208_13 +# 2197| v2197_9(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index b93c7d2649f..4eaff8357e6 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2161:28:2161:29 | Chi: s2 | Instruction 'Chi: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index b93c7d2649f..4eaff8357e6 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2161:28:2161:29 | Chi: s2 | Instruction 'Chi: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 8f5fd9d888b..e497cdaf41c 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2157,6 +2157,10 @@ void ForDestructors() { for(String s : vector(String("hello"))) { String s2; } + + for(String s("hello"), s2("world"); c != 0; c = s.pop_back()) { + c = 0; + } } void IfDestructors2(bool b) { diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index b6ebd5f2dc0..5a55f7a9cfa 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -10464,7 +10464,6 @@ | ir.cpp:2149:1:2149:1 | SideEffect | ~m2149_6 | | ir.cpp:2151:6:2151:19 | ChiPartial | partial:m2151_3 | | ir.cpp:2151:6:2151:19 | ChiTotal | total:m2151_2 | -| ir.cpp:2151:6:2151:19 | SideEffect | ~m2157_48 | | ir.cpp:2152:10:2152:10 | Address | &:r2152_1 | | ir.cpp:2152:13:2152:16 | StoreValue | r2152_2 | | ir.cpp:2153:16:2153:16 | Address | &:r2153_1 | @@ -10646,198 +10645,260 @@ | ir.cpp:2159:5:2159:5 | ChiTotal | total:m2158_8 | | ir.cpp:2159:5:2159:5 | SideEffect | m2158_8 | | ir.cpp:2159:5:2159:5 | SideEffect | ~m2158_6 | -| ir.cpp:2162:6:2162:19 | ChiPartial | partial:m2162_3 | -| ir.cpp:2162:6:2162:19 | ChiTotal | total:m2162_2 | -| ir.cpp:2162:6:2162:19 | SideEffect | ~m2167_5 | -| ir.cpp:2162:26:2162:26 | Address | &:r2162_5 | -| ir.cpp:2163:15:2163:15 | Address | &:r2163_1 | -| ir.cpp:2163:15:2163:15 | Address | &:r2163_1 | -| ir.cpp:2163:15:2163:15 | Arg(this) | this:r2163_1 | -| ir.cpp:2163:18:2163:33 | CallTarget | func:r2163_3 | -| ir.cpp:2163:18:2163:33 | ChiPartial | partial:m2163_7 | -| ir.cpp:2163:18:2163:33 | ChiPartial | partial:m2163_10 | -| ir.cpp:2163:18:2163:33 | ChiTotal | total:m2162_4 | -| ir.cpp:2163:18:2163:33 | ChiTotal | total:m2163_2 | -| ir.cpp:2163:18:2163:33 | SideEffect | ~m2162_4 | -| ir.cpp:2163:26:2163:32 | Address | &:r2163_5 | -| ir.cpp:2163:26:2163:32 | Arg(0) | 0:r2163_5 | -| ir.cpp:2163:26:2163:32 | SideEffect | ~m2162_3 | -| ir.cpp:2163:26:2163:32 | Unary | r2163_4 | -| ir.cpp:2163:36:2163:36 | Address | &:r2163_12 | -| ir.cpp:2163:36:2163:36 | Condition | r2163_13 | -| ir.cpp:2163:36:2163:36 | Load | m2162_6 | -| ir.cpp:2164:13:2164:13 | Address | &:r2164_1 | -| ir.cpp:2164:16:2164:17 | StoreValue | r2164_2 | -| ir.cpp:2166:13:2166:13 | Address | &:r2166_1 | -| ir.cpp:2166:16:2166:17 | StoreValue | r2166_2 | -| ir.cpp:2167:5:2167:5 | Address | &:r2167_1 | -| ir.cpp:2167:5:2167:5 | Address | &:r2167_1 | -| ir.cpp:2167:5:2167:5 | Arg(this) | this:r2167_1 | -| ir.cpp:2167:5:2167:5 | CallTarget | func:r2167_2 | -| ir.cpp:2167:5:2167:5 | ChiPartial | partial:m2167_4 | -| ir.cpp:2167:5:2167:5 | ChiPartial | partial:m2167_7 | -| ir.cpp:2167:5:2167:5 | ChiTotal | total:m2163_8 | -| ir.cpp:2167:5:2167:5 | ChiTotal | total:m2163_11 | -| ir.cpp:2167:5:2167:5 | SideEffect | m2163_11 | -| ir.cpp:2167:5:2167:5 | SideEffect | ~m2163_8 | -| ir.cpp:2177:6:2177:19 | ChiPartial | partial:m2177_3 | -| ir.cpp:2177:6:2177:19 | ChiTotal | total:m2177_2 | -| ir.cpp:2177:6:2177:19 | SideEffect | ~m2182_14 | -| ir.cpp:2177:26:2177:26 | Address | &:r2177_5 | -| ir.cpp:2178:8:2178:23 | Address | &:r2178_1 | -| ir.cpp:2178:8:2178:23 | Address | &:r2178_1 | -| ir.cpp:2178:8:2178:23 | Arg(this) | this:r2178_1 | -| ir.cpp:2178:8:2178:23 | Condition | r2178_19 | -| ir.cpp:2178:13:2178:13 | Address | &:r2178_11 | -| ir.cpp:2178:13:2178:13 | Address | &:r2178_11 | -| ir.cpp:2178:13:2178:13 | Arg(this) | this:r2178_11 | -| ir.cpp:2178:13:2178:13 | CallTarget | func:r2178_12 | -| ir.cpp:2178:13:2178:13 | ChiPartial | partial:m2178_14 | -| ir.cpp:2178:13:2178:13 | ChiPartial | partial:m2178_17 | -| ir.cpp:2178:13:2178:13 | ChiTotal | total:m2178_8 | -| ir.cpp:2178:13:2178:13 | ChiTotal | total:m2178_10 | -| ir.cpp:2178:13:2178:13 | SideEffect | m2178_10 | -| ir.cpp:2178:13:2178:13 | SideEffect | ~m2178_8 | -| ir.cpp:2178:13:2178:13 | Unary | r2178_13 | -| ir.cpp:2178:16:2178:23 | CallTarget | func:r2178_3 | -| ir.cpp:2178:16:2178:23 | ChiPartial | partial:m2178_7 | -| ir.cpp:2178:16:2178:23 | ChiPartial | partial:m2178_9 | -| ir.cpp:2178:16:2178:23 | ChiTotal | total:m2177_4 | -| ir.cpp:2178:16:2178:23 | ChiTotal | total:m2178_2 | -| ir.cpp:2178:16:2178:23 | SideEffect | ~m2177_4 | -| ir.cpp:2178:22:2178:22 | Address | &:r2178_4 | -| ir.cpp:2178:22:2178:22 | Arg(0) | 0:r2178_5 | -| ir.cpp:2178:22:2178:22 | Load | m2177_6 | -| ir.cpp:2179:16:2179:17 | Address | &:r2179_1 | -| ir.cpp:2179:16:2179:17 | Address | &:r2179_1 | -| ir.cpp:2179:16:2179:17 | Arg(this) | this:r2179_1 | -| ir.cpp:2179:16:2179:17 | CallTarget | func:r2179_3 | -| ir.cpp:2179:16:2179:17 | ChiPartial | partial:m2179_5 | -| ir.cpp:2179:16:2179:17 | ChiPartial | partial:m2179_7 | -| ir.cpp:2179:16:2179:17 | ChiTotal | total:m2178_15 | -| ir.cpp:2179:16:2179:17 | ChiTotal | total:m2179_2 | -| ir.cpp:2179:16:2179:17 | SideEffect | ~m2178_15 | -| ir.cpp:2180:5:2180:5 | Address | &:r2180_1 | -| ir.cpp:2180:5:2180:5 | Address | &:r2180_1 | -| ir.cpp:2180:5:2180:5 | Arg(this) | this:r2180_1 | -| ir.cpp:2180:5:2180:5 | CallTarget | func:r2180_2 | -| ir.cpp:2180:5:2180:5 | ChiPartial | partial:m2180_4 | -| ir.cpp:2180:5:2180:5 | ChiPartial | partial:m2180_7 | -| ir.cpp:2180:5:2180:5 | ChiTotal | total:m2179_6 | -| ir.cpp:2180:5:2180:5 | ChiTotal | total:m2179_8 | -| ir.cpp:2180:5:2180:5 | SideEffect | m2179_8 | -| ir.cpp:2180:5:2180:5 | SideEffect | ~m2179_6 | -| ir.cpp:2181:16:2181:17 | Address | &:r2181_1 | -| ir.cpp:2181:16:2181:17 | Address | &:r2181_1 | -| ir.cpp:2181:16:2181:17 | Arg(this) | this:r2181_1 | -| ir.cpp:2181:16:2181:17 | CallTarget | func:r2181_3 | -| ir.cpp:2181:16:2181:17 | ChiPartial | partial:m2181_5 | -| ir.cpp:2181:16:2181:17 | ChiPartial | partial:m2181_7 | -| ir.cpp:2181:16:2181:17 | ChiTotal | total:m2178_15 | -| ir.cpp:2181:16:2181:17 | ChiTotal | total:m2181_2 | -| ir.cpp:2181:16:2181:17 | SideEffect | ~m2178_15 | -| ir.cpp:2182:5:2182:5 | Address | &:r2182_1 | -| ir.cpp:2182:5:2182:5 | Address | &:r2182_1 | -| ir.cpp:2182:5:2182:5 | Address | &:r2182_10 | -| ir.cpp:2182:5:2182:5 | Address | &:r2182_10 | -| ir.cpp:2182:5:2182:5 | Arg(this) | this:r2182_1 | -| ir.cpp:2182:5:2182:5 | Arg(this) | this:r2182_10 | -| ir.cpp:2182:5:2182:5 | CallTarget | func:r2182_2 | -| ir.cpp:2182:5:2182:5 | CallTarget | func:r2182_11 | -| ir.cpp:2182:5:2182:5 | ChiPartial | partial:m2182_4 | -| ir.cpp:2182:5:2182:5 | ChiPartial | partial:m2182_7 | -| ir.cpp:2182:5:2182:5 | ChiPartial | partial:m2182_13 | -| ir.cpp:2182:5:2182:5 | ChiPartial | partial:m2182_16 | -| ir.cpp:2182:5:2182:5 | ChiTotal | total:m2178_18 | -| ir.cpp:2182:5:2182:5 | ChiTotal | total:m2181_6 | -| ir.cpp:2182:5:2182:5 | ChiTotal | total:m2181_8 | -| ir.cpp:2182:5:2182:5 | ChiTotal | total:m2182_9 | -| ir.cpp:2182:5:2182:5 | Phi | from 1:~m2180_5 | -| ir.cpp:2182:5:2182:5 | Phi | from 2:~m2182_5 | -| ir.cpp:2182:5:2182:5 | SideEffect | m2178_18 | -| ir.cpp:2182:5:2182:5 | SideEffect | m2181_8 | -| ir.cpp:2182:5:2182:5 | SideEffect | ~m2181_6 | -| ir.cpp:2182:5:2182:5 | SideEffect | ~m2182_9 | -| ir.cpp:2193:6:2193:25 | ChiPartial | partial:m2193_3 | -| ir.cpp:2193:6:2193:25 | ChiTotal | total:m2193_2 | -| ir.cpp:2193:6:2193:25 | SideEffect | ~m2204_13 | -| ir.cpp:2193:32:2193:32 | Address | &:r2193_5 | -| ir.cpp:2195:16:2195:16 | Address | &:r2195_1 | -| ir.cpp:2195:16:2195:16 | Address | &:r2195_1 | -| ir.cpp:2195:16:2195:16 | Arg(this) | this:r2195_1 | -| ir.cpp:2195:16:2195:16 | CallTarget | func:r2195_3 | -| ir.cpp:2195:16:2195:16 | ChiPartial | partial:m2195_5 | -| ir.cpp:2195:16:2195:16 | ChiPartial | partial:m2195_7 | -| ir.cpp:2195:16:2195:16 | ChiTotal | total:m2193_4 | -| ir.cpp:2195:16:2195:16 | ChiTotal | total:m2195_2 | -| ir.cpp:2195:16:2195:16 | SideEffect | ~m2193_4 | -| ir.cpp:2196:15:2196:15 | Address | &:r2196_2 | -| ir.cpp:2196:15:2196:15 | Condition | r2196_3 | -| ir.cpp:2196:15:2196:15 | Load | m2196_1 | -| ir.cpp:2196:15:2196:15 | Phi | from 0:m2193_6 | -| ir.cpp:2196:15:2196:15 | Phi | from 2:m2197_3 | -| ir.cpp:2197:13:2197:13 | Address | &:r2197_2 | -| ir.cpp:2197:17:2197:21 | StoreValue | r2197_1 | -| ir.cpp:2199:5:2199:5 | Address | &:r2199_1 | -| ir.cpp:2199:5:2199:5 | Address | &:r2199_1 | -| ir.cpp:2199:5:2199:5 | Arg(this) | this:r2199_1 | -| ir.cpp:2199:5:2199:5 | CallTarget | func:r2199_2 | -| ir.cpp:2199:5:2199:5 | ChiPartial | partial:m2199_4 | -| ir.cpp:2199:5:2199:5 | ChiPartial | partial:m2199_7 | -| ir.cpp:2199:5:2199:5 | ChiTotal | total:m2195_6 | -| ir.cpp:2199:5:2199:5 | ChiTotal | total:m2195_8 | -| ir.cpp:2199:5:2199:5 | SideEffect | m2195_8 | -| ir.cpp:2199:5:2199:5 | SideEffect | ~m2195_6 | -| ir.cpp:2202:16:2202:31 | Address | &:r2202_3 | -| ir.cpp:2202:16:2202:31 | Address | &:r2202_3 | -| ir.cpp:2202:16:2202:31 | Arg(this) | this:r2202_3 | -| ir.cpp:2202:16:2202:31 | Condition | r2202_21 | -| ir.cpp:2202:16:2202:31 | Phi | from 3:m2196_1 | -| ir.cpp:2202:16:2202:31 | Phi | from 3:~m2199_5 | -| ir.cpp:2202:16:2202:31 | Phi | from 5:m2203_3 | -| ir.cpp:2202:16:2202:31 | Phi | from 5:~m2204_5 | -| ir.cpp:2202:21:2202:21 | Address | &:r2202_13 | -| ir.cpp:2202:21:2202:21 | Address | &:r2202_13 | -| ir.cpp:2202:21:2202:21 | Arg(this) | this:r2202_13 | -| ir.cpp:2202:21:2202:21 | CallTarget | func:r2202_14 | -| ir.cpp:2202:21:2202:21 | ChiPartial | partial:m2202_16 | -| ir.cpp:2202:21:2202:21 | ChiPartial | partial:m2202_19 | -| ir.cpp:2202:21:2202:21 | ChiTotal | total:m2202_10 | -| ir.cpp:2202:21:2202:21 | ChiTotal | total:m2202_12 | -| ir.cpp:2202:21:2202:21 | SideEffect | m2202_12 | -| ir.cpp:2202:21:2202:21 | SideEffect | ~m2202_10 | -| ir.cpp:2202:21:2202:21 | Unary | r2202_15 | -| ir.cpp:2202:24:2202:31 | CallTarget | func:r2202_5 | -| ir.cpp:2202:24:2202:31 | ChiPartial | partial:m2202_9 | -| ir.cpp:2202:24:2202:31 | ChiPartial | partial:m2202_11 | -| ir.cpp:2202:24:2202:31 | ChiTotal | total:m2202_1 | -| ir.cpp:2202:24:2202:31 | ChiTotal | total:m2202_4 | -| ir.cpp:2202:24:2202:31 | SideEffect | ~m2202_1 | -| ir.cpp:2202:30:2202:30 | Address | &:r2202_6 | -| ir.cpp:2202:30:2202:30 | Arg(0) | 0:r2202_7 | -| ir.cpp:2202:30:2202:30 | Load | m2202_2 | -| ir.cpp:2203:13:2203:13 | Address | &:r2203_2 | -| ir.cpp:2203:17:2203:21 | StoreValue | r2203_1 | -| ir.cpp:2204:9:2204:9 | Address | &:r2204_1 | -| ir.cpp:2204:9:2204:9 | Address | &:r2204_1 | -| ir.cpp:2204:9:2204:9 | Address | &:r2204_9 | -| ir.cpp:2204:9:2204:9 | Address | &:r2204_9 | -| ir.cpp:2204:9:2204:9 | Arg(this) | this:r2204_1 | -| ir.cpp:2204:9:2204:9 | Arg(this) | this:r2204_9 | -| ir.cpp:2204:9:2204:9 | CallTarget | func:r2204_2 | -| ir.cpp:2204:9:2204:9 | CallTarget | func:r2204_10 | -| ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_4 | -| ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_7 | -| ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_12 | -| ir.cpp:2204:9:2204:9 | ChiPartial | partial:m2204_15 | -| ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_17 | -| ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_17 | -| ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_20 | -| ir.cpp:2204:9:2204:9 | ChiTotal | total:m2202_20 | -| ir.cpp:2204:9:2204:9 | SideEffect | m2202_20 | -| ir.cpp:2204:9:2204:9 | SideEffect | m2202_20 | -| ir.cpp:2204:9:2204:9 | SideEffect | ~m2202_17 | -| ir.cpp:2204:9:2204:9 | SideEffect | ~m2202_17 | +| ir.cpp:2161:16:2161:16 | Address | &:r2161_1 | +| ir.cpp:2161:16:2161:16 | Address | &:r2161_1 | +| ir.cpp:2161:16:2161:16 | Arg(this) | this:r2161_1 | +| ir.cpp:2161:18:2161:24 | Address | &:r2161_5 | +| ir.cpp:2161:18:2161:24 | Arg(0) | 0:r2161_5 | +| ir.cpp:2161:18:2161:24 | SideEffect | ~m2151_3 | +| ir.cpp:2161:18:2161:24 | Unary | r2161_4 | +| ir.cpp:2161:18:2161:25 | CallTarget | func:r2161_3 | +| ir.cpp:2161:18:2161:25 | ChiPartial | partial:m2161_7 | +| ir.cpp:2161:18:2161:25 | ChiPartial | partial:m2161_10 | +| ir.cpp:2161:18:2161:25 | ChiTotal | total:m2157_48 | +| ir.cpp:2161:18:2161:25 | ChiTotal | total:m2161_2 | +| ir.cpp:2161:18:2161:25 | SideEffect | ~m2157_48 | +| ir.cpp:2161:28:2161:29 | Address | &:r2161_12 | +| ir.cpp:2161:28:2161:29 | Address | &:r2161_12 | +| ir.cpp:2161:28:2161:29 | Address | &:r2161_42 | +| ir.cpp:2161:28:2161:29 | Address | &:r2161_42 | +| ir.cpp:2161:28:2161:29 | Arg(this) | this:r2161_12 | +| ir.cpp:2161:28:2161:29 | Arg(this) | this:r2161_42 | +| ir.cpp:2161:28:2161:29 | CallTarget | func:r2161_43 | +| ir.cpp:2161:28:2161:29 | ChiPartial | partial:m2161_45 | +| ir.cpp:2161:28:2161:29 | ChiPartial | partial:m2161_48 | +| ir.cpp:2161:28:2161:29 | ChiTotal | total:m2161_22 | +| ir.cpp:2161:28:2161:29 | ChiTotal | total:m2161_24 | +| ir.cpp:2161:28:2161:29 | SideEffect | m2161_22 | +| ir.cpp:2161:28:2161:29 | SideEffect | ~m2161_24 | +| ir.cpp:2161:31:2161:37 | Address | &:r2161_16 | +| ir.cpp:2161:31:2161:37 | Arg(0) | 0:r2161_16 | +| ir.cpp:2161:31:2161:37 | SideEffect | ~m2151_3 | +| ir.cpp:2161:31:2161:37 | Unary | r2161_15 | +| ir.cpp:2161:31:2161:38 | CallTarget | func:r2161_14 | +| ir.cpp:2161:31:2161:38 | ChiPartial | partial:m2161_18 | +| ir.cpp:2161:31:2161:38 | ChiPartial | partial:m2161_21 | +| ir.cpp:2161:31:2161:38 | ChiTotal | total:m2161_8 | +| ir.cpp:2161:31:2161:38 | ChiTotal | total:m2161_13 | +| ir.cpp:2161:31:2161:38 | SideEffect | ~m2161_8 | +| ir.cpp:2161:41:2161:41 | Address | &:r2161_26 | +| ir.cpp:2161:41:2161:41 | Left | r2161_28 | +| ir.cpp:2161:41:2161:41 | Load | m2161_25 | +| ir.cpp:2161:41:2161:41 | Phi | from 6:m2153_14 | +| ir.cpp:2161:41:2161:41 | Phi | from 6:m2161_11 | +| ir.cpp:2161:41:2161:41 | Phi | from 6:~m2161_19 | +| ir.cpp:2161:41:2161:41 | Phi | from 8:m2161_39 | +| ir.cpp:2161:41:2161:41 | Phi | from 8:m2161_41 | +| ir.cpp:2161:41:2161:41 | Phi | from 8:~m2161_36 | +| ir.cpp:2161:41:2161:41 | Unary | r2161_27 | +| ir.cpp:2161:41:2161:46 | Condition | r2161_30 | +| ir.cpp:2161:46:2161:46 | Right | r2161_29 | +| ir.cpp:2161:49:2161:49 | Address | &:r2161_40 | +| ir.cpp:2161:53:2161:53 | Address | &:r2161_32 | +| ir.cpp:2161:53:2161:53 | Address | &:r2161_32 | +| ir.cpp:2161:53:2161:53 | Arg(this) | this:r2161_32 | +| ir.cpp:2161:53:2161:53 | ChiPartial | partial:m2161_38 | +| ir.cpp:2161:53:2161:53 | ChiTotal | total:m2161_23 | +| ir.cpp:2161:53:2161:53 | SideEffect | m2161_23 | +| ir.cpp:2161:55:2161:62 | CallTarget | func:r2161_33 | +| ir.cpp:2161:55:2161:62 | ChiPartial | partial:m2161_35 | +| ir.cpp:2161:55:2161:62 | ChiTotal | total:m2161_24 | +| ir.cpp:2161:55:2161:62 | SideEffect | ~m2161_24 | +| ir.cpp:2161:55:2161:62 | StoreValue | r2161_34 | +| ir.cpp:2162:9:2162:9 | Address | &:r2162_2 | +| ir.cpp:2162:13:2162:13 | StoreValue | r2162_1 | +| ir.cpp:2166:6:2166:19 | ChiPartial | partial:m2166_3 | +| ir.cpp:2166:6:2166:19 | ChiTotal | total:m2166_2 | +| ir.cpp:2166:6:2166:19 | SideEffect | ~m2171_5 | +| ir.cpp:2166:26:2166:26 | Address | &:r2166_5 | +| ir.cpp:2167:15:2167:15 | Address | &:r2167_1 | +| ir.cpp:2167:15:2167:15 | Address | &:r2167_1 | +| ir.cpp:2167:15:2167:15 | Arg(this) | this:r2167_1 | +| ir.cpp:2167:18:2167:33 | CallTarget | func:r2167_3 | +| ir.cpp:2167:18:2167:33 | ChiPartial | partial:m2167_7 | +| ir.cpp:2167:18:2167:33 | ChiPartial | partial:m2167_10 | +| ir.cpp:2167:18:2167:33 | ChiTotal | total:m2166_4 | +| ir.cpp:2167:18:2167:33 | ChiTotal | total:m2167_2 | +| ir.cpp:2167:18:2167:33 | SideEffect | ~m2166_4 | +| ir.cpp:2167:26:2167:32 | Address | &:r2167_5 | +| ir.cpp:2167:26:2167:32 | Arg(0) | 0:r2167_5 | +| ir.cpp:2167:26:2167:32 | SideEffect | ~m2166_3 | +| ir.cpp:2167:26:2167:32 | Unary | r2167_4 | +| ir.cpp:2167:36:2167:36 | Address | &:r2167_12 | +| ir.cpp:2167:36:2167:36 | Condition | r2167_13 | +| ir.cpp:2167:36:2167:36 | Load | m2166_6 | +| ir.cpp:2168:13:2168:13 | Address | &:r2168_1 | +| ir.cpp:2168:16:2168:17 | StoreValue | r2168_2 | +| ir.cpp:2170:13:2170:13 | Address | &:r2170_1 | +| ir.cpp:2170:16:2170:17 | StoreValue | r2170_2 | +| ir.cpp:2171:5:2171:5 | Address | &:r2171_1 | +| ir.cpp:2171:5:2171:5 | Address | &:r2171_1 | +| ir.cpp:2171:5:2171:5 | Arg(this) | this:r2171_1 | +| ir.cpp:2171:5:2171:5 | CallTarget | func:r2171_2 | +| ir.cpp:2171:5:2171:5 | ChiPartial | partial:m2171_4 | +| ir.cpp:2171:5:2171:5 | ChiPartial | partial:m2171_7 | +| ir.cpp:2171:5:2171:5 | ChiTotal | total:m2167_8 | +| ir.cpp:2171:5:2171:5 | ChiTotal | total:m2167_11 | +| ir.cpp:2171:5:2171:5 | SideEffect | m2167_11 | +| ir.cpp:2171:5:2171:5 | SideEffect | ~m2167_8 | +| ir.cpp:2181:6:2181:19 | ChiPartial | partial:m2181_3 | +| ir.cpp:2181:6:2181:19 | ChiTotal | total:m2181_2 | +| ir.cpp:2181:6:2181:19 | SideEffect | ~m2186_14 | +| ir.cpp:2181:26:2181:26 | Address | &:r2181_5 | +| ir.cpp:2182:8:2182:23 | Address | &:r2182_1 | +| ir.cpp:2182:8:2182:23 | Address | &:r2182_1 | +| ir.cpp:2182:8:2182:23 | Arg(this) | this:r2182_1 | +| ir.cpp:2182:8:2182:23 | Condition | r2182_19 | +| ir.cpp:2182:13:2182:13 | Address | &:r2182_11 | +| ir.cpp:2182:13:2182:13 | Address | &:r2182_11 | +| ir.cpp:2182:13:2182:13 | Arg(this) | this:r2182_11 | +| ir.cpp:2182:13:2182:13 | CallTarget | func:r2182_12 | +| ir.cpp:2182:13:2182:13 | ChiPartial | partial:m2182_14 | +| ir.cpp:2182:13:2182:13 | ChiPartial | partial:m2182_17 | +| ir.cpp:2182:13:2182:13 | ChiTotal | total:m2182_8 | +| ir.cpp:2182:13:2182:13 | ChiTotal | total:m2182_10 | +| ir.cpp:2182:13:2182:13 | SideEffect | m2182_10 | +| ir.cpp:2182:13:2182:13 | SideEffect | ~m2182_8 | +| ir.cpp:2182:13:2182:13 | Unary | r2182_13 | +| ir.cpp:2182:16:2182:23 | CallTarget | func:r2182_3 | +| ir.cpp:2182:16:2182:23 | ChiPartial | partial:m2182_7 | +| ir.cpp:2182:16:2182:23 | ChiPartial | partial:m2182_9 | +| ir.cpp:2182:16:2182:23 | ChiTotal | total:m2181_4 | +| ir.cpp:2182:16:2182:23 | ChiTotal | total:m2182_2 | +| ir.cpp:2182:16:2182:23 | SideEffect | ~m2181_4 | +| ir.cpp:2182:22:2182:22 | Address | &:r2182_4 | +| ir.cpp:2182:22:2182:22 | Arg(0) | 0:r2182_5 | +| ir.cpp:2182:22:2182:22 | Load | m2181_6 | +| ir.cpp:2183:16:2183:17 | Address | &:r2183_1 | +| ir.cpp:2183:16:2183:17 | Address | &:r2183_1 | +| ir.cpp:2183:16:2183:17 | Arg(this) | this:r2183_1 | +| ir.cpp:2183:16:2183:17 | CallTarget | func:r2183_3 | +| ir.cpp:2183:16:2183:17 | ChiPartial | partial:m2183_5 | +| ir.cpp:2183:16:2183:17 | ChiPartial | partial:m2183_7 | +| ir.cpp:2183:16:2183:17 | ChiTotal | total:m2182_15 | +| ir.cpp:2183:16:2183:17 | ChiTotal | total:m2183_2 | +| ir.cpp:2183:16:2183:17 | SideEffect | ~m2182_15 | +| ir.cpp:2184:5:2184:5 | Address | &:r2184_1 | +| ir.cpp:2184:5:2184:5 | Address | &:r2184_1 | +| ir.cpp:2184:5:2184:5 | Arg(this) | this:r2184_1 | +| ir.cpp:2184:5:2184:5 | CallTarget | func:r2184_2 | +| ir.cpp:2184:5:2184:5 | ChiPartial | partial:m2184_4 | +| ir.cpp:2184:5:2184:5 | ChiPartial | partial:m2184_7 | +| ir.cpp:2184:5:2184:5 | ChiTotal | total:m2183_6 | +| ir.cpp:2184:5:2184:5 | ChiTotal | total:m2183_8 | +| ir.cpp:2184:5:2184:5 | SideEffect | m2183_8 | +| ir.cpp:2184:5:2184:5 | SideEffect | ~m2183_6 | +| ir.cpp:2185:16:2185:17 | Address | &:r2185_1 | +| ir.cpp:2185:16:2185:17 | Address | &:r2185_1 | +| ir.cpp:2185:16:2185:17 | Arg(this) | this:r2185_1 | +| ir.cpp:2185:16:2185:17 | CallTarget | func:r2185_3 | +| ir.cpp:2185:16:2185:17 | ChiPartial | partial:m2185_5 | +| ir.cpp:2185:16:2185:17 | ChiPartial | partial:m2185_7 | +| ir.cpp:2185:16:2185:17 | ChiTotal | total:m2182_15 | +| ir.cpp:2185:16:2185:17 | ChiTotal | total:m2185_2 | +| ir.cpp:2185:16:2185:17 | SideEffect | ~m2182_15 | +| ir.cpp:2186:5:2186:5 | Address | &:r2186_1 | +| ir.cpp:2186:5:2186:5 | Address | &:r2186_1 | +| ir.cpp:2186:5:2186:5 | Address | &:r2186_10 | +| ir.cpp:2186:5:2186:5 | Address | &:r2186_10 | +| ir.cpp:2186:5:2186:5 | Arg(this) | this:r2186_1 | +| ir.cpp:2186:5:2186:5 | Arg(this) | this:r2186_10 | +| ir.cpp:2186:5:2186:5 | CallTarget | func:r2186_2 | +| ir.cpp:2186:5:2186:5 | CallTarget | func:r2186_11 | +| ir.cpp:2186:5:2186:5 | ChiPartial | partial:m2186_4 | +| ir.cpp:2186:5:2186:5 | ChiPartial | partial:m2186_7 | +| ir.cpp:2186:5:2186:5 | ChiPartial | partial:m2186_13 | +| ir.cpp:2186:5:2186:5 | ChiPartial | partial:m2186_16 | +| ir.cpp:2186:5:2186:5 | ChiTotal | total:m2182_18 | +| ir.cpp:2186:5:2186:5 | ChiTotal | total:m2185_6 | +| ir.cpp:2186:5:2186:5 | ChiTotal | total:m2185_8 | +| ir.cpp:2186:5:2186:5 | ChiTotal | total:m2186_9 | +| ir.cpp:2186:5:2186:5 | Phi | from 1:~m2184_5 | +| ir.cpp:2186:5:2186:5 | Phi | from 2:~m2186_5 | +| ir.cpp:2186:5:2186:5 | SideEffect | m2182_18 | +| ir.cpp:2186:5:2186:5 | SideEffect | m2185_8 | +| ir.cpp:2186:5:2186:5 | SideEffect | ~m2185_6 | +| ir.cpp:2186:5:2186:5 | SideEffect | ~m2186_9 | +| ir.cpp:2197:6:2197:25 | ChiPartial | partial:m2197_3 | +| ir.cpp:2197:6:2197:25 | ChiTotal | total:m2197_2 | +| ir.cpp:2197:6:2197:25 | SideEffect | ~m2208_13 | +| ir.cpp:2197:32:2197:32 | Address | &:r2197_5 | +| ir.cpp:2199:16:2199:16 | Address | &:r2199_1 | +| ir.cpp:2199:16:2199:16 | Address | &:r2199_1 | +| ir.cpp:2199:16:2199:16 | Arg(this) | this:r2199_1 | +| ir.cpp:2199:16:2199:16 | CallTarget | func:r2199_3 | +| ir.cpp:2199:16:2199:16 | ChiPartial | partial:m2199_5 | +| ir.cpp:2199:16:2199:16 | ChiPartial | partial:m2199_7 | +| ir.cpp:2199:16:2199:16 | ChiTotal | total:m2197_4 | +| ir.cpp:2199:16:2199:16 | ChiTotal | total:m2199_2 | +| ir.cpp:2199:16:2199:16 | SideEffect | ~m2197_4 | +| ir.cpp:2200:15:2200:15 | Address | &:r2200_2 | +| ir.cpp:2200:15:2200:15 | Condition | r2200_3 | +| ir.cpp:2200:15:2200:15 | Load | m2200_1 | +| ir.cpp:2200:15:2200:15 | Phi | from 0:m2197_6 | +| ir.cpp:2200:15:2200:15 | Phi | from 2:m2201_3 | +| ir.cpp:2201:13:2201:13 | Address | &:r2201_2 | +| ir.cpp:2201:17:2201:21 | StoreValue | r2201_1 | +| ir.cpp:2203:5:2203:5 | Address | &:r2203_1 | +| ir.cpp:2203:5:2203:5 | Address | &:r2203_1 | +| ir.cpp:2203:5:2203:5 | Arg(this) | this:r2203_1 | +| ir.cpp:2203:5:2203:5 | CallTarget | func:r2203_2 | +| ir.cpp:2203:5:2203:5 | ChiPartial | partial:m2203_4 | +| ir.cpp:2203:5:2203:5 | ChiPartial | partial:m2203_7 | +| ir.cpp:2203:5:2203:5 | ChiTotal | total:m2199_6 | +| ir.cpp:2203:5:2203:5 | ChiTotal | total:m2199_8 | +| ir.cpp:2203:5:2203:5 | SideEffect | m2199_8 | +| ir.cpp:2203:5:2203:5 | SideEffect | ~m2199_6 | +| ir.cpp:2206:16:2206:31 | Address | &:r2206_3 | +| ir.cpp:2206:16:2206:31 | Address | &:r2206_3 | +| ir.cpp:2206:16:2206:31 | Arg(this) | this:r2206_3 | +| ir.cpp:2206:16:2206:31 | Condition | r2206_21 | +| ir.cpp:2206:16:2206:31 | Phi | from 3:m2200_1 | +| ir.cpp:2206:16:2206:31 | Phi | from 3:~m2203_5 | +| ir.cpp:2206:16:2206:31 | Phi | from 5:m2207_3 | +| ir.cpp:2206:16:2206:31 | Phi | from 5:~m2208_5 | +| ir.cpp:2206:21:2206:21 | Address | &:r2206_13 | +| ir.cpp:2206:21:2206:21 | Address | &:r2206_13 | +| ir.cpp:2206:21:2206:21 | Arg(this) | this:r2206_13 | +| ir.cpp:2206:21:2206:21 | CallTarget | func:r2206_14 | +| ir.cpp:2206:21:2206:21 | ChiPartial | partial:m2206_16 | +| ir.cpp:2206:21:2206:21 | ChiPartial | partial:m2206_19 | +| ir.cpp:2206:21:2206:21 | ChiTotal | total:m2206_10 | +| ir.cpp:2206:21:2206:21 | ChiTotal | total:m2206_12 | +| ir.cpp:2206:21:2206:21 | SideEffect | m2206_12 | +| ir.cpp:2206:21:2206:21 | SideEffect | ~m2206_10 | +| ir.cpp:2206:21:2206:21 | Unary | r2206_15 | +| ir.cpp:2206:24:2206:31 | CallTarget | func:r2206_5 | +| ir.cpp:2206:24:2206:31 | ChiPartial | partial:m2206_9 | +| ir.cpp:2206:24:2206:31 | ChiPartial | partial:m2206_11 | +| ir.cpp:2206:24:2206:31 | ChiTotal | total:m2206_1 | +| ir.cpp:2206:24:2206:31 | ChiTotal | total:m2206_4 | +| ir.cpp:2206:24:2206:31 | SideEffect | ~m2206_1 | +| ir.cpp:2206:30:2206:30 | Address | &:r2206_6 | +| ir.cpp:2206:30:2206:30 | Arg(0) | 0:r2206_7 | +| ir.cpp:2206:30:2206:30 | Load | m2206_2 | +| ir.cpp:2207:13:2207:13 | Address | &:r2207_2 | +| ir.cpp:2207:17:2207:21 | StoreValue | r2207_1 | +| ir.cpp:2208:9:2208:9 | Address | &:r2208_1 | +| ir.cpp:2208:9:2208:9 | Address | &:r2208_1 | +| ir.cpp:2208:9:2208:9 | Address | &:r2208_9 | +| ir.cpp:2208:9:2208:9 | Address | &:r2208_9 | +| ir.cpp:2208:9:2208:9 | Arg(this) | this:r2208_1 | +| ir.cpp:2208:9:2208:9 | Arg(this) | this:r2208_9 | +| ir.cpp:2208:9:2208:9 | CallTarget | func:r2208_2 | +| ir.cpp:2208:9:2208:9 | CallTarget | func:r2208_10 | +| ir.cpp:2208:9:2208:9 | ChiPartial | partial:m2208_4 | +| ir.cpp:2208:9:2208:9 | ChiPartial | partial:m2208_7 | +| ir.cpp:2208:9:2208:9 | ChiPartial | partial:m2208_12 | +| ir.cpp:2208:9:2208:9 | ChiPartial | partial:m2208_15 | +| ir.cpp:2208:9:2208:9 | ChiTotal | total:m2206_17 | +| ir.cpp:2208:9:2208:9 | ChiTotal | total:m2206_17 | +| ir.cpp:2208:9:2208:9 | ChiTotal | total:m2206_20 | +| ir.cpp:2208:9:2208:9 | ChiTotal | total:m2206_20 | +| ir.cpp:2208:9:2208:9 | SideEffect | m2206_20 | +| ir.cpp:2208:9:2208:9 | SideEffect | m2206_20 | +| ir.cpp:2208:9:2208:9 | SideEffect | ~m2206_17 | +| ir.cpp:2208:9:2208:9 | SideEffect | ~m2206_17 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index d2a11541fd1..238e8e4ba59 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2161:28:2161:29 | IndirectMayWriteSideEffect: s2 | Instruction 'IndirectMayWriteSideEffect: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index c474fe2f77d..137a67108f1 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12130,206 +12130,265 @@ ir.cpp: # 2157| r2157_61(glval) = CopyValue : r2157_57 #-----| Goto (back edge) -> Block 4 -# 2160| Block 6 -# 2160| v2160_1(void) = NoOp : -# 2151| v2151_4(void) = ReturnVoid : -# 2151| v2151_5(void) = AliasedUse : ~m? -# 2151| v2151_6(void) = ExitFunction : +# 2161| Block 6 +# 2161| r2161_1(glval) = VariableAddress[s] : +# 2161| mu2161_2(String) = Uninitialized[s] : &:r2161_1 +# 2161| r2161_3(glval) = FunctionAddress[String] : +# 2161| r2161_4(glval) = StringConstant["hello"] : +# 2161| r2161_5(char *) = Convert : r2161_4 +# 2161| v2161_6(void) = Call[String] : func:r2161_3, this:r2161_1, 0:r2161_5 +# 2161| mu2161_7(unknown) = ^CallSideEffect : ~m? +# 2161| v2161_8(void) = ^BufferReadSideEffect[0] : &:r2161_5, ~m? +# 2161| mu2161_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_1 +# 2161| r2161_10(glval) = VariableAddress[s2] : +# 2161| mu2161_11(String) = Uninitialized[s2] : &:r2161_10 +# 2161| r2161_12(glval) = FunctionAddress[String] : +# 2161| r2161_13(glval) = StringConstant["world"] : +# 2161| r2161_14(char *) = Convert : r2161_13 +# 2161| v2161_15(void) = Call[String] : func:r2161_12, this:r2161_10, 0:r2161_14 +# 2161| mu2161_16(unknown) = ^CallSideEffect : ~m? +# 2161| v2161_17(void) = ^BufferReadSideEffect[0] : &:r2161_14, ~m? +# 2161| mu2161_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_10 +#-----| Goto -> Block 7 -# 2162| void IfDestructors2(bool) -# 2162| Block 0 -# 2162| v2162_1(void) = EnterFunction : -# 2162| mu2162_2(unknown) = AliasedDefinition : -# 2162| mu2162_3(unknown) = InitializeNonLocal : -# 2162| r2162_4(glval) = VariableAddress[b] : -# 2162| mu2162_5(bool) = InitializeParameter[b] : &:r2162_4 -# 2163| r2163_1(glval) = VariableAddress[s] : -# 2163| mu2163_2(String) = Uninitialized[s] : &:r2163_1 -# 2163| r2163_3(glval) = FunctionAddress[String] : -# 2163| r2163_4(glval) = StringConstant["hello"] : -# 2163| r2163_5(char *) = Convert : r2163_4 -# 2163| v2163_6(void) = Call[String] : func:r2163_3, this:r2163_1, 0:r2163_5 -# 2163| mu2163_7(unknown) = ^CallSideEffect : ~m? -# 2163| v2163_8(void) = ^BufferReadSideEffect[0] : &:r2163_5, ~m? -# 2163| mu2163_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2163_1 -# 2163| r2163_10(glval) = VariableAddress[b] : -# 2163| r2163_11(bool) = Load[b] : &:r2163_10, ~m? -# 2163| v2163_12(void) = ConditionalBranch : r2163_11 -#-----| False -> Block 2 -#-----| True -> Block 1 +# 2161| Block 7 +# 2161| r2161_19(glval) = VariableAddress[c] : +# 2161| r2161_20(char) = Load[c] : &:r2161_19, ~m? +# 2161| r2161_21(int) = Convert : r2161_20 +# 2161| r2161_22(int) = Constant[0] : +# 2161| r2161_23(bool) = CompareNE : r2161_21, r2161_22 +# 2161| v2161_24(void) = ConditionalBranch : r2161_23 +#-----| False -> Block 9 +#-----| True -> Block 8 -# 2164| Block 1 -# 2164| r2164_1(glval) = VariableAddress[x] : -# 2164| r2164_2(int) = Constant[0] : -# 2164| mu2164_3(int) = Store[x] : &:r2164_1, r2164_2 -#-----| Goto -> Block 3 +# 2162| Block 8 +# 2162| r2162_1(char) = Constant[0] : +# 2162| r2162_2(glval) = VariableAddress[c] : +# 2162| mu2162_3(char) = Store[c] : &:r2162_2, r2162_1 +# 2161| r2161_25(glval) = VariableAddress[s] : +# 2161| r2161_26(glval) = FunctionAddress[pop_back] : +# 2161| r2161_27(char) = Call[pop_back] : func:r2161_26, this:r2161_25 +# 2161| mu2161_28(unknown) = ^CallSideEffect : ~m? +# 2161| v2161_29(void) = ^IndirectReadSideEffect[-1] : &:r2161_25, ~m? +# 2161| mu2161_30(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_25 +# 2161| r2161_31(glval) = VariableAddress[c] : +# 2161| mu2161_32(char) = Store[c] : &:r2161_31, r2161_27 +#-----| Goto (back edge) -> Block 7 -# 2166| Block 2 -# 2166| r2166_1(glval) = VariableAddress[y] : -# 2166| r2166_2(int) = Constant[0] : -# 2166| mu2166_3(int) = Store[y] : &:r2166_1, r2166_2 -#-----| Goto -> Block 3 +# 2161| Block 9 +# 2161| r2161_33(glval) = VariableAddress[s2] : +# 2161| r2161_34(glval) = FunctionAddress[~String] : +# 2161| v2161_35(void) = Call[~String] : func:r2161_34, this:r2161_33 +# 2161| mu2161_36(unknown) = ^CallSideEffect : ~m? +# 2161| v2161_37(void) = ^IndirectReadSideEffect[-1] : &:r2161_33, ~m? +# 2161| mu2161_38(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_33 -# 2167| Block 3 +# 2161| Block 10 +# 2161| r2161_39(glval) = VariableAddress[s] : +# 2161| r2161_40(glval) = FunctionAddress[~String] : +# 2161| v2161_41(void) = Call[~String] : func:r2161_40, this:r2161_39 +# 2161| mu2161_42(unknown) = ^CallSideEffect : ~m? +# 2161| v2161_43(void) = ^IndirectReadSideEffect[-1] : &:r2161_39, ~m? +# 2161| mu2161_44(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_39 +# 2164| v2164_1(void) = NoOp : +# 2151| v2151_4(void) = ReturnVoid : +# 2151| v2151_5(void) = AliasedUse : ~m? +# 2151| v2151_6(void) = ExitFunction : + +# 2166| void IfDestructors2(bool) +# 2166| Block 0 +# 2166| v2166_1(void) = EnterFunction : +# 2166| mu2166_2(unknown) = AliasedDefinition : +# 2166| mu2166_3(unknown) = InitializeNonLocal : +# 2166| r2166_4(glval) = VariableAddress[b] : +# 2166| mu2166_5(bool) = InitializeParameter[b] : &:r2166_4 # 2167| r2167_1(glval) = VariableAddress[s] : -# 2167| r2167_2(glval) = FunctionAddress[~String] : -# 2167| v2167_3(void) = Call[~String] : func:r2167_2, this:r2167_1 -# 2167| mu2167_4(unknown) = ^CallSideEffect : ~m? -# 2167| v2167_5(void) = ^IndirectReadSideEffect[-1] : &:r2167_1, ~m? -# 2167| mu2167_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2167_1 -# 2168| v2168_1(void) = NoOp : -# 2162| v2162_6(void) = ReturnVoid : -# 2162| v2162_7(void) = AliasedUse : ~m? -# 2162| v2162_8(void) = ExitFunction : - -# 2177| void IfDestructors3(bool) -# 2177| Block 0 -# 2177| v2177_1(void) = EnterFunction : -# 2177| mu2177_2(unknown) = AliasedDefinition : -# 2177| mu2177_3(unknown) = InitializeNonLocal : -# 2177| r2177_4(glval) = VariableAddress[b] : -# 2177| mu2177_5(bool) = InitializeParameter[b] : &:r2177_4 -# 2178| r2178_1(glval) = VariableAddress[B] : -# 2178| mu2178_2(Bool) = Uninitialized[B] : &:r2178_1 -# 2178| r2178_3(glval) = FunctionAddress[Bool] : -# 2178| r2178_4(glval) = VariableAddress[b] : -# 2178| r2178_5(bool) = Load[b] : &:r2178_4, ~m? -# 2178| v2178_6(void) = Call[Bool] : func:r2178_3, this:r2178_1, 0:r2178_5 -# 2178| mu2178_7(unknown) = ^CallSideEffect : ~m? -# 2178| mu2178_8(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2178_1 -# 2178| r2178_9(glval) = VariableAddress[B] : -# 2178| r2178_10(glval) = FunctionAddress[operator bool] : -# 2178| r2178_11(bool) = Call[operator bool] : func:r2178_10, this:r2178_9 -# 2178| mu2178_12(unknown) = ^CallSideEffect : ~m? -# 2178| v2178_13(void) = ^IndirectReadSideEffect[-1] : &:r2178_9, ~m? -# 2178| mu2178_14(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2178_9 -# 2178| r2178_15(bool) = CopyValue : r2178_11 -# 2178| v2178_16(void) = ConditionalBranch : r2178_15 +# 2167| mu2167_2(String) = Uninitialized[s] : &:r2167_1 +# 2167| r2167_3(glval) = FunctionAddress[String] : +# 2167| r2167_4(glval) = StringConstant["hello"] : +# 2167| r2167_5(char *) = Convert : r2167_4 +# 2167| v2167_6(void) = Call[String] : func:r2167_3, this:r2167_1, 0:r2167_5 +# 2167| mu2167_7(unknown) = ^CallSideEffect : ~m? +# 2167| v2167_8(void) = ^BufferReadSideEffect[0] : &:r2167_5, ~m? +# 2167| mu2167_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2167_1 +# 2167| r2167_10(glval) = VariableAddress[b] : +# 2167| r2167_11(bool) = Load[b] : &:r2167_10, ~m? +# 2167| v2167_12(void) = ConditionalBranch : r2167_11 #-----| False -> Block 2 #-----| True -> Block 1 -# 2179| Block 1 -# 2179| r2179_1(glval) = VariableAddress[s1] : -# 2179| mu2179_2(String) = Uninitialized[s1] : &:r2179_1 -# 2179| r2179_3(glval) = FunctionAddress[String] : -# 2179| v2179_4(void) = Call[String] : func:r2179_3, this:r2179_1 -# 2179| mu2179_5(unknown) = ^CallSideEffect : ~m? -# 2179| mu2179_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2179_1 -# 2180| r2180_1(glval) = VariableAddress[s1] : -# 2180| r2180_2(glval) = FunctionAddress[~String] : -# 2180| v2180_3(void) = Call[~String] : func:r2180_2, this:r2180_1 -# 2180| mu2180_4(unknown) = ^CallSideEffect : ~m? -# 2180| v2180_5(void) = ^IndirectReadSideEffect[-1] : &:r2180_1, ~m? -# 2180| mu2180_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2180_1 +# 2168| Block 1 +# 2168| r2168_1(glval) = VariableAddress[x] : +# 2168| r2168_2(int) = Constant[0] : +# 2168| mu2168_3(int) = Store[x] : &:r2168_1, r2168_2 #-----| Goto -> Block 3 -# 2181| Block 2 -# 2181| r2181_1(glval) = VariableAddress[s2] : -# 2181| mu2181_2(String) = Uninitialized[s2] : &:r2181_1 -# 2181| r2181_3(glval) = FunctionAddress[String] : -# 2181| v2181_4(void) = Call[String] : func:r2181_3, this:r2181_1 -# 2181| mu2181_5(unknown) = ^CallSideEffect : ~m? -# 2181| mu2181_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2181_1 -# 2182| r2182_1(glval) = VariableAddress[s2] : -# 2182| r2182_2(glval) = FunctionAddress[~String] : -# 2182| v2182_3(void) = Call[~String] : func:r2182_2, this:r2182_1 -# 2182| mu2182_4(unknown) = ^CallSideEffect : ~m? -# 2182| v2182_5(void) = ^IndirectReadSideEffect[-1] : &:r2182_1, ~m? -# 2182| mu2182_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2182_1 +# 2170| Block 2 +# 2170| r2170_1(glval) = VariableAddress[y] : +# 2170| r2170_2(int) = Constant[0] : +# 2170| mu2170_3(int) = Store[y] : &:r2170_1, r2170_2 #-----| Goto -> Block 3 -# 2182| Block 3 -# 2182| r2182_7(glval) = VariableAddress[B] : -# 2182| r2182_8(glval) = FunctionAddress[~Bool] : -# 2182| v2182_9(void) = Call[~Bool] : func:r2182_8, this:r2182_7 -# 2182| mu2182_10(unknown) = ^CallSideEffect : ~m? -# 2182| v2182_11(void) = ^IndirectReadSideEffect[-1] : &:r2182_7, ~m? -# 2182| mu2182_12(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2182_7 -# 2183| v2183_1(void) = NoOp : -# 2177| v2177_6(void) = ReturnVoid : -# 2177| v2177_7(void) = AliasedUse : ~m? -# 2177| v2177_8(void) = ExitFunction : +# 2171| Block 3 +# 2171| r2171_1(glval) = VariableAddress[s] : +# 2171| r2171_2(glval) = FunctionAddress[~String] : +# 2171| v2171_3(void) = Call[~String] : func:r2171_2, this:r2171_1 +# 2171| mu2171_4(unknown) = ^CallSideEffect : ~m? +# 2171| v2171_5(void) = ^IndirectReadSideEffect[-1] : &:r2171_1, ~m? +# 2171| mu2171_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2171_1 +# 2172| v2172_1(void) = NoOp : +# 2166| v2166_6(void) = ReturnVoid : +# 2166| v2166_7(void) = AliasedUse : ~m? +# 2166| v2166_8(void) = ExitFunction : -# 2193| void WhileLoopDestructors(bool) -# 2193| Block 0 -# 2193| v2193_1(void) = EnterFunction : -# 2193| mu2193_2(unknown) = AliasedDefinition : -# 2193| mu2193_3(unknown) = InitializeNonLocal : -# 2193| r2193_4(glval) = VariableAddress[b] : -# 2193| mu2193_5(bool) = InitializeParameter[b] : &:r2193_4 -# 2195| r2195_1(glval) = VariableAddress[s] : -# 2195| mu2195_2(String) = Uninitialized[s] : &:r2195_1 -# 2195| r2195_3(glval) = FunctionAddress[String] : -# 2195| v2195_4(void) = Call[String] : func:r2195_3, this:r2195_1 -# 2195| mu2195_5(unknown) = ^CallSideEffect : ~m? -# 2195| mu2195_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2195_1 +# 2181| void IfDestructors3(bool) +# 2181| Block 0 +# 2181| v2181_1(void) = EnterFunction : +# 2181| mu2181_2(unknown) = AliasedDefinition : +# 2181| mu2181_3(unknown) = InitializeNonLocal : +# 2181| r2181_4(glval) = VariableAddress[b] : +# 2181| mu2181_5(bool) = InitializeParameter[b] : &:r2181_4 +# 2182| r2182_1(glval) = VariableAddress[B] : +# 2182| mu2182_2(Bool) = Uninitialized[B] : &:r2182_1 +# 2182| r2182_3(glval) = FunctionAddress[Bool] : +# 2182| r2182_4(glval) = VariableAddress[b] : +# 2182| r2182_5(bool) = Load[b] : &:r2182_4, ~m? +# 2182| v2182_6(void) = Call[Bool] : func:r2182_3, this:r2182_1, 0:r2182_5 +# 2182| mu2182_7(unknown) = ^CallSideEffect : ~m? +# 2182| mu2182_8(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2182_1 +# 2182| r2182_9(glval) = VariableAddress[B] : +# 2182| r2182_10(glval) = FunctionAddress[operator bool] : +# 2182| r2182_11(bool) = Call[operator bool] : func:r2182_10, this:r2182_9 +# 2182| mu2182_12(unknown) = ^CallSideEffect : ~m? +# 2182| v2182_13(void) = ^IndirectReadSideEffect[-1] : &:r2182_9, ~m? +# 2182| mu2182_14(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2182_9 +# 2182| r2182_15(bool) = CopyValue : r2182_11 +# 2182| v2182_16(void) = ConditionalBranch : r2182_15 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2183| Block 1 +# 2183| r2183_1(glval) = VariableAddress[s1] : +# 2183| mu2183_2(String) = Uninitialized[s1] : &:r2183_1 +# 2183| r2183_3(glval) = FunctionAddress[String] : +# 2183| v2183_4(void) = Call[String] : func:r2183_3, this:r2183_1 +# 2183| mu2183_5(unknown) = ^CallSideEffect : ~m? +# 2183| mu2183_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2183_1 +# 2184| r2184_1(glval) = VariableAddress[s1] : +# 2184| r2184_2(glval) = FunctionAddress[~String] : +# 2184| v2184_3(void) = Call[~String] : func:r2184_2, this:r2184_1 +# 2184| mu2184_4(unknown) = ^CallSideEffect : ~m? +# 2184| v2184_5(void) = ^IndirectReadSideEffect[-1] : &:r2184_1, ~m? +# 2184| mu2184_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2184_1 +#-----| Goto -> Block 3 + +# 2185| Block 2 +# 2185| r2185_1(glval) = VariableAddress[s2] : +# 2185| mu2185_2(String) = Uninitialized[s2] : &:r2185_1 +# 2185| r2185_3(glval) = FunctionAddress[String] : +# 2185| v2185_4(void) = Call[String] : func:r2185_3, this:r2185_1 +# 2185| mu2185_5(unknown) = ^CallSideEffect : ~m? +# 2185| mu2185_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2185_1 +# 2186| r2186_1(glval) = VariableAddress[s2] : +# 2186| r2186_2(glval) = FunctionAddress[~String] : +# 2186| v2186_3(void) = Call[~String] : func:r2186_2, this:r2186_1 +# 2186| mu2186_4(unknown) = ^CallSideEffect : ~m? +# 2186| v2186_5(void) = ^IndirectReadSideEffect[-1] : &:r2186_1, ~m? +# 2186| mu2186_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2186_1 +#-----| Goto -> Block 3 + +# 2186| Block 3 +# 2186| r2186_7(glval) = VariableAddress[B] : +# 2186| r2186_8(glval) = FunctionAddress[~Bool] : +# 2186| v2186_9(void) = Call[~Bool] : func:r2186_8, this:r2186_7 +# 2186| mu2186_10(unknown) = ^CallSideEffect : ~m? +# 2186| v2186_11(void) = ^IndirectReadSideEffect[-1] : &:r2186_7, ~m? +# 2186| mu2186_12(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2186_7 +# 2187| v2187_1(void) = NoOp : +# 2181| v2181_6(void) = ReturnVoid : +# 2181| v2181_7(void) = AliasedUse : ~m? +# 2181| v2181_8(void) = ExitFunction : + +# 2197| void WhileLoopDestructors(bool) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| mu2197_2(unknown) = AliasedDefinition : +# 2197| mu2197_3(unknown) = InitializeNonLocal : +# 2197| r2197_4(glval) = VariableAddress[b] : +# 2197| mu2197_5(bool) = InitializeParameter[b] : &:r2197_4 +# 2199| r2199_1(glval) = VariableAddress[s] : +# 2199| mu2199_2(String) = Uninitialized[s] : &:r2199_1 +# 2199| r2199_3(glval) = FunctionAddress[String] : +# 2199| v2199_4(void) = Call[String] : func:r2199_3, this:r2199_1 +# 2199| mu2199_5(unknown) = ^CallSideEffect : ~m? +# 2199| mu2199_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2199_1 #-----| Goto -> Block 1 -# 2196| Block 1 -# 2196| r2196_1(glval) = VariableAddress[b] : -# 2196| r2196_2(bool) = Load[b] : &:r2196_1, ~m? -# 2196| v2196_3(void) = ConditionalBranch : r2196_2 +# 2200| Block 1 +# 2200| r2200_1(glval) = VariableAddress[b] : +# 2200| r2200_2(bool) = Load[b] : &:r2200_1, ~m? +# 2200| v2200_3(void) = ConditionalBranch : r2200_2 #-----| False -> Block 3 #-----| True -> Block 2 -# 2197| Block 2 -# 2197| r2197_1(bool) = Constant[0] : -# 2197| r2197_2(glval) = VariableAddress[b] : -# 2197| mu2197_3(bool) = Store[b] : &:r2197_2, r2197_1 +# 2201| Block 2 +# 2201| r2201_1(bool) = Constant[0] : +# 2201| r2201_2(glval) = VariableAddress[b] : +# 2201| mu2201_3(bool) = Store[b] : &:r2201_2, r2201_1 #-----| Goto (back edge) -> Block 1 -# 2199| Block 3 -# 2199| r2199_1(glval) = VariableAddress[s] : -# 2199| r2199_2(glval) = FunctionAddress[~String] : -# 2199| v2199_3(void) = Call[~String] : func:r2199_2, this:r2199_1 -# 2199| mu2199_4(unknown) = ^CallSideEffect : ~m? -# 2199| v2199_5(void) = ^IndirectReadSideEffect[-1] : &:r2199_1, ~m? -# 2199| mu2199_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2199_1 +# 2203| Block 3 +# 2203| r2203_1(glval) = VariableAddress[s] : +# 2203| r2203_2(glval) = FunctionAddress[~String] : +# 2203| v2203_3(void) = Call[~String] : func:r2203_2, this:r2203_1 +# 2203| mu2203_4(unknown) = ^CallSideEffect : ~m? +# 2203| v2203_5(void) = ^IndirectReadSideEffect[-1] : &:r2203_1, ~m? +# 2203| mu2203_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2203_1 #-----| Goto -> Block 4 -# 2202| Block 4 -# 2202| r2202_1(glval) = VariableAddress[B] : -# 2202| mu2202_2(Bool) = Uninitialized[B] : &:r2202_1 -# 2202| r2202_3(glval) = FunctionAddress[Bool] : -# 2202| r2202_4(glval) = VariableAddress[b] : -# 2202| r2202_5(bool) = Load[b] : &:r2202_4, ~m? -# 2202| v2202_6(void) = Call[Bool] : func:r2202_3, this:r2202_1, 0:r2202_5 -# 2202| mu2202_7(unknown) = ^CallSideEffect : ~m? -# 2202| mu2202_8(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1 -# 2202| r2202_9(glval) = VariableAddress[B] : -# 2202| r2202_10(glval) = FunctionAddress[operator bool] : -# 2202| r2202_11(bool) = Call[operator bool] : func:r2202_10, this:r2202_9 -# 2202| mu2202_12(unknown) = ^CallSideEffect : ~m? -# 2202| v2202_13(void) = ^IndirectReadSideEffect[-1] : &:r2202_9, ~m? -# 2202| mu2202_14(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2202_9 -# 2202| r2202_15(bool) = CopyValue : r2202_11 -# 2202| v2202_16(void) = ConditionalBranch : r2202_15 +# 2206| Block 4 +# 2206| r2206_1(glval) = VariableAddress[B] : +# 2206| mu2206_2(Bool) = Uninitialized[B] : &:r2206_1 +# 2206| r2206_3(glval) = FunctionAddress[Bool] : +# 2206| r2206_4(glval) = VariableAddress[b] : +# 2206| r2206_5(bool) = Load[b] : &:r2206_4, ~m? +# 2206| v2206_6(void) = Call[Bool] : func:r2206_3, this:r2206_1, 0:r2206_5 +# 2206| mu2206_7(unknown) = ^CallSideEffect : ~m? +# 2206| mu2206_8(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2206_1 +# 2206| r2206_9(glval) = VariableAddress[B] : +# 2206| r2206_10(glval) = FunctionAddress[operator bool] : +# 2206| r2206_11(bool) = Call[operator bool] : func:r2206_10, this:r2206_9 +# 2206| mu2206_12(unknown) = ^CallSideEffect : ~m? +# 2206| v2206_13(void) = ^IndirectReadSideEffect[-1] : &:r2206_9, ~m? +# 2206| mu2206_14(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2206_9 +# 2206| r2206_15(bool) = CopyValue : r2206_11 +# 2206| v2206_16(void) = ConditionalBranch : r2206_15 #-----| False -> Block 6 #-----| True -> Block 5 -# 2203| Block 5 -# 2203| r2203_1(bool) = Constant[0] : -# 2203| r2203_2(glval) = VariableAddress[b] : -# 2203| mu2203_3(bool) = Store[b] : &:r2203_2, r2203_1 -# 2204| r2204_1(glval) = VariableAddress[B] : -# 2204| r2204_2(glval) = FunctionAddress[~Bool] : -# 2204| v2204_3(void) = Call[~Bool] : func:r2204_2, this:r2204_1 -# 2204| mu2204_4(unknown) = ^CallSideEffect : ~m? -# 2204| v2204_5(void) = ^IndirectReadSideEffect[-1] : &:r2204_1, ~m? -# 2204| mu2204_6(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2204_1 +# 2207| Block 5 +# 2207| r2207_1(bool) = Constant[0] : +# 2207| r2207_2(glval) = VariableAddress[b] : +# 2207| mu2207_3(bool) = Store[b] : &:r2207_2, r2207_1 +# 2208| r2208_1(glval) = VariableAddress[B] : +# 2208| r2208_2(glval) = FunctionAddress[~Bool] : +# 2208| v2208_3(void) = Call[~Bool] : func:r2208_2, this:r2208_1 +# 2208| mu2208_4(unknown) = ^CallSideEffect : ~m? +# 2208| v2208_5(void) = ^IndirectReadSideEffect[-1] : &:r2208_1, ~m? +# 2208| mu2208_6(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2208_1 #-----| Goto (back edge) -> Block 4 -# 2204| Block 6 -# 2204| r2204_7(glval) = VariableAddress[B] : -# 2204| r2204_8(glval) = FunctionAddress[~Bool] : -# 2204| v2204_9(void) = Call[~Bool] : func:r2204_8, this:r2204_7 -# 2204| mu2204_10(unknown) = ^CallSideEffect : ~m? -# 2204| v2204_11(void) = ^IndirectReadSideEffect[-1] : &:r2204_7, ~m? -# 2204| mu2204_12(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2204_7 -# 2206| v2206_1(void) = NoOp : -# 2193| v2193_6(void) = ReturnVoid : -# 2193| v2193_7(void) = AliasedUse : ~m? -# 2193| v2193_8(void) = ExitFunction : +# 2208| Block 6 +# 2208| r2208_7(glval) = VariableAddress[B] : +# 2208| r2208_8(glval) = FunctionAddress[~Bool] : +# 2208| v2208_9(void) = Call[~Bool] : func:r2208_8, this:r2208_7 +# 2208| mu2208_10(unknown) = ^CallSideEffect : ~m? +# 2208| v2208_11(void) = ^IndirectReadSideEffect[-1] : &:r2208_7, ~m? +# 2208| mu2208_12(Bool) = ^IndirectMayWriteSideEffect[-1] : &:r2208_7 +# 2210| v2210_1(void) = NoOp : +# 2197| v2197_6(void) = ReturnVoid : +# 2197| v2197_7(void) = AliasedUse : ~m? +# 2197| v2197_8(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index b93c7d2649f..943725ada3a 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2161:28:2161:29 | IndirectMayWriteSideEffect: s2 | Instruction 'IndirectMayWriteSideEffect: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index b93c7d2649f..943725ada3a 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2161:28:2161:29 | IndirectMayWriteSideEffect: s2 | Instruction 'IndirectMayWriteSideEffect: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From 7d8872bb997ec9bba7f14f48695be4255b4c7058 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 13 Feb 2024 00:40:19 +0000 Subject: [PATCH 031/207] C++: Fix for multiple for-loop variables with destructors --- .../implementation/raw/internal/TranslatedStmt.qll | 6 ++++++ cpp/ql/test/library-tests/ir/ir/aliased_ir.expected | 12 ++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 1 - .../ir/ir/aliased_ssa_consistency_unsound.expected | 1 - .../library-tests/ir/ir/operand_locations.expected | 11 +++++++++++ .../library-tests/ir/ir/raw_consistency.expected | 1 - cpp/ql/test/library-tests/ir/ir/raw_ir.expected | 2 -- .../ir/ir/unaliased_ssa_consistency.expected | 1 - .../ir/ir/unaliased_ssa_consistency_unsound.expected | 1 - 9 files changed, 29 insertions(+), 7 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index a1844e4bd6b..5c0f572ba54 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -1019,6 +1019,12 @@ class TranslatedForStmt extends TranslatedLoop { or child = this.getUpdate() and result = this.getFirstConditionInstruction(kind) or + exists(int destructorId | + destructorId >= this.getFirstDestructorCallIndex() and + child = this.getChild(destructorId) and + result = this.getChild(destructorId + 1).getFirstInstruction(kind) + ) + or exists(int lastDestructorIndex | lastDestructorIndex = max(int n | exists(this.getChild(n)) and n >= this.getFirstDestructorCallIndex()) and diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 8232a69acea..4665cb1cf5a 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -13085,6 +13085,18 @@ ir.cpp: # 2161| v2161_47(void) = ^IndirectReadSideEffect[-1] : &:r2161_42, m2161_22 # 2161| m2161_48(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_42 # 2161| m2161_49(String) = Chi : total:m2161_22, partial:m2161_48 +# 2161| r2161_50(glval) = VariableAddress[s] : +# 2161| r2161_51(glval) = FunctionAddress[~String] : +# 2161| v2161_52(void) = Call[~String] : func:r2161_51, this:r2161_50 +# 2161| m2161_53(unknown) = ^CallSideEffect : ~m2161_46 +# 2161| m2161_54(unknown) = Chi : total:m2161_46, partial:m2161_53 +# 2161| v2161_55(void) = ^IndirectReadSideEffect[-1] : &:r2161_50, m2161_23 +# 2161| m2161_56(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_50 +# 2161| m2161_57(String) = Chi : total:m2161_23, partial:m2161_56 +# 2164| v2164_1(void) = NoOp : +# 2151| v2151_5(void) = ReturnVoid : +# 2151| v2151_6(void) = AliasedUse : ~m2161_54 +# 2151| v2151_7(void) = ExitFunction : # 2166| void IfDestructors2(bool) # 2166| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 4eaff8357e6..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2161:28:2161:29 | Chi: s2 | Instruction 'Chi: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 4eaff8357e6..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2161:28:2161:29 | Chi: s2 | Instruction 'Chi: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 5a55f7a9cfa..6329c187477 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -10464,6 +10464,7 @@ | ir.cpp:2149:1:2149:1 | SideEffect | ~m2149_6 | | ir.cpp:2151:6:2151:19 | ChiPartial | partial:m2151_3 | | ir.cpp:2151:6:2151:19 | ChiTotal | total:m2151_2 | +| ir.cpp:2151:6:2151:19 | SideEffect | ~m2161_54 | | ir.cpp:2152:10:2152:10 | Address | &:r2152_1 | | ir.cpp:2152:13:2152:16 | StoreValue | r2152_2 | | ir.cpp:2153:16:2153:16 | Address | &:r2153_1 | @@ -10647,7 +10648,17 @@ | ir.cpp:2159:5:2159:5 | SideEffect | ~m2158_6 | | ir.cpp:2161:16:2161:16 | Address | &:r2161_1 | | ir.cpp:2161:16:2161:16 | Address | &:r2161_1 | +| ir.cpp:2161:16:2161:16 | Address | &:r2161_50 | +| ir.cpp:2161:16:2161:16 | Address | &:r2161_50 | | ir.cpp:2161:16:2161:16 | Arg(this) | this:r2161_1 | +| ir.cpp:2161:16:2161:16 | Arg(this) | this:r2161_50 | +| ir.cpp:2161:16:2161:16 | CallTarget | func:r2161_51 | +| ir.cpp:2161:16:2161:16 | ChiPartial | partial:m2161_53 | +| ir.cpp:2161:16:2161:16 | ChiPartial | partial:m2161_56 | +| ir.cpp:2161:16:2161:16 | ChiTotal | total:m2161_23 | +| ir.cpp:2161:16:2161:16 | ChiTotal | total:m2161_46 | +| ir.cpp:2161:16:2161:16 | SideEffect | m2161_23 | +| ir.cpp:2161:16:2161:16 | SideEffect | ~m2161_46 | | ir.cpp:2161:18:2161:24 | Address | &:r2161_5 | | ir.cpp:2161:18:2161:24 | Arg(0) | 0:r2161_5 | | ir.cpp:2161:18:2161:24 | SideEffect | ~m2151_3 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 238e8e4ba59..d2a11541fd1 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2161:28:2161:29 | IndirectMayWriteSideEffect: s2 | Instruction 'IndirectMayWriteSideEffect: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 137a67108f1..39d7270d186 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12182,8 +12182,6 @@ ir.cpp: # 2161| mu2161_36(unknown) = ^CallSideEffect : ~m? # 2161| v2161_37(void) = ^IndirectReadSideEffect[-1] : &:r2161_33, ~m? # 2161| mu2161_38(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_33 - -# 2161| Block 10 # 2161| r2161_39(glval) = VariableAddress[s] : # 2161| r2161_40(glval) = FunctionAddress[~String] : # 2161| v2161_41(void) = Call[~String] : func:r2161_40, this:r2161_39 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 943725ada3a..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2161:28:2161:29 | IndirectMayWriteSideEffect: s2 | Instruction 'IndirectMayWriteSideEffect: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 943725ada3a..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2161:28:2161:29 | IndirectMayWriteSideEffect: s2 | Instruction 'IndirectMayWriteSideEffect: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From b6cf64cff35cee4b0a032f71d16ace1833d0714a Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 13 Feb 2024 00:46:53 +0000 Subject: [PATCH 032/207] C++: simplify TranslatedBlock::getLastChild --- .../code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 5c0f572ba54..d5e77e170a9 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -674,7 +674,7 @@ class TranslatedBlock extends TranslatedStmt { } override TranslatedElement getLastChild() { - not this.isEmpty() and result = this.getStmt(this.getStmtCount() - 1) + result = this.getStmt(this.getStmtCount() - 1) } private predicate isEmpty() { not exists(stmt.getStmt(0)) } From f791b0ebbf140872555177e1a7fbd0902b9fb5f9 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 13 Feb 2024 01:00:46 +0000 Subject: [PATCH 033/207] C++: Model for smart pointer destructors --- .../models/implementations/SmartPointer.qll | 55 ++++++++++++ .../ir/ir/operand_locations.expected | 85 ++++++------------- .../test/library-tests/ir/ir/raw_ir.expected | 59 ++++++------- .../ir/points_to/points_to.expected | 12 --- 4 files changed, 106 insertions(+), 105 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll index 883596a8532..c37b6fb9b97 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll @@ -168,3 +168,58 @@ private class SmartPtrSetterFunction extends MemberFunction, AliasFunction, Side ) } } + +/** A destructor assocaited with a smart pointer. */ +private class SmartPtrDestructor extends Destructor, SideEffectFunction, AliasFunction { + SmartPtr declaringType; + + SmartPtrDestructor() { + declaringType = this.getDeclaringType() and not this.isFromUninstantiatedTemplate(_) + } + + /** + * Gets the destructor associated with the base type of this smart pointer. + */ + private Destructor getBaseTypeDestructor() { + // TODO: Check if this is join ordered correctly. + result.getDeclaringType() = declaringType.getBaseType() + } + + override predicate hasOnlySpecificReadSideEffects() { + this.getBaseTypeDestructor().(SideEffectFunction).hasOnlySpecificReadSideEffects() + or + // If there's no declared destructor for the base type then it won't have + // any strange read side effects. + not exists(this.getBaseTypeDestructor()) + } + + override predicate hasOnlySpecificWriteSideEffects() { + this.getBaseTypeDestructor().(SideEffectFunction).hasOnlySpecificWriteSideEffects() + or + // If there's no declared destructor for the base type then it won't have + // any strange write side effects. + not exists(this.getBaseTypeDestructor()) + } + + override predicate hasSpecificReadSideEffect(ParameterIndex i, boolean buffer) { + i = -1 and buffer = false + } + + override predicate hasSpecificWriteSideEffect(ParameterIndex i, boolean buffer, boolean mustWrite) { + i = -1 and buffer = false and mustWrite = true + } + + override predicate parameterNeverEscapes(int index) { + this.getBaseTypeDestructor().(AliasFunction).parameterNeverEscapes(index) + or + // If there's no declared destructor for the base type then it won't cause + // anything to escape. + not exists(this.getBaseTypeDestructor()) and + index = -1 + } + + override predicate parameterEscapesOnlyViaReturn(int index) { + // A destructor call does not have a return value + none() + } +} \ No newline at end of file diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 6329c187477..7c189db89f7 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -10952,13 +10952,13 @@ | perf-regression.cpp:12:10:12:10 | StoreValue | r12_2 | | smart_ptr.cpp:10:6:10:24 | ChiPartial | partial:m10_3 | | smart_ptr.cpp:10:6:10:24 | ChiTotal | total:m10_2 | -| smart_ptr.cpp:10:6:10:24 | SideEffect | ~m13_6 | +| smart_ptr.cpp:10:6:10:24 | SideEffect | ~m12_12 | | smart_ptr.cpp:10:31:10:31 | Address | &:r10_5 | | smart_ptr.cpp:10:31:10:31 | Address | &:r10_5 | | smart_ptr.cpp:10:31:10:31 | Address | &:r10_7 | | smart_ptr.cpp:10:31:10:31 | Address | &:r10_7 | | smart_ptr.cpp:10:31:10:31 | Load | m10_6 | -| smart_ptr.cpp:10:31:10:31 | SideEffect | m10_8 | +| smart_ptr.cpp:10:31:10:31 | SideEffect | m12_15 | | smart_ptr.cpp:11:21:11:22 | Address | &:r11_1 | | smart_ptr.cpp:11:21:11:22 | Address | &:r11_1 | | smart_ptr.cpp:11:21:11:22 | Arg(this) | this:r11_1 | @@ -10981,9 +10981,9 @@ | smart_ptr.cpp:12:20:12:27 | Address | &:r12_9 | | smart_ptr.cpp:12:20:12:27 | Arg(0) | 0:r12_9 | | smart_ptr.cpp:12:20:12:27 | ChiPartial | partial:m12_14 | -| smart_ptr.cpp:12:20:12:27 | ChiTotal | total:m12_12 | +| smart_ptr.cpp:12:20:12:27 | ChiTotal | total:m10_8 | | smart_ptr.cpp:12:20:12:27 | Load | m12_8 | -| smart_ptr.cpp:12:20:12:27 | SideEffect | ~m12_12 | +| smart_ptr.cpp:12:20:12:27 | SideEffect | ~m10_8 | | smart_ptr.cpp:12:24:12:28 | Load | m11_9 | | smart_ptr.cpp:12:24:12:28 | StoreValue | r12_7 | | smart_ptr.cpp:12:25:12:26 | Arg(0) | 0:r12_5 | @@ -10992,21 +10992,16 @@ | smart_ptr.cpp:13:1:13:1 | Address | &:r13_2 | | smart_ptr.cpp:13:1:13:1 | Arg(this) | this:r13_2 | | smart_ptr.cpp:13:1:13:1 | CallTarget | func:r13_3 | -| smart_ptr.cpp:13:1:13:1 | ChiPartial | partial:m13_5 | -| smart_ptr.cpp:13:1:13:1 | ChiPartial | partial:m13_8 | -| smart_ptr.cpp:13:1:13:1 | ChiTotal | total:m11_9 | -| smart_ptr.cpp:13:1:13:1 | ChiTotal | total:m12_15 | | smart_ptr.cpp:13:1:13:1 | SideEffect | m11_9 | -| smart_ptr.cpp:13:1:13:1 | SideEffect | ~m12_15 | | smart_ptr.cpp:17:6:17:24 | ChiPartial | partial:m17_3 | | smart_ptr.cpp:17:6:17:24 | ChiTotal | total:m17_2 | -| smart_ptr.cpp:17:6:17:24 | SideEffect | ~m20_6 | +| smart_ptr.cpp:17:6:17:24 | SideEffect | ~m19_16 | | smart_ptr.cpp:17:33:17:33 | Address | &:r17_5 | | smart_ptr.cpp:17:33:17:33 | Address | &:r17_5 | | smart_ptr.cpp:17:33:17:33 | Address | &:r17_7 | | smart_ptr.cpp:17:33:17:33 | Address | &:r17_7 | | smart_ptr.cpp:17:33:17:33 | Load | m17_6 | -| smart_ptr.cpp:17:33:17:33 | SideEffect | m17_8 | +| smart_ptr.cpp:17:33:17:33 | SideEffect | m19_19 | | smart_ptr.cpp:18:23:18:24 | Address | &:r18_1 | | smart_ptr.cpp:18:23:18:24 | Address | &:r18_1 | | smart_ptr.cpp:18:23:18:24 | Arg(this) | this:r18_1 | @@ -11033,27 +11028,22 @@ | smart_ptr.cpp:19:20:19:21 | CallTarget | func:r19_4 | | smart_ptr.cpp:19:20:19:21 | ChiPartial | partial:m19_9 | | smart_ptr.cpp:19:20:19:21 | ChiPartial | partial:m19_18 | +| smart_ptr.cpp:19:20:19:21 | ChiTotal | total:m17_8 | | smart_ptr.cpp:19:20:19:21 | ChiTotal | total:m18_8 | -| smart_ptr.cpp:19:20:19:21 | ChiTotal | total:m19_16 | | smart_ptr.cpp:19:20:19:21 | Load | m19_12 | | smart_ptr.cpp:19:20:19:21 | SideEffect | m18_9 | +| smart_ptr.cpp:19:20:19:21 | SideEffect | ~m17_8 | | smart_ptr.cpp:19:20:19:21 | SideEffect | ~m18_8 | -| smart_ptr.cpp:19:20:19:21 | SideEffect | ~m19_16 | | smart_ptr.cpp:19:20:19:21 | Unary | r19_5 | | smart_ptr.cpp:19:20:19:21 | Unary | r19_6 | | smart_ptr.cpp:20:1:20:1 | Address | &:r20_2 | | smart_ptr.cpp:20:1:20:1 | Address | &:r20_2 | | smart_ptr.cpp:20:1:20:1 | Arg(this) | this:r20_2 | | smart_ptr.cpp:20:1:20:1 | CallTarget | func:r20_3 | -| smart_ptr.cpp:20:1:20:1 | ChiPartial | partial:m20_5 | -| smart_ptr.cpp:20:1:20:1 | ChiPartial | partial:m20_8 | -| smart_ptr.cpp:20:1:20:1 | ChiTotal | total:m18_9 | -| smart_ptr.cpp:20:1:20:1 | ChiTotal | total:m19_19 | | smart_ptr.cpp:20:1:20:1 | SideEffect | m18_9 | -| smart_ptr.cpp:20:1:20:1 | SideEffect | ~m19_19 | | smart_ptr.cpp:28:6:28:27 | ChiPartial | partial:m28_3 | | smart_ptr.cpp:28:6:28:27 | ChiTotal | total:m28_2 | -| smart_ptr.cpp:28:6:28:27 | SideEffect | ~m48_38 | +| smart_ptr.cpp:28:6:28:27 | SideEffect | ~m47_16 | | smart_ptr.cpp:29:27:29:38 | Address | &:r29_1 | | smart_ptr.cpp:31:5:31:24 | CallTarget | func:r31_1 | | smart_ptr.cpp:31:5:31:24 | ChiPartial | partial:m31_15 | @@ -11175,54 +11165,29 @@ | smart_ptr.cpp:47:43:47:63 | Unary | r47_6 | | smart_ptr.cpp:48:1:48:1 | Address | &:r48_2 | | smart_ptr.cpp:48:1:48:1 | Address | &:r48_2 | -| smart_ptr.cpp:48:1:48:1 | Address | &:r48_10 | -| smart_ptr.cpp:48:1:48:1 | Address | &:r48_10 | -| smart_ptr.cpp:48:1:48:1 | Address | &:r48_18 | -| smart_ptr.cpp:48:1:48:1 | Address | &:r48_18 | -| smart_ptr.cpp:48:1:48:1 | Address | &:r48_26 | -| smart_ptr.cpp:48:1:48:1 | Address | &:r48_26 | -| smart_ptr.cpp:48:1:48:1 | Address | &:r48_34 | -| smart_ptr.cpp:48:1:48:1 | Address | &:r48_34 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_7 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_7 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_12 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_12 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_17 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_17 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_22 | +| smart_ptr.cpp:48:1:48:1 | Address | &:r48_22 | | smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_2 | -| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_10 | -| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_18 | -| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_26 | -| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_34 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_7 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_12 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_17 | +| smart_ptr.cpp:48:1:48:1 | Arg(this) | this:r48_22 | | smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_3 | -| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_11 | -| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_19 | -| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_27 | -| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_35 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_5 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_8 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_13 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_16 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_21 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_24 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_29 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_32 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_37 | -| smart_ptr.cpp:48:1:48:1 | ChiPartial | partial:m48_40 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m29_2 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m33_2 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m37_2 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m41_2 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m45_2 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m47_16 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m48_6 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m48_14 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m48_22 | -| smart_ptr.cpp:48:1:48:1 | ChiTotal | total:m48_30 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_8 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_13 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_18 | +| smart_ptr.cpp:48:1:48:1 | CallTarget | func:r48_23 | | smart_ptr.cpp:48:1:48:1 | SideEffect | m29_2 | | smart_ptr.cpp:48:1:48:1 | SideEffect | m33_2 | | smart_ptr.cpp:48:1:48:1 | SideEffect | m37_2 | | smart_ptr.cpp:48:1:48:1 | SideEffect | m41_2 | | smart_ptr.cpp:48:1:48:1 | SideEffect | m45_2 | -| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m47_16 | -| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m48_6 | -| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m48_14 | -| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m48_22 | -| smart_ptr.cpp:48:1:48:1 | SideEffect | ~m48_30 | | struct_init.cpp:9:13:9:25 | Left | r9_3 | | struct_init.cpp:9:13:9:25 | Left | r9_3 | | struct_init.cpp:9:13:9:25 | SideEffect | ~m11_10 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 39d7270d186..2036eeea6fb 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12469,9 +12469,8 @@ smart_ptr.cpp: # 13| r13_2(glval>>) = VariableAddress[up] : # 13| r13_3(glval) = FunctionAddress[~unique_ptr] : # 13| v13_4(void) = Call[~unique_ptr] : func:r13_3, this:r13_2 -# 13| mu13_5(unknown) = ^CallSideEffect : ~m? -# 13| v13_6(void) = ^IndirectReadSideEffect[-1] : &:r13_2, ~m? -# 13| mu13_7(unique_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r13_2 +# 13| v13_5(void) = ^IndirectReadSideEffect[-1] : &:r13_2, ~m? +# 13| mu13_6(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r13_2 # 10| v10_8(void) = ReturnIndirection[p] : &:r10_6, ~m? # 10| v10_9(void) = ReturnVoid : # 10| v10_10(void) = AliasedUse : ~m? @@ -12514,9 +12513,8 @@ smart_ptr.cpp: # 20| r20_2(glval>) = VariableAddress[sp] : # 20| r20_3(glval) = FunctionAddress[~shared_ptr] : # 20| v20_4(void) = Call[~shared_ptr] : func:r20_3, this:r20_2 -# 20| mu20_5(unknown) = ^CallSideEffect : ~m? -# 20| v20_6(void) = ^IndirectReadSideEffect[-1] : &:r20_2, ~m? -# 20| mu20_7(shared_ptr) = ^IndirectMayWriteSideEffect[-1] : &:r20_2 +# 20| v20_5(void) = ^IndirectReadSideEffect[-1] : &:r20_2, ~m? +# 20| mu20_6(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r20_2 # 17| v17_8(void) = ReturnIndirection[p] : &:r17_6, ~m? # 17| v17_9(void) = ReturnVoid : # 17| v17_10(void) = AliasedUse : ~m? @@ -12619,33 +12617,28 @@ smart_ptr.cpp: # 48| r48_2(glval>>) = VariableAddress[sp_const_sp_const_int] : # 48| r48_3(glval) = FunctionAddress[~shared_ptr] : # 48| v48_4(void) = Call[~shared_ptr] : func:r48_3, this:r48_2 -# 48| mu48_5(unknown) = ^CallSideEffect : ~m? -# 48| v48_6(void) = ^IndirectReadSideEffect[-1] : &:r48_2, ~m? -# 48| mu48_7(shared_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r48_2 -# 48| r48_8(glval>>) = VariableAddress[sp_const_sp_int] : -# 48| r48_9(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_10(void) = Call[~shared_ptr] : func:r48_9, this:r48_8 -# 48| mu48_11(unknown) = ^CallSideEffect : ~m? -# 48| v48_12(void) = ^IndirectReadSideEffect[-1] : &:r48_8, ~m? -# 48| mu48_13(shared_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r48_8 -# 48| r48_14(glval>>) = VariableAddress[sp_sp_const_int] : -# 48| r48_15(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_16(void) = Call[~shared_ptr] : func:r48_15, this:r48_14 -# 48| mu48_17(unknown) = ^CallSideEffect : ~m? -# 48| v48_18(void) = ^IndirectReadSideEffect[-1] : &:r48_14, ~m? -# 48| mu48_19(shared_ptr>) = ^IndirectMayWriteSideEffect[-1] : &:r48_14 -# 48| r48_20(glval>) = VariableAddress[sp_const_int_pointer] : -# 48| r48_21(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_22(void) = Call[~shared_ptr] : func:r48_21, this:r48_20 -# 48| mu48_23(unknown) = ^CallSideEffect : ~m? -# 48| v48_24(void) = ^IndirectReadSideEffect[-1] : &:r48_20, ~m? -# 48| mu48_25(shared_ptr) = ^IndirectMayWriteSideEffect[-1] : &:r48_20 -# 48| r48_26(glval>) = VariableAddress[sp_const_int] : -# 48| r48_27(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_28(void) = Call[~shared_ptr] : func:r48_27, this:r48_26 -# 48| mu48_29(unknown) = ^CallSideEffect : ~m? -# 48| v48_30(void) = ^IndirectReadSideEffect[-1] : &:r48_26, ~m? -# 48| mu48_31(shared_ptr) = ^IndirectMayWriteSideEffect[-1] : &:r48_26 +# 48| v48_5(void) = ^IndirectReadSideEffect[-1] : &:r48_2, ~m? +# 48| mu48_6(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_2 +# 48| r48_7(glval>>) = VariableAddress[sp_const_sp_int] : +# 48| r48_8(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_9(void) = Call[~shared_ptr] : func:r48_8, this:r48_7 +# 48| v48_10(void) = ^IndirectReadSideEffect[-1] : &:r48_7, ~m? +# 48| mu48_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_7 +# 48| r48_12(glval>>) = VariableAddress[sp_sp_const_int] : +# 48| r48_13(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_14(void) = Call[~shared_ptr] : func:r48_13, this:r48_12 +# 48| v48_15(void) = ^IndirectReadSideEffect[-1] : &:r48_12, ~m? +# 48| mu48_16(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_12 +# 48| r48_17(glval>) = VariableAddress[sp_const_int_pointer] : +# 48| r48_18(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_19(void) = Call[~shared_ptr] : func:r48_18, this:r48_17 +# 48| v48_20(void) = ^IndirectReadSideEffect[-1] : &:r48_17, ~m? +# 48| mu48_21(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_17 +# 48| r48_22(glval>) = VariableAddress[sp_const_int] : +# 48| r48_23(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_24(void) = Call[~shared_ptr] : func:r48_23, this:r48_22 +# 48| v48_25(void) = ^IndirectReadSideEffect[-1] : &:r48_22, ~m? +# 48| mu48_26(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_22 # 28| v28_4(void) = ReturnVoid : # 28| v28_5(void) = AliasedUse : ~m? # 28| v28_6(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/points_to/points_to.expected b/cpp/ql/test/library-tests/ir/points_to/points_to.expected index f5afc27ea0f..8ec8033d086 100644 --- a/cpp/ql/test/library-tests/ir/points_to/points_to.expected +++ b/cpp/ql/test/library-tests/ir/points_to/points_to.expected @@ -1,14 +1,2 @@ testFailures -| smart_pointer.cpp:13:21:13:49 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:14:14:14:40 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:16:22:16:48 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:18:15:18:43 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:19:13:19:39 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:20:21:20:47 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:25:21:25:49 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:26:14:26:40 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:28:22:28:48 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:30:15:30:43 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:31:13:31:39 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | -| smart_pointer.cpp:32:21:32:47 | //$ussa=dynamic{1}[0..4) | Missing result:ussa=dynamic{1}[0..4) | failures From b9785ea7b29e0a8e638f13fad58732d8b7454254 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 13 Feb 2024 01:07:41 +0000 Subject: [PATCH 034/207] C++: autoformat --- .../cpp/ir/implementation/raw/internal/TranslatedStmt.qll | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index d5e77e170a9..5cb72409c35 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -673,9 +673,7 @@ class TranslatedBlock extends TranslatedStmt { else result = this.getStmt(this.getStmtCount() - 1).getFirstInstruction(any(GotoEdge goto)) } - override TranslatedElement getLastChild() { - result = this.getStmt(this.getStmtCount() - 1) - } + override TranslatedElement getLastChild() { result = this.getStmt(this.getStmtCount() - 1) } private predicate isEmpty() { not exists(stmt.getStmt(0)) } From 2f7b946c9f8817a1972289d44b79b5d3c96bc742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20St=C3=B6ckli?= Date: Tue, 13 Feb 2024 15:52:18 +0100 Subject: [PATCH 035/207] Ruby: add sources on request object of Rails --- .../actiondispatch/internal/Request.qll | 11 +-- .../2024-02-13-rails-more-request-sources.md | 4 + .../ActionController.expected | 86 ++++++++++--------- .../action_controller/input_access.rb | 14 ++- 4 files changed, 68 insertions(+), 47 deletions(-) create mode 100644 ruby/ql/src/change-notes/2024-02-13-rails-more-request-sources.md diff --git a/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Request.qll b/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Request.qll index b24301b676d..87e4a713960 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Request.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/actiondispatch/internal/Request.qll @@ -38,8 +38,8 @@ module Request { ParametersCall() { this.getMethodName() = [ - "parameters", "params", "GET", "POST", "query_parameters", "request_parameters", - "filtered_parameters" + "parameters", "params", "[]", "GET", "POST", "query_parameters", "request_parameters", + "filtered_parameters", "query_string" ] } @@ -64,7 +64,7 @@ module Request { this.getMethodName() = [ "authorization", "script_name", "path_info", "user_agent", "referer", "referrer", - "host_authority", "content_type", "host", "hostname", "accept_encoding", + "headers", "cookies", "cookie_jar", "content_type", "accept", "accept_encoding", "accept_language", "if_none_match", "if_none_match_etags", "content_mime_type" ] or @@ -86,8 +86,9 @@ module Request { HostCall() { this.getMethodName() = [ - "authority", "host", "host_authority", "host_with_port", "hostname", "forwarded_for", - "forwarded_host", "port", "forwarded_port" + "authority", "host", "host_authority", "host_with_port", "raw_host_with_port", "hostname", + "forwarded_for", "forwarded_host", "port", "forwarded_port", "port_string", "domain", + "subdomain", "subdomains" ] } diff --git a/ruby/ql/src/change-notes/2024-02-13-rails-more-request-sources.md b/ruby/ql/src/change-notes/2024-02-13-rails-more-request-sources.md new file mode 100644 index 00000000000..84ea696dfef --- /dev/null +++ b/ruby/ql/src/change-notes/2024-02-13-rails-more-request-sources.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added additional request sources for Ruby on Rails. \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected b/ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected index 6f2810e13d7..9276cc0b350 100644 --- a/ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected +++ b/ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected @@ -11,7 +11,7 @@ actionControllerControllerClasses | filter_flow.rb:42:1:57:3 | ThreeController | | filter_flow.rb:59:1:73:3 | FourController | | filter_flow.rb:75:1:93:3 | FiveController | -| input_access.rb:1:1:50:3 | UsersController | +| input_access.rb:1:1:58:3 | UsersController | | params_flow.rb:1:1:162:3 | MyController | | params_flow.rb:170:1:178:3 | Subclass | actionControllerActionMethods @@ -48,7 +48,7 @@ actionControllerActionMethods | filter_flow.rb:83:3:84:5 | b | | filter_flow.rb:86:3:88:5 | c | | filter_flow.rb:90:3:92:5 | taint_foo | -| input_access.rb:2:3:49:5 | index | +| input_access.rb:2:3:57:5 | index | | logging.rb:2:5:8:7 | index | | params_flow.rb:2:3:4:5 | m1 | | params_flow.rb:6:3:8:5 | m2 | @@ -230,43 +230,51 @@ httpInputAccesses | filter_flow.rb:91:12:91:17 | call to params | ActionController::Metal#params | | input_access.rb:3:5:3:18 | call to params | ActionDispatch::Request#params | | input_access.rb:4:5:4:22 | call to parameters | ActionDispatch::Request#parameters | -| input_access.rb:5:5:5:15 | call to GET | ActionDispatch::Request#GET | -| input_access.rb:6:5:6:16 | call to POST | ActionDispatch::Request#POST | -| input_access.rb:7:5:7:28 | call to query_parameters | ActionDispatch::Request#query_parameters | -| input_access.rb:8:5:8:30 | call to request_parameters | ActionDispatch::Request#request_parameters | -| input_access.rb:9:5:9:31 | call to filtered_parameters | ActionDispatch::Request#filtered_parameters | -| input_access.rb:11:5:11:25 | call to authorization | ActionDispatch::Request#authorization | -| input_access.rb:12:5:12:23 | call to script_name | ActionDispatch::Request#script_name | -| input_access.rb:13:5:13:21 | call to path_info | ActionDispatch::Request#path_info | -| input_access.rb:14:5:14:22 | call to user_agent | ActionDispatch::Request#user_agent | -| input_access.rb:15:5:15:19 | call to referer | ActionDispatch::Request#referer | -| input_access.rb:16:5:16:20 | call to referrer | ActionDispatch::Request#referrer | -| input_access.rb:17:5:17:26 | call to host_authority | ActionDispatch::Request#host_authority | -| input_access.rb:18:5:18:24 | call to content_type | ActionDispatch::Request#content_type | -| input_access.rb:19:5:19:16 | call to host | ActionDispatch::Request#host | -| input_access.rb:20:5:20:20 | call to hostname | ActionDispatch::Request#hostname | -| input_access.rb:21:5:21:27 | call to accept_encoding | ActionDispatch::Request#accept_encoding | -| input_access.rb:22:5:22:27 | call to accept_language | ActionDispatch::Request#accept_language | -| input_access.rb:23:5:23:25 | call to if_none_match | ActionDispatch::Request#if_none_match | -| input_access.rb:24:5:24:31 | call to if_none_match_etags | ActionDispatch::Request#if_none_match_etags | -| input_access.rb:25:5:25:29 | call to content_mime_type | ActionDispatch::Request#content_mime_type | -| input_access.rb:27:5:27:21 | call to authority | ActionDispatch::Request#authority | -| input_access.rb:28:5:28:16 | call to host | ActionDispatch::Request#host | -| input_access.rb:29:5:29:26 | call to host_authority | ActionDispatch::Request#host_authority | -| input_access.rb:30:5:30:26 | call to host_with_port | ActionDispatch::Request#host_with_port | -| input_access.rb:31:5:31:20 | call to hostname | ActionDispatch::Request#hostname | -| input_access.rb:32:5:32:25 | call to forwarded_for | ActionDispatch::Request#forwarded_for | -| input_access.rb:33:5:33:26 | call to forwarded_host | ActionDispatch::Request#forwarded_host | -| input_access.rb:34:5:34:16 | call to port | ActionDispatch::Request#port | -| input_access.rb:35:5:35:26 | call to forwarded_port | ActionDispatch::Request#forwarded_port | -| input_access.rb:37:5:37:22 | call to media_type | ActionDispatch::Request#media_type | -| input_access.rb:38:5:38:29 | call to media_type_params | ActionDispatch::Request#media_type_params | -| input_access.rb:39:5:39:27 | call to content_charset | ActionDispatch::Request#content_charset | -| input_access.rb:40:5:40:20 | call to base_url | ActionDispatch::Request#base_url | -| input_access.rb:42:5:42:16 | call to body | ActionDispatch::Request#body | -| input_access.rb:43:5:43:20 | call to raw_post | ActionDispatch::Request#raw_post | -| input_access.rb:45:5:45:30 | ...[...] | ActionDispatch::Request#env[] | -| input_access.rb:47:5:47:39 | ...[...] | ActionDispatch::Request#env[] | +| input_access.rb:5:5:5:29 | ...[...] | ActionDispatch::Request#[] | +| input_access.rb:6:5:6:15 | call to GET | ActionDispatch::Request#GET | +| input_access.rb:7:5:7:16 | call to POST | ActionDispatch::Request#POST | +| input_access.rb:8:5:8:28 | call to query_parameters | ActionDispatch::Request#query_parameters | +| input_access.rb:9:5:9:30 | call to request_parameters | ActionDispatch::Request#request_parameters | +| input_access.rb:10:5:10:31 | call to filtered_parameters | ActionDispatch::Request#filtered_parameters | +| input_access.rb:11:5:11:24 | call to query_string | ActionDispatch::Request#query_string | +| input_access.rb:13:5:13:25 | call to authorization | ActionDispatch::Request#authorization | +| input_access.rb:14:5:14:23 | call to script_name | ActionDispatch::Request#script_name | +| input_access.rb:15:5:15:21 | call to path_info | ActionDispatch::Request#path_info | +| input_access.rb:16:5:16:22 | call to user_agent | ActionDispatch::Request#user_agent | +| input_access.rb:17:5:17:19 | call to referer | ActionDispatch::Request#referer | +| input_access.rb:18:5:18:20 | call to referrer | ActionDispatch::Request#referrer | +| input_access.rb:19:5:19:19 | call to headers | ActionDispatch::Request#headers | +| input_access.rb:20:5:20:19 | call to cookies | ActionDispatch::Request#cookies | +| input_access.rb:21:5:21:22 | call to cookie_jar | ActionDispatch::Request#cookie_jar | +| input_access.rb:22:5:22:24 | call to content_type | ActionDispatch::Request#content_type | +| input_access.rb:23:5:23:18 | call to accept | ActionDispatch::Request#accept | +| input_access.rb:24:5:24:27 | call to accept_encoding | ActionDispatch::Request#accept_encoding | +| input_access.rb:25:5:25:27 | call to accept_language | ActionDispatch::Request#accept_language | +| input_access.rb:26:5:26:25 | call to if_none_match | ActionDispatch::Request#if_none_match | +| input_access.rb:27:5:27:31 | call to if_none_match_etags | ActionDispatch::Request#if_none_match_etags | +| input_access.rb:28:5:28:29 | call to content_mime_type | ActionDispatch::Request#content_mime_type | +| input_access.rb:30:5:30:21 | call to authority | ActionDispatch::Request#authority | +| input_access.rb:31:5:31:16 | call to host | ActionDispatch::Request#host | +| input_access.rb:32:5:32:26 | call to host_authority | ActionDispatch::Request#host_authority | +| input_access.rb:33:5:33:26 | call to host_with_port | ActionDispatch::Request#host_with_port | +| input_access.rb:34:5:34:30 | call to raw_host_with_port | ActionDispatch::Request#raw_host_with_port | +| input_access.rb:35:5:35:20 | call to hostname | ActionDispatch::Request#hostname | +| input_access.rb:36:5:36:25 | call to forwarded_for | ActionDispatch::Request#forwarded_for | +| input_access.rb:37:5:37:26 | call to forwarded_host | ActionDispatch::Request#forwarded_host | +| input_access.rb:38:5:38:16 | call to port | ActionDispatch::Request#port | +| input_access.rb:39:5:39:26 | call to forwarded_port | ActionDispatch::Request#forwarded_port | +| input_access.rb:40:5:40:23 | call to port_string | ActionDispatch::Request#port_string | +| input_access.rb:41:5:41:18 | call to domain | ActionDispatch::Request#domain | +| input_access.rb:42:5:42:21 | call to subdomain | ActionDispatch::Request#subdomain | +| input_access.rb:43:5:43:22 | call to subdomains | ActionDispatch::Request#subdomains | +| input_access.rb:45:5:45:22 | call to media_type | ActionDispatch::Request#media_type | +| input_access.rb:46:5:46:29 | call to media_type_params | ActionDispatch::Request#media_type_params | +| input_access.rb:47:5:47:27 | call to content_charset | ActionDispatch::Request#content_charset | +| input_access.rb:48:5:48:20 | call to base_url | ActionDispatch::Request#base_url | +| input_access.rb:50:5:50:16 | call to body | ActionDispatch::Request#body | +| input_access.rb:51:5:51:20 | call to raw_post | ActionDispatch::Request#raw_post | +| input_access.rb:53:5:53:30 | ...[...] | ActionDispatch::Request#env[] | +| input_access.rb:55:5:55:39 | ...[...] | ActionDispatch::Request#env[] | | logging.rb:5:22:5:35 | call to params | ActionDispatch::Request#params | | params_flow.rb:3:10:3:15 | call to params | ActionController::Metal#params | | params_flow.rb:7:10:7:15 | call to params | ActionController::Metal#params | diff --git a/ruby/ql/test/library-tests/frameworks/action_controller/input_access.rb b/ruby/ql/test/library-tests/frameworks/action_controller/input_access.rb index 334e36d3f3c..d5716bf4bd8 100644 --- a/ruby/ql/test/library-tests/frameworks/action_controller/input_access.rb +++ b/ruby/ql/test/library-tests/frameworks/action_controller/input_access.rb @@ -2,11 +2,13 @@ class UsersController < ActionController::Base def index request.params request.parameters + request["parameter_name"] request.GET request.POST request.query_parameters request.request_parameters request.filtered_parameters + request.query_string request.authorization request.script_name @@ -14,10 +16,11 @@ class UsersController < ActionController::Base request.user_agent request.referer request.referrer - request.host_authority + request.headers + request.cookies + request.cookie_jar request.content_type - request.host - request.hostname + request.accept request.accept_encoding request.accept_language request.if_none_match @@ -28,11 +31,16 @@ class UsersController < ActionController::Base request.host request.host_authority request.host_with_port + request.raw_host_with_port request.hostname request.forwarded_for request.forwarded_host request.port request.forwarded_port + request.port_string + request.domain + request.subdomain + request.subdomains request.media_type request.media_type_params From 128bc99f90b8ed15802203d1e4eeca32ceea12b6 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 13 Feb 2024 15:34:36 +0000 Subject: [PATCH 036/207] C++: delete some FIXMEs that turned out fine --- .../implementation/raw/internal/TranslatedInitialization.qll | 2 +- .../semmle/code/cpp/models/implementations/SmartPointer.qll | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index ff906a85bf5..9b6165d0782 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -1067,7 +1067,7 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr result = this.getParent().getChildSuccessor(this, kind) } - override Instruction getALastInstructionInternal() { none() } // FIXME: does this need to be filled in? + override Instruction getALastInstructionInternal() { none() } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { none() diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll index c37b6fb9b97..fe5448812fd 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll @@ -181,7 +181,6 @@ private class SmartPtrDestructor extends Destructor, SideEffectFunction, AliasFu * Gets the destructor associated with the base type of this smart pointer. */ private Destructor getBaseTypeDestructor() { - // TODO: Check if this is join ordered correctly. result.getDeclaringType() = declaringType.getBaseType() } @@ -222,4 +221,4 @@ private class SmartPtrDestructor extends Destructor, SideEffectFunction, AliasFu // A destructor call does not have a return value none() } -} \ No newline at end of file +} From 9016997b511e6cef468a68ba548f7a5967f4e346 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Wed, 14 Feb 2024 14:56:24 +0000 Subject: [PATCH 037/207] Golang: fix flow from a map value via a range statement --- .../semmle/go/dataflow/internal/ContainerFlow.qll | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll index ad985e2c5b5..a864b6a4d03 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll @@ -57,11 +57,11 @@ predicate containerStoreStep(Node node1, Node node2, Content c) { predicate containerReadStep(Node node1, Node node2, Content c) { c instanceof ArrayContent and ( - node2.(Read).readsElement(node1, _) and - ( - node1.getType() instanceof ArrayType or - node1.getType() instanceof SliceType - ) + node1.getType() instanceof ArrayType or + node1.getType() instanceof SliceType + ) and + ( + node2.(Read).readsElement(node1, _) or node2.(RangeElementNode).getBase() = node1 or @@ -85,5 +85,5 @@ predicate containerReadStep(Node node1, Node node2, Content c) { or c instanceof MapValueContent and node1.getType() instanceof MapType and - node2.(Read).readsElement(node1, _) + (node2.(Read).readsElement(node1, _) or node2.(RangeElementNode).getBase() = node1) } From 7ed73bc4ed5d09cea2b4f65d5457e7bce9d0a837 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Wed, 14 Feb 2024 15:45:03 +0000 Subject: [PATCH 038/207] change note --- go/ql/lib/change-notes/2024-02-14-range-map-read.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 go/ql/lib/change-notes/2024-02-14-range-map-read.md diff --git a/go/ql/lib/change-notes/2024-02-14-range-map-read.md b/go/ql/lib/change-notes/2024-02-14-range-map-read.md new file mode 100644 index 00000000000..ea45737a72e --- /dev/null +++ b/go/ql/lib/change-notes/2024-02-14-range-map-read.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed dataflow out of a `map` using a `range` statement. From 37eb81097fa35ec74a081933e049ff441942cde4 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Wed, 14 Feb 2024 22:42:03 +0000 Subject: [PATCH 039/207] Add additional sinks for connection methods --- ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll index 4596c432070..b0462170a9a 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll @@ -200,7 +200,13 @@ private predicate sqlFragmentArgumentInner(DataFlow::CallNode call, DataFlow::No call = activeRecordQueryBuilderCall("annotate") and sink = call.getArgument(_) or - call = activeRecordConnectionInstance().getAMethodCall("execute") and + call = + activeRecordConnectionInstance() + .getAMethodCall([ + "delete", "exec_query", "exec_delete", "exec_insert", "exec_update", "execute", + "insert", "select_all", "select_one", "select_rows", "select_value", "select_values", + "select_update", "update" + ]) and sink = call.getArgument(0) or call = activeRecordQueryBuilderCall("update_all") and From e36b9f4d3c9a5eb95ef5c93702e9758de2de0a47 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 15 Feb 2024 13:46:25 +0000 Subject: [PATCH 040/207] Add tests and change note --- ...02-15-activerecord_connection_sql_sinks.md | 4 + .../active_record/ActiveRecord.expected | 256 ++++++++++-------- .../frameworks/active_record/ActiveRecord.rb | 13 + 3 files changed, 158 insertions(+), 115 deletions(-) create mode 100644 ruby/ql/lib/change-notes/2024-02-15-activerecord_connection_sql_sinks.md diff --git a/ruby/ql/lib/change-notes/2024-02-15-activerecord_connection_sql_sinks.md b/ruby/ql/lib/change-notes/2024-02-15-activerecord_connection_sql_sinks.md new file mode 100644 index 00000000000..c2276f284a8 --- /dev/null +++ b/ruby/ql/lib/change-notes/2024-02-15-activerecord_connection_sql_sinks.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Calls to several methods of `ActiveRecord::Connection`, such as `ActiveRecord::Connection#exec_query`, are now recognized as SQL executions, including those via subclasses. \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected index b273bddbee6..f4fc841112c 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected @@ -1,7 +1,7 @@ activeRecordModelClasses | ActiveRecord.rb:1:1:3:3 | UserGroup | -| ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:21:1:25:3 | Admin | +| ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:34:1:38:3 | Admin | | associations.rb:1:1:3:3 | Author | | associations.rb:5:1:9:3 | Post | | associations.rb:11:1:13:3 | Tag | @@ -10,20 +10,33 @@ activeRecordInstances | ActiveRecord.rb:9:5:9:68 | call to find | | ActiveRecord.rb:13:5:13:40 | call to find_by | | ActiveRecord.rb:13:5:13:46 | call to users | -| ActiveRecord.rb:16:3:18:5 | self (exec) | -| ActiveRecord.rb:16:3:18:5 | self in exec | +| ActiveRecord.rb:16:3:31:5 | self (exec) | +| ActiveRecord.rb:16:3:31:5 | self in exec | | ActiveRecord.rb:17:5:17:14 | self | -| ActiveRecord.rb:39:5:39:51 | call to authenticate | -| ActiveRecord.rb:40:5:40:30 | call to find_by_name | -| ActiveRecord.rb:59:5:61:7 | if ... | -| ActiveRecord.rb:59:43:60:40 | then ... | -| ActiveRecord.rb:60:7:60:40 | call to find_by | -| ActiveRecord.rb:64:5:64:33 | call to find_by | -| ActiveRecord.rb:66:5:66:34 | call to find | -| ActiveRecord.rb:76:5:76:24 | call to create | -| ActiveRecord.rb:80:5:80:66 | call to create | -| ActiveRecord.rb:84:5:84:68 | call to create | -| ActiveRecord.rb:88:5:88:16 | call to create | +| ActiveRecord.rb:18:5:18:14 | self | +| ActiveRecord.rb:19:5:19:14 | self | +| ActiveRecord.rb:20:5:20:14 | self | +| ActiveRecord.rb:21:5:21:14 | self | +| ActiveRecord.rb:22:5:22:14 | self | +| ActiveRecord.rb:23:5:23:14 | self | +| ActiveRecord.rb:24:5:24:14 | self | +| ActiveRecord.rb:25:5:25:14 | self | +| ActiveRecord.rb:26:5:26:14 | self | +| ActiveRecord.rb:27:5:27:14 | self | +| ActiveRecord.rb:28:5:28:14 | self | +| ActiveRecord.rb:29:5:29:14 | self | +| ActiveRecord.rb:30:5:30:14 | self | +| ActiveRecord.rb:52:5:52:51 | call to authenticate | +| ActiveRecord.rb:53:5:53:30 | call to find_by_name | +| ActiveRecord.rb:72:5:74:7 | if ... | +| ActiveRecord.rb:72:43:73:40 | then ... | +| ActiveRecord.rb:73:7:73:40 | call to find_by | +| ActiveRecord.rb:77:5:77:33 | call to find_by | +| ActiveRecord.rb:79:5:79:34 | call to find | +| ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:101:5:101:16 | call to create | | associations.rb:19:1:19:7 | author1 | | associations.rb:19:1:19:20 | ... = ... | | associations.rb:19:11:19:20 | call to new | @@ -108,47 +121,60 @@ activeRecordInstances | associations.rb:53:1:53:34 | call to find | activeRecordSqlExecutionRanges | ActiveRecord.rb:9:33:9:67 | "name='#{...}' and pass='#{...}'" | -| ActiveRecord.rb:17:24:17:24 | q | -| ActiveRecord.rb:23:16:23:24 | condition | -| ActiveRecord.rb:32:30:32:44 | ...[...] | -| ActiveRecord.rb:33:20:33:42 | "id = '#{...}'" | -| ActiveRecord.rb:34:21:34:45 | call to [] | -| ActiveRecord.rb:35:16:35:21 | <<-SQL | -| ActiveRecord.rb:38:20:38:47 | "user.id = '#{...}'" | -| ActiveRecord.rb:50:20:50:32 | ... + ... | -| ActiveRecord.rb:56:16:56:28 | "name #{...}" | -| ActiveRecord.rb:60:20:60:39 | "username = #{...}" | -| ActiveRecord.rb:72:21:72:44 | ...[...] | -| ActiveRecord.rb:110:27:110:76 | "this is an unsafe annotation:..." | +| ActiveRecord.rb:17:23:17:23 | q | +| ActiveRecord.rb:18:27:18:27 | q | +| ActiveRecord.rb:19:28:19:28 | q | +| ActiveRecord.rb:20:28:20:28 | q | +| ActiveRecord.rb:21:28:21:28 | q | +| ActiveRecord.rb:22:28:22:28 | q | +| ActiveRecord.rb:23:24:23:24 | q | +| ActiveRecord.rb:24:23:24:23 | q | +| ActiveRecord.rb:25:27:25:27 | q | +| ActiveRecord.rb:26:27:26:27 | q | +| ActiveRecord.rb:27:28:27:28 | q | +| ActiveRecord.rb:28:29:28:29 | q | +| ActiveRecord.rb:29:30:29:30 | q | +| ActiveRecord.rb:30:23:30:23 | q | +| ActiveRecord.rb:36:16:36:24 | condition | +| ActiveRecord.rb:45:30:45:44 | ...[...] | +| ActiveRecord.rb:46:20:46:42 | "id = '#{...}'" | +| ActiveRecord.rb:47:21:47:45 | call to [] | +| ActiveRecord.rb:48:16:48:21 | <<-SQL | +| ActiveRecord.rb:51:20:51:47 | "user.id = '#{...}'" | +| ActiveRecord.rb:63:20:63:32 | ... + ... | +| ActiveRecord.rb:69:16:69:28 | "name #{...}" | +| ActiveRecord.rb:73:20:73:39 | "username = #{...}" | +| ActiveRecord.rb:85:21:85:44 | ...[...] | +| ActiveRecord.rb:123:27:123:76 | "this is an unsafe annotation:..." | activeRecordModelClassMethodCalls | ActiveRecord.rb:2:3:2:17 | call to has_many | | ActiveRecord.rb:6:3:6:24 | call to belongs_to | | ActiveRecord.rb:9:5:9:68 | call to find | | ActiveRecord.rb:13:5:13:40 | call to find_by | | ActiveRecord.rb:13:5:13:46 | call to users | -| ActiveRecord.rb:23:5:23:25 | call to destroy_by | -| ActiveRecord.rb:32:5:32:45 | call to calculate | -| ActiveRecord.rb:33:5:33:43 | call to delete_by | -| ActiveRecord.rb:34:5:34:46 | call to destroy_by | -| ActiveRecord.rb:35:5:35:35 | call to where | -| ActiveRecord.rb:38:5:38:14 | call to where | -| ActiveRecord.rb:38:5:38:48 | call to not | -| ActiveRecord.rb:40:5:40:30 | call to find_by_name | -| ActiveRecord.rb:41:5:41:36 | call to not_a_find_by_method | -| ActiveRecord.rb:50:5:50:33 | call to delete_by | -| ActiveRecord.rb:56:5:56:29 | call to order | -| ActiveRecord.rb:60:7:60:40 | call to find_by | -| ActiveRecord.rb:64:5:64:33 | call to find_by | -| ActiveRecord.rb:66:5:66:34 | call to find | -| ActiveRecord.rb:76:5:76:24 | call to create | -| ActiveRecord.rb:80:5:80:66 | call to create | -| ActiveRecord.rb:84:5:84:68 | call to create | -| ActiveRecord.rb:88:5:88:16 | call to create | -| ActiveRecord.rb:92:5:92:27 | call to update | -| ActiveRecord.rb:96:5:96:69 | call to update | -| ActiveRecord.rb:100:5:100:71 | call to update | -| ActiveRecord.rb:106:13:106:54 | call to annotate | -| ActiveRecord.rb:110:13:110:77 | call to annotate | +| ActiveRecord.rb:36:5:36:25 | call to destroy_by | +| ActiveRecord.rb:45:5:45:45 | call to calculate | +| ActiveRecord.rb:46:5:46:43 | call to delete_by | +| ActiveRecord.rb:47:5:47:46 | call to destroy_by | +| ActiveRecord.rb:48:5:48:35 | call to where | +| ActiveRecord.rb:51:5:51:14 | call to where | +| ActiveRecord.rb:51:5:51:48 | call to not | +| ActiveRecord.rb:53:5:53:30 | call to find_by_name | +| ActiveRecord.rb:54:5:54:36 | call to not_a_find_by_method | +| ActiveRecord.rb:63:5:63:33 | call to delete_by | +| ActiveRecord.rb:69:5:69:29 | call to order | +| ActiveRecord.rb:73:7:73:40 | call to find_by | +| ActiveRecord.rb:77:5:77:33 | call to find_by | +| ActiveRecord.rb:79:5:79:34 | call to find | +| ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:101:5:101:16 | call to create | +| ActiveRecord.rb:105:5:105:27 | call to update | +| ActiveRecord.rb:109:5:109:69 | call to update | +| ActiveRecord.rb:113:5:113:71 | call to update | +| ActiveRecord.rb:119:13:119:54 | call to annotate | +| ActiveRecord.rb:123:13:123:77 | call to annotate | | associations.rb:2:3:2:17 | call to has_many | | associations.rb:6:3:6:20 | call to belongs_to | | associations.rb:7:3:7:20 | call to has_many | @@ -204,41 +230,41 @@ activeRecordModelClassMethodCalls activeRecordModelClassMethodCallsReplacement | ActiveRecord.rb:1:1:3:3 | UserGroup | ActiveRecord.rb:2:3:2:17 | call to has_many | | ActiveRecord.rb:1:1:3:3 | UserGroup | ActiveRecord.rb:13:5:13:40 | call to find_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:6:3:6:24 | call to belongs_to | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:9:5:9:68 | call to find | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:23:5:23:25 | call to destroy_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:32:5:32:45 | call to calculate | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:33:5:33:43 | call to delete_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:34:5:34:46 | call to destroy_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:35:5:35:35 | call to where | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:38:5:38:14 | call to where | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:39:5:39:51 | call to authenticate | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:40:5:40:30 | call to find_by_name | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:41:5:41:36 | call to not_a_find_by_method | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:50:5:50:33 | call to delete_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:56:5:56:29 | call to order | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:60:7:60:40 | call to find_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:64:5:64:33 | call to find_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:66:5:66:34 | call to find | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:72:5:72:45 | call to delete_by | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:76:5:76:24 | call to create | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:80:5:80:66 | call to create | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:84:5:84:68 | call to create | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:88:5:88:16 | call to create | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:92:5:92:27 | call to update | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:96:5:96:69 | call to update | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:100:5:100:71 | call to update | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:106:13:106:54 | call to annotate | -| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:110:13:110:77 | call to annotate | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:23:5:23:25 | call to destroy_by | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:72:5:72:45 | call to delete_by | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:76:5:76:24 | call to create | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:80:5:80:66 | call to create | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:84:5:84:68 | call to create | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:88:5:88:16 | call to create | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:92:5:92:27 | call to update | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:96:5:96:69 | call to update | -| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:100:5:100:71 | call to update | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:6:3:6:24 | call to belongs_to | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:9:5:9:68 | call to find | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:36:5:36:25 | call to destroy_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:45:5:45:45 | call to calculate | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:46:5:46:43 | call to delete_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:47:5:47:46 | call to destroy_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:48:5:48:35 | call to where | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:51:5:51:14 | call to where | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:52:5:52:51 | call to authenticate | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:53:5:53:30 | call to find_by_name | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:54:5:54:36 | call to not_a_find_by_method | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:63:5:63:33 | call to delete_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:69:5:69:29 | call to order | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:73:7:73:40 | call to find_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:77:5:77:33 | call to find_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:79:5:79:34 | call to find | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:85:5:85:45 | call to delete_by | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:101:5:101:16 | call to create | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:105:5:105:27 | call to update | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:109:5:109:69 | call to update | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:113:5:113:71 | call to update | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:119:13:119:54 | call to annotate | +| ActiveRecord.rb:5:1:32:3 | User | ActiveRecord.rb:123:13:123:77 | call to annotate | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:36:5:36:25 | call to destroy_by | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:85:5:85:45 | call to delete_by | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:101:5:101:16 | call to create | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:105:5:105:27 | call to update | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:109:5:109:69 | call to update | +| ActiveRecord.rb:34:1:38:3 | Admin | ActiveRecord.rb:113:5:113:71 | call to update | | associations.rb:1:1:3:3 | Author | associations.rb:2:3:2:17 | call to has_many | | associations.rb:1:1:3:3 | Author | associations.rb:19:11:19:20 | call to new | | associations.rb:5:1:9:3 | Post | associations.rb:6:3:6:20 | call to belongs_to | @@ -248,29 +274,29 @@ activeRecordModelClassMethodCallsReplacement | associations.rb:15:1:17:3 | Comment | associations.rb:16:3:16:18 | call to belongs_to | potentiallyUnsafeSqlExecutingMethodCall | ActiveRecord.rb:9:5:9:68 | call to find | -| ActiveRecord.rb:23:5:23:25 | call to destroy_by | -| ActiveRecord.rb:32:5:32:45 | call to calculate | -| ActiveRecord.rb:33:5:33:43 | call to delete_by | -| ActiveRecord.rb:34:5:34:46 | call to destroy_by | -| ActiveRecord.rb:35:5:35:35 | call to where | -| ActiveRecord.rb:38:5:38:48 | call to not | -| ActiveRecord.rb:50:5:50:33 | call to delete_by | -| ActiveRecord.rb:56:5:56:29 | call to order | -| ActiveRecord.rb:60:7:60:40 | call to find_by | -| ActiveRecord.rb:110:13:110:77 | call to annotate | +| ActiveRecord.rb:36:5:36:25 | call to destroy_by | +| ActiveRecord.rb:45:5:45:45 | call to calculate | +| ActiveRecord.rb:46:5:46:43 | call to delete_by | +| ActiveRecord.rb:47:5:47:46 | call to destroy_by | +| ActiveRecord.rb:48:5:48:35 | call to where | +| ActiveRecord.rb:51:5:51:48 | call to not | +| ActiveRecord.rb:63:5:63:33 | call to delete_by | +| ActiveRecord.rb:69:5:69:29 | call to order | +| ActiveRecord.rb:73:7:73:40 | call to find_by | +| ActiveRecord.rb:123:13:123:77 | call to annotate | activeRecordModelInstantiations -| ActiveRecord.rb:9:5:9:68 | call to find | ActiveRecord.rb:5:1:19:3 | User | +| ActiveRecord.rb:9:5:9:68 | call to find | ActiveRecord.rb:5:1:32:3 | User | | ActiveRecord.rb:13:5:13:40 | call to find_by | ActiveRecord.rb:1:1:3:3 | UserGroup | -| ActiveRecord.rb:13:5:13:46 | call to users | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:16:3:18:5 | self in exec | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:40:5:40:30 | call to find_by_name | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:60:7:60:40 | call to find_by | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:64:5:64:33 | call to find_by | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:66:5:66:34 | call to find | ActiveRecord.rb:5:1:19:3 | User | -| ActiveRecord.rb:76:5:76:24 | call to create | ActiveRecord.rb:21:1:25:3 | Admin | -| ActiveRecord.rb:80:5:80:66 | call to create | ActiveRecord.rb:21:1:25:3 | Admin | -| ActiveRecord.rb:84:5:84:68 | call to create | ActiveRecord.rb:21:1:25:3 | Admin | -| ActiveRecord.rb:88:5:88:16 | call to create | ActiveRecord.rb:21:1:25:3 | Admin | +| ActiveRecord.rb:13:5:13:46 | call to users | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:16:3:31:5 | self in exec | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:53:5:53:30 | call to find_by_name | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:73:7:73:40 | call to find_by | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:77:5:77:33 | call to find_by | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:79:5:79:34 | call to find | ActiveRecord.rb:5:1:32:3 | User | +| ActiveRecord.rb:89:5:89:24 | call to create | ActiveRecord.rb:34:1:38:3 | Admin | +| ActiveRecord.rb:93:5:93:66 | call to create | ActiveRecord.rb:34:1:38:3 | Admin | +| ActiveRecord.rb:97:5:97:68 | call to create | ActiveRecord.rb:34:1:38:3 | Admin | +| ActiveRecord.rb:101:5:101:16 | call to create | ActiveRecord.rb:34:1:38:3 | Admin | | associations.rb:19:11:19:20 | call to new | associations.rb:1:1:3:3 | Author | | associations.rb:21:9:21:21 | call to posts | associations.rb:5:1:9:3 | Post | | associations.rb:21:9:21:28 | call to create | associations.rb:5:1:9:3 | Post | @@ -312,13 +338,13 @@ activeRecordModelInstantiations | associations.rb:53:1:53:13 | call to posts | associations.rb:5:1:9:3 | Post | | associations.rb:53:1:53:20 | call to reload | associations.rb:5:1:9:3 | Post | persistentWriteAccesses -| ActiveRecord.rb:76:5:76:24 | call to create | ActiveRecord.rb:76:18:76:23 | call to params | -| ActiveRecord.rb:80:5:80:66 | call to create | ActiveRecord.rb:80:24:80:36 | ...[...] | -| ActiveRecord.rb:80:5:80:66 | call to create | ActiveRecord.rb:80:49:80:65 | ...[...] | -| ActiveRecord.rb:84:5:84:68 | call to create | ActiveRecord.rb:84:25:84:37 | ...[...] | -| ActiveRecord.rb:84:5:84:68 | call to create | ActiveRecord.rb:84:50:84:66 | ...[...] | -| ActiveRecord.rb:92:5:92:27 | call to update | ActiveRecord.rb:92:21:92:26 | call to params | -| ActiveRecord.rb:96:5:96:69 | call to update | ActiveRecord.rb:96:27:96:39 | ...[...] | -| ActiveRecord.rb:96:5:96:69 | call to update | ActiveRecord.rb:96:52:96:68 | ...[...] | -| ActiveRecord.rb:100:5:100:71 | call to update | ActiveRecord.rb:100:21:100:70 | call to [] | +| ActiveRecord.rb:89:5:89:24 | call to create | ActiveRecord.rb:89:18:89:23 | call to params | +| ActiveRecord.rb:93:5:93:66 | call to create | ActiveRecord.rb:93:24:93:36 | ...[...] | +| ActiveRecord.rb:93:5:93:66 | call to create | ActiveRecord.rb:93:49:93:65 | ...[...] | +| ActiveRecord.rb:97:5:97:68 | call to create | ActiveRecord.rb:97:25:97:37 | ...[...] | +| ActiveRecord.rb:97:5:97:68 | call to create | ActiveRecord.rb:97:50:97:66 | ...[...] | +| ActiveRecord.rb:105:5:105:27 | call to update | ActiveRecord.rb:105:21:105:26 | call to params | +| ActiveRecord.rb:109:5:109:69 | call to update | ActiveRecord.rb:109:27:109:39 | ...[...] | +| ActiveRecord.rb:109:5:109:69 | call to update | ActiveRecord.rb:109:52:109:68 | ...[...] | +| ActiveRecord.rb:113:5:113:71 | call to update | ActiveRecord.rb:113:21:113:70 | call to [] | | associations.rb:31:16:31:22 | ... = ... | associations.rb:31:16:31:22 | author2 | diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb index dca8f3c43d3..763d90fffaa 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb @@ -14,7 +14,20 @@ class User < ApplicationRecord end def exec(q) + connection.delete(q) + connection.exec_query(q) + connection.exec_insert(q) + connection.exec_delete(q) + connection.exec_update(q) + connection.exec_insert(q) connection.execute(q) + connection.insert(q) + connection.select_all(q) + connection.select_one(q) + connection.select_rows(q) + connection.select_value(q) + connection.select_values(q) + connection.update(q) end end From 625c47fa9c11ef2f3b8b9a9663e5b08f4c44678b Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 14 Feb 2024 23:33:28 +0100 Subject: [PATCH 041/207] C++: Add a testcase. --- .../dataflow/taint-tests/localTaint.expected | 17 +++++++++++++++++ .../dataflow/taint-tests/taint.cpp | 13 +++++++++++++ 2 files changed, 30 insertions(+) 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 cebf91d6f59..cf758a9b226 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected @@ -6657,6 +6657,23 @@ WARNING: Module TaintTracking has been deprecated and may be removed in future ( | taint.cpp:745:27:745:32 | buffer | taint.cpp:745:19:745:25 | call to realloc | TAINT | | taint.cpp:746:9:746:15 | * ... | taint.cpp:746:8:746:15 | * ... | TAINT | | taint.cpp:746:10:746:15 | buffer | taint.cpp:746:9:746:15 | * ... | TAINT | +| taint.cpp:751:31:751:34 | path | taint.cpp:751:31:751:34 | path | | +| taint.cpp:751:31:751:34 | path | taint.cpp:752:10:752:13 | path | | +| taint.cpp:751:31:751:34 | path | taint.cpp:753:10:753:13 | path | | +| taint.cpp:751:43:751:46 | data | taint.cpp:751:43:751:46 | data | | +| taint.cpp:751:43:751:46 | data | taint.cpp:753:22:753:25 | data | | +| taint.cpp:752:10:752:13 | ref arg path | taint.cpp:751:31:751:34 | path | | +| taint.cpp:752:10:752:13 | ref arg path | taint.cpp:753:10:753:13 | path | | +| taint.cpp:752:16:752:19 | %s | taint.cpp:752:10:752:13 | ref arg path | TAINT | +| taint.cpp:752:22:752:26 | abc | taint.cpp:752:10:752:13 | ref arg path | TAINT | +| taint.cpp:753:10:753:13 | ref arg path | taint.cpp:751:31:751:34 | path | | +| taint.cpp:753:16:753:19 | %s | taint.cpp:753:10:753:13 | ref arg path | TAINT | +| taint.cpp:753:22:753:25 | data | taint.cpp:753:10:753:13 | ref arg path | TAINT | +| taint.cpp:753:22:753:25 | ref arg data | taint.cpp:751:43:751:46 | data | | +| taint.cpp:757:7:757:10 | path | taint.cpp:758:21:758:24 | path | | +| taint.cpp:757:7:757:10 | path | taint.cpp:759:8:759:11 | path | | +| taint.cpp:758:21:758:24 | ref arg path | taint.cpp:759:8:759:11 | path | | +| taint.cpp:759:8:759:11 | path | taint.cpp:759:7:759:11 | * ... | | | 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 eeefa6dd427..02ddc44d883 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp @@ -744,4 +744,17 @@ void test_realloc_2_indirections(int **buffer) { **buffer = source(); buffer = (int**)realloc(buffer, 16); sink(**buffer); // $ ir MISSING: ast +} + +int sprintf(char *, const char *, ...); + +void call_sprintf_twice(char* path, char* data) { + sprintf(path, "%s", "abc"); + sprintf(path, "%s", data); +} + +void test_call_sprintf() { + char path[10]; + call_sprintf_twice(path, indirect_source()); + sink(*path); // $ ir ast } \ No newline at end of file From 24a63ae94de387bd61d0f07d67d81d9833f47511 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 15 Feb 2024 10:17:20 +0100 Subject: [PATCH 042/207] C++: Block flow by default. --- .../cpp/ir/dataflow/internal/SsaInternals.qll | 42 +++++++++++++++++- .../dataflow-tests/test-source-sink.expected | 2 - .../dataflow/dataflow-tests/test.cpp | 4 +- .../dataflow/taint-tests/map.cpp | 44 +++++++++---------- .../dataflow/taint-tests/set.cpp | 32 +++++++------- .../dataflow/taint-tests/string.cpp | 8 ++-- .../dataflow/taint-tests/stringstream.cpp | 14 +++--- .../dataflow/taint-tests/taint.cpp | 4 +- .../dataflow/taint-tests/vector.cpp | 6 +-- 9 files changed, 97 insertions(+), 59 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll index 8a5e8d20319..a6255abcee3 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll @@ -4,7 +4,10 @@ private import DataFlowUtil private import DataFlowImplCommon as DataFlowImplCommon private import semmle.code.cpp.models.interfaces.Allocation as Alloc private import semmle.code.cpp.models.interfaces.DataFlow as DataFlow +private import semmle.code.cpp.models.interfaces.Taint as Taint +private import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs as FIO private import semmle.code.cpp.ir.internal.IRCppLanguage +private import semmle.code.cpp.ir.dataflow.internal.ModelUtil private import DataFlowPrivate private import ssa0.SsaInternals as SsaInternals0 import SsaInternalsCommon @@ -796,10 +799,47 @@ private Node getAPriorDefinition(SsaDefOrUse defOrUse) { ) } +private predicate inOut(FIO::FunctionInput input, FIO::FunctionOutput output) { + exists(int indirectionIndex | + input.isQualifierObject(indirectionIndex) and + output.isQualifierObject(indirectionIndex) + or + exists(int i | + input.isParameterDeref(i, indirectionIndex) and + output.isParameterDeref(i, indirectionIndex) + ) + ) +} + +/** + * Holds if there should not be use-use flow out of `n` (or a conversion that + * flows to `n`). + */ +private predicate modeledFlowBarrier(Node n) { + exists(FIO::FunctionInput input, FIO::FunctionOutput output, CallInstruction call | + n = callInput(call, input) and + inOut(input, output) and + exists(callOutput(call, output)) + | + call.getStaticCallTarget().(DataFlow::DataFlowFunction).hasDataFlow(_, output) + or + call.getStaticCallTarget().(Taint::TaintFunction).hasTaintFlow(_, output) + ) + or + exists(Operand operand, Instruction instr, Node n0, int indirectionIndex | + modeledFlowBarrier(n0) and + nodeHasInstruction(n0, instr, indirectionIndex) and + conversionFlow(operand, instr, false, _) and + nodeHasOperand(n, operand, indirectionIndex) + ) +} + /** Holds if there is def-use or use-use flow from `nodeFrom` to `nodeTo`. */ predicate ssaFlow(Node nodeFrom, Node nodeTo) { exists(Node nFrom, boolean uncertain, SsaDefOrUse defOrUse | - ssaFlowImpl(defOrUse, nFrom, nodeTo, uncertain) and nodeFrom != nodeTo + ssaFlowImpl(defOrUse, nFrom, nodeTo, uncertain) and + not modeledFlowBarrier(nFrom) and + nodeFrom != nodeTo | if uncertain = true then nodeFrom = [nFrom, getAPriorDefinition(defOrUse)] else nodeFrom = nFrom ) diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected index 2d33f47ba60..f9ccfb8e3e4 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected @@ -238,8 +238,6 @@ irFlow | test.cpp:382:48:382:54 | source1 | test.cpp:385:8:385:10 | tmp | | test.cpp:388:53:388:59 | source1 | test.cpp:392:8:392:10 | tmp | | test.cpp:388:53:388:59 | source1 | test.cpp:394:10:394:12 | tmp | -| test.cpp:399:7:399:9 | definition of tmp | test.cpp:401:8:401:10 | tmp | -| test.cpp:405:7:405:9 | definition of tmp | test.cpp:408:8:408:10 | tmp | | test.cpp:416:7:416:11 | definition of local | test.cpp:418:8:418:12 | local | | test.cpp:417:16:417:20 | intRefSource output argument | test.cpp:418:8:418:12 | local | | test.cpp:422:7:422:11 | definition of local | test.cpp:424:8:424:12 | local | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp index e29619a6800..60c3abfdfc6 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp @@ -398,14 +398,14 @@ void flowThroughMemcpy_blockvar_with_local_flow(int source1, int b) { void cleanedByMemcpy_ssa(int clean1) { // currently modeled with BlockVar, not SSA int tmp; memcpy(&tmp, &clean1, sizeof tmp); - sink(tmp); // $ SPURIOUS: ast,ir + sink(tmp); // $ SPURIOUS: ast } void cleanedByMemcpy_blockvar(int clean1) { int tmp; int *capture = &tmp; memcpy(&tmp, &clean1, sizeof tmp); - sink(tmp); // $ SPURIOUS: ast,ir + sink(tmp); // $ SPURIOUS: ast } void intRefSource(int &ref_source); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp index 8eeb80a0f83..9e361e9cf49 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp @@ -71,11 +71,11 @@ void test_pair() sink(i.second); // $ MISSING: ast,ir sink(i); // $ ast,ir sink(j.first); - sink(j.second); // $ SPURIOUS: ast,ir - sink(j); // $ SPURIOUS: ast,ir + sink(j.second); // $ SPURIOUS: ast + sink(j); // $ SPURIOUS: ast sink(k.first); - sink(k.second); // $ SPURIOUS: ast,ir - sink(k); // $ SPURIOUS: ast,ir + sink(k.second); // $ SPURIOUS: ast + sink(k); // $ SPURIOUS: ast sink(l.first); sink(l.second); // $ MISSING: ast,ir sink(l); // $ ast,ir @@ -179,11 +179,11 @@ void test_map() m14.insert(std::make_pair("b", source())); m14.insert(std::make_pair("c", source())); m14.insert(std::make_pair("d", "d")); - sink(m14.lower_bound("b")); // $ ast,ir=179:33 ast,ir=180:33 - sink(m14.upper_bound("b")); // $ ast,ir=179:33 ast,ir=180:33 + sink(m14.lower_bound("b")); // $ ast=179:33 ast=180:33 MISSING: ir=179:33 ir=180:33 + sink(m14.upper_bound("b")); // $ ast=179:33 ast=180:33 MISSING: ir=179:33 ir=180:33 sink(m14.equal_range("b").first); // $ MISSING: ast,ir sink(m14.equal_range("b").second); // $ MISSING: ast,ir - sink(m14.upper_bound("c")); // $ SPURIOUS: ast,ir=179:33 ast,ir=180:33 + sink(m14.upper_bound("c")); // $ SPURIOUS: ast=179:33 ast=180:33 sink(m14.equal_range("c").second); // swap @@ -196,10 +196,10 @@ void test_map() sink(m18); // $ ast,ir m15.swap(m16); m17.swap(m18); - sink(m15); // $ SPURIOUS: ast,ir + sink(m15); // $ SPURIOUS: ast sink(m16); // $ ast,ir sink(m17); // $ ast,ir - sink(m18); // $ SPURIOUS: ast,ir + sink(m18); // $ SPURIOUS: ast // merge std::map m19, m20, m21, m22; @@ -213,7 +213,7 @@ void test_map() sink(m22); // $ ast,ir m19.merge(m20); m21.merge(m22); - sink(m19); // $ ast,ir + sink(m19); // $ ast sink(m20); sink(m21); // $ ast,ir sink(m22); // $ ast,ir @@ -222,11 +222,11 @@ void test_map() std::map m23; m23.insert(std::pair(source(), source())); m23.insert(std::pair(source(), source())); - sink(m23); // $ ast,ir=223:49 ast,ir=224:49 - sink(m23.erase(m23.begin())); // $ ast,ir=223:49 ast,ir=224:49 - sink(m23); // $ ast,ir=223:49 ast,ir=224:49 + sink(m23); // $ ast=223:49 ast=224:49 ir MISSING: ir=223:49 ir=224:49 + sink(m23.erase(m23.begin())); // $ ast=223:49 ast=224:49 ir MISSING: ir=223:49 ir=224:49 + sink(m23); // $ ast=223:49 ast=224:49 ir MISSING: ir=223:49 ir=224:49 m23.clear(); - sink(m23); // $ SPURIOUS: ast,ir=223:49 ast,ir=224:49 + sink(m23); // $ SPURIOUS: ast=223:49 ast=224:49 ir // emplace, emplace_hint std::map m24, m25; @@ -345,10 +345,10 @@ void test_unordered_map() sink(m18); // $ ast,ir m15.swap(m16); m17.swap(m18); - sink(m15); // $ SPURIOUS: ast,ir + sink(m15); // $ SPURIOUS: ast sink(m16); // $ ast,ir sink(m17); // $ ast,ir - sink(m18); // $ SPURIOUS: ast,ir + sink(m18); // $ SPURIOUS: ast // merge std::unordered_map m19, m20, m21, m22; @@ -362,7 +362,7 @@ void test_unordered_map() sink(m22); // $ ast,ir m19.merge(m20); m21.merge(m22); - sink(m19); // $ ast,ir + sink(m19); // $ ast MISSING: ir sink(m20); sink(m21); // $ ast,ir sink(m22); // $ ast,ir @@ -371,11 +371,11 @@ void test_unordered_map() std::unordered_map m23; m23.insert(std::pair(source(), source())); m23.insert(std::pair(source(), source())); - sink(m23); // $ ast,ir=372:49 ast,ir=373:49 - sink(m23.erase(m23.begin())); // $ ast,ir=372:49 ast,ir=373:49 - sink(m23); // $ ast,ir=372:49 ast,ir=373:49 + sink(m23); // $ ast=372:49 ast=373:49 ir MISSING: ir=372:49 ir=373:49 + sink(m23.erase(m23.begin())); // $ ast=372:49 ast=373:49 ir MISSING: ir=372:49 ir=373:49 + sink(m23); // $ ast=372:49 ast=373:49 ir MISSING: ir=372:49 ir=373:49 m23.clear(); - sink(m23); // $ SPURIOUS: ast,ir=372:49 ast,ir=373:49 + sink(m23); // $ SPURIOUS: ast=372:49 ast=373:49 ir // emplace, emplace_hint std::unordered_map m24, m25; @@ -395,7 +395,7 @@ void test_unordered_map() sink(m26); sink(m26.try_emplace("abc", source()).first); sink(m26.try_emplace("abc", source()).second); // $ MISSING: ast,ir=396:30 - sink(m26); // $ ast,ir=396:30 SPURIOUS: ast,ir=397:30 + sink(m26); // $ ast=396:30 ir MISSING: ir=396:30 SPURIOUS: ast=397:30 sink(m27.try_emplace(m27.begin(), "abc", "def")); sink(m27); sink(m27.try_emplace(m27.begin(), "abc", source())); // $ ast,ir diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp index c6c19d90089..0715eac8b4e 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp @@ -66,8 +66,8 @@ void test_set() s11.insert("a"); s11.insert(source()); s11.insert("c"); - sink(s11.lower_bound("b")); // $ ast,ir - sink(s11.upper_bound("b")); // $ ast,ir + sink(s11.lower_bound("b")); // $ ast MISSING: ir + sink(s11.upper_bound("b")); // $ ast MISSING: ir sink(s11.equal_range("b").first); // $ MISSING: ast,ir sink(s11.equal_range("b").second); // $ MISSING: ast,ir @@ -81,10 +81,10 @@ void test_set() sink(s15); // $ ast,ir s12.swap(s13); s14.swap(s15); - sink(s12); // $ SPURIOUS: ast,ir + sink(s12); // $ SPURIOUS: ast sink(s13); // $ ast,ir sink(s14); // $ ast,ir - sink(s15); // $ SPURIOUS: ast,ir + sink(s15); // $ SPURIOUS: ast // merge std::set s16, s17, s18, s19; @@ -98,7 +98,7 @@ void test_set() sink(s19); // $ ast,ir s16.merge(s17); s18.merge(s19); - sink(s16); // $ ast,ir + sink(s16); // $ ast MISSING: ir sink(s17); sink(s18); // $ ast,ir sink(s19); // $ ast,ir @@ -107,11 +107,11 @@ void test_set() std::set s20; s20.insert(source()); s20.insert(source()); - sink(s20); // $ ast,ir=108:13 ast,ir=109:13 - sink(s20.erase(s20.begin())); // $ ast,ir=108:13 ast,ir=109:13 - sink(s20); // $ ast,ir=108:13 ast,ir=109:13 + sink(s20); // $ ast=108:13 ast=109:13 ir MISSING: ir=108:13 ir=109:13 + sink(s20.erase(s20.begin())); // $ ast=108:13 ast=109:13 ir MISSING: ir=108:13 ir=109:13 + sink(s20); // $ ir ast=108:13 ast=109:13 MISSING: ir=108:13 ir=109:13 s20.clear(); - sink(s20); // $ SPURIOUS: ast,ir=108:13 ast,ir=109:13 + sink(s20); // $ SPURIOUS: ir ast=108:13 ast=109:13 // emplace, emplace_hint std::set s21, s22; @@ -193,10 +193,10 @@ void test_unordered_set() sink(s15); // $ ast,ir s12.swap(s13); s14.swap(s15); - sink(s12); // $ SPURIOUS: ast,ir + sink(s12); // $ SPURIOUS: ast sink(s13); // $ ast,ir sink(s14); // $ ast,ir - sink(s15); // $ SPURIOUS: ast,ir + sink(s15); // $ SPURIOUS: ast // merge std::unordered_set s16, s17, s18, s19; @@ -210,7 +210,7 @@ void test_unordered_set() sink(s19); // $ ast,ir s16.merge(s17); s18.merge(s19); - sink(s16); // $ ast,ir + sink(s16); // $ ast MISSING: ir sink(s17); sink(s18); // $ ast,ir sink(s19); // $ ast,ir @@ -219,11 +219,11 @@ void test_unordered_set() std::unordered_set s20; s20.insert(source()); s20.insert(source()); - sink(s20); // $ ast,ir=220:13 ast,ir=221:13 - sink(s20.erase(s20.begin())); // $ ast,ir=220:13 ast,ir=221:13 - sink(s20); // $ ast,ir=220:13 ast,ir=221:13 + sink(s20); // $ ir ast=220:13 ast=221:13 MISSING: ir=220:13 ir=221:13 + sink(s20.erase(s20.begin())); // $ ast=220:13 ast=221:13 ir MISSING: ir=220:13 ir=221:13 + sink(s20); // $ ast=220:13 ast=221:13 ir MISSING: ir=220:13 ir=221:13 s20.clear(); - sink(s20); // $ SPURIOUS: ast,ir=220:13 ast,ir=221:13 + sink(s20); // $ SPURIOUS: ast=220:13 ast=221:13 ir // emplace, emplace_hint std::unordered_set s21, s22; diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp index e2b99945724..dc92a0664be 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp @@ -203,7 +203,7 @@ void test_string_assign() { sink(s5); // $ ast,ir sink(s6.assign(s1)); - sink(s6); // $ SPURIOUS: ast,ir + sink(s6); // $ SPURIOUS: ast } void test_string_insert() { @@ -280,9 +280,9 @@ void test_string_swap() { s4.swap(s3); sink(s1); // $ ast,ir - sink(s2); // $ SPURIOUS: ast,ir + sink(s2); // $ SPURIOUS: ast sink(s3); // $ ast,ir - sink(s4); // $ SPURIOUS: ast,ir + sink(s4); // $ SPURIOUS: ast } void test_string_clear() { @@ -495,7 +495,7 @@ void test_string_iterator_methods() sink(h); // $ ast,ir sink(s6.assign(s5.cbegin(), s5.cend())); - sink(s6); // $ SPURIOUS: ast,ir + sink(s6); // $ SPURIOUS: ast } } diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp index a84b3606f92..ca17fb4b3e7 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp @@ -50,7 +50,7 @@ void test_stringstream_string(int amount) ss7.str(source()); ss7.str("abc"); // (overwrites) sink(ss6); // $ ast,ir - sink(ss7); // $ SPURIOUS: ast,ir + sink(ss7); // $ SPURIOUS: ast sink(ss8.put('a')); sink(ss9.put(ns_char::source())); // $ ast,ir @@ -118,9 +118,9 @@ void test_stringstream_swap() ss4.swap(ss3); sink(ss1); // $ ast,ir - sink(ss2); // $ SPURIOUS: ast,ir + sink(ss2); // $ SPURIOUS: ast sink(ss3); // $ ast,ir - sink(ss4); // $ SPURIOUS: ast,ir + sink(ss4); // $ SPURIOUS: ast } void test_stringstream_in() @@ -217,7 +217,7 @@ void test_getline() sink(ss1.getline(b3, 1000)); sink(b1); sink(b2); // $ ast,ir - sink(b3); // $ SPURIOUS: ast,ir + sink(b3); // $ SPURIOUS: ast sink(ss1.getline(b4, 1000, ' ')); sink(ss2.getline(b5, 1000, ' ')); // $ ast,ir @@ -225,7 +225,7 @@ void test_getline() sink(ss1.getline(b6, 1000, ' ')); sink(b4); sink(b5); // $ ast,ir - sink(b6); // $ SPURIOUS: ast,ir + sink(b6); // $ SPURIOUS: ast sink(ss2.getline(b7, 1000).getline(b8, 1000)); // $ ast,ir sink(b7); // $ ast,ir @@ -237,7 +237,7 @@ void test_getline() sink(getline(ss1, s3)); sink(s1); sink(s2); // $ ast,ir - sink(s3); // $ SPURIOUS: ast,ir + sink(s3); // $ SPURIOUS: ast sink(getline(ss1, s4, ' ')); sink(getline(ss2, s5, ' ')); // $ ast,ir @@ -245,7 +245,7 @@ void test_getline() sink(getline(ss1, s6, ' ')); sink(s4); sink(s5); // $ ast,ir - sink(s6); // $ SPURIOUS: ast,ir + sink(s6); // $ SPURIOUS: ast sink(getline(getline(ss2, s7), s8)); // $ ast,ir sink(s7); // $ ast,ir 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 02ddc44d883..e24830a3004 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp @@ -212,7 +212,7 @@ void test_swap() { std::swap(x, y); - sink(x); // $ SPURIOUS: ast,ir + sink(x); // $ SPURIOUS: ast sink(y); // $ ast,ir } @@ -756,5 +756,5 @@ void call_sprintf_twice(char* path, char* data) { void test_call_sprintf() { char path[10]; call_sprintf_twice(path, indirect_source()); - sink(*path); // $ ir ast + sink(*path); // $ ast MISSING: ir } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp index a26ac8f0513..2728be23e2e 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp @@ -114,10 +114,10 @@ void test_vector_swap() { v1.swap(v2); v3.swap(v4); - sink(v1); // $ SPURIOUS: ast,ir + sink(v1); // $ SPURIOUS: ast sink(v2); // $ ast,ir sink(v3); // $ ast,ir - sink(v4); // $ SPURIOUS: ast,ir + sink(v4); // $ SPURIOUS: ast } void test_vector_clear() { @@ -138,7 +138,7 @@ void test_vector_clear() { sink(v1); // $ SPURIOUS: ast,ir sink(v2); // $ ast,ir - sink(v3); // $ ast,ir + sink(v3); // $ SPURIOUS: ast sink(v4); } From 7e9bf2a880d9a70fd5d019083ef6e0251eaa8bda Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 15 Feb 2024 10:25:17 +0100 Subject: [PATCH 043/207] C++: Add a model for 'partial updating' and extend models appropriately. --- .../cpp/ir/dataflow/internal/SsaInternals.qll | 10 +++++-- .../cpp/models/implementations/GetDelim.qll | 2 ++ .../code/cpp/models/implementations/Gets.qll | 2 ++ .../code/cpp/models/implementations/Inet.qll | 2 ++ .../models/implementations/StdContainer.qll | 12 ++++++++ .../cpp/models/implementations/StdMap.qll | 11 ++++++++ .../cpp/models/implementations/StdSet.qll | 6 ++++ .../cpp/models/implementations/StdString.qll | 26 +++++++++++++++++ .../cpp/models/implementations/Strcrement.qll | 2 ++ .../code/cpp/models/interfaces/DataFlow.qll | 3 +- .../cpp/models/interfaces/PartialFlow.qll | 15 ++++++++++ .../code/cpp/models/interfaces/Taint.qll | 3 +- .../dataflow/taint-tests/localTaint.expected | 2 ++ .../dataflow/taint-tests/map.cpp | 28 +++++++++---------- .../dataflow/taint-tests/set.cpp | 24 ++++++++-------- 15 files changed, 118 insertions(+), 30 deletions(-) create mode 100644 cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll index a6255abcee3..0637396a759 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll @@ -5,6 +5,7 @@ private import DataFlowImplCommon as DataFlowImplCommon private import semmle.code.cpp.models.interfaces.Allocation as Alloc private import semmle.code.cpp.models.interfaces.DataFlow as DataFlow private import semmle.code.cpp.models.interfaces.Taint as Taint +private import semmle.code.cpp.models.interfaces.PartialFlow as PartialFlow private import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs as FIO private import semmle.code.cpp.ir.internal.IRCppLanguage private import semmle.code.cpp.ir.dataflow.internal.ModelUtil @@ -816,10 +817,15 @@ private predicate inOut(FIO::FunctionInput input, FIO::FunctionOutput output) { * flows to `n`). */ private predicate modeledFlowBarrier(Node n) { - exists(FIO::FunctionInput input, FIO::FunctionOutput output, CallInstruction call | + exists( + FIO::FunctionInput input, FIO::FunctionOutput output, CallInstruction call, + PartialFlow::PartialFlowFunction partialFlowFunc + | n = callInput(call, input) and inOut(input, output) and - exists(callOutput(call, output)) + exists(callOutput(call, output)) and + partialFlowFunc = call.getStaticCallTarget() and + not partialFlowFunc.isPartialWrite(output) | call.getStaticCallTarget().(DataFlow::DataFlowFunction).hasDataFlow(_, output) or diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll index 4415dd0c3fc..9689c2f8a3b 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll @@ -15,6 +15,8 @@ private class GetDelimFunction extends TaintFunction, AliasFunction, SideEffectF i.isParameter(3) and o.isParameterDeref(0) } + override predicate isPartialWrite(FunctionOutput o) { o.isParameterDeref(3) } + override predicate parameterNeverEscapes(int index) { index = [0, 1, 3] } override predicate parameterEscapesOnlyViaReturn(int index) { none() } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll index 1c227684e4f..c0e2c0c4538 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll @@ -27,6 +27,8 @@ private class FgetsFunction extends DataFlowFunction, TaintFunction, ArrayFuncti output.isReturnValue() } + override predicate isPartialWrite(FunctionOutput output) { output.isParameterDeref(2) } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { input.isParameter(2) and output.isParameterDeref(0) diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll index e75c38216f4..f61b13dc568 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll @@ -20,6 +20,8 @@ private class InetAton extends TaintFunction, ArrayFunction { output.isParameterDeref(1) } + override predicate isPartialWrite(FunctionOutput output) { output.isParameterDeref(1) } + override predicate hasArrayInput(int bufParam) { bufParam = 0 } override predicate hasArrayOutput(int bufParam) { bufParam = 1 } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll index 1fb42010caf..877dc5d3ac4 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll @@ -118,6 +118,8 @@ private class StdSequenceContainerData extends TaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -147,6 +149,8 @@ private class StdSequenceContainerPushModel extends StdSequenceContainerPush, Ta input.isParameterDeref(0) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -207,6 +211,8 @@ private class StdSequenceContainerInsertModel extends StdSequenceContainerInsert output.isReturnValue() ) } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -263,6 +269,8 @@ private class StdSequenceContainerAt extends TaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -297,6 +305,8 @@ private class StdSequenceEmplaceModel extends StdSequenceEmplace, TaintFunction output.isReturnValue() ) } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -335,6 +345,8 @@ private class StdSequenceEmplaceBackModel extends StdSequenceEmplaceBack, TaintF input.isParameterDeref([0 .. this.getNumberOfParameters() - 1]) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll index 9dc220e79af..b6d869d7bea 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll @@ -3,6 +3,7 @@ */ import semmle.code.cpp.models.interfaces.Taint +import semmle.code.cpp.models.interfaces.DataFlow import semmle.code.cpp.models.interfaces.Iterator /** @@ -53,6 +54,8 @@ private class StdMapInsert extends TaintFunction { output.isReturnValue() ) } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -75,6 +78,8 @@ private class StdMapEmplace extends TaintFunction { input.isQualifierObject() and output.isReturnValue() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -102,6 +107,8 @@ private class StdMapTryEmplace extends TaintFunction { input.isQualifierObject() and output.isReturnValue() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -115,6 +122,8 @@ private class StdMapMerge extends TaintFunction { input.isParameterDeref(0) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -132,6 +141,8 @@ private class StdMapAt extends TaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll index bd2ba99aff0..8fe7fb930c2 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll @@ -61,6 +61,8 @@ private class StdSetInsert extends TaintFunction { output.isReturnValue() ) } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -82,6 +84,8 @@ private class StdSetEmplace extends TaintFunction { input.isQualifierObject() and output.isReturnValue() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -95,6 +99,8 @@ private class StdSetMerge extends TaintFunction { input.isParameterDeref(0) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll index 9ddf87085df..e2246874579 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll @@ -129,6 +129,8 @@ private class StdStringDataModel extends StdStringData, StdStringTaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -142,6 +144,8 @@ private class StdStringPush extends StdStringTaintFunction { input.isParameter(0) and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -204,6 +208,8 @@ private class StdStringAppend extends StdStringTaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -237,6 +243,8 @@ private class StdStringInsert extends StdStringTaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -305,6 +313,8 @@ private class StdStringAt extends StdStringTaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -338,6 +348,8 @@ private class StdIStreamIn extends DataFlowFunction, TaintFunction { input.isReturnValueDeref() and output.isQualifierObject() } + + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } } /** @@ -358,6 +370,8 @@ private class StdIStreamInNonMember extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from first parameter to second parameter input.isParameterDeref(0) and @@ -403,6 +417,8 @@ private class StdIStreamRead extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from qualifier to first parameter input.isQualifierObject() and @@ -442,6 +458,8 @@ private class StdIStreamPutBack extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from first parameter (value or pointer) to qualifier input.isParameter(0) and @@ -478,6 +496,8 @@ private class StdIStreamGetLine extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from qualifier to first parameter input.isQualifierObject() and @@ -540,6 +560,8 @@ private class StdOStreamOut extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from first parameter (value or pointer) to qualifier input.isParameter(0) and @@ -579,6 +601,8 @@ private class StdOStreamOutNonMember extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isParameterDeref(0) } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // flow from second parameter to first parameter input.isParameterDeref(1) and @@ -672,6 +696,8 @@ private class StdStreamFunction extends DataFlowFunction, TaintFunction { output.isReturnValueDeref() } + override predicate isPartialWrite(FunctionOutput output) { output.isQualifierObject() } + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { // reverse flow from returned reference to the qualifier input.isReturnValueDeref() and diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll index 8f6c17aae54..a4070c2f907 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll @@ -36,6 +36,8 @@ private class Strcrement extends ArrayFunction, TaintFunction, SideEffectFunctio input.isParameter(index) and output.isReturnValue() or input.isParameterDeref(index) and output.isReturnValueDeref() + or + input.isParameterDeref(index) and output.isParameterDeref(index) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll index b30861254dc..7b78a0787b8 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll @@ -10,6 +10,7 @@ import semmle.code.cpp.Function import FunctionInputsAndOutputs import semmle.code.cpp.models.Models +import PartialFlow /** * A library function for which a value is or may be copied from a parameter @@ -18,7 +19,7 @@ import semmle.code.cpp.models.Models * Note that this does not include partial copying of values or partial writes * to destinations; that is covered by `TaintModel.qll`. */ -abstract class DataFlowFunction extends Function { +abstract class DataFlowFunction extends PartialFlowFunction { /** * Holds if data can be copied from the argument, qualifier, or buffer * represented by `input` to the return value or buffer represented by diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll new file mode 100644 index 00000000000..1370bb25b6e --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll @@ -0,0 +1,15 @@ +import semmle.code.cpp.Function +import FunctionInputsAndOutputs +import semmle.code.cpp.models.Models + +/** + * A function that may (but not always) updates (part of) a `FunctionOutput`. + */ +abstract class PartialFlowFunction extends Function { + /** + * Holds if the write to `output` either is: + * - Only partially updating the `output` + * - Is not unconditional + */ + predicate isPartialWrite(FunctionOutput output) { none() } +} diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll index 05a5d9f1c28..e7b507a2f7e 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll @@ -10,6 +10,7 @@ import semmle.code.cpp.Function import FunctionInputsAndOutputs import semmle.code.cpp.models.Models +import PartialFlow /** * A library function for which a taint-tracking library should propagate taint @@ -23,7 +24,7 @@ import semmle.code.cpp.models.Models * altered (for example copying a string with `strncpy`), this is also considered * data flow. */ -abstract class TaintFunction extends Function { +abstract class TaintFunction extends PartialFlowFunction { /** * Holds if data passed into the argument, qualifier, or buffer represented by * `input` influences the return value or buffer represented by `output` 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 cf758a9b226..54fd7cd8883 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected @@ -6490,6 +6490,7 @@ WARNING: Module TaintTracking has been deprecated and may be removed in future ( | 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 | locale | taint.cpp:607:26:607:31 | ref arg locale | TAINT | | taint.cpp:607:26:607:31 | ref arg locale | taint.cpp:606:82:606:87 | locale | | | 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:606:52:606:56 | dest1 | | @@ -6501,6 +6502,7 @@ WARNING: Module TaintTracking has been deprecated and may be removed in future ( | 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:611:25:611:30 | locale | taint.cpp:611:25:611:30 | ref arg locale | TAINT | | taint.cpp:611:25:611:30 | ref arg locale | taint.cpp:606:82:606:87 | locale | | | taint.cpp:612:7:612:11 | ref arg dest2 | taint.cpp:606:65:606:69 | dest2 | | | taint.cpp:612:7:612:11 | ref arg dest2 | taint.cpp:613:8:613:12 | dest2 | | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp index 9e361e9cf49..555f39779bf 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp @@ -179,11 +179,11 @@ void test_map() m14.insert(std::make_pair("b", source())); m14.insert(std::make_pair("c", source())); m14.insert(std::make_pair("d", "d")); - sink(m14.lower_bound("b")); // $ ast=179:33 ast=180:33 MISSING: ir=179:33 ir=180:33 - sink(m14.upper_bound("b")); // $ ast=179:33 ast=180:33 MISSING: ir=179:33 ir=180:33 + sink(m14.lower_bound("b")); // $ ast,ir=179:33 ast,ir=180:33 + sink(m14.upper_bound("b")); // $ ast,ir=179:33 ast,ir=180:33 sink(m14.equal_range("b").first); // $ MISSING: ast,ir sink(m14.equal_range("b").second); // $ MISSING: ast,ir - sink(m14.upper_bound("c")); // $ SPURIOUS: ast=179:33 ast=180:33 + sink(m14.upper_bound("c")); // $ SPURIOUS: ast,ir=179:33 ast,ir=180:33 sink(m14.equal_range("c").second); // swap @@ -213,7 +213,7 @@ void test_map() sink(m22); // $ ast,ir m19.merge(m20); m21.merge(m22); - sink(m19); // $ ast + sink(m19); // $ ast,ir sink(m20); sink(m21); // $ ast,ir sink(m22); // $ ast,ir @@ -222,11 +222,11 @@ void test_map() std::map m23; m23.insert(std::pair(source(), source())); m23.insert(std::pair(source(), source())); - sink(m23); // $ ast=223:49 ast=224:49 ir MISSING: ir=223:49 ir=224:49 - sink(m23.erase(m23.begin())); // $ ast=223:49 ast=224:49 ir MISSING: ir=223:49 ir=224:49 - sink(m23); // $ ast=223:49 ast=224:49 ir MISSING: ir=223:49 ir=224:49 + sink(m23); // $ ast,ir=223:49 ast,ir=224:49 + sink(m23.erase(m23.begin())); // $ ast,ir=223:49 ast,ir=224:49 + sink(m23); // $ ast,ir=223:49 ast,ir=224:49 m23.clear(); - sink(m23); // $ SPURIOUS: ast=223:49 ast=224:49 ir + sink(m23); // $ SPURIOUS: ast,ir=223:49 ast,ir=224:49 // emplace, emplace_hint std::map m24, m25; @@ -362,7 +362,7 @@ void test_unordered_map() sink(m22); // $ ast,ir m19.merge(m20); m21.merge(m22); - sink(m19); // $ ast MISSING: ir + sink(m19); // $ ast,ir sink(m20); sink(m21); // $ ast,ir sink(m22); // $ ast,ir @@ -371,11 +371,11 @@ void test_unordered_map() std::unordered_map m23; m23.insert(std::pair(source(), source())); m23.insert(std::pair(source(), source())); - sink(m23); // $ ast=372:49 ast=373:49 ir MISSING: ir=372:49 ir=373:49 - sink(m23.erase(m23.begin())); // $ ast=372:49 ast=373:49 ir MISSING: ir=372:49 ir=373:49 - sink(m23); // $ ast=372:49 ast=373:49 ir MISSING: ir=372:49 ir=373:49 + sink(m23); // $ ast,ir=372:49 ast,ir=373:49 + sink(m23.erase(m23.begin())); // $ ast,ir=372:49 ast,ir=373:49 + sink(m23); // $ ast,ir=372:49 ast,ir=373:49 m23.clear(); - sink(m23); // $ SPURIOUS: ast=372:49 ast=373:49 ir + sink(m23); // $ SPURIOUS: ast,ir=372:49 ast,ir=373:49 // emplace, emplace_hint std::unordered_map m24, m25; @@ -395,7 +395,7 @@ void test_unordered_map() sink(m26); sink(m26.try_emplace("abc", source()).first); sink(m26.try_emplace("abc", source()).second); // $ MISSING: ast,ir=396:30 - sink(m26); // $ ast=396:30 ir MISSING: ir=396:30 SPURIOUS: ast=397:30 + sink(m26); // $ ast,ir=396:30 SPURIOUS: ast,ir=397:30 sink(m27.try_emplace(m27.begin(), "abc", "def")); sink(m27); sink(m27.try_emplace(m27.begin(), "abc", source())); // $ ast,ir diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp index 0715eac8b4e..7c906fb72d2 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp @@ -66,8 +66,8 @@ void test_set() s11.insert("a"); s11.insert(source()); s11.insert("c"); - sink(s11.lower_bound("b")); // $ ast MISSING: ir - sink(s11.upper_bound("b")); // $ ast MISSING: ir + sink(s11.lower_bound("b")); // $ ast,ir + sink(s11.upper_bound("b")); // $ ast,ir sink(s11.equal_range("b").first); // $ MISSING: ast,ir sink(s11.equal_range("b").second); // $ MISSING: ast,ir @@ -98,7 +98,7 @@ void test_set() sink(s19); // $ ast,ir s16.merge(s17); s18.merge(s19); - sink(s16); // $ ast MISSING: ir + sink(s16); // $ ast,ir sink(s17); sink(s18); // $ ast,ir sink(s19); // $ ast,ir @@ -107,11 +107,11 @@ void test_set() std::set s20; s20.insert(source()); s20.insert(source()); - sink(s20); // $ ast=108:13 ast=109:13 ir MISSING: ir=108:13 ir=109:13 - sink(s20.erase(s20.begin())); // $ ast=108:13 ast=109:13 ir MISSING: ir=108:13 ir=109:13 - sink(s20); // $ ir ast=108:13 ast=109:13 MISSING: ir=108:13 ir=109:13 + sink(s20); // $ ast,ir=108:13 ast,ir=109:13 + sink(s20.erase(s20.begin())); // $ ast,ir=108:13 ast,ir=109:13 + sink(s20); // $ ast,ir=108:13 ast,ir=109:13 s20.clear(); - sink(s20); // $ SPURIOUS: ir ast=108:13 ast=109:13 + sink(s20); // $ SPURIOUS: ast,ir=108:13 ast,ir=109:13 // emplace, emplace_hint std::set s21, s22; @@ -210,7 +210,7 @@ void test_unordered_set() sink(s19); // $ ast,ir s16.merge(s17); s18.merge(s19); - sink(s16); // $ ast MISSING: ir + sink(s16); // $ ast,ir sink(s17); sink(s18); // $ ast,ir sink(s19); // $ ast,ir @@ -219,11 +219,11 @@ void test_unordered_set() std::unordered_set s20; s20.insert(source()); s20.insert(source()); - sink(s20); // $ ir ast=220:13 ast=221:13 MISSING: ir=220:13 ir=221:13 - sink(s20.erase(s20.begin())); // $ ast=220:13 ast=221:13 ir MISSING: ir=220:13 ir=221:13 - sink(s20); // $ ast=220:13 ast=221:13 ir MISSING: ir=220:13 ir=221:13 + sink(s20); // $ ast,ir=220:13 ast,ir=221:13 + sink(s20.erase(s20.begin())); // $ ast,ir=220:13 ast,ir=221:13 + sink(s20); // $ ast,ir=220:13 ast,ir=221:13 s20.clear(); - sink(s20); // $ SPURIOUS: ast=220:13 ast=221:13 ir + sink(s20); // $ SPURIOUS: ast,ir=220:13 ast,ir=221:13 // emplace, emplace_hint std::unordered_set s21, s22; From 9ad05fe51c08c0a84033fc956844b526d550c2cd Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 16 Feb 2024 12:00:51 +0000 Subject: [PATCH 044/207] Address reveiws - Add BAD example to doc, add doc example to tests and fix typo. --- .../CWE/CWE-287/AndroidInsecureKeys.qhelp | 3 ++ .../CWE/CWE-287/AndroidInsecureKeysBad.java | 47 +++++++++++++++++++ .../CWE/CWE-287/AndroidInsecureKeysGood.java | 2 +- .../CWE-287/InsecureKeys/Test1/Test.java | 18 +++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysBad.java diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp index 7b7a86ca667..95257fb020c 100644 --- a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp @@ -26,6 +26,9 @@ When generating a key for use with biometric authentication, ensure that the fol

    The following example demonstrates a key that is configured with secure paramaters:

    + +

    In each of the following cases, a parameter is set insecurely:

    +
    diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysBad.java b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysBad.java new file mode 100644 index 00000000000..deb14d7a5e7 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysBad.java @@ -0,0 +1,47 @@ +private void generateSecretKey() { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + // BAD: User authentication is not required to use this key. + .setUserAuthenticationRequired(false) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); +} + +private void generateSecretKey() { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + .setUserAuthenticationRequired(true) + // BAD: An attacker can access this key by enrolling additional biometrics. + .setInvalidatedByBiometricEnrollment(false) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); +} + +private void generateSecretKey() { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + .setUserAuthenticationRequired(true) + .setInvalidatedByBiometricEnrollment(true) + // BAD: This key can be accessed using non-biometric credentials. + .setUserAuthenticationValidityDurationSeconds(30) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); +} \ No newline at end of file diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java index 843f020fdbe..64f9c94f9ee 100644 --- a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeysGood.java @@ -7,7 +7,7 @@ private void generateSecretKey() { // GOOD: Secure parameters are used to generate a key for biometric authentication. .setUserAuthenticationRequired(true) .setInvalidatedByBiometricEnrollment(true) - .setUserAuthenticationParamters(0, KeyProperties.AUTH_BIOMETRIC_STRONG) + .setUserAuthenticationParameters(0, KeyProperties.AUTH_BIOMETRIC_STRONG) .build(); KeyGenerator keyGenerator = KeyGenerator.getInstance( KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java index 5fc2c83eea9..87e973ab774 100644 --- a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/Test.java @@ -1,6 +1,7 @@ import android.security.keystore.KeyGenParameterSpec; import android.hardware.biometrics.BiometricPrompt; import android.security.keystore.KeyProperties; +import javax.crypto.KeyGenerator; class Test { void test() { @@ -9,6 +10,23 @@ class Test { builder.setInvalidatedByBiometricEnrollment(false); // $insecure-key builder.setUserAuthenticationValidityDurationSeconds(30); // $insecure-key } + + private void generateSecretKey() throws Exception { + KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder( + "MySecretKey", + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_CBC) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) + // GOOD: Secure parameters are used to generate a key for biometric authentication. + .setUserAuthenticationRequired(true) + .setInvalidatedByBiometricEnrollment(true) + .setUserAuthenticationParameters(0, KeyProperties.AUTH_BIOMETRIC_STRONG) + .build(); + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); + keyGenerator.init(keyGenParameterSpec); + keyGenerator.generateKey(); + } } class Callback extends BiometricPrompt.AuthenticationCallback { From 499ab0892f7a533a80e5406cd842c2441286a3d6 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 16 Feb 2024 13:09:45 +0100 Subject: [PATCH 045/207] C++: Currently, to catch flow in an example such as: ```cpp char* source(); void sink(const char*); int sprintf(char *, const char *, ...); void call_sprintf(char* path, char* data) { sprintf(path, "%s", "abc"); // (1) sprintf(path, "%s", data); // (2) } void foo() { char path[10]; call_sprintf(path, source()); // (3) sink(path); } ``` we identify that the `*path [post update]` node at `// (2)` is a `ReturnNodeExt` and since `*data` flows to that node flow will be carried out to `*path [post update]` at // (3) and thus reach `sink(path)`. The reason `*path [post update]` at `// 2` is recognized as a `ReturnNodeExt` is because it satisfies the following condition (which is identified by the shared dataflow library): There is flow from the parameter node `*path` to the pre-update node of the post-update node `*path [post update]` at `// (2)`. However, when we start recognizing that the call to `sprintf(path, ...)` at `// (1)` overrides the value of `*path` and no longer provide use-use flow out of `*path` the `*path [post update]` node at `// (2)` is no longer recognized as a `ReturnNodeExt` (because it doesn't satisfy the above criteria). Thus, we need to identify the flow above without relying on the dataflow library's summary mechanism. That is, instead of relying on the dataflow library's mechanism to summarize the `*data -> *path` flow for `call_sprintf` we need to: - Ensure that the write to `*path` at `// (2)` is recognized as the "final" write to the parameter, and - Ensure that there's flow out of that parameter and back to `*path [post update]` at `// (3)`. Luckiky, we do all of this already to support flow out of writes to parameters that don't have post-update nodes. For example, in something like: ```cpp void set(int* x, int y) { *x = y; } void test() { int x; set(&x, source()); sink(x); } ``` So in order to make the original example work, all we need to do is to remove the restrictions on this mechanism so that the same mechanism that makes the above example work also makes the original example work! --- .../cpp/ir/dataflow/internal/DataFlowUtil.qll | 19 +------------------ .../cpp/ir/dataflow/internal/SsaInternals.qll | 11 +++++------ 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 7d4bb6f5866..2a7dfbb8208 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -55,29 +55,12 @@ private newtype TIRDataFlowNode = TFinalParameterNode(Parameter p, int indirectionIndex) { exists(Ssa::FinalParameterUse use | use.getParameter() = p and - use.getIndirectionIndex() = indirectionIndex and - parameterIsRedefined(p) + use.getIndirectionIndex() = indirectionIndex ) } or TFinalGlobalValue(Ssa::GlobalUse globalUse) or TInitialGlobalValue(Ssa::GlobalDef globalUse) -/** - * Holds if the value of `*p` (or `**p`, `***p`, etc.) is redefined somewhere in the body - * of the enclosing function of `p`. - * - * Only parameters satisfying this predicate will generate a `FinalParameterNode` transferring - * flow out of the function. - */ -private predicate parameterIsRedefined(Parameter p) { - exists(Ssa::Def def | - def.getSourceVariable().getBaseVariable().(Ssa::BaseIRVariable).getIRVariable().getAst() = p and - def.getIndirectionIndex() = 0 and - def.getIndirection() > 1 and - not def.getValue().asInstruction() instanceof InitializeParameterInstruction - ) -} - /** * An operand that is defined by a `FieldAddressInstruction`. */ diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll index 0637396a759..6a943ed6915 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll @@ -142,12 +142,11 @@ private newtype TDefOrUseImpl = isIteratorUse(container, iteratorAddress, _, indirectionIndex) } or TFinalParameterUse(Parameter p, int indirectionIndex) { - // Avoid creating parameter nodes if there is no definitions of the variable other than the initializaion. - exists(SsaInternals0::Def def | - def.getSourceVariable().getBaseVariable().(BaseIRVariable).getIRVariable().getAst() = p and - not def.getValue().asInstruction() instanceof InitializeParameterInstruction and - underlyingTypeIsModifiableAt(p.getUnderlyingType(), indirectionIndex) - ) + underlyingTypeIsModifiableAt(p.getUnderlyingType(), indirectionIndex) and + // Only create an SSA read for the final use of a parameter if there's + // actually a body of the enclosing function. If there's no function body + // then we'll never need to flow out of the function anyway. + p.getFunction().hasDefinition() } private predicate isGlobalUse( From 9b2019db6b3507d66226e896ba53974bbab27a10 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 16 Feb 2024 13:10:41 +0100 Subject: [PATCH 046/207] C++: Accept test changes. --- cpp/ql/test/include/iterator.h | 4 +- .../dataflow/dataflow-tests/BarrierGuard.cpp | 2 +- .../dataflow/dataflow-tests/clang.cpp | 2 +- .../dataflow/dataflow-tests/dispatch.cpp | 12 ++-- .../dataflow/dataflow-tests/example.c | 2 +- .../dataflow/dataflow-tests/flowOut.cpp | 36 ++++++------ .../dataflow/dataflow-tests/lambdas.cpp | 2 +- .../dataflow/dataflow-tests/ref.cpp | 14 ++--- .../dataflow-tests/self_parameter_flow.cpp | 4 +- .../dataflow-tests/test-source-sink.expected | 1 + .../dataflow/dataflow-tests/test.cpp | 24 ++++---- .../dataflow/fields/ir-path-flow.expected | 57 +++++++++++++++++++ .../dataflow/taint-tests/taint.cpp | 2 +- 13 files changed, 110 insertions(+), 52 deletions(-) diff --git a/cpp/ql/test/include/iterator.h b/cpp/ql/test/include/iterator.h index 77758bfa8da..5cd7f231284 100644 --- a/cpp/ql/test/include/iterator.h +++ b/cpp/ql/test/include/iterator.h @@ -65,7 +65,7 @@ namespace std { }; template - constexpr back_insert_iterator back_inserter(Container& x) { + constexpr back_insert_iterator back_inserter(Container& x) { // $ ir-def=*x return back_insert_iterator(x); } @@ -89,7 +89,7 @@ namespace std { constexpr front_insert_iterator operator++(int); }; template - constexpr front_insert_iterator front_inserter(Container& x) { + constexpr front_insert_iterator front_inserter(Container& x) { // $ ir-def=*x return front_insert_iterator(x); } } diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp index 74cc86e5c14..0e9c9f1bc77 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp @@ -56,7 +56,7 @@ void bg_stackstruct(XY s1, XY s2) { } } -void bg_structptr(XY *p1, XY *p2) { // $ ast-def=p1 ast-def=p2 +void bg_structptr(XY *p1, XY *p2) { // $ ast-def=p1 ast-def=p2 ir-def=*p1 ir-def=*p2 p1->x = source(); if (guarded(p1->x)) { sink(p1->x); // $ SPURIOUS: ast diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp index 499e8b8a62b..7b4759ec0bf 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp @@ -8,7 +8,7 @@ struct twoIntFields { int getFirst() { return m1; } }; -void following_pointers( // $ ast-def=sourceStruct1_ptr +void following_pointers( // $ ast-def=sourceStruct1_ptr ir-def=*cleanArray1 ir-def=*sourceArray1 ir-def=*sourceStruct1_ptr int sourceArray1[], int cleanArray1[], twoIntFields sourceStruct1, diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp index ff22b0d12b7..105212ccca6 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp @@ -25,7 +25,7 @@ struct Bottom : Middle { void notSink(int x) override { } }; -void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef +void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef ir-def=*bottomPtr ir-def=*bottomRef Top *topPtr = bottomPtr, &topRef = bottomRef; sink(topPtr->isSource1()); // $ ir MISSING: ast @@ -65,11 +65,11 @@ Top *allocateBottom() { return new Bottom(); } -void callSinkByPointer(Top *top) { // $ ast-def=top +void callSinkByPointer(Top *top) { // $ ast-def=top ir-def=*top top->isSink(source()); // leads to MISSING from ast } -void callSinkByReference(Top &top) { // $ ast-def=top +void callSinkByReference(Top &top) { // $ ast-def=top ir-def=*top top.isSink(source()); // leads to MISSING from ast } @@ -81,11 +81,11 @@ void globalVirtualDispatch() { x->isSink(source()); // $ MISSING: ast,ir } -Top *identity(Top *top) { // $ ast-def=top +Top *identity(Top *top) { // $ ast-def=top ir-def=*top return top; } -void callIdentityFunctions(Top *top, Bottom *bottom) { // $ ast-def=bottom ast-def=top +void callIdentityFunctions(Top *top, Bottom *bottom) { // $ ast-def=bottom ast-def=top ir-def=*bottom ir-def=*top identity(bottom)->isSink(source()); // $ MISSING: ast,ir identity(top)->isSink(source()); // no flow } @@ -120,7 +120,7 @@ namespace virtual_inheritance { struct Bottom : Middle { }; - void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef + void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef ir-def=*bottomPtr ir-def=*bottomRef // Because the inheritance from `Top` is virtual, the following casts go // directly from `Bottom` to `Top`, skipping `Middle`. That means we don't // get flow from a `Middle` value to the call qualifier. diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c b/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c index ad01145cde7..6e80ec61972 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c @@ -12,7 +12,7 @@ typedef struct char isTrue; } MyBool; -void myTest_with_local_flow(MyBool *b, int pos) // $ ast-def=b +void myTest_with_local_flow(MyBool *b, int pos) // $ ast-def=b ir-def=*b { MyCoords coords = {0}; diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp index 826fc542503..d6a06361524 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp @@ -7,7 +7,7 @@ void source_ref(int *toTaint) { // $ ir-def=*toTaint ast-def=toTaint void source_ref(char *toTaint) { // $ ir-def=*toTaint ast-def=toTaint *toTaint = source(); } -void modify_copy(int* ptr) { // $ ast-def=ptr +void modify_copy(int* ptr) { // $ ast-def=ptr ir-def=*ptr int deref = *ptr; int* other = &deref; source_ref(other); @@ -19,7 +19,7 @@ void test_output_copy() { sink(x); // clean } -void modify(int* ptr) { // $ ast-def=ptr +void modify(int* ptr) { // $ ast-def=ptr ir-def=*ptr int* deref = ptr; int* other = &*deref; source_ref(other); @@ -31,7 +31,7 @@ void test_output() { sink(x); // $ ir MISSING: ast } -void modify_copy_of_pointer(int* p, unsigned len) { // $ ast-def=p +void modify_copy_of_pointer(int* p, unsigned len) { // $ ast-def=p ir-def=*p int* p2 = new int[len]; for(unsigned i = 0; i < len; ++i) { p2[i] = p[i]; @@ -46,7 +46,7 @@ void test_modify_copy_of_pointer() { sink(x[0]); // $ SPURIOUS: ast // clean } -void modify_pointer(int* p, unsigned len) { // $ ast-def=p +void modify_pointer(int* p, unsigned len) { // $ ast-def=p ir-def=*p int** p2 = &p; for(unsigned i = 0; i < len; ++i) { *p2[i] = p[i]; @@ -63,17 +63,17 @@ void test_modify_of_pointer() { char* strdup(const char* p); -void modify_copy_via_strdup(char* p) { // $ ast-def=p +void modify_copy_via_strdup(char* p) { // $ ast-def=p ir-def=*p char* p2 = strdup(p); source_ref(p2); } -void test_modify_copy_via_strdup(char* p) { // $ ast-def=p +void test_modify_copy_via_strdup(char* p) { // $ ast-def=p ir-def=*p modify_copy_via_strdup(p); sink(*p); // clean } -int* deref(int** p) { // $ ast-def=p +int* deref(int** p) { // $ ast-def=p ir-def=*p ir-def=**p int* q = *p; return q; } @@ -90,7 +90,7 @@ void addtaint1(int* q) { // $ ast-def=q ir-def=*q *q = source(); } -void addtaint2(int** p) { // $ ast-def=p +void addtaint2(int** p) { // $ ast-def=p ir-def=*p ir-def=**p int* q = *p; addtaint1(q); } @@ -106,13 +106,13 @@ using size_t = decltype(sizeof(int)); void* memcpy(void* dest, const void* src, size_t); -void modify_copy_via_memcpy(char* p) { // $ ast-def=p +void modify_copy_via_memcpy(char* p) { // $ ast-def=p ir-def=*p char* dest; char* p2 = (char*)memcpy(dest, p, 10); source_ref(p2); } -void test_modify_copy_via_memcpy(char* p) { // $ ast-def=p +void test_modify_copy_via_memcpy(char* p) { // $ ast-def=p ir-def=*p modify_copy_via_memcpy(p); sink(*p); // clean } @@ -134,14 +134,14 @@ void source_ref_ref(char** toTaint) { // $ ast-def=toTaint ir-def=*toTaint ir-de // This function copies the value of **p into a new location **p2 and then // taints **p. Thus, **p does not contain tainted data after returning from // this function. -void modify_copy_via_strdup_ptr_001(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_001(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2 char** p2 = strdup_ptr_001(p); // source -> **p2 source_ref_ref(p2); } -void test_modify_copy_via_strdup_001(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_001(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_001(p); sink(**p); // clean } @@ -149,14 +149,14 @@ void test_modify_copy_via_strdup_001(char** p) { // $ ast-def=p // This function copies the value of *p into a new location *p2 and then // taints **p2. Thus, **p contains tainted data after returning from this // function. -void modify_copy_via_strdup_ptr_011(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_011(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2 and *p -> *p2 char** p2 = strdup_ptr_011(p); // source -> **p2 source_ref_ref(p2); } -void test_modify_copy_via_strdup_011(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_011(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_011(p); sink(**p); // $ ir MISSING: ast } @@ -171,7 +171,7 @@ void source_ref_2(char** toTaint) { // $ ast-def=toTaint ir-def=*toTaint ir-def= // This function copies the value of p into a new location p2 and then // taints *p2. Thus, *p contains tainted data after returning from this // function. -void modify_copy_via_strdup_ptr_111_taint_ind(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_111_taint_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2, *p -> *p2, and p -> p2 char** p2 = strdup_ptr_111(p); // source -> *p2 @@ -180,7 +180,7 @@ void modify_copy_via_strdup_ptr_111_taint_ind(char** p) { // $ ast-def=p void sink(char*); -void test_modify_copy_via_strdup_111_taint_ind(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_111_taint_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_111_taint_ind(p); sink(*p); // $ ir MISSING: ast } @@ -188,7 +188,7 @@ void test_modify_copy_via_strdup_111_taint_ind(char** p) { // $ ast-def=p // This function copies the value of p into a new location p2 and then // taints **p2. Thus, **p contains tainted data after returning from this // function. -void modify_copy_via_strdup_ptr_111_taint_ind_ind(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_111_taint_ind_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2, *p -> *p2, and p -> p2 char** p2 = strdup_ptr_111(p); // source -> **p2 @@ -197,7 +197,7 @@ void modify_copy_via_strdup_ptr_111_taint_ind_ind(char** p) { // $ ast-def=p void sink(char*); -void test_modify_copy_via_strdup_111_taint_ind_ind(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_111_taint_ind_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_111_taint_ind_ind(p); sink(**p); // $ ir MISSING: ast } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp index 645c41896c4..d0687994b45 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp @@ -37,7 +37,7 @@ void test_lambdas() }; d(t, u); - auto e = [](int &a, int &b, int &c) { // $ ast-def=a ast-def=b ast-def=c ir-def=*c + auto e = [](int &a, int &b, int &c) { // $ ast-def=a ast-def=b ast-def=c ir-def=*c ir-def=*a ir-def=*b sink(a); // $ ast,ir sink(b); c = source(); diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp index 1fda792dd26..3f8d77a7b2b 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp @@ -12,7 +12,7 @@ namespace withoutFields { } template - void assignWrapper(T &lhs, T rhs) { // $ ast-def=lhs ast-def=lhs + void assignWrapper(T &lhs, T rhs) { // $ ast-def=lhs ast-def=lhs ir-def=*lhs assign(lhs, rhs); } @@ -71,15 +71,15 @@ namespace withFields { int val; }; - void assign(Int &lhs, int rhs) { // $ ast-def=lhs + void assign(Int &lhs, int rhs) { // $ ast-def=lhs ir-def=*lhs lhs.val = rhs; } - void assignWrapper(Int &lhs, int rhs) { // $ ast-def=lhs + void assignWrapper(Int &lhs, int rhs) { // $ ast-def=lhs ir-def=*lhs assign(lhs, rhs); } - void notAssign(Int &lhs, int rhs) { // $ ast-def=lhs + void notAssign(Int &lhs, int rhs) { // $ ast-def=lhs ir-def=*lhs lhs.val = rhs; // Field flow ignores that the field is subsequently overwritten, leading // to false flow here. @@ -90,14 +90,14 @@ namespace withFields { } } - void sourceToParam(Int &out) { // $ ast-def=out + void sourceToParam(Int &out) { // $ ast-def=out ir-def=*out out.val = source(); if (arbitrary) { out.val = 1; } } - void sourceToParamWrapper(Int &out) { // $ ast-def=out + void sourceToParamWrapper(Int &out) { // $ ast-def=out ir-def=*out if (arbitrary) { sourceToParam(out); } else { @@ -105,7 +105,7 @@ namespace withFields { } } - void notSource(Int &out) { // $ ast-def=out + void notSource(Int &out) { // $ ast-def=out ir-def=*out out.val = source(); // Field flow ignores that the field is subsequently overwritten, leading // to false flow here. diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp index 2298e644b05..fe415ebab77 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp @@ -3,12 +3,12 @@ void incr(unsigned char **ps) // $ ast-def=ps ir-def=*ps ir-def=**ps *ps += 1; } -void callincr(unsigned char *s) // $ ast-def=s +void callincr(unsigned char *s) // $ ast-def=s ir-def=*s { incr(&s); } -void test(unsigned char *s) // $ ast-def=s +void test(unsigned char *s) // $ ast-def=s ir-def=*s { callincr(s); // $ flow } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected index f9ccfb8e3e4..c9f90a60b6e 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected @@ -264,6 +264,7 @@ irFlow | test.cpp:576:17:576:31 | *call to indirect_source | test.cpp:568:10:568:19 | * ... | | test.cpp:576:17:576:31 | *call to indirect_source | test.cpp:572:10:572:19 | * ... | | test.cpp:576:17:576:31 | *call to indirect_source | test.cpp:578:10:578:19 | * ... | +| test.cpp:583:11:583:16 | call to source | test.cpp:590:8:590:8 | x | | test.cpp:594:12:594:26 | *call to indirect_source | test.cpp:597:8:597:13 | * ... | | test.cpp:601:20:601:20 | intPointerSource output argument | test.cpp:603:8:603:9 | * ... | | test.cpp:607:20:607:20 | intPointerSource output argument | test.cpp:609:8:609:9 | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp index 60c3abfdfc6..b36c289aaf1 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp @@ -63,7 +63,7 @@ namespace std { template T&& move(T& t) noexcept; // simplified signature } -void identityOperations(int* source1) { // $ ast-def=source1 +void identityOperations(int* source1) { // $ ast-def=source1 ir-def=*source1 const int *x1 = std::move(source1); int* x2 = const_cast(x1); int* x3 = (x2); @@ -484,7 +484,7 @@ struct MyStruct { int* content; }; -void local_field_flow_def_by_ref_steps_with_local_flow(MyStruct * s) { // $ ast-def=s +void local_field_flow_def_by_ref_steps_with_local_flow(MyStruct * s) { // $ ast-def=s ir-def=*s writes_to_content(s->content); int* p_content = s->content; sink(*p_content); @@ -521,12 +521,12 @@ void uncertain_definition() { sink(stackArray[0]); // $ ast=519:19 ir SPURIOUS: ast=517:7 } -void set_through_const_pointer(int x, const int **e) // $ ast-def=e ir-def=**e ir-def=*e +void set_through_const_pointer(int x, const int **e) // $ ast-def=e ir-def=*e ir-def=**e { *e = &x; } -void test_set_through_const_pointer(int *e) // $ ast-def=e +void test_set_through_const_pointer(int *e) // $ ast-def=e ir-def=*e { set_through_const_pointer(source(), &e); sink(*e); // $ ir MISSING: ast @@ -579,7 +579,7 @@ namespace IndirectFlowThroughGlobals { } } -void write_to_param(int* x) { // $ ast-def=x +void write_to_param(int* x) { // $ ast-def=x ir-def=*x int s = source(); x = &s; } @@ -587,7 +587,7 @@ void write_to_param(int* x) { // $ ast-def=x void test_write_to_param() { int x = 0; write_to_param(&x); - sink(x); // $ SPURIOUS: ast + sink(x); // $ SPURIOUS: ast,ir } void test_indirect_flow_to_array() { @@ -609,7 +609,7 @@ void test_def_by_ref_followed_by_uncertain_write_pointer(int* p) { // $ ast-def= sink(*p); // $ ir MISSING: ast } -void test_flow_through_void_double_pointer(int *p) // $ ast-def=p +void test_flow_through_void_double_pointer(int *p) // $ ast-def=p ir-def=*p { intPointerSource(p); void* q = (void*)&p; @@ -695,11 +695,11 @@ void increment_buf(int** buf) { // $ ast-def=buf ir-def=*buf ir-def=**buf sink(buf); // $ SPURIOUS: ast } -void call_increment_buf(int** buf) { // $ ast-def=buf +void call_increment_buf(int** buf) { // $ ast-def=buf ir-def=*buf ir-def=**buf increment_buf(buf); } -void test_conflation_regression(int* source) { // $ ast-def=source +void test_conflation_regression(int* source) { // $ ast-def=source ir-def=*source int* buf = source; call_increment_buf(&buf); } @@ -709,13 +709,13 @@ void write_to_star_star_p(unsigned char **p) // $ ast-def=p ir-def=**p ir-def=*p **p = 0; } -void write_to_star_buf(unsigned char *buf) // $ ast-def=buf +void write_to_star_buf(unsigned char *buf) // $ ast-def=buf ir-def=*buf { unsigned char *c = buf; write_to_star_star_p(&c); } -void test_write_to_star_buf(unsigned char *source) // $ ast-def=source +void test_write_to_star_buf(unsigned char *source) // $ ast-def=source ir-def=*source { write_to_star_buf(source); sink(*source); // clean @@ -1041,7 +1041,7 @@ namespace test_gettext { void* memset(void*, int, size_t); -void memset_test(char* buf) { // $ ast-def=buf +void memset_test(char* buf) { // $ ast-def=buf ir-def=*buf memset(buf, source(), 10); sink(*buf); // $ ir MISSING: ast } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected b/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected index 770a70f2a1d..2fff7b5403c 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected @@ -52,13 +52,17 @@ edges | A.cpp:103:14:103:14 | *c [a] | A.cpp:120:12:120:13 | *c1 [a] | provenance | | | A.cpp:107:12:107:13 | *c1 [a] | A.cpp:107:12:107:16 | a | provenance | | | A.cpp:120:12:120:13 | *c1 [a] | A.cpp:120:12:120:16 | a | provenance | | +| A.cpp:124:14:124:14 | *b [c] | A.cpp:131:8:131:8 | f7 output argument [c] | provenance | | +| A.cpp:126:5:126:5 | set output argument [c] | A.cpp:124:14:124:14 | *b [c] | provenance | | | A.cpp:126:5:126:5 | set output argument [c] | A.cpp:131:8:131:8 | f7 output argument [c] | provenance | | | A.cpp:126:12:126:18 | new | A.cpp:27:17:27:17 | c | provenance | | | A.cpp:126:12:126:18 | new | A.cpp:126:5:126:5 | set output argument [c] | provenance | | | A.cpp:126:12:126:18 | new | A.cpp:126:12:126:18 | new | provenance | | | A.cpp:131:8:131:8 | f7 output argument [c] | A.cpp:132:10:132:10 | *b [c] | provenance | | | A.cpp:132:10:132:10 | *b [c] | A.cpp:132:10:132:13 | c | provenance | | +| A.cpp:140:13:140:13 | *b [c] | A.cpp:151:18:151:18 | D output argument [c] | provenance | | | A.cpp:140:13:140:13 | b | A.cpp:143:7:143:31 | ... = ... | provenance | | +| A.cpp:142:7:142:7 | *b [post update] [c] | A.cpp:140:13:140:13 | *b [c] | provenance | | | A.cpp:142:7:142:7 | *b [post update] [c] | A.cpp:143:7:143:31 | *... = ... [c] | provenance | | | A.cpp:142:7:142:7 | *b [post update] [c] | A.cpp:151:18:151:18 | D output argument [c] | provenance | | | A.cpp:142:7:142:20 | ... = ... | A.cpp:142:7:142:7 | *b [post update] [c] | provenance | | @@ -70,12 +74,20 @@ edges | A.cpp:143:7:143:31 | ... = ... | A.cpp:143:7:143:10 | *this [post update] [b] | provenance | | | A.cpp:143:25:143:31 | new | A.cpp:143:7:143:31 | ... = ... | provenance | | | A.cpp:150:12:150:18 | new | A.cpp:151:18:151:18 | b | provenance | | +| A.cpp:151:12:151:24 | call to D [*b, c] | A.cpp:152:10:152:10 | *d [*b, c] | provenance | | | A.cpp:151:12:151:24 | call to D [*b, c] | A.cpp:153:10:153:10 | *d [*b, c] | provenance | | | A.cpp:151:12:151:24 | call to D [b] | A.cpp:152:10:152:10 | *d [b] | provenance | | | A.cpp:151:18:151:18 | D output argument [c] | A.cpp:154:10:154:10 | *b [c] | provenance | | | A.cpp:151:18:151:18 | b | A.cpp:140:13:140:13 | b | provenance | | | A.cpp:151:18:151:18 | b | A.cpp:151:12:151:24 | call to D [b] | provenance | | +| A.cpp:152:10:152:10 | *d [*b, c] | A.cpp:152:10:152:13 | *b [c] | provenance | | +| A.cpp:152:10:152:10 | *d [*b, c] | A.cpp:152:13:152:13 | *b [c] | provenance | | | A.cpp:152:10:152:10 | *d [b] | A.cpp:152:10:152:13 | b | provenance | | +| A.cpp:152:10:152:10 | *d [post update] [*b, c] | A.cpp:153:10:153:10 | *d [*b, c] | provenance | | +| A.cpp:152:10:152:13 | *b [c] | A.cpp:152:10:152:13 | sink output argument [c] | provenance | | +| A.cpp:152:10:152:13 | *b [c] | A.cpp:173:26:173:26 | *o [c] | provenance | | +| A.cpp:152:10:152:13 | sink output argument [c] | A.cpp:152:10:152:10 | *d [post update] [*b, c] | provenance | | +| A.cpp:152:13:152:13 | *b [c] | A.cpp:152:10:152:13 | *b [c] | provenance | | | A.cpp:153:10:153:10 | *d [*b, c] | A.cpp:153:13:153:13 | *b [c] | provenance | | | A.cpp:153:13:153:13 | *b [c] | A.cpp:153:10:153:16 | c | provenance | | | A.cpp:154:10:154:10 | *b [c] | A.cpp:154:10:154:13 | c | provenance | | @@ -98,6 +110,7 @@ edges | A.cpp:167:47:167:50 | *next [*next, head] | A.cpp:167:44:167:44 | *l [*next, head] | provenance | | | A.cpp:167:47:167:50 | *next [head] | A.cpp:169:12:169:12 | *l [head] | provenance | | | A.cpp:169:12:169:12 | *l [head] | A.cpp:169:12:169:18 | head | provenance | | +| A.cpp:173:26:173:26 | *o [c] | A.cpp:173:26:173:26 | *o [c] | provenance | | | A.cpp:181:15:181:21 | newHead | A.cpp:183:7:183:20 | ... = ... | provenance | | | A.cpp:181:32:181:35 | *next [*next, head] | A.cpp:184:7:184:23 | *... = ... [*next, head] | provenance | | | A.cpp:181:32:181:35 | *next [head] | A.cpp:184:7:184:23 | *... = ... [head] | provenance | | @@ -200,9 +213,13 @@ edges | E.cpp:30:23:30:26 | *data [post update] [*buffer] | E.cpp:30:21:30:21 | *p [post update] [data, *buffer] | provenance | | | E.cpp:32:10:32:10 | *b [*buffer] | E.cpp:32:13:32:18 | *buffer | provenance | | | E.cpp:33:18:33:19 | *& ... [data, *buffer] | E.cpp:19:27:19:27 | *p [data, *buffer] | provenance | | +| aliasing.cpp:8:23:8:23 | *s [m1] | aliasing.cpp:25:17:25:19 | pointerSetter output argument [m1] | provenance | | +| aliasing.cpp:9:3:9:3 | *s [post update] [m1] | aliasing.cpp:8:23:8:23 | *s [m1] | provenance | | | aliasing.cpp:9:3:9:3 | *s [post update] [m1] | aliasing.cpp:25:17:25:19 | pointerSetter output argument [m1] | provenance | | | aliasing.cpp:9:3:9:22 | ... = ... | aliasing.cpp:9:3:9:3 | *s [post update] [m1] | provenance | | | aliasing.cpp:9:11:9:20 | call to user_input | aliasing.cpp:9:3:9:22 | ... = ... | provenance | | +| aliasing.cpp:12:25:12:25 | *s [m1] | aliasing.cpp:26:19:26:20 | referenceSetter output argument [m1] | provenance | | +| aliasing.cpp:13:3:13:3 | *s [post update] [m1] | aliasing.cpp:12:25:12:25 | *s [m1] | provenance | | | aliasing.cpp:13:3:13:3 | *s [post update] [m1] | aliasing.cpp:26:19:26:20 | referenceSetter output argument [m1] | provenance | | | aliasing.cpp:13:3:13:21 | ... = ... | aliasing.cpp:13:3:13:3 | *s [post update] [m1] | provenance | | | aliasing.cpp:13:10:13:19 | call to user_input | aliasing.cpp:13:3:13:21 | ... = ... | provenance | | @@ -313,6 +330,7 @@ edges | arrays.cpp:50:10:50:17 | *indirect [*ptr, data] | arrays.cpp:50:20:50:22 | *ptr [data] | provenance | | | arrays.cpp:50:20:50:22 | *ptr [data] | arrays.cpp:50:8:50:25 | *access to array [data] | provenance | | | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:12:5:12:16 | ... = ... | provenance | | +| by_reference.cpp:12:5:12:5 | *s [post update] [a] | by_reference.cpp:11:39:11:39 | *s [a] | provenance | | | by_reference.cpp:12:5:12:16 | ... = ... | by_reference.cpp:12:5:12:5 | *s [post update] [a] | provenance | | | by_reference.cpp:15:26:15:30 | value | by_reference.cpp:16:5:16:19 | ... = ... | provenance | | | by_reference.cpp:16:5:16:19 | ... = ... | by_reference.cpp:16:5:16:8 | *this [post update] [a] | provenance | | @@ -356,12 +374,22 @@ edges | by_reference.cpp:68:21:68:30 | call to user_input | by_reference.cpp:68:17:68:18 | nonMemberSetA output argument [a] | provenance | | | by_reference.cpp:69:22:69:23 | *& ... [a] | by_reference.cpp:31:46:31:46 | *s [a] | provenance | | | by_reference.cpp:69:22:69:23 | *& ... [a] | by_reference.cpp:69:8:69:20 | call to nonMemberGetA | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:102:21:102:39 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:103:27:103:35 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:106:21:106:41 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:107:29:107:37 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:83:31:83:35 | *inner [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:102:21:102:39 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:103:27:103:35 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:106:21:106:41 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:107:29:107:37 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:25 | ... = ... | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | provenance | | | by_reference.cpp:84:14:84:23 | call to user_input | by_reference.cpp:84:3:84:25 | ... = ... | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:122:21:122:38 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:123:21:123:36 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:126:21:126:40 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:127:21:127:38 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:87:31:87:35 | *inner [a] | provenance | | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:122:21:122:38 | taint_inner_a_ref output argument [a] | provenance | | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:123:21:123:36 | taint_inner_a_ref output argument [a] | provenance | | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:126:21:126:40 | taint_inner_a_ref output argument [a] | provenance | | @@ -614,8 +642,10 @@ edges | qualifiers.cpp:9:21:9:25 | value | qualifiers.cpp:9:30:9:44 | ... = ... | provenance | | | qualifiers.cpp:9:30:9:44 | ... = ... | qualifiers.cpp:9:30:9:33 | *this [post update] [a] | provenance | | | qualifiers.cpp:12:40:12:44 | value | qualifiers.cpp:12:49:12:64 | ... = ... | provenance | | +| qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | qualifiers.cpp:12:27:12:31 | *inner [a] | provenance | | | qualifiers.cpp:12:49:12:64 | ... = ... | qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | provenance | | | qualifiers.cpp:13:42:13:46 | value | qualifiers.cpp:13:51:13:65 | ... = ... | provenance | | +| qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | qualifiers.cpp:13:29:13:33 | *inner [a] | provenance | | | qualifiers.cpp:13:51:13:65 | ... = ... | qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | provenance | | | qualifiers.cpp:22:5:22:9 | getInner output argument [*inner, a] | qualifiers.cpp:23:10:23:14 | *outer [*inner, a] | provenance | | | qualifiers.cpp:22:5:22:38 | ... = ... | qualifiers.cpp:22:11:22:18 | *call to getInner [post update] [a] | provenance | | @@ -716,6 +746,7 @@ edges | simple.cpp:103:24:103:24 | x | simple.cpp:104:14:104:14 | x | provenance | | | simple.cpp:108:17:108:26 | call to user_input | simple.cpp:109:43:109:43 | x | provenance | | | simple.cpp:109:43:109:43 | x | simple.cpp:103:24:103:24 | x | provenance | | +| struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:14:24:14:25 | *ab [a] | provenance | | | struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:15:8:15:9 | *ab [a] | provenance | | | struct_init.c:15:8:15:9 | *ab [a] | struct_init.c:15:12:15:12 | a | provenance | | | struct_init.c:20:13:20:14 | *definition of ab [a] | struct_init.c:22:8:22:9 | *ab [a] | provenance | | @@ -726,6 +757,8 @@ edges | struct_init.c:20:20:20:29 | call to user_input | struct_init.c:20:20:20:29 | call to user_input | provenance | | | struct_init.c:22:8:22:9 | *ab [a] | struct_init.c:22:11:22:11 | a | provenance | | | struct_init.c:24:10:24:12 | *& ... [a] | struct_init.c:14:24:14:25 | *ab [a] | provenance | | +| struct_init.c:24:10:24:12 | *& ... [a] | struct_init.c:24:10:24:12 | absink output argument [a] | provenance | | +| struct_init.c:24:10:24:12 | absink output argument [a] | struct_init.c:28:5:28:7 | *& ... [a] | provenance | | | struct_init.c:26:16:26:20 | *definition of outer [nestedAB, a] | struct_init.c:31:8:31:12 | *outer [nestedAB, a] | provenance | | | struct_init.c:26:16:26:20 | *definition of outer [nestedAB, a] | struct_init.c:36:11:36:15 | *outer [nestedAB, a] | provenance | | | struct_init.c:26:16:26:20 | *definition of outer [post update] [*pointerAB, a] | struct_init.c:33:8:33:12 | *outer [*pointerAB, a] | provenance | | @@ -805,12 +838,14 @@ nodes | A.cpp:107:12:107:16 | a | semmle.label | a | | A.cpp:120:12:120:13 | *c1 [a] | semmle.label | *c1 [a] | | A.cpp:120:12:120:16 | a | semmle.label | a | +| A.cpp:124:14:124:14 | *b [c] | semmle.label | *b [c] | | A.cpp:126:5:126:5 | set output argument [c] | semmle.label | set output argument [c] | | A.cpp:126:12:126:18 | new | semmle.label | new | | A.cpp:126:12:126:18 | new | semmle.label | new | | A.cpp:131:8:131:8 | f7 output argument [c] | semmle.label | f7 output argument [c] | | A.cpp:132:10:132:10 | *b [c] | semmle.label | *b [c] | | A.cpp:132:10:132:13 | c | semmle.label | c | +| A.cpp:140:13:140:13 | *b [c] | semmle.label | *b [c] | | A.cpp:140:13:140:13 | b | semmle.label | b | | A.cpp:142:7:142:7 | *b [post update] [c] | semmle.label | *b [post update] [c] | | A.cpp:142:7:142:20 | ... = ... | semmle.label | ... = ... | @@ -827,8 +862,13 @@ nodes | A.cpp:151:12:151:24 | call to D [b] | semmle.label | call to D [b] | | A.cpp:151:18:151:18 | D output argument [c] | semmle.label | D output argument [c] | | A.cpp:151:18:151:18 | b | semmle.label | b | +| A.cpp:152:10:152:10 | *d [*b, c] | semmle.label | *d [*b, c] | | A.cpp:152:10:152:10 | *d [b] | semmle.label | *d [b] | +| A.cpp:152:10:152:10 | *d [post update] [*b, c] | semmle.label | *d [post update] [*b, c] | +| A.cpp:152:10:152:13 | *b [c] | semmle.label | *b [c] | | A.cpp:152:10:152:13 | b | semmle.label | b | +| A.cpp:152:10:152:13 | sink output argument [c] | semmle.label | sink output argument [c] | +| A.cpp:152:13:152:13 | *b [c] | semmle.label | *b [c] | | A.cpp:153:10:153:10 | *d [*b, c] | semmle.label | *d [*b, c] | | A.cpp:153:10:153:16 | c | semmle.label | c | | A.cpp:153:13:153:13 | *b [c] | semmle.label | *b [c] | @@ -851,6 +891,8 @@ nodes | A.cpp:167:47:167:50 | *next [head] | semmle.label | *next [head] | | A.cpp:169:12:169:12 | *l [head] | semmle.label | *l [head] | | A.cpp:169:12:169:18 | head | semmle.label | head | +| A.cpp:173:26:173:26 | *o [c] | semmle.label | *o [c] | +| A.cpp:173:26:173:26 | *o [c] | semmle.label | *o [c] | | A.cpp:181:15:181:21 | newHead | semmle.label | newHead | | A.cpp:181:32:181:35 | *next [*next, head] | semmle.label | *next [*next, head] | | A.cpp:181:32:181:35 | *next [head] | semmle.label | *next [head] | @@ -964,9 +1006,11 @@ nodes | E.cpp:32:10:32:10 | *b [*buffer] | semmle.label | *b [*buffer] | | E.cpp:32:13:32:18 | *buffer | semmle.label | *buffer | | E.cpp:33:18:33:19 | *& ... [data, *buffer] | semmle.label | *& ... [data, *buffer] | +| aliasing.cpp:8:23:8:23 | *s [m1] | semmle.label | *s [m1] | | aliasing.cpp:9:3:9:3 | *s [post update] [m1] | semmle.label | *s [post update] [m1] | | aliasing.cpp:9:3:9:22 | ... = ... | semmle.label | ... = ... | | aliasing.cpp:9:11:9:20 | call to user_input | semmle.label | call to user_input | +| aliasing.cpp:12:25:12:25 | *s [m1] | semmle.label | *s [m1] | | aliasing.cpp:13:3:13:3 | *s [post update] [m1] | semmle.label | *s [post update] [m1] | | aliasing.cpp:13:3:13:21 | ... = ... | semmle.label | ... = ... | | aliasing.cpp:13:10:13:19 | call to user_input | semmle.label | call to user_input | @@ -1084,6 +1128,7 @@ nodes | arrays.cpp:50:10:50:17 | *indirect [*ptr, data] | semmle.label | *indirect [*ptr, data] | | arrays.cpp:50:20:50:22 | *ptr [data] | semmle.label | *ptr [data] | | arrays.cpp:50:27:50:30 | data | semmle.label | data | +| by_reference.cpp:11:39:11:39 | *s [a] | semmle.label | *s [a] | | by_reference.cpp:11:48:11:52 | value | semmle.label | value | | by_reference.cpp:12:5:12:5 | *s [post update] [a] | semmle.label | *s [post update] [a] | | by_reference.cpp:12:5:12:16 | ... = ... | semmle.label | ... = ... | @@ -1128,9 +1173,11 @@ nodes | by_reference.cpp:68:21:68:30 | call to user_input | semmle.label | call to user_input | | by_reference.cpp:69:8:69:20 | call to nonMemberGetA | semmle.label | call to nonMemberGetA | | by_reference.cpp:69:22:69:23 | *& ... [a] | semmle.label | *& ... [a] | +| by_reference.cpp:83:31:83:35 | *inner [a] | semmle.label | *inner [a] | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | by_reference.cpp:84:3:84:25 | ... = ... | semmle.label | ... = ... | | by_reference.cpp:84:14:84:23 | call to user_input | semmle.label | call to user_input | +| by_reference.cpp:87:31:87:35 | *inner [a] | semmle.label | *inner [a] | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | by_reference.cpp:88:3:88:24 | ... = ... | semmle.label | ... = ... | | by_reference.cpp:88:13:88:22 | call to user_input | semmle.label | call to user_input | @@ -1393,9 +1440,11 @@ nodes | qualifiers.cpp:9:21:9:25 | value | semmle.label | value | | qualifiers.cpp:9:30:9:33 | *this [post update] [a] | semmle.label | *this [post update] [a] | | qualifiers.cpp:9:30:9:44 | ... = ... | semmle.label | ... = ... | +| qualifiers.cpp:12:27:12:31 | *inner [a] | semmle.label | *inner [a] | | qualifiers.cpp:12:40:12:44 | value | semmle.label | value | | qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | qualifiers.cpp:12:49:12:64 | ... = ... | semmle.label | ... = ... | +| qualifiers.cpp:13:29:13:33 | *inner [a] | semmle.label | *inner [a] | | qualifiers.cpp:13:42:13:46 | value | semmle.label | value | | qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | qualifiers.cpp:13:51:13:65 | ... = ... | semmle.label | ... = ... | @@ -1507,6 +1556,7 @@ nodes | simple.cpp:108:17:108:26 | call to user_input | semmle.label | call to user_input | | simple.cpp:109:43:109:43 | x | semmle.label | x | | struct_init.c:14:24:14:25 | *ab [a] | semmle.label | *ab [a] | +| struct_init.c:14:24:14:25 | *ab [a] | semmle.label | *ab [a] | | struct_init.c:15:8:15:9 | *ab [a] | semmle.label | *ab [a] | | struct_init.c:15:12:15:12 | a | semmle.label | a | | struct_init.c:20:13:20:14 | *definition of ab [a] | semmle.label | *definition of ab [a] | @@ -1516,6 +1566,7 @@ nodes | struct_init.c:22:8:22:9 | *ab [a] | semmle.label | *ab [a] | | struct_init.c:22:11:22:11 | a | semmle.label | a | | struct_init.c:24:10:24:12 | *& ... [a] | semmle.label | *& ... [a] | +| struct_init.c:24:10:24:12 | absink output argument [a] | semmle.label | absink output argument [a] | | struct_init.c:26:16:26:20 | *definition of outer [nestedAB, a] | semmle.label | *definition of outer [nestedAB, a] | | struct_init.c:26:16:26:20 | *definition of outer [post update] [*pointerAB, a] | semmle.label | *definition of outer [post update] [*pointerAB, a] | | struct_init.c:26:16:26:20 | *definition of outer [post update] [nestedAB, a] | semmle.label | *definition of outer [post update] [nestedAB, a] | @@ -1552,6 +1603,7 @@ subpaths | A.cpp:90:15:90:15 | c | A.cpp:27:17:27:17 | c | A.cpp:27:22:27:25 | *this [post update] [c] | A.cpp:90:7:90:8 | set output argument [c] | | A.cpp:126:12:126:18 | new | A.cpp:27:17:27:17 | c | A.cpp:27:22:27:25 | *this [post update] [c] | A.cpp:126:5:126:5 | set output argument [c] | | A.cpp:151:18:151:18 | b | A.cpp:140:13:140:13 | b | A.cpp:143:7:143:10 | *this [post update] [b] | A.cpp:151:12:151:24 | call to D [b] | +| A.cpp:152:10:152:13 | *b [c] | A.cpp:173:26:173:26 | *o [c] | A.cpp:173:26:173:26 | *o [c] | A.cpp:152:10:152:13 | sink output argument [c] | | A.cpp:160:29:160:29 | b | A.cpp:181:15:181:21 | newHead | A.cpp:183:7:183:10 | *this [post update] [head] | A.cpp:160:18:160:60 | call to MyList [head] | | A.cpp:161:38:161:39 | *l1 [head] | A.cpp:181:32:181:35 | *next [head] | A.cpp:184:7:184:10 | *this [post update] [*next, head] | A.cpp:161:18:161:40 | call to MyList [*next, head] | | A.cpp:162:38:162:39 | *l2 [*next, head] | A.cpp:181:32:181:35 | *next [*next, head] | A.cpp:184:7:184:10 | *this [post update] [*next, *next, head] | A.cpp:162:18:162:40 | call to MyList [*next, *next, head] | @@ -1564,6 +1616,7 @@ subpaths | D.cpp:37:21:37:21 | e | D.cpp:11:24:11:24 | e | D.cpp:11:29:11:32 | *this [post update] [elem] | D.cpp:37:8:37:10 | setElem output argument [elem] | | D.cpp:51:27:51:27 | e | D.cpp:11:24:11:24 | e | D.cpp:11:29:11:32 | *this [post update] [elem] | D.cpp:51:8:51:14 | setElem output argument [elem] | | by_reference.cpp:20:23:20:27 | value | by_reference.cpp:15:26:15:30 | value | by_reference.cpp:16:5:16:8 | *this [post update] [a] | by_reference.cpp:20:5:20:8 | setDirectly output argument [a] | +| by_reference.cpp:24:25:24:29 | value | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:11:39:11:39 | *s [a] | by_reference.cpp:24:19:24:22 | nonMemberSetA output argument [a] | | by_reference.cpp:24:25:24:29 | value | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:12:5:12:5 | *s [post update] [a] | by_reference.cpp:24:19:24:22 | nonMemberSetA output argument [a] | | by_reference.cpp:40:12:40:15 | *this [a] | by_reference.cpp:35:9:35:19 | *this [a] | by_reference.cpp:35:9:35:19 | *getDirectly | by_reference.cpp:40:18:40:28 | call to getDirectly | | by_reference.cpp:44:26:44:29 | *this [a] | by_reference.cpp:31:46:31:46 | *s [a] | by_reference.cpp:31:16:31:28 | *nonMemberGetA | by_reference.cpp:44:12:44:24 | call to nonMemberGetA | @@ -1573,6 +1626,7 @@ subpaths | by_reference.cpp:57:8:57:8 | *s [a] | by_reference.cpp:39:9:39:21 | *this [a] | by_reference.cpp:39:9:39:21 | *getIndirectly | by_reference.cpp:57:10:57:22 | call to getIndirectly | | by_reference.cpp:62:25:62:34 | call to user_input | by_reference.cpp:23:34:23:38 | value | by_reference.cpp:24:19:24:22 | nonMemberSetA output argument [a] | by_reference.cpp:62:3:62:3 | setThroughNonMember output argument [a] | | by_reference.cpp:63:8:63:8 | *s [a] | by_reference.cpp:43:9:43:27 | *this [a] | by_reference.cpp:43:9:43:27 | *getThroughNonMember | by_reference.cpp:63:10:63:28 | call to getThroughNonMember | +| by_reference.cpp:68:21:68:30 | call to user_input | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:11:39:11:39 | *s [a] | by_reference.cpp:68:17:68:18 | nonMemberSetA output argument [a] | | by_reference.cpp:68:21:68:30 | call to user_input | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:12:5:12:5 | *s [post update] [a] | by_reference.cpp:68:17:68:18 | nonMemberSetA output argument [a] | | by_reference.cpp:69:22:69:23 | *& ... [a] | by_reference.cpp:31:46:31:46 | *s [a] | by_reference.cpp:31:16:31:28 | *nonMemberGetA | by_reference.cpp:69:8:69:20 | call to nonMemberGetA | | complex.cpp:42:16:42:16 | *f [a_] | complex.cpp:9:7:9:7 | *this [a_] | complex.cpp:9:7:9:7 | *a | complex.cpp:42:18:42:18 | call to a | @@ -1588,7 +1642,9 @@ subpaths | constructors.cpp:36:11:36:20 | call to user_input | constructors.cpp:23:13:23:13 | a | constructors.cpp:23:5:23:7 | *this [post update] [a_] | constructors.cpp:36:9:36:9 | call to Foo [a_] | | constructors.cpp:36:25:36:34 | call to user_input | constructors.cpp:23:20:23:20 | b | constructors.cpp:23:5:23:7 | *this [post update] [b_] | constructors.cpp:36:9:36:9 | call to Foo [b_] | | qualifiers.cpp:27:28:27:37 | call to user_input | qualifiers.cpp:9:21:9:25 | value | qualifiers.cpp:9:30:9:33 | *this [post update] [a] | qualifiers.cpp:27:11:27:18 | setA output argument [a] | +| qualifiers.cpp:32:35:32:44 | call to user_input | qualifiers.cpp:12:40:12:44 | value | qualifiers.cpp:12:27:12:31 | *inner [a] | qualifiers.cpp:32:23:32:30 | pointerSetA output argument [a] | | qualifiers.cpp:32:35:32:44 | call to user_input | qualifiers.cpp:12:40:12:44 | value | qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | qualifiers.cpp:32:23:32:30 | pointerSetA output argument [a] | +| qualifiers.cpp:37:38:37:47 | call to user_input | qualifiers.cpp:13:42:13:46 | value | qualifiers.cpp:13:29:13:33 | *inner [a] | qualifiers.cpp:37:19:37:35 | referenceSetA output argument [a] | | qualifiers.cpp:37:38:37:47 | call to user_input | qualifiers.cpp:13:42:13:46 | value | qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | qualifiers.cpp:37:19:37:35 | referenceSetA output argument [a] | | simple.cpp:28:10:28:10 | *f [a_] | simple.cpp:18:9:18:9 | *this [a_] | simple.cpp:18:9:18:9 | *a | simple.cpp:28:12:28:12 | call to a | | simple.cpp:29:10:29:10 | *f [b_] | simple.cpp:19:9:19:9 | *this [b_] | simple.cpp:19:9:19:9 | *b | simple.cpp:29:12:29:12 | call to b | @@ -1597,6 +1653,7 @@ subpaths | simple.cpp:41:12:41:21 | call to user_input | simple.cpp:20:19:20:19 | a | simple.cpp:20:24:20:25 | *this [post update] [a_] | simple.cpp:41:5:41:5 | setA output argument [a_] | | simple.cpp:42:12:42:21 | call to user_input | simple.cpp:21:19:21:19 | b | simple.cpp:21:24:21:25 | *this [post update] [b_] | simple.cpp:42:5:42:5 | setB output argument [b_] | | simple.cpp:84:14:84:20 | *this [f2, f1] | simple.cpp:78:9:78:15 | *this [f2, f1] | simple.cpp:78:9:78:15 | *getf2f1 | simple.cpp:84:14:84:20 | call to getf2f1 | +| struct_init.c:24:10:24:12 | *& ... [a] | struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:24:10:24:12 | absink output argument [a] | #select | A.cpp:43:10:43:12 | *& ... | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | *& ... | *& ... flows from $@ | A.cpp:41:15:41:21 | new | new | | A.cpp:49:10:49:13 | c | A.cpp:47:12:47:18 | new | A.cpp:49:10:49:13 | c | c flows from $@ | A.cpp:47:12:47:18 | new | new | 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 e24830a3004..0ba45b6f30a 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp @@ -756,5 +756,5 @@ void call_sprintf_twice(char* path, char* data) { void test_call_sprintf() { char path[10]; call_sprintf_twice(path, indirect_source()); - sink(*path); // $ ast MISSING: ir + sink(*path); // $ ast,ir } \ No newline at end of file From 497592a4d478a83d735ff435326997bbd6eab4e8 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 16 Feb 2024 13:36:25 +0100 Subject: [PATCH 047/207] C++: Add change note. --- .../change-notes/2024-02-16-modelled-functions-block-flow.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/src/change-notes/2024-02-16-modelled-functions-block-flow.md diff --git a/cpp/ql/src/change-notes/2024-02-16-modelled-functions-block-flow.md b/cpp/ql/src/change-notes/2024-02-16-modelled-functions-block-flow.md new file mode 100644 index 00000000000..d6ef3c3e056 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-02-16-modelled-functions-block-flow.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The new C/C++ dataflow and taint-tracking libraries (`semmle.code.cpp.dataflow.new.DataFlow` and `semmle.code.cpp.dataflow.new.TaintTracking`) now implicitly assume that dataflow and taint modelled via `DataFlowFunction` and `TaintFunction` always fully overwrite their buffers and thus act as flow barriers. As a result, many dataflow and taint-tracking queries now produce fewer false positives. To remove this assumption and go back to the previous behavior for a given model, one can override the new `isPartialWrite` predicate. From 57c1bf583594fe8b19a2a0a3f40ddfcd7ab0bdbf Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 16 Feb 2024 13:47:02 +0100 Subject: [PATCH 048/207] C++: Add file-level QLDoc. --- .../code/cpp/models/interfaces/PartialFlow.qll | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll index 1370bb25b6e..3a3e2cea09f 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll @@ -1,3 +1,16 @@ +/** + * Provides an abstract class to override the implicit assumption that a + * dataflow/taint-tracking model always fully override the parameters they are + * are modelled as writing to. To use this QL library, create a QL class + * extending `PartialFlowFunction` with a characteristic predicate that selects + * the function or set of functions you are modeling and override the + * `isPartialWrite` predicate. + * + * Note: Since both `DataFlowFunction` and `TaintFunction` extend this class + * you don't need to explicitly add this as a base class if your QL class + * already extends either `DataFlowFunction` or `TaintFunction`. + */ + import semmle.code.cpp.Function import FunctionInputsAndOutputs import semmle.code.cpp.models.Models From b407c86d035454f07d77cec6d12c58c01c4aae66 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 16 Feb 2024 13:51:34 +0100 Subject: [PATCH 049/207] C++: Make Code Scanning happy. --- cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll index 3a3e2cea09f..9a3ecad2123 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll @@ -1,7 +1,7 @@ /** * Provides an abstract class to override the implicit assumption that a * dataflow/taint-tracking model always fully override the parameters they are - * are modelled as writing to. To use this QL library, create a QL class + * are modeled as writing to. To use this QL library, create a QL class * extending `PartialFlowFunction` with a characteristic predicate that selects * the function or set of functions you are modeling and override the * `isPartialWrite` predicate. From be54a41593bd2939687e6d0a0180c6f9f275a399 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 16 Feb 2024 14:21:55 +0100 Subject: [PATCH 050/207] C++: Accept query test changes. --- .../ArrayAccessProductFlow.expected | 6 ++ .../semmle/ExecTainted/ExecTainted.expected | 9 +- .../SAMATE/OverrunWriteProductFlow.expected | 3 + .../semmle/tests/OverflowDestination.expected | 6 ++ .../semmle/tests/UnboundedWrite.expected | 77 ++++++++++++++++ .../CWE-134/semmle/argv/argvLocal.expected | 91 +++++++++++++++++++ .../UncontrolledFormatString.expected | 17 ++++ .../semmle/tests/CleartextFileWrite.expected | 3 - .../CWE/CWE-311/semmle/tests/test2.cpp | 2 +- .../Security/CWE/CWE-611/XXE.expected | 6 ++ 10 files changed, 213 insertions(+), 7 deletions(-) diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/array-access/ArrayAccessProductFlow.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/array-access/ArrayAccessProductFlow.expected index bb062dac218..96f5e711fd5 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/array-access/ArrayAccessProductFlow.expected +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-193/array-access/ArrayAccessProductFlow.expected @@ -33,11 +33,14 @@ edges | test.cpp:76:20:76:29 | *call to mk_array_p [p] | test.cpp:83:9:83:11 | *arr [p] | provenance | | | test.cpp:79:9:79:11 | *arr [p] | test.cpp:79:14:79:14 | p | provenance | | | test.cpp:83:9:83:11 | *arr [p] | test.cpp:83:14:83:14 | p | provenance | | +| test.cpp:87:28:87:30 | *arr [p] | test.cpp:87:28:87:30 | *arr [p] | provenance | | | test.cpp:87:28:87:30 | *arr [p] | test.cpp:89:9:89:11 | *arr [p] | provenance | | | test.cpp:87:28:87:30 | *arr [p] | test.cpp:93:9:93:11 | *arr [p] | provenance | | | test.cpp:89:9:89:11 | *arr [p] | test.cpp:89:14:89:14 | p | provenance | | | test.cpp:93:9:93:11 | *arr [p] | test.cpp:93:14:93:14 | p | provenance | | | test.cpp:98:18:98:27 | *call to mk_array_p [p] | test.cpp:87:28:87:30 | *arr [p] | provenance | | +| test.cpp:98:18:98:27 | *call to mk_array_p [p] | test.cpp:98:18:98:27 | test6_callee output argument [p] | provenance | | +| test.cpp:98:18:98:27 | test6_callee output argument [p] | test.cpp:98:18:98:27 | *call to mk_array_p [p] | provenance | | nodes | test.cpp:4:17:4:22 | call to malloc | semmle.label | call to malloc | | test.cpp:6:9:6:11 | arr | semmle.label | arr | @@ -77,12 +80,15 @@ nodes | test.cpp:83:9:83:11 | *arr [p] | semmle.label | *arr [p] | | test.cpp:83:14:83:14 | p | semmle.label | p | | test.cpp:87:28:87:30 | *arr [p] | semmle.label | *arr [p] | +| test.cpp:87:28:87:30 | *arr [p] | semmle.label | *arr [p] | | test.cpp:89:9:89:11 | *arr [p] | semmle.label | *arr [p] | | test.cpp:89:14:89:14 | p | semmle.label | p | | test.cpp:93:9:93:11 | *arr [p] | semmle.label | *arr [p] | | test.cpp:93:14:93:14 | p | semmle.label | p | | test.cpp:98:18:98:27 | *call to mk_array_p [p] | semmle.label | *call to mk_array_p [p] | +| test.cpp:98:18:98:27 | test6_callee output argument [p] | semmle.label | test6_callee output argument [p] | subpaths +| test.cpp:98:18:98:27 | *call to mk_array_p [p] | test.cpp:87:28:87:30 | *arr [p] | test.cpp:87:28:87:30 | *arr [p] | test.cpp:98:18:98:27 | test6_callee output argument [p] | #select | test.cpp:10:9:10:11 | arr | test.cpp:4:17:4:22 | call to malloc | test.cpp:10:9:10:11 | arr | Off-by one error allocated at $@ bounded by $@. | test.cpp:4:17:4:22 | call to malloc | call to malloc | test.cpp:4:24:4:27 | size | size | | test.cpp:10:9:10:11 | arr | test.cpp:4:17:4:22 | call to malloc | test.cpp:10:9:10:11 | arr | Off-by one error allocated at $@ bounded by $@. | test.cpp:4:17:4:22 | call to malloc | call to malloc | test.cpp:4:24:4:27 | size | size | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected index d50edce5f2f..a52bd778a04 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-078/semmle/ExecTainted/ExecTainted.expected @@ -46,6 +46,8 @@ edges | test.cpp:187:11:187:15 | strncat output argument | test.cpp:188:20:188:24 | *flags | provenance | | | test.cpp:187:18:187:25 | *filename | test.cpp:187:11:187:15 | strncat output argument | provenance | | | test.cpp:187:18:187:25 | *filename | test.cpp:187:11:187:15 | strncat output argument | provenance | | +| test.cpp:188:11:188:17 | strncat output argument | test.cpp:186:19:186:25 | *command | provenance | | +| test.cpp:188:11:188:17 | strncat output argument | test.cpp:186:19:186:25 | *command | provenance | | | test.cpp:188:20:188:24 | *flags | test.cpp:188:11:188:17 | strncat output argument | provenance | | | test.cpp:188:20:188:24 | *flags | test.cpp:188:11:188:17 | strncat output argument | provenance | | | test.cpp:194:9:194:16 | fread output argument | test.cpp:196:26:196:33 | *filename | provenance | | @@ -57,9 +59,6 @@ edges | test.cpp:218:9:218:16 | fread output argument | test.cpp:220:19:220:26 | *filename | provenance | | | test.cpp:220:10:220:16 | strncat output argument | test.cpp:220:10:220:16 | strncat output argument | provenance | | | test.cpp:220:10:220:16 | strncat output argument | test.cpp:220:10:220:16 | strncat output argument | provenance | | -| test.cpp:220:10:220:16 | strncat output argument | test.cpp:220:10:220:16 | strncat output argument | provenance | | -| test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | *command | provenance | | -| test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | *command | provenance | | | test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | *command | provenance | | | test.cpp:220:10:220:16 | strncat output argument | test.cpp:222:32:222:38 | *command | provenance | | | test.cpp:220:19:220:26 | *filename | test.cpp:220:10:220:16 | strncat output argument | provenance | | @@ -118,6 +117,8 @@ nodes | test.cpp:183:32:183:38 | *command | semmle.label | *command | | test.cpp:183:32:183:38 | *command | semmle.label | *command | | test.cpp:183:32:183:38 | *command | semmle.label | *command | +| test.cpp:186:19:186:25 | *command | semmle.label | *command | +| test.cpp:186:19:186:25 | *command | semmle.label | *command | | test.cpp:186:47:186:54 | *filename | semmle.label | *filename | | test.cpp:187:11:187:15 | strncat output argument | semmle.label | strncat output argument | | test.cpp:187:11:187:15 | strncat output argument | semmle.label | strncat output argument | @@ -142,6 +143,8 @@ nodes | test.cpp:222:32:222:38 | *command | semmle.label | *command | | test.cpp:222:32:222:38 | *command | semmle.label | *command | subpaths +| test.cpp:196:26:196:33 | *filename | test.cpp:186:47:186:54 | *filename | test.cpp:186:19:186:25 | *command | test.cpp:196:10:196:16 | concat output argument | +| test.cpp:196:26:196:33 | *filename | test.cpp:186:47:186:54 | *filename | test.cpp:186:19:186:25 | *command | test.cpp:196:10:196:16 | concat output argument | | test.cpp:196:26:196:33 | *filename | test.cpp:186:47:186:54 | *filename | test.cpp:188:11:188:17 | strncat output argument | test.cpp:196:10:196:16 | concat output argument | | test.cpp:196:26:196:33 | *filename | test.cpp:186:47:186:54 | *filename | test.cpp:188:11:188:17 | strncat output argument | test.cpp:196:10:196:16 | concat output argument | #select diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected index 21e6445c8fd..db6712b11d3 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected @@ -47,6 +47,7 @@ edges | test.cpp:222:15:222:20 | buffer | test.cpp:214:24:214:24 | p | provenance | | | test.cpp:228:27:228:54 | call to malloc | test.cpp:232:10:232:15 | buffer | provenance | | | test.cpp:235:40:235:45 | buffer | test.cpp:236:5:236:26 | ... = ... | provenance | | +| test.cpp:236:5:236:9 | *p_str [post update] [string] | test.cpp:235:27:235:31 | *p_str [string] | provenance | | | test.cpp:236:5:236:26 | ... = ... | test.cpp:236:5:236:9 | *p_str [post update] [string] | provenance | | | test.cpp:241:20:241:38 | call to malloc | test.cpp:242:22:242:27 | buffer | provenance | | | test.cpp:242:16:242:19 | set_string output argument [string] | test.cpp:243:12:243:14 | *str [string] | provenance | | @@ -110,6 +111,7 @@ nodes | test.cpp:222:15:222:20 | buffer | semmle.label | buffer | | test.cpp:228:27:228:54 | call to malloc | semmle.label | call to malloc | | test.cpp:232:10:232:15 | buffer | semmle.label | buffer | +| test.cpp:235:27:235:31 | *p_str [string] | semmle.label | *p_str [string] | | test.cpp:235:40:235:45 | buffer | semmle.label | buffer | | test.cpp:236:5:236:9 | *p_str [post update] [string] | semmle.label | *p_str [post update] [string] | | test.cpp:236:5:236:26 | ... = ... | semmle.label | ... = ... | @@ -126,6 +128,7 @@ nodes | test.cpp:264:13:264:30 | call to malloc | semmle.label | call to malloc | | test.cpp:266:12:266:12 | p | semmle.label | p | subpaths +| test.cpp:242:22:242:27 | buffer | test.cpp:235:40:235:45 | buffer | test.cpp:235:27:235:31 | *p_str [string] | test.cpp:242:16:242:19 | set_string output argument [string] | | test.cpp:242:22:242:27 | buffer | test.cpp:235:40:235:45 | buffer | test.cpp:236:5:236:9 | *p_str [post update] [string] | test.cpp:242:16:242:19 | set_string output argument [string] | #select | test.cpp:42:5:42:11 | call to strncpy | test.cpp:18:19:18:24 | call to malloc | test.cpp:42:18:42:23 | string | This write may overflow $@ by 1 element. | test.cpp:42:18:42:23 | string | string | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected index fa6e1c36b53..b3eb5bbca97 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowDestination.expected @@ -3,11 +3,14 @@ edges | main.cpp:7:33:7:36 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | provenance | | | overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:30:17:30:20 | *arg1 | provenance | | | overflowdestination.cpp:43:8:43:10 | fgets output argument | overflowdestination.cpp:46:15:46:17 | *src | provenance | | +| overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:50:52:50:54 | *src | provenance | | | overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:53:15:53:17 | *src | provenance | | | overflowdestination.cpp:57:52:57:54 | *src | overflowdestination.cpp:64:16:64:19 | *src2 | provenance | | | overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:75:30:75:32 | *src | provenance | | | overflowdestination.cpp:73:8:73:10 | fgets output argument | overflowdestination.cpp:76:30:76:32 | *src | provenance | | | overflowdestination.cpp:75:30:75:32 | *src | overflowdestination.cpp:50:52:50:54 | *src | provenance | | +| overflowdestination.cpp:75:30:75:32 | *src | overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | provenance | | +| overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | overflowdestination.cpp:76:30:76:32 | *src | provenance | | | overflowdestination.cpp:76:30:76:32 | *src | overflowdestination.cpp:57:52:57:54 | *src | provenance | | nodes | main.cpp:6:27:6:30 | **argv | semmle.label | **argv | @@ -17,13 +20,16 @@ nodes | overflowdestination.cpp:43:8:43:10 | fgets output argument | semmle.label | fgets output argument | | overflowdestination.cpp:46:15:46:17 | *src | semmle.label | *src | | overflowdestination.cpp:50:52:50:54 | *src | semmle.label | *src | +| overflowdestination.cpp:50:52:50:54 | *src | semmle.label | *src | | overflowdestination.cpp:53:15:53:17 | *src | semmle.label | *src | | overflowdestination.cpp:57:52:57:54 | *src | semmle.label | *src | | overflowdestination.cpp:64:16:64:19 | *src2 | semmle.label | *src2 | | overflowdestination.cpp:73:8:73:10 | fgets output argument | semmle.label | fgets output argument | | overflowdestination.cpp:75:30:75:32 | *src | semmle.label | *src | +| overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | semmle.label | overflowdest_test2 output argument | | overflowdestination.cpp:76:30:76:32 | *src | semmle.label | *src | subpaths +| overflowdestination.cpp:75:30:75:32 | *src | overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:50:52:50:54 | *src | overflowdestination.cpp:75:30:75:32 | overflowdest_test2 output argument | #select | overflowdestination.cpp:30:2:30:8 | call to strncpy | main.cpp:6:27:6:30 | **argv | overflowdestination.cpp:30:17:30:20 | *arg1 | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | | overflowdestination.cpp:46:2:46:7 | call to memcpy | overflowdestination.cpp:43:8:43:10 | fgets output argument | overflowdestination.cpp:46:15:46:17 | *src | To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/UnboundedWrite.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/UnboundedWrite.expected index c5cfefdbff0..cde0ba8bc75 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/UnboundedWrite.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/UnboundedWrite.expected @@ -1,6 +1,44 @@ edges +| main.cpp:6:27:6:30 | **argv | main.cpp:7:33:7:36 | **argv | provenance | | +| main.cpp:6:27:6:30 | **argv | main.cpp:8:34:8:37 | **argv | provenance | | +| main.cpp:6:27:6:30 | **argv | main.cpp:9:29:9:32 | **argv | provenance | | | main.cpp:6:27:6:30 | **argv | main.cpp:10:20:10:23 | **argv | provenance | | +| main.cpp:7:33:7:36 | **argv | main.cpp:7:33:7:36 | overflowdesination_main output argument | provenance | | +| main.cpp:7:33:7:36 | **argv | main.cpp:7:33:7:36 | overflowdesination_main output argument | provenance | | +| main.cpp:7:33:7:36 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:8:34:8:37 | **argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:8:34:8:37 | *argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:9:29:9:32 | **argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:9:29:9:32 | *argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:10:20:10:23 | **argv | provenance | | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | main.cpp:10:20:10:23 | *argv | provenance | | +| main.cpp:8:34:8:37 | **argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | provenance | | +| main.cpp:8:34:8:37 | **argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | provenance | | +| main.cpp:8:34:8:37 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | provenance | | +| main.cpp:8:34:8:37 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | provenance | | +| main.cpp:8:34:8:37 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | provenance | | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | provenance | | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | provenance | | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | main.cpp:9:29:9:32 | **argv | provenance | | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | main.cpp:9:29:9:32 | *argv | provenance | | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | main.cpp:10:20:10:23 | **argv | provenance | | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | main.cpp:10:20:10:23 | *argv | provenance | | +| main.cpp:9:29:9:32 | **argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | provenance | | +| main.cpp:9:29:9:32 | **argv | tests_restrict.c:15:41:15:44 | **argv | provenance | | +| main.cpp:9:29:9:32 | *argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | provenance | | +| main.cpp:9:29:9:32 | *argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | provenance | | +| main.cpp:9:29:9:32 | *argv | tests_restrict.c:15:41:15:44 | **argv | provenance | | +| main.cpp:9:29:9:32 | *argv | tests_restrict.c:15:41:15:44 | *argv | provenance | | +| main.cpp:9:29:9:32 | tests_restrict_main output argument | main.cpp:10:20:10:23 | **argv | provenance | | +| main.cpp:9:29:9:32 | tests_restrict_main output argument | main.cpp:10:20:10:23 | *argv | provenance | | | main.cpp:10:20:10:23 | **argv | tests.cpp:657:32:657:35 | **argv | provenance | | +| main.cpp:10:20:10:23 | *argv | tests.cpp:657:32:657:35 | **argv | provenance | | +| main.cpp:10:20:10:23 | *argv | tests.cpp:657:32:657:35 | *argv | provenance | | +| overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | provenance | | +| overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:23:45:23:48 | *argv | provenance | | +| test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | provenance | | +| test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | provenance | | +| test_buffer_overrun.cpp:32:46:32:49 | *argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | provenance | | | tests.cpp:613:19:613:24 | *source | tests.cpp:615:17:615:22 | *source | provenance | | | tests.cpp:622:19:622:24 | *source | tests.cpp:625:2:625:16 | *... = ... | provenance | | | tests.cpp:625:2:625:2 | *s [post update] [*home] | tests.cpp:628:14:628:14 | *s [*home] | provenance | | @@ -10,11 +48,35 @@ edges | tests.cpp:628:16:628:19 | *home | tests.cpp:628:14:628:19 | *home | provenance | | | tests.cpp:657:32:657:35 | **argv | tests.cpp:682:9:682:15 | *access to array | provenance | | | tests.cpp:657:32:657:35 | **argv | tests.cpp:683:9:683:15 | *access to array | provenance | | +| tests.cpp:657:32:657:35 | *argv | tests.cpp:682:9:682:15 | *access to array | provenance | | +| tests.cpp:657:32:657:35 | *argv | tests.cpp:683:9:683:15 | *access to array | provenance | | | tests.cpp:682:9:682:15 | *access to array | tests.cpp:613:19:613:24 | *source | provenance | | | tests.cpp:683:9:683:15 | *access to array | tests.cpp:622:19:622:24 | *source | provenance | | +| tests_restrict.c:15:41:15:44 | **argv | tests_restrict.c:15:41:15:44 | **argv | provenance | | +| tests_restrict.c:15:41:15:44 | *argv | tests_restrict.c:15:41:15:44 | *argv | provenance | | nodes | main.cpp:6:27:6:30 | **argv | semmle.label | **argv | +| main.cpp:7:33:7:36 | **argv | semmle.label | **argv | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | semmle.label | overflowdesination_main output argument | +| main.cpp:7:33:7:36 | overflowdesination_main output argument | semmle.label | overflowdesination_main output argument | +| main.cpp:8:34:8:37 | **argv | semmle.label | **argv | +| main.cpp:8:34:8:37 | *argv | semmle.label | *argv | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | semmle.label | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | semmle.label | test_buffer_overrun_main output argument | +| main.cpp:9:29:9:32 | **argv | semmle.label | **argv | +| main.cpp:9:29:9:32 | *argv | semmle.label | *argv | +| main.cpp:9:29:9:32 | tests_restrict_main output argument | semmle.label | tests_restrict_main output argument | +| main.cpp:9:29:9:32 | tests_restrict_main output argument | semmle.label | tests_restrict_main output argument | | main.cpp:10:20:10:23 | **argv | semmle.label | **argv | +| main.cpp:10:20:10:23 | *argv | semmle.label | *argv | +| overflowdestination.cpp:23:45:23:48 | **argv | semmle.label | **argv | +| overflowdestination.cpp:23:45:23:48 | **argv | semmle.label | **argv | +| overflowdestination.cpp:23:45:23:48 | *argv | semmle.label | *argv | +| test_buffer_overrun.cpp:32:46:32:49 | **argv | semmle.label | **argv | +| test_buffer_overrun.cpp:32:46:32:49 | **argv | semmle.label | **argv | +| test_buffer_overrun.cpp:32:46:32:49 | *argv | semmle.label | *argv | +| test_buffer_overrun.cpp:32:46:32:49 | *argv | semmle.label | *argv | +| test_buffer_overrun.cpp:32:46:32:49 | *argv | semmle.label | *argv | | tests.cpp:613:19:613:24 | *source | semmle.label | *source | | tests.cpp:615:17:615:22 | *source | semmle.label | *source | | tests.cpp:622:19:622:24 | *source | semmle.label | *source | @@ -24,9 +86,24 @@ nodes | tests.cpp:628:14:628:19 | *home | semmle.label | *home | | tests.cpp:628:16:628:19 | *home | semmle.label | *home | | tests.cpp:657:32:657:35 | **argv | semmle.label | **argv | +| tests.cpp:657:32:657:35 | *argv | semmle.label | *argv | | tests.cpp:682:9:682:15 | *access to array | semmle.label | *access to array | | tests.cpp:683:9:683:15 | *access to array | semmle.label | *access to array | +| tests_restrict.c:15:41:15:44 | **argv | semmle.label | **argv | +| tests_restrict.c:15:41:15:44 | **argv | semmle.label | **argv | +| tests_restrict.c:15:41:15:44 | *argv | semmle.label | *argv | +| tests_restrict.c:15:41:15:44 | *argv | semmle.label | *argv | subpaths +| main.cpp:7:33:7:36 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | main.cpp:7:33:7:36 | overflowdesination_main output argument | +| main.cpp:7:33:7:36 | **argv | overflowdestination.cpp:23:45:23:48 | **argv | overflowdestination.cpp:23:45:23:48 | *argv | main.cpp:7:33:7:36 | overflowdesination_main output argument | +| main.cpp:8:34:8:37 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | **argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:8:34:8:37 | *argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | test_buffer_overrun.cpp:32:46:32:49 | *argv | main.cpp:8:34:8:37 | test_buffer_overrun_main output argument | +| main.cpp:9:29:9:32 | **argv | tests_restrict.c:15:41:15:44 | **argv | tests_restrict.c:15:41:15:44 | **argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | +| main.cpp:9:29:9:32 | *argv | tests_restrict.c:15:41:15:44 | **argv | tests_restrict.c:15:41:15:44 | **argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | +| main.cpp:9:29:9:32 | *argv | tests_restrict.c:15:41:15:44 | *argv | tests_restrict.c:15:41:15:44 | *argv | main.cpp:9:29:9:32 | tests_restrict_main output argument | #select | tests.cpp:615:2:615:7 | call to strcpy | main.cpp:6:27:6:30 | **argv | tests.cpp:615:17:615:22 | *source | This 'call to strcpy' with input from $@ may overflow the destination. | main.cpp:6:27:6:30 | **argv | a command-line argument | | tests.cpp:628:2:628:7 | call to strcpy | main.cpp:6:27:6:30 | **argv | tests.cpp:628:14:628:19 | *home | This 'call to strcpy' with input from $@ may overflow the destination. | main.cpp:6:27:6:30 | **argv | a command-line argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/argv/argvLocal.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/argv/argvLocal.expected index 8f09b2ee7f5..6b0a955e7b1 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/argv/argvLocal.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/argv/argvLocal.expected @@ -1,20 +1,28 @@ edges +| argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:95:9:95:15 | *access to array | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:96:15:96:21 | *access to array | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:96:15:96:21 | *access to array | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:101:9:101:10 | *i1 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:102:15:102:16 | *i1 | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:102:15:102:16 | *i1 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:106:9:106:13 | *access to array | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:107:15:107:19 | *access to array | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:107:15:107:19 | *access to array | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:110:9:110:11 | ** ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:111:15:111:17 | ** ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:116:9:116:10 | *i3 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:117:15:117:16 | *i3 | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:117:15:117:16 | *i3 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:121:9:121:10 | *i4 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:122:15:122:16 | *i4 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:127:9:127:10 | *i5 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:128:15:128:16 | *i5 | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:128:15:128:16 | *i5 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:131:9:131:14 | *... + ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:13:27:13:30 | **argv | argvLocal.c:132:15:132:20 | *... + ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:135:9:135:12 | *... ++ | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:136:15:136:18 | *-- ... | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:139:9:139:26 | *... ? ... : ... | provenance | | @@ -23,24 +31,100 @@ edges | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:145:15:145:16 | *i7 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:150:9:150:10 | *i8 | provenance | | | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:151:15:151:16 | *i8 | provenance | | +| argvLocal.c:96:15:96:21 | *access to array | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:96:15:96:21 | *access to array | argvLocal.c:96:15:96:21 | printWrapper output argument | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:101:9:101:10 | *i1 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:102:15:102:16 | *i1 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:102:15:102:16 | *i1 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:106:9:106:13 | *access to array | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:107:15:107:19 | *access to array | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:107:15:107:19 | *access to array | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:110:9:110:11 | ** ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:111:15:111:17 | ** ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:116:9:116:10 | *i3 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:117:15:117:16 | *i3 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:117:15:117:16 | *i3 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:121:9:121:10 | *i4 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:127:9:127:10 | *i5 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:128:15:128:16 | *i5 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:128:15:128:16 | *i5 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:131:9:131:14 | *... + ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:135:9:135:12 | *... ++ | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:136:15:136:18 | *-- ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:139:9:139:26 | *... ? ... : ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:140:15:140:32 | *... ? ... : ... | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:144:9:144:10 | *i7 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:145:15:145:16 | *i7 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:150:9:150:10 | *i8 | provenance | | +| argvLocal.c:96:15:96:21 | printWrapper output argument | argvLocal.c:151:15:151:16 | *i8 | provenance | | +| argvLocal.c:102:15:102:16 | *i1 | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:102:15:102:16 | *i1 | argvLocal.c:102:15:102:16 | printWrapper output argument | provenance | | +| argvLocal.c:102:15:102:16 | printWrapper output argument | argvLocal.c:144:9:144:10 | *i7 | provenance | | +| argvLocal.c:102:15:102:16 | printWrapper output argument | argvLocal.c:145:15:145:16 | *i7 | provenance | | +| argvLocal.c:107:15:107:19 | *access to array | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:107:15:107:19 | *access to array | argvLocal.c:107:15:107:19 | printWrapper output argument | provenance | | +| argvLocal.c:107:15:107:19 | printWrapper output argument | argvLocal.c:110:9:110:11 | ** ... | provenance | | +| argvLocal.c:107:15:107:19 | printWrapper output argument | argvLocal.c:111:15:111:17 | ** ... | provenance | | +| argvLocal.c:117:15:117:16 | *i3 | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:117:15:117:16 | *i3 | argvLocal.c:117:15:117:16 | printWrapper output argument | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:121:9:121:10 | *i4 | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:122:15:122:16 | *i4 | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:135:9:135:12 | *... ++ | provenance | | +| argvLocal.c:117:15:117:16 | printWrapper output argument | argvLocal.c:136:15:136:18 | *-- ... | provenance | | +| argvLocal.c:122:15:122:16 | *i4 | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:122:15:122:16 | *i4 | argvLocal.c:122:15:122:16 | printWrapper output argument | provenance | | +| argvLocal.c:122:15:122:16 | printWrapper output argument | argvLocal.c:135:9:135:12 | *... ++ | provenance | | +| argvLocal.c:122:15:122:16 | printWrapper output argument | argvLocal.c:136:15:136:18 | *-- ... | provenance | | +| argvLocal.c:128:15:128:16 | *i5 | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:128:15:128:16 | *i5 | argvLocal.c:128:15:128:16 | printWrapper output argument | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:131:9:131:14 | *... + ... | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:132:15:132:20 | *... + ... | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:139:9:139:26 | *... ? ... : ... | provenance | | +| argvLocal.c:128:15:128:16 | printWrapper output argument | argvLocal.c:140:15:140:32 | *... ? ... : ... | provenance | | +| argvLocal.c:132:15:132:20 | *... + ... | argvLocal.c:9:25:9:31 | *correct | provenance | | +| argvLocal.c:132:15:132:20 | *... + ... | argvLocal.c:132:15:132:20 | printWrapper output argument | provenance | | +| argvLocal.c:132:15:132:20 | printWrapper output argument | argvLocal.c:139:9:139:26 | *... ? ... : ... | provenance | | +| argvLocal.c:132:15:132:20 | printWrapper output argument | argvLocal.c:140:15:140:32 | *... ? ... : ... | provenance | | nodes +| argvLocal.c:9:25:9:31 | *correct | semmle.label | *correct | +| argvLocal.c:9:25:9:31 | *correct | semmle.label | *correct | | argvLocal.c:13:27:13:30 | **argv | semmle.label | **argv | | argvLocal.c:95:9:95:15 | *access to array | semmle.label | *access to array | | argvLocal.c:96:15:96:21 | *access to array | semmle.label | *access to array | +| argvLocal.c:96:15:96:21 | *access to array | semmle.label | *access to array | +| argvLocal.c:96:15:96:21 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:101:9:101:10 | *i1 | semmle.label | *i1 | | argvLocal.c:102:15:102:16 | *i1 | semmle.label | *i1 | +| argvLocal.c:102:15:102:16 | *i1 | semmle.label | *i1 | +| argvLocal.c:102:15:102:16 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:106:9:106:13 | *access to array | semmle.label | *access to array | | argvLocal.c:107:15:107:19 | *access to array | semmle.label | *access to array | +| argvLocal.c:107:15:107:19 | *access to array | semmle.label | *access to array | +| argvLocal.c:107:15:107:19 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:110:9:110:11 | ** ... | semmle.label | ** ... | | argvLocal.c:111:15:111:17 | ** ... | semmle.label | ** ... | | argvLocal.c:116:9:116:10 | *i3 | semmle.label | *i3 | | argvLocal.c:117:15:117:16 | *i3 | semmle.label | *i3 | +| argvLocal.c:117:15:117:16 | *i3 | semmle.label | *i3 | +| argvLocal.c:117:15:117:16 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:121:9:121:10 | *i4 | semmle.label | *i4 | | argvLocal.c:122:15:122:16 | *i4 | semmle.label | *i4 | +| argvLocal.c:122:15:122:16 | *i4 | semmle.label | *i4 | +| argvLocal.c:122:15:122:16 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:127:9:127:10 | *i5 | semmle.label | *i5 | | argvLocal.c:128:15:128:16 | *i5 | semmle.label | *i5 | +| argvLocal.c:128:15:128:16 | *i5 | semmle.label | *i5 | +| argvLocal.c:128:15:128:16 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:131:9:131:14 | *... + ... | semmle.label | *... + ... | | argvLocal.c:132:15:132:20 | *... + ... | semmle.label | *... + ... | +| argvLocal.c:132:15:132:20 | *... + ... | semmle.label | *... + ... | +| argvLocal.c:132:15:132:20 | printWrapper output argument | semmle.label | printWrapper output argument | | argvLocal.c:135:9:135:12 | *... ++ | semmle.label | *... ++ | | argvLocal.c:136:15:136:18 | *-- ... | semmle.label | *-- ... | | argvLocal.c:139:9:139:26 | *... ? ... : ... | semmle.label | *... ? ... : ... | @@ -50,6 +134,13 @@ nodes | argvLocal.c:150:9:150:10 | *i8 | semmle.label | *i8 | | argvLocal.c:151:15:151:16 | *i8 | semmle.label | *i8 | subpaths +| argvLocal.c:96:15:96:21 | *access to array | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:96:15:96:21 | printWrapper output argument | +| argvLocal.c:102:15:102:16 | *i1 | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:102:15:102:16 | printWrapper output argument | +| argvLocal.c:107:15:107:19 | *access to array | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:107:15:107:19 | printWrapper output argument | +| argvLocal.c:117:15:117:16 | *i3 | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:117:15:117:16 | printWrapper output argument | +| argvLocal.c:122:15:122:16 | *i4 | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:122:15:122:16 | printWrapper output argument | +| argvLocal.c:128:15:128:16 | *i5 | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:128:15:128:16 | printWrapper output argument | +| argvLocal.c:132:15:132:20 | *... + ... | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:9:25:9:31 | *correct | argvLocal.c:132:15:132:20 | printWrapper output argument | #select | argvLocal.c:95:9:95:15 | *access to array | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:95:9:95:15 | *access to array | The value of this argument may come from $@ and is being used as a formatting argument to printf(format). | argvLocal.c:13:27:13:30 | **argv | a command-line argument | | argvLocal.c:96:15:96:21 | *access to array | argvLocal.c:13:27:13:30 | **argv | argvLocal.c:96:15:96:21 | *access to array | The value of this argument may come from $@ and is being used as a formatting argument to printWrapper(correct), which calls printf(format). | argvLocal.c:13:27:13:30 | **argv | a command-line argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatString.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatString.expected index 087a0a88662..20b69b653c9 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatString.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatString.expected @@ -1,29 +1,46 @@ edges | globalVars.c:8:7:8:10 | **copy | globalVars.c:27:9:27:12 | *copy | provenance | | | globalVars.c:8:7:8:10 | **copy | globalVars.c:30:15:30:18 | *copy | provenance | | +| globalVars.c:8:7:8:10 | **copy | globalVars.c:30:15:30:18 | *copy | provenance | | | globalVars.c:8:7:8:10 | **copy | globalVars.c:35:11:35:14 | *copy | provenance | | | globalVars.c:9:7:9:11 | **copy2 | globalVars.c:38:9:38:13 | *copy2 | provenance | | | globalVars.c:9:7:9:11 | **copy2 | globalVars.c:41:15:41:19 | *copy2 | provenance | | +| globalVars.c:9:7:9:11 | **copy2 | globalVars.c:41:15:41:19 | *copy2 | provenance | | | globalVars.c:9:7:9:11 | **copy2 | globalVars.c:50:9:50:13 | *copy2 | provenance | | | globalVars.c:11:22:11:25 | **argv | globalVars.c:8:7:8:10 | **copy | provenance | | | globalVars.c:15:21:15:23 | *val | globalVars.c:9:7:9:11 | **copy2 | provenance | | +| globalVars.c:19:25:19:27 | *str | globalVars.c:19:25:19:27 | *str | provenance | | | globalVars.c:23:27:23:30 | **argv | globalVars.c:24:11:24:14 | **argv | provenance | | | globalVars.c:24:11:24:14 | **argv | globalVars.c:11:22:11:25 | **argv | provenance | | +| globalVars.c:30:15:30:18 | *copy | globalVars.c:19:25:19:27 | *str | provenance | | +| globalVars.c:30:15:30:18 | *copy | globalVars.c:30:15:30:18 | printWrapper output argument | provenance | | +| globalVars.c:30:15:30:18 | printWrapper output argument | globalVars.c:35:11:35:14 | *copy | provenance | | | globalVars.c:35:11:35:14 | *copy | globalVars.c:15:21:15:23 | *val | provenance | | +| globalVars.c:41:15:41:19 | *copy2 | globalVars.c:19:25:19:27 | *str | provenance | | +| globalVars.c:41:15:41:19 | *copy2 | globalVars.c:41:15:41:19 | printWrapper output argument | provenance | | +| globalVars.c:41:15:41:19 | printWrapper output argument | globalVars.c:50:9:50:13 | *copy2 | provenance | | nodes | globalVars.c:8:7:8:10 | **copy | semmle.label | **copy | | globalVars.c:9:7:9:11 | **copy2 | semmle.label | **copy2 | | globalVars.c:11:22:11:25 | **argv | semmle.label | **argv | | globalVars.c:15:21:15:23 | *val | semmle.label | *val | +| globalVars.c:19:25:19:27 | *str | semmle.label | *str | +| globalVars.c:19:25:19:27 | *str | semmle.label | *str | | globalVars.c:23:27:23:30 | **argv | semmle.label | **argv | | globalVars.c:24:11:24:14 | **argv | semmle.label | **argv | | globalVars.c:27:9:27:12 | *copy | semmle.label | *copy | | globalVars.c:30:15:30:18 | *copy | semmle.label | *copy | +| globalVars.c:30:15:30:18 | *copy | semmle.label | *copy | +| globalVars.c:30:15:30:18 | printWrapper output argument | semmle.label | printWrapper output argument | | globalVars.c:35:11:35:14 | *copy | semmle.label | *copy | | globalVars.c:38:9:38:13 | *copy2 | semmle.label | *copy2 | | globalVars.c:41:15:41:19 | *copy2 | semmle.label | *copy2 | +| globalVars.c:41:15:41:19 | *copy2 | semmle.label | *copy2 | +| globalVars.c:41:15:41:19 | printWrapper output argument | semmle.label | printWrapper output argument | | globalVars.c:50:9:50:13 | *copy2 | semmle.label | *copy2 | subpaths +| globalVars.c:30:15:30:18 | *copy | globalVars.c:19:25:19:27 | *str | globalVars.c:19:25:19:27 | *str | globalVars.c:30:15:30:18 | printWrapper output argument | +| globalVars.c:41:15:41:19 | *copy2 | globalVars.c:19:25:19:27 | *str | globalVars.c:19:25:19:27 | *str | globalVars.c:41:15:41:19 | printWrapper output argument | #select | globalVars.c:27:9:27:12 | *copy | globalVars.c:23:27:23:30 | **argv | globalVars.c:27:9:27:12 | *copy | The value of this argument may come from $@ and is being used as a formatting argument to printf(format). | globalVars.c:23:27:23:30 | **argv | a command-line argument | | globalVars.c:30:15:30:18 | *copy | globalVars.c:23:27:23:30 | **argv | globalVars.c:30:15:30:18 | *copy | The value of this argument may come from $@ and is being used as a formatting argument to printWrapper(str), which calls printf(format). | globalVars.c:23:27:23:30 | **argv | a command-line argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected index ddeb3fed32f..42992d988ba 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/CleartextFileWrite.expected @@ -1,7 +1,6 @@ edges | test2.cpp:62:18:62:25 | password | test2.cpp:65:31:65:34 | cpy1 | provenance | | | test2.cpp:72:15:72:24 | password | test2.cpp:73:30:73:32 | *buf | provenance | | -| test2.cpp:72:15:72:24 | password | test2.cpp:76:30:76:32 | *buf | provenance | | | test2.cpp:98:45:98:52 | password | test2.cpp:99:27:99:32 | *buffer | provenance | | | test.cpp:70:38:70:48 | thePassword | test.cpp:73:43:73:53 | thePassword | provenance | | | test.cpp:73:63:73:73 | thePassword | test.cpp:73:43:73:53 | thePassword | provenance | | @@ -17,7 +16,6 @@ nodes | test2.cpp:65:31:65:34 | cpy1 | semmle.label | cpy1 | | test2.cpp:72:15:72:24 | password | semmle.label | password | | test2.cpp:73:30:73:32 | *buf | semmle.label | *buf | -| test2.cpp:76:30:76:32 | *buf | semmle.label | *buf | | test2.cpp:98:45:98:52 | password | semmle.label | password | | test2.cpp:99:27:99:32 | *buffer | semmle.label | *buffer | | test.cpp:45:9:45:19 | thePassword | semmle.label | thePassword | @@ -36,7 +34,6 @@ subpaths | test2.cpp:57:2:57:8 | call to fprintf | test2.cpp:57:39:57:49 | call to getPassword | test2.cpp:57:39:57:49 | call to getPassword | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:57:39:57:49 | call to getPassword | this source. | | test2.cpp:65:3:65:9 | call to fprintf | test2.cpp:62:18:62:25 | password | test2.cpp:65:31:65:34 | cpy1 | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:62:18:62:25 | password | this source. | | test2.cpp:73:3:73:9 | call to fprintf | test2.cpp:72:15:72:24 | password | test2.cpp:73:30:73:32 | *buf | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:72:17:72:24 | password | this source. | -| test2.cpp:76:3:76:9 | call to fprintf | test2.cpp:72:15:72:24 | password | test2.cpp:76:30:76:32 | *buf | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:72:17:72:24 | password | this source. | | test2.cpp:99:3:99:9 | call to fprintf | test2.cpp:98:45:98:52 | password | test2.cpp:99:27:99:32 | *buffer | This write into file 'log' may contain unencrypted data from $@. | test2.cpp:98:45:98:52 | password | this source. | | test.cpp:45:3:45:7 | call to fputs | test.cpp:45:9:45:19 | thePassword | test.cpp:45:9:45:19 | thePassword | This write into file 'file' may contain unencrypted data from $@. | test.cpp:45:9:45:19 | thePassword | this source. | | test.cpp:70:35:70:35 | call to operator<< | test.cpp:70:38:70:48 | thePassword | test.cpp:70:38:70:48 | thePassword | This write into file 'mystream' may contain unencrypted data from $@. | test.cpp:70:38:70:48 | thePassword | this source. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp index 0220b8d09eb..ff10fba761b 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-311/semmle/tests/test2.cpp @@ -73,7 +73,7 @@ void tests(FILE *log, myStruct &s) fprintf(log, "buf = %s\n", buf); // BAD strcpy(buf, s.password_hash); - fprintf(log, "buf = %s\n", buf); // GOOD [FALSE POSITIVE] + fprintf(log, "buf = %s\n", buf); // GOOD } { diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected index 70386662fe8..44a83a752d6 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-611/XXE.expected @@ -41,11 +41,14 @@ edges | tests.cpp:73:23:73:43 | call to XercesDOMParser | tests.cpp:80:2:80:2 | *p | provenance | | | tests.cpp:85:24:85:44 | call to XercesDOMParser | tests.cpp:88:3:88:3 | *q | provenance | | | tests.cpp:100:24:100:44 | call to XercesDOMParser | tests.cpp:104:3:104:3 | *q | provenance | | +| tests.cpp:112:39:112:39 | *p | tests.cpp:112:39:112:39 | *p | provenance | | | tests.cpp:112:39:112:39 | *p | tests.cpp:113:2:113:2 | *p | provenance | | | tests.cpp:116:39:116:39 | *p | tests.cpp:117:2:117:2 | *p | provenance | | | tests.cpp:122:23:122:43 | call to XercesDOMParser | tests.cpp:126:18:126:18 | *q | provenance | | | tests.cpp:122:23:122:43 | call to XercesDOMParser | tests.cpp:128:18:128:18 | *q | provenance | | | tests.cpp:126:18:126:18 | *q | tests.cpp:112:39:112:39 | *p | provenance | | +| tests.cpp:126:18:126:18 | *q | tests.cpp:126:18:126:18 | test10_doParseB output argument | provenance | | +| tests.cpp:126:18:126:18 | test10_doParseB output argument | tests.cpp:128:18:128:18 | *q | provenance | | | tests.cpp:128:18:128:18 | *q | tests.cpp:116:39:116:39 | *p | provenance | | nodes | tests2.cpp:20:17:20:31 | call to SAXParser | semmle.label | call to SAXParser | @@ -117,13 +120,16 @@ nodes | tests.cpp:100:24:100:44 | call to XercesDOMParser | semmle.label | call to XercesDOMParser | | tests.cpp:104:3:104:3 | *q | semmle.label | *q | | tests.cpp:112:39:112:39 | *p | semmle.label | *p | +| tests.cpp:112:39:112:39 | *p | semmle.label | *p | | tests.cpp:113:2:113:2 | *p | semmle.label | *p | | tests.cpp:116:39:116:39 | *p | semmle.label | *p | | tests.cpp:117:2:117:2 | *p | semmle.label | *p | | tests.cpp:122:23:122:43 | call to XercesDOMParser | semmle.label | call to XercesDOMParser | | tests.cpp:126:18:126:18 | *q | semmle.label | *q | +| tests.cpp:126:18:126:18 | test10_doParseB output argument | semmle.label | test10_doParseB output argument | | tests.cpp:128:18:128:18 | *q | semmle.label | *q | subpaths +| tests.cpp:126:18:126:18 | *q | tests.cpp:112:39:112:39 | *p | tests.cpp:112:39:112:39 | *p | tests.cpp:126:18:126:18 | test10_doParseB output argument | #select | tests2.cpp:22:2:22:2 | *p | tests2.cpp:20:17:20:31 | call to SAXParser | tests2.cpp:22:2:22:2 | *p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests2.cpp:20:17:20:31 | call to SAXParser | XML parser | | tests2.cpp:37:2:37:2 | *p | tests2.cpp:33:17:33:31 | call to SAXParser | tests2.cpp:37:2:37:2 | *p | This $@ is not configured to prevent an XML external entity (XXE) attack. | tests2.cpp:33:17:33:31 | call to SAXParser | XML parser | From 32d6c5ac3d582502c2a9307d811c15632d9ff32f Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 16 Feb 2024 16:58:54 +0100 Subject: [PATCH 051/207] Javascript: fix project layout for bazel tests On Windows, the project layout needs to match `codeql~override`, while on POSIX we must keep on matching `ql`. We work around this by using `*ql*` in the project layout, which matches both. --- javascript/extractor/tests/project-layout | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/extractor/tests/project-layout b/javascript/extractor/tests/project-layout index df5e520e9cc..ecee7dfcd40 100644 --- a/javascript/extractor/tests/project-layout +++ b/javascript/extractor/tests/project-layout @@ -1 +1 @@ -**/ql/javascript/extractor/tests/*/input// +**/*ql*/javascript/extractor/tests/*/input// From 2c8ed6479a65cab197ea3a522a379f11e105989b Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Fri, 16 Feb 2024 17:55:34 +0000 Subject: [PATCH 052/207] C++: test for return in if --- .../library-tests/ir/ir/PrintAST.expected | 35 +++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 51 +++++++++++++++++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 8 +++ .../ir/ir/operand_locations.expected | 40 +++++++++++++++ .../test/library-tests/ir/ir/raw_ir.expected | 42 +++++++++++++++ 5 files changed, 176 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index a8ea8a89c42..ab5cb24946e 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -17001,6 +17001,41 @@ ir.cpp: # 2234| Type = [Class] Bool # 2234| ValueCategory = lvalue # 2236| getStmt(2): [ReturnStmt] return ... +# 2238| [TopLevelFunction] void IfReturnDestructors(bool) +# 2238| : +# 2238| getParameter(0): [Parameter] b +# 2238| Type = [BoolType] bool +# 2238| getEntryPoint(): [BlockStmt] { ... } +# 2239| getStmt(0): [DeclStmt] declaration +# 2239| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2239| Type = [Struct] String +# 2239| getVariable().getInitializer(): [Initializer] initializer for s +# 2239| getExpr(): [ConstructorCall] call to String +# 2239| Type = [VoidType] void +# 2239| ValueCategory = prvalue +# 2240| getStmt(1): [IfStmt] if (...) ... +# 2240| getCondition(): [VariableAccess] b +# 2240| Type = [BoolType] bool +# 2240| ValueCategory = prvalue(load) +# 2240| getThen(): [BlockStmt] { ... } +# 2241| getStmt(0): [ReturnStmt] return ... +# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2244| Type = [VoidType] void +# 2244| ValueCategory = prvalue +# 2244| getQualifier(): [VariableAccess] s +# 2244| Type = [Struct] String +# 2244| ValueCategory = lvalue +# 2243| getStmt(2): [ExprStmt] ExprStmt +# 2243| getExpr(): [VariableAccess] s +# 2243| Type = [Struct] String +# 2243| ValueCategory = lvalue +# 2244| getStmt(3): [ReturnStmt] return ... +# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2244| Type = [VoidType] void +# 2244| ValueCategory = prvalue +# 2244| getQualifier(): [VariableAccess] s +# 2244| Type = [Struct] String +# 2244| ValueCategory = lvalue perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 23526345278..804c0625306 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -13492,6 +13492,57 @@ ir.cpp: # 2223| v2223_8(void) = AliasedUse : ~m2234_13 # 2223| v2223_9(void) = ExitFunction : +# 2238| void IfReturnDestructors(bool) +# 2238| Block 0 +# 2238| v2238_1(void) = EnterFunction : +# 2238| m2238_2(unknown) = AliasedDefinition : +# 2238| m2238_3(unknown) = InitializeNonLocal : +# 2238| m2238_4(unknown) = Chi : total:m2238_2, partial:m2238_3 +# 2238| r2238_5(glval) = VariableAddress[b] : +# 2238| m2238_6(bool) = InitializeParameter[b] : &:r2238_5 +# 2239| r2239_1(glval) = VariableAddress[s] : +# 2239| m2239_2(String) = Uninitialized[s] : &:r2239_1 +# 2239| r2239_3(glval) = FunctionAddress[String] : +# 2239| v2239_4(void) = Call[String] : func:r2239_3, this:r2239_1 +# 2239| m2239_5(unknown) = ^CallSideEffect : ~m2238_4 +# 2239| m2239_6(unknown) = Chi : total:m2238_4, partial:m2239_5 +# 2239| m2239_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2239_1 +# 2239| m2239_8(String) = Chi : total:m2239_2, partial:m2239_7 +# 2240| r2240_1(glval) = VariableAddress[b] : +# 2240| r2240_2(bool) = Load[b] : &:r2240_1, m2238_6 +# 2240| v2240_3(void) = ConditionalBranch : r2240_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2241| Block 1 +# 2241| v2241_1(void) = NoOp : +# 2244| r2244_1(glval) = VariableAddress[s] : +# 2244| r2244_2(glval) = FunctionAddress[~String] : +# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1 +# 2244| m2244_4(unknown) = ^CallSideEffect : ~m2239_6 +# 2244| m2244_5(unknown) = Chi : total:m2239_6, partial:m2244_4 +# 2244| v2244_6(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, m2239_8 +# 2244| m2244_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1 +# 2244| m2244_8(String) = Chi : total:m2239_8, partial:m2244_7 +#-----| Goto -> Block 2 + +# 2243| Block 2 +# 2243| m2243_1(String) = Phi : from 0:m2239_8, from 1:m2244_8 +# 2243| m2243_2(unknown) = Phi : from 0:~m2239_6, from 1:~m2244_5 +# 2243| r2243_3(glval) = VariableAddress[s] : +# 2244| v2244_9(void) = NoOp : +# 2244| r2244_10(glval) = VariableAddress[s] : +# 2244| r2244_11(glval) = FunctionAddress[~String] : +# 2244| v2244_12(void) = Call[~String] : func:r2244_11, this:r2244_10 +# 2244| m2244_13(unknown) = ^CallSideEffect : ~m2243_2 +# 2244| m2244_14(unknown) = Chi : total:m2243_2, partial:m2244_13 +# 2244| v2244_15(void) = ^IndirectReadSideEffect[-1] : &:r2244_10, m2243_1 +# 2244| m2244_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_10 +# 2244| m2244_17(String) = Chi : total:m2243_1, partial:m2244_16 +# 2238| v2238_7(void) = ReturnVoid : +# 2238| v2238_8(void) = AliasedUse : ~m2244_14 +# 2238| v2238_9(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 474fac98d05..7e69d231ec5 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2235,4 +2235,12 @@ void WhileLoopDestructors(bool b) { } } +void IfReturnDestructors(bool b) { + String s; + if(b) { + return; + } + s; +} + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 540377a47ca..b33614a688f 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -11042,6 +11042,46 @@ | ir.cpp:2234:9:2234:9 | SideEffect | m2232_20 | | ir.cpp:2234:9:2234:9 | SideEffect | ~m2232_17 | | ir.cpp:2234:9:2234:9 | SideEffect | ~m2232_17 | +| ir.cpp:2238:6:2238:24 | ChiPartial | partial:m2238_3 | +| ir.cpp:2238:6:2238:24 | ChiTotal | total:m2238_2 | +| ir.cpp:2238:6:2238:24 | SideEffect | ~m2244_14 | +| ir.cpp:2238:31:2238:31 | Address | &:r2238_5 | +| ir.cpp:2239:12:2239:12 | Address | &:r2239_1 | +| ir.cpp:2239:12:2239:12 | Address | &:r2239_1 | +| ir.cpp:2239:12:2239:12 | Arg(this) | this:r2239_1 | +| ir.cpp:2239:12:2239:12 | CallTarget | func:r2239_3 | +| ir.cpp:2239:12:2239:12 | ChiPartial | partial:m2239_5 | +| ir.cpp:2239:12:2239:12 | ChiPartial | partial:m2239_7 | +| ir.cpp:2239:12:2239:12 | ChiTotal | total:m2238_4 | +| ir.cpp:2239:12:2239:12 | ChiTotal | total:m2239_2 | +| ir.cpp:2239:12:2239:12 | SideEffect | ~m2238_4 | +| ir.cpp:2240:8:2240:8 | Address | &:r2240_1 | +| ir.cpp:2240:8:2240:8 | Condition | r2240_2 | +| ir.cpp:2240:8:2240:8 | Load | m2238_6 | +| ir.cpp:2243:5:2243:5 | Phi | from 0:m2239_8 | +| ir.cpp:2243:5:2243:5 | Phi | from 0:~m2239_6 | +| ir.cpp:2243:5:2243:5 | Phi | from 1:m2244_8 | +| ir.cpp:2243:5:2243:5 | Phi | from 1:~m2244_5 | +| ir.cpp:2244:1:2244:1 | Address | &:r2244_1 | +| ir.cpp:2244:1:2244:1 | Address | &:r2244_1 | +| ir.cpp:2244:1:2244:1 | Address | &:r2244_10 | +| ir.cpp:2244:1:2244:1 | Address | &:r2244_10 | +| ir.cpp:2244:1:2244:1 | Arg(this) | this:r2244_1 | +| ir.cpp:2244:1:2244:1 | Arg(this) | this:r2244_10 | +| ir.cpp:2244:1:2244:1 | CallTarget | func:r2244_2 | +| ir.cpp:2244:1:2244:1 | CallTarget | func:r2244_11 | +| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_4 | +| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_7 | +| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_13 | +| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_16 | +| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2239_6 | +| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2239_8 | +| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2243_1 | +| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2243_2 | +| ir.cpp:2244:1:2244:1 | SideEffect | m2239_8 | +| ir.cpp:2244:1:2244:1 | SideEffect | m2243_1 | +| ir.cpp:2244:1:2244:1 | SideEffect | ~m2239_6 | +| ir.cpp:2244:1:2244:1 | SideEffect | ~m2243_2 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index fbd40796206..e6c49f112b4 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12685,6 +12685,48 @@ ir.cpp: # 2223| v2223_7(void) = AliasedUse : ~m? # 2223| v2223_8(void) = ExitFunction : +# 2238| void IfReturnDestructors(bool) +# 2238| Block 0 +# 2238| v2238_1(void) = EnterFunction : +# 2238| mu2238_2(unknown) = AliasedDefinition : +# 2238| mu2238_3(unknown) = InitializeNonLocal : +# 2238| r2238_4(glval) = VariableAddress[b] : +# 2238| mu2238_5(bool) = InitializeParameter[b] : &:r2238_4 +# 2239| r2239_1(glval) = VariableAddress[s] : +# 2239| mu2239_2(String) = Uninitialized[s] : &:r2239_1 +# 2239| r2239_3(glval) = FunctionAddress[String] : +# 2239| v2239_4(void) = Call[String] : func:r2239_3, this:r2239_1 +# 2239| mu2239_5(unknown) = ^CallSideEffect : ~m? +# 2239| mu2239_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2239_1 +# 2240| r2240_1(glval) = VariableAddress[b] : +# 2240| r2240_2(bool) = Load[b] : &:r2240_1, ~m? +# 2240| v2240_3(void) = ConditionalBranch : r2240_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2241| Block 1 +# 2241| v2241_1(void) = NoOp : +# 2244| r2244_1(glval) = VariableAddress[s] : +# 2244| r2244_2(glval) = FunctionAddress[~String] : +# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1 +# 2244| mu2244_4(unknown) = ^CallSideEffect : ~m? +# 2244| v2244_5(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, ~m? +# 2244| mu2244_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1 +#-----| Goto -> Block 2 + +# 2243| Block 2 +# 2243| r2243_1(glval) = VariableAddress[s] : +# 2244| v2244_7(void) = NoOp : +# 2244| r2244_8(glval) = VariableAddress[s] : +# 2244| r2244_9(glval) = FunctionAddress[~String] : +# 2244| v2244_10(void) = Call[~String] : func:r2244_9, this:r2244_8 +# 2244| mu2244_11(unknown) = ^CallSideEffect : ~m? +# 2244| v2244_12(void) = ^IndirectReadSideEffect[-1] : &:r2244_8, ~m? +# 2244| mu2244_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_8 +# 2238| v2238_6(void) = ReturnVoid : +# 2238| v2238_7(void) = AliasedUse : ~m? +# 2238| v2238_8(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 From 2494b7d8015cad005fd0e0e25c17e711c1a7a72b Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Fri, 16 Feb 2024 21:08:21 +0000 Subject: [PATCH 053/207] C++: fix for IR CFG problem with return in if --- .../raw/internal/TranslatedStmt.qll | 67 ++++++- .../library-tests/ir/ir/PrintAST.expected | 126 ++++++++---- .../library-tests/ir/ir/aliased_ir.expected | 182 +++++++++++++----- .../ir/ir/aliased_ssa_consistency.expected | 1 + .../aliased_ssa_consistency_unsound.expected | 1 + cpp/ql/test/library-tests/ir/ir/ir.cpp | 13 ++ .../ir/ir/operand_locations.expected | 136 +++++++++---- .../ir/ir/raw_consistency.expected | 1 + .../test/library-tests/ir/ir/raw_ir.expected | 166 ++++++++++++---- .../ir/ir/unaliased_ssa_consistency.expected | 1 + ...unaliased_ssa_consistency_unsound.expected | 1 + 11 files changed, 529 insertions(+), 166 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 5cb72409c35..a3f2f8560d9 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -413,7 +413,23 @@ class TranslatedReturnValueStmt extends TranslatedReturnStmt, TranslatedVariable TranslatedReturnValueStmt() { stmt.hasExpr() and hasReturnValue(stmt.getEnclosingFunction()) } final override Instruction getInitializationSuccessor(EdgeKind kind) { - result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + if this.hasAnImplicitDestructorCall() + then result = this.getChild(1).getFirstInstruction(kind) + else result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = TranslatedVariableInitialization.super.getChildSuccessorInternal(child, kind) + or + exists(int id | + this.getChild(id) = child and + ( + result = this.getChild(id + 1).getFirstInstruction(kind) + or + not exists(this.getChild(id + 1)) and + result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + ) + ) } final override TranslatedElement getChildInternal(int id) { @@ -429,6 +445,8 @@ class TranslatedReturnValueStmt extends TranslatedReturnStmt, TranslatedVariable final override IRVariable getIRVariable() { result = this.getEnclosingFunction().getReturnVariable() } + + override predicate handlesDestructorsExplicitly() { any() } } /** @@ -449,7 +467,10 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { } override Instruction getALastInstructionInternal() { - result = this.getInstruction(OnlyInstructionTag()) + if this.hasAnImplicitDestructorCall() + then + result = this.getChildInternal(max(int id | exists(this.getChild(id)))).getALastInstruction() + else result = this.getInstruction(OnlyInstructionTag()) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -460,16 +481,34 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and - result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + if this.hasAnImplicitDestructorCall() + then result = this.getChildInternal(1).getFirstInstruction(kind) + else result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { child = this.getExpr() and result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge + or + exists(int id | + child = this.getChild(id) and + id >= this.getFirstDestructorCallIndex() and + result = this.getChild(id + 1).getFirstInstruction(kind) + ) + or + exists(int id | + child = this.getChild(id) and + id >= this.getFirstDestructorCallIndex() and + exists(this.getChild(id)) and + not exists(this.getChild(id + 1)) and + result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + ) } private TranslatedExpr getExpr() { result = getTranslatedExpr(stmt.getExpr()) } + + override predicate handlesDestructorsExplicitly() { any() } } /** @@ -489,7 +528,9 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { } override Instruction getALastInstructionInternal() { - result = this.getInstruction(OnlyInstructionTag()) + if this.hasAnImplicitDestructorCall() + then result = this.getChild(max(int id | exists(this.getChild(id)))).getALastInstruction() + else result = this.getInstruction(OnlyInstructionTag()) } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -500,10 +541,24 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and - result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + if this.hasAnImplicitDestructorCall() + then result = this.getChild(0).getFirstInstruction(kind) + else result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } - override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + exists(int id | + this.getChild(id) = child and + ( + result = this.getChild(id + 1).getFirstInstruction(kind) + or + not exists(this.getChild(id + 1)) and + result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + ) + ) + } + + override predicate handlesDestructorsExplicitly() { any() } } /** diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index ab5cb24946e..db59bd0199f 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -4316,8 +4316,6 @@ ir.cpp: # 365| ValueCategory = prvalue # 361| getStmt(2): [LabelStmt] label ...: # 367| getStmt(1): [ReturnStmt] return ... -# 369| [TopLevelFunction] void VoidFunc() -# 369| : # 370| [TopLevelFunction] int Add(int, int) # 370| : # 370| getParameter(0): [Parameter] x @@ -17001,41 +16999,99 @@ ir.cpp: # 2234| Type = [Class] Bool # 2234| ValueCategory = lvalue # 2236| getStmt(2): [ReturnStmt] return ... -# 2238| [TopLevelFunction] void IfReturnDestructors(bool) +# 2238| [TopLevelFunction] void VoidFunc() # 2238| : -# 2238| getParameter(0): [Parameter] b -# 2238| Type = [BoolType] bool # 2238| getEntryPoint(): [BlockStmt] { ... } -# 2239| getStmt(0): [DeclStmt] declaration -# 2239| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s -# 2239| Type = [Struct] String -# 2239| getVariable().getInitializer(): [Initializer] initializer for s -# 2239| getExpr(): [ConstructorCall] call to String -# 2239| Type = [VoidType] void -# 2239| ValueCategory = prvalue -# 2240| getStmt(1): [IfStmt] if (...) ... -# 2240| getCondition(): [VariableAccess] b -# 2240| Type = [BoolType] bool -# 2240| ValueCategory = prvalue(load) -# 2240| getThen(): [BlockStmt] { ... } -# 2241| getStmt(0): [ReturnStmt] return ... -# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 2244| Type = [VoidType] void -# 2244| ValueCategory = prvalue -# 2244| getQualifier(): [VariableAccess] s -# 2244| Type = [Struct] String -# 2244| ValueCategory = lvalue -# 2243| getStmt(2): [ExprStmt] ExprStmt -# 2243| getExpr(): [VariableAccess] s -# 2243| Type = [Struct] String -# 2243| ValueCategory = lvalue -# 2244| getStmt(3): [ReturnStmt] return ... -# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 2244| Type = [VoidType] void -# 2244| ValueCategory = prvalue -# 2244| getQualifier(): [VariableAccess] s -# 2244| Type = [Struct] String -# 2244| ValueCategory = lvalue +# 2238| getStmt(0): [ReturnStmt] return ... +# 2240| [TopLevelFunction] void IfReturnDestructors(bool) +# 2240| : +# 2240| getParameter(0): [Parameter] b +# 2240| Type = [BoolType] bool +# 2240| getEntryPoint(): [BlockStmt] { ... } +# 2241| getStmt(0): [DeclStmt] declaration +# 2241| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2241| Type = [Struct] String +# 2241| getVariable().getInitializer(): [Initializer] initializer for s +# 2241| getExpr(): [ConstructorCall] call to String +# 2241| Type = [VoidType] void +# 2241| ValueCategory = prvalue +# 2242| getStmt(1): [IfStmt] if (...) ... +# 2242| getCondition(): [VariableAccess] b +# 2242| Type = [BoolType] bool +# 2242| ValueCategory = prvalue(load) +# 2242| getThen(): [BlockStmt] { ... } +# 2243| getStmt(0): [ReturnStmt] return ... +# 2249| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2249| Type = [VoidType] void +# 2249| ValueCategory = prvalue +# 2249| getQualifier(): [VariableAccess] s +# 2249| Type = [Struct] String +# 2249| ValueCategory = lvalue +# 2245| getStmt(2): [IfStmt] if (...) ... +# 2245| getCondition(): [VariableAccess] b +# 2245| Type = [BoolType] bool +# 2245| ValueCategory = prvalue(load) +# 2245| getThen(): [BlockStmt] { ... } +# 2246| getStmt(0): [ReturnStmt] return ... +# 2246| getExpr(): [FunctionCall] call to VoidFunc +# 2246| Type = [VoidType] void +# 2246| ValueCategory = prvalue +# 2249| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2249| Type = [VoidType] void +# 2249| ValueCategory = prvalue +# 2249| getQualifier(): [VariableAccess] s +# 2249| Type = [Struct] String +# 2249| ValueCategory = lvalue +# 2248| getStmt(3): [ExprStmt] ExprStmt +# 2248| getExpr(): [VariableAccess] s +# 2248| Type = [Struct] String +# 2248| ValueCategory = lvalue +# 2249| getStmt(4): [ReturnStmt] return ... +# 2249| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2249| Type = [VoidType] void +# 2249| ValueCategory = prvalue +# 2249| getQualifier(): [VariableAccess] s +# 2249| Type = [Struct] String +# 2249| ValueCategory = lvalue +# 2251| [TopLevelFunction] int IfReturnDestructors3(bool) +# 2251| : +# 2251| getParameter(0): [Parameter] b +# 2251| Type = [BoolType] bool +# 2251| getEntryPoint(): [BlockStmt] { ... } +# 2252| getStmt(0): [DeclStmt] declaration +# 2252| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2252| Type = [Struct] String +# 2252| getVariable().getInitializer(): [Initializer] initializer for s +# 2252| getExpr(): [ConstructorCall] call to String +# 2252| Type = [VoidType] void +# 2252| ValueCategory = prvalue +# 2253| getStmt(1): [IfStmt] if (...) ... +# 2253| getCondition(): [VariableAccess] b +# 2253| Type = [BoolType] bool +# 2253| ValueCategory = prvalue(load) +# 2253| getThen(): [BlockStmt] { ... } +# 2254| getStmt(0): [ReturnStmt] return ... +# 2254| getExpr(): [Literal] 1 +# 2254| Type = [IntType] int +# 2254| Value = [Literal] 1 +# 2254| ValueCategory = prvalue +# 2257| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2257| Type = [VoidType] void +# 2257| ValueCategory = prvalue +# 2257| getQualifier(): [VariableAccess] s +# 2257| Type = [Struct] String +# 2257| ValueCategory = lvalue +# 2256| getStmt(2): [ReturnStmt] return ... +# 2256| getExpr(): [Literal] 0 +# 2256| Type = [IntType] int +# 2256| Value = [Literal] 0 +# 2256| ValueCategory = prvalue +# 2257| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2257| Type = [VoidType] void +# 2257| ValueCategory = prvalue +# 2257| getQualifier(): [VariableAccess] s +# 2257| Type = [Struct] String +# 2257| ValueCategory = lvalue perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 804c0625306..55103759057 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -13492,56 +13492,144 @@ ir.cpp: # 2223| v2223_8(void) = AliasedUse : ~m2234_13 # 2223| v2223_9(void) = ExitFunction : -# 2238| void IfReturnDestructors(bool) +# 2238| void VoidFunc() # 2238| Block 0 -# 2238| v2238_1(void) = EnterFunction : -# 2238| m2238_2(unknown) = AliasedDefinition : -# 2238| m2238_3(unknown) = InitializeNonLocal : -# 2238| m2238_4(unknown) = Chi : total:m2238_2, partial:m2238_3 -# 2238| r2238_5(glval) = VariableAddress[b] : -# 2238| m2238_6(bool) = InitializeParameter[b] : &:r2238_5 -# 2239| r2239_1(glval) = VariableAddress[s] : -# 2239| m2239_2(String) = Uninitialized[s] : &:r2239_1 -# 2239| r2239_3(glval) = FunctionAddress[String] : -# 2239| v2239_4(void) = Call[String] : func:r2239_3, this:r2239_1 -# 2239| m2239_5(unknown) = ^CallSideEffect : ~m2238_4 -# 2239| m2239_6(unknown) = Chi : total:m2238_4, partial:m2239_5 -# 2239| m2239_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2239_1 -# 2239| m2239_8(String) = Chi : total:m2239_2, partial:m2239_7 -# 2240| r2240_1(glval) = VariableAddress[b] : -# 2240| r2240_2(bool) = Load[b] : &:r2240_1, m2238_6 -# 2240| v2240_3(void) = ConditionalBranch : r2240_2 -#-----| False -> Block 2 -#-----| True -> Block 1 +# 2238| v2238_1(void) = EnterFunction : +# 2238| m2238_2(unknown) = AliasedDefinition : +# 2238| m2238_3(unknown) = InitializeNonLocal : +# 2238| m2238_4(unknown) = Chi : total:m2238_2, partial:m2238_3 +# 2238| v2238_5(void) = NoOp : +# 2238| v2238_6(void) = ReturnVoid : +# 2238| v2238_7(void) = AliasedUse : m2238_3 +# 2238| v2238_8(void) = ExitFunction : -# 2241| Block 1 -# 2241| v2241_1(void) = NoOp : -# 2244| r2244_1(glval) = VariableAddress[s] : -# 2244| r2244_2(glval) = FunctionAddress[~String] : -# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1 -# 2244| m2244_4(unknown) = ^CallSideEffect : ~m2239_6 -# 2244| m2244_5(unknown) = Chi : total:m2239_6, partial:m2244_4 -# 2244| v2244_6(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, m2239_8 -# 2244| m2244_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1 -# 2244| m2244_8(String) = Chi : total:m2239_8, partial:m2244_7 -#-----| Goto -> Block 2 +# 2240| void IfReturnDestructors(bool) +# 2240| Block 0 +# 2240| v2240_1(void) = EnterFunction : +# 2240| m2240_2(unknown) = AliasedDefinition : +# 2240| m2240_3(unknown) = InitializeNonLocal : +# 2240| m2240_4(unknown) = Chi : total:m2240_2, partial:m2240_3 +# 2240| r2240_5(glval) = VariableAddress[b] : +# 2240| m2240_6(bool) = InitializeParameter[b] : &:r2240_5 +# 2241| r2241_1(glval) = VariableAddress[s] : +# 2241| m2241_2(String) = Uninitialized[s] : &:r2241_1 +# 2241| r2241_3(glval) = FunctionAddress[String] : +# 2241| v2241_4(void) = Call[String] : func:r2241_3, this:r2241_1 +# 2241| m2241_5(unknown) = ^CallSideEffect : ~m2240_4 +# 2241| m2241_6(unknown) = Chi : total:m2240_4, partial:m2241_5 +# 2241| m2241_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2241_1 +# 2241| m2241_8(String) = Chi : total:m2241_2, partial:m2241_7 +# 2242| r2242_1(glval) = VariableAddress[b] : +# 2242| r2242_2(bool) = Load[b] : &:r2242_1, m2240_6 +# 2242| v2242_3(void) = ConditionalBranch : r2242_2 +#-----| False -> Block 4 +#-----| True -> Block 3 -# 2243| Block 2 -# 2243| m2243_1(String) = Phi : from 0:m2239_8, from 1:m2244_8 -# 2243| m2243_2(unknown) = Phi : from 0:~m2239_6, from 1:~m2244_5 -# 2243| r2243_3(glval) = VariableAddress[s] : -# 2244| v2244_9(void) = NoOp : -# 2244| r2244_10(glval) = VariableAddress[s] : -# 2244| r2244_11(glval) = FunctionAddress[~String] : -# 2244| v2244_12(void) = Call[~String] : func:r2244_11, this:r2244_10 -# 2244| m2244_13(unknown) = ^CallSideEffect : ~m2243_2 -# 2244| m2244_14(unknown) = Chi : total:m2243_2, partial:m2244_13 -# 2244| v2244_15(void) = ^IndirectReadSideEffect[-1] : &:r2244_10, m2243_1 -# 2244| m2244_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_10 -# 2244| m2244_17(String) = Chi : total:m2243_1, partial:m2244_16 -# 2238| v2238_7(void) = ReturnVoid : -# 2238| v2238_8(void) = AliasedUse : ~m2244_14 -# 2238| v2238_9(void) = ExitFunction : +# 2240| Block 1 +# 2240| m2240_7(unknown) = Phi : from 3:~m2249_5, from 6:~m2249_14 +# 2240| v2240_8(void) = ReturnVoid : +# 2240| v2240_9(void) = AliasedUse : ~m2240_7 +# 2240| v2240_10(void) = ExitFunction : + +# 2243| Block 3 +# 2243| v2243_1(void) = NoOp : +# 2249| r2249_1(glval) = VariableAddress[s] : +# 2249| r2249_2(glval) = FunctionAddress[~String] : +# 2249| v2249_3(void) = Call[~String] : func:r2249_2, this:r2249_1 +# 2249| m2249_4(unknown) = ^CallSideEffect : ~m2241_6 +# 2249| m2249_5(unknown) = Chi : total:m2241_6, partial:m2249_4 +# 2249| v2249_6(void) = ^IndirectReadSideEffect[-1] : &:r2249_1, m2241_8 +# 2249| m2249_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_1 +# 2249| m2249_8(String) = Chi : total:m2241_8, partial:m2249_7 +#-----| Goto -> Block 1 + +# 2245| Block 4 +# 2245| r2245_1(glval) = VariableAddress[b] : +# 2245| r2245_2(bool) = Load[b] : &:r2245_1, m2240_6 +# 2245| v2245_3(void) = ConditionalBranch : r2245_2 +#-----| False -> Block 6 +#-----| True -> Block 5 +#-----| True -> Block 5 + +# 2246| Block 5 +# 2246| r2246_6(glval) = FunctionAddress[VoidFunc] : +# 2246| v2246_7(void) = Call[VoidFunc] : func:r2246_1, func:r2246_6 +# 2246| m2246_8(unknown) = ^CallSideEffect : ~m2241_6 +# 2246| m2246_9(unknown) = Chi : total:m2241_6, partial:m2246_3, partial:m2246_8 +# 2246| v2246_5(void) = NoOp : + +# 2246| Block 5 + +# 2248| Block 6 +# 2248| r2248_1(glval) = VariableAddress[s] : +# 2249| v2249_9(void) = NoOp : +# 2249| r2249_10(glval) = VariableAddress[s] : +# 2249| r2249_11(glval) = FunctionAddress[~String] : +# 2249| v2249_12(void) = Call[~String] : func:r2249_11, this:r2249_10 +# 2249| m2249_13(unknown) = ^CallSideEffect : ~m2241_6 +# 2249| m2249_14(unknown) = Chi : total:m2241_6, partial:m2249_13 +# 2249| v2249_15(void) = ^IndirectReadSideEffect[-1] : &:r2249_10, m2241_8 +# 2249| m2249_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_10 +# 2249| m2249_17(String) = Chi : total:m2241_8, partial:m2249_16 +#-----| Goto -> Block 1 + +# 2251| int IfReturnDestructors3(bool) +# 2251| Block 0 +# 2251| v2251_1(void) = EnterFunction : +# 2251| m2251_2(unknown) = AliasedDefinition : +# 2251| m2251_3(unknown) = InitializeNonLocal : +# 2251| m2251_4(unknown) = Chi : total:m2251_2, partial:m2251_3 +# 2251| r2251_5(glval) = VariableAddress[b] : +# 2251| m2251_6(bool) = InitializeParameter[b] : &:r2251_5 +# 2252| r2252_1(glval) = VariableAddress[s] : +# 2252| m2252_2(String) = Uninitialized[s] : &:r2252_1 +# 2252| r2252_3(glval) = FunctionAddress[String] : +# 2252| v2252_4(void) = Call[String] : func:r2252_3, this:r2252_1 +# 2252| m2252_5(unknown) = ^CallSideEffect : ~m2251_4 +# 2252| m2252_6(unknown) = Chi : total:m2251_4, partial:m2252_5 +# 2252| m2252_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2252_1 +# 2252| m2252_8(String) = Chi : total:m2252_2, partial:m2252_7 +# 2253| r2253_1(glval) = VariableAddress[b] : +# 2253| r2253_2(bool) = Load[b] : &:r2253_1, m2251_6 +# 2253| v2253_3(void) = ConditionalBranch : r2253_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2251| Block 1 +# 2251| m2251_7(unknown) = Phi : from 2:~m2257_5, from 3:~m2257_13 +# 2251| m2251_8(int) = Phi : from 2:m2254_3, from 3:m2256_3 +# 2251| r2251_9(glval) = VariableAddress[#return] : +# 2251| v2251_10(void) = ReturnValue : &:r2251_9, m2251_8 +# 2251| v2251_11(void) = AliasedUse : ~m2251_7 +# 2251| v2251_12(void) = ExitFunction : + +# 2254| Block 2 +# 2254| r2254_1(glval) = VariableAddress[#return] : +# 2254| r2254_2(int) = Constant[1] : +# 2254| m2254_3(int) = Store[#return] : &:r2254_1, r2254_2 +# 2257| r2257_1(glval) = VariableAddress[s] : +# 2257| r2257_2(glval) = FunctionAddress[~String] : +# 2257| v2257_3(void) = Call[~String] : func:r2257_2, this:r2257_1 +# 2257| m2257_4(unknown) = ^CallSideEffect : ~m2252_6 +# 2257| m2257_5(unknown) = Chi : total:m2252_6, partial:m2257_4 +# 2257| v2257_6(void) = ^IndirectReadSideEffect[-1] : &:r2257_1, m2252_8 +# 2257| m2257_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2257_1 +# 2257| m2257_8(String) = Chi : total:m2252_8, partial:m2257_7 +#-----| Goto -> Block 1 + +# 2256| Block 3 +# 2256| r2256_1(glval) = VariableAddress[#return] : +# 2256| r2256_2(int) = Constant[0] : +# 2256| m2256_3(int) = Store[#return] : &:r2256_1, r2256_2 +# 2257| r2257_9(glval) = VariableAddress[s] : +# 2257| r2257_10(glval) = FunctionAddress[~String] : +# 2257| v2257_11(void) = Call[~String] : func:r2257_10, this:r2257_9 +# 2257| m2257_12(unknown) = ^CallSideEffect : ~m2252_6 +# 2257| m2257_13(unknown) = Chi : total:m2252_6, partial:m2257_12 +# 2257| v2257_14(void) = ^IndirectReadSideEffect[-1] : &:r2257_9, m2252_8 +# 2257| m2257_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r2257_9 +# 2257| m2257_16(String) = Chi : total:m2252_8, partial:m2257_15 +#-----| Goto -> Block 1 perf-regression.cpp: # 6| void Big::Big() diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 4b738909c63..0d7951927c7 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -7,6 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:2138:21:2138:21 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | +| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 4b738909c63..0d7951927c7 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -7,6 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:2138:21:2138:21 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | +| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 7e69d231ec5..76ffebda287 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2235,12 +2235,25 @@ void WhileLoopDestructors(bool b) { } } +void VoidFunc() {} + void IfReturnDestructors(bool b) { String s; if(b) { return; } + if(b) { + return VoidFunc(); + } s; } +int IfReturnDestructors3(bool b) { + String s; + if(b) { + return 1; + } + return 0; +} + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index b33614a688f..8ab3a48185a 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -11042,46 +11042,102 @@ | ir.cpp:2234:9:2234:9 | SideEffect | m2232_20 | | ir.cpp:2234:9:2234:9 | SideEffect | ~m2232_17 | | ir.cpp:2234:9:2234:9 | SideEffect | ~m2232_17 | -| ir.cpp:2238:6:2238:24 | ChiPartial | partial:m2238_3 | -| ir.cpp:2238:6:2238:24 | ChiTotal | total:m2238_2 | -| ir.cpp:2238:6:2238:24 | SideEffect | ~m2244_14 | -| ir.cpp:2238:31:2238:31 | Address | &:r2238_5 | -| ir.cpp:2239:12:2239:12 | Address | &:r2239_1 | -| ir.cpp:2239:12:2239:12 | Address | &:r2239_1 | -| ir.cpp:2239:12:2239:12 | Arg(this) | this:r2239_1 | -| ir.cpp:2239:12:2239:12 | CallTarget | func:r2239_3 | -| ir.cpp:2239:12:2239:12 | ChiPartial | partial:m2239_5 | -| ir.cpp:2239:12:2239:12 | ChiPartial | partial:m2239_7 | -| ir.cpp:2239:12:2239:12 | ChiTotal | total:m2238_4 | -| ir.cpp:2239:12:2239:12 | ChiTotal | total:m2239_2 | -| ir.cpp:2239:12:2239:12 | SideEffect | ~m2238_4 | -| ir.cpp:2240:8:2240:8 | Address | &:r2240_1 | -| ir.cpp:2240:8:2240:8 | Condition | r2240_2 | -| ir.cpp:2240:8:2240:8 | Load | m2238_6 | -| ir.cpp:2243:5:2243:5 | Phi | from 0:m2239_8 | -| ir.cpp:2243:5:2243:5 | Phi | from 0:~m2239_6 | -| ir.cpp:2243:5:2243:5 | Phi | from 1:m2244_8 | -| ir.cpp:2243:5:2243:5 | Phi | from 1:~m2244_5 | -| ir.cpp:2244:1:2244:1 | Address | &:r2244_1 | -| ir.cpp:2244:1:2244:1 | Address | &:r2244_1 | -| ir.cpp:2244:1:2244:1 | Address | &:r2244_10 | -| ir.cpp:2244:1:2244:1 | Address | &:r2244_10 | -| ir.cpp:2244:1:2244:1 | Arg(this) | this:r2244_1 | -| ir.cpp:2244:1:2244:1 | Arg(this) | this:r2244_10 | -| ir.cpp:2244:1:2244:1 | CallTarget | func:r2244_2 | -| ir.cpp:2244:1:2244:1 | CallTarget | func:r2244_11 | -| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_4 | -| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_7 | -| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_13 | -| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_16 | -| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2239_6 | -| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2239_8 | -| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2243_1 | -| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2243_2 | -| ir.cpp:2244:1:2244:1 | SideEffect | m2239_8 | -| ir.cpp:2244:1:2244:1 | SideEffect | m2243_1 | -| ir.cpp:2244:1:2244:1 | SideEffect | ~m2239_6 | -| ir.cpp:2244:1:2244:1 | SideEffect | ~m2243_2 | +| ir.cpp:2238:6:2238:13 | ChiPartial | partial:m2238_3 | +| ir.cpp:2238:6:2238:13 | ChiTotal | total:m2238_2 | +| ir.cpp:2238:6:2238:13 | SideEffect | m2238_3 | +| ir.cpp:2240:6:2240:24 | ChiPartial | partial:m2240_3 | +| ir.cpp:2240:6:2240:24 | ChiTotal | total:m2240_2 | +| ir.cpp:2240:6:2240:24 | Phi | from 3:~m2249_5 | +| ir.cpp:2240:6:2240:24 | Phi | from 6:~m2249_14 | +| ir.cpp:2240:6:2240:24 | SideEffect | ~m2240_7 | +| ir.cpp:2240:31:2240:31 | Address | &:r2240_5 | +| ir.cpp:2241:12:2241:12 | Address | &:r2241_1 | +| ir.cpp:2241:12:2241:12 | Address | &:r2241_1 | +| ir.cpp:2241:12:2241:12 | Arg(this) | this:r2241_1 | +| ir.cpp:2241:12:2241:12 | CallTarget | func:r2241_3 | +| ir.cpp:2241:12:2241:12 | ChiPartial | partial:m2241_5 | +| ir.cpp:2241:12:2241:12 | ChiPartial | partial:m2241_7 | +| ir.cpp:2241:12:2241:12 | ChiTotal | total:m2240_4 | +| ir.cpp:2241:12:2241:12 | ChiTotal | total:m2241_2 | +| ir.cpp:2241:12:2241:12 | SideEffect | ~m2240_4 | +| ir.cpp:2242:8:2242:8 | Address | &:r2242_1 | +| ir.cpp:2242:8:2242:8 | Condition | r2242_2 | +| ir.cpp:2242:8:2242:8 | Load | m2240_6 | +| ir.cpp:2245:8:2245:8 | Address | &:r2245_1 | +| ir.cpp:2245:8:2245:8 | Condition | r2245_2 | +| ir.cpp:2245:8:2245:8 | Load | m2240_6 | +| ir.cpp:2246:16:2246:23 | CallTarget | func:r2246_1 | +| ir.cpp:2246:16:2246:23 | CallTarget | func:r2246_6 | +| ir.cpp:2246:16:2246:23 | ChiPartial | partial:m2246_3 | +| ir.cpp:2246:16:2246:23 | ChiPartial | partial:m2246_8 | +| ir.cpp:2246:16:2246:23 | ChiTotal | total:m2241_6 | +| ir.cpp:2246:16:2246:23 | SideEffect | ~m2241_6 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_1 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_1 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_10 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_10 | +| ir.cpp:2249:1:2249:1 | Arg(this) | this:r2249_1 | +| ir.cpp:2249:1:2249:1 | Arg(this) | this:r2249_10 | +| ir.cpp:2249:1:2249:1 | CallTarget | func:r2249_2 | +| ir.cpp:2249:1:2249:1 | CallTarget | func:r2249_11 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_4 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_7 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_13 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_16 | +| ir.cpp:2249:1:2249:1 | ChiTotal | total:m2241_6 | +| ir.cpp:2249:1:2249:1 | ChiTotal | total:m2241_6 | +| ir.cpp:2249:1:2249:1 | ChiTotal | total:m2241_8 | +| ir.cpp:2249:1:2249:1 | ChiTotal | total:m2241_8 | +| ir.cpp:2249:1:2249:1 | SideEffect | m2241_8 | +| ir.cpp:2249:1:2249:1 | SideEffect | m2241_8 | +| ir.cpp:2249:1:2249:1 | SideEffect | ~m2241_6 | +| ir.cpp:2249:1:2249:1 | SideEffect | ~m2241_6 | +| ir.cpp:2251:5:2251:24 | Address | &:r2251_9 | +| ir.cpp:2251:5:2251:24 | ChiPartial | partial:m2251_3 | +| ir.cpp:2251:5:2251:24 | ChiTotal | total:m2251_2 | +| ir.cpp:2251:5:2251:24 | Load | m2251_8 | +| ir.cpp:2251:5:2251:24 | Phi | from 2:m2254_3 | +| ir.cpp:2251:5:2251:24 | Phi | from 2:~m2257_5 | +| ir.cpp:2251:5:2251:24 | Phi | from 3:m2256_3 | +| ir.cpp:2251:5:2251:24 | Phi | from 3:~m2257_13 | +| ir.cpp:2251:5:2251:24 | SideEffect | ~m2251_7 | +| ir.cpp:2251:31:2251:31 | Address | &:r2251_5 | +| ir.cpp:2252:12:2252:12 | Address | &:r2252_1 | +| ir.cpp:2252:12:2252:12 | Address | &:r2252_1 | +| ir.cpp:2252:12:2252:12 | Arg(this) | this:r2252_1 | +| ir.cpp:2252:12:2252:12 | CallTarget | func:r2252_3 | +| ir.cpp:2252:12:2252:12 | ChiPartial | partial:m2252_5 | +| ir.cpp:2252:12:2252:12 | ChiPartial | partial:m2252_7 | +| ir.cpp:2252:12:2252:12 | ChiTotal | total:m2251_4 | +| ir.cpp:2252:12:2252:12 | ChiTotal | total:m2252_2 | +| ir.cpp:2252:12:2252:12 | SideEffect | ~m2251_4 | +| ir.cpp:2253:8:2253:8 | Address | &:r2253_1 | +| ir.cpp:2253:8:2253:8 | Condition | r2253_2 | +| ir.cpp:2253:8:2253:8 | Load | m2251_6 | +| ir.cpp:2254:9:2254:17 | Address | &:r2254_1 | +| ir.cpp:2254:16:2254:16 | StoreValue | r2254_2 | +| ir.cpp:2256:5:2256:13 | Address | &:r2256_1 | +| ir.cpp:2256:12:2256:12 | StoreValue | r2256_2 | +| ir.cpp:2257:1:2257:1 | Address | &:r2257_1 | +| ir.cpp:2257:1:2257:1 | Address | &:r2257_1 | +| ir.cpp:2257:1:2257:1 | Address | &:r2257_9 | +| ir.cpp:2257:1:2257:1 | Address | &:r2257_9 | +| ir.cpp:2257:1:2257:1 | Arg(this) | this:r2257_1 | +| ir.cpp:2257:1:2257:1 | Arg(this) | this:r2257_9 | +| ir.cpp:2257:1:2257:1 | CallTarget | func:r2257_2 | +| ir.cpp:2257:1:2257:1 | CallTarget | func:r2257_10 | +| ir.cpp:2257:1:2257:1 | ChiPartial | partial:m2257_4 | +| ir.cpp:2257:1:2257:1 | ChiPartial | partial:m2257_7 | +| ir.cpp:2257:1:2257:1 | ChiPartial | partial:m2257_12 | +| ir.cpp:2257:1:2257:1 | ChiPartial | partial:m2257_15 | +| ir.cpp:2257:1:2257:1 | ChiTotal | total:m2252_6 | +| ir.cpp:2257:1:2257:1 | ChiTotal | total:m2252_6 | +| ir.cpp:2257:1:2257:1 | ChiTotal | total:m2252_8 | +| ir.cpp:2257:1:2257:1 | ChiTotal | total:m2252_8 | +| ir.cpp:2257:1:2257:1 | SideEffect | m2252_8 | +| ir.cpp:2257:1:2257:1 | SideEffect | m2252_8 | +| ir.cpp:2257:1:2257:1 | SideEffect | ~m2252_6 | +| ir.cpp:2257:1:2257:1 | SideEffect | ~m2252_6 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 4c39a53588d..cc9b824239b 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -10,6 +10,7 @@ instructionWithoutSuccessor | ir.cpp:2140:39:2140:39 | IndirectMayWriteSideEffect: call to ClassWithDestructor | Instruction 'IndirectMayWriteSideEffect: call to ClassWithDestructor' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | | ir.cpp:2140:42:2140:76 | Constant: initialization_with_destructor_bool | Instruction 'Constant: initialization_with_destructor_bool' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | | ir.cpp:2141:9:2141:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | +| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index e6c49f112b4..d2acb933606 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12685,47 +12685,137 @@ ir.cpp: # 2223| v2223_7(void) = AliasedUse : ~m? # 2223| v2223_8(void) = ExitFunction : -# 2238| void IfReturnDestructors(bool) +# 2238| void VoidFunc() # 2238| Block 0 -# 2238| v2238_1(void) = EnterFunction : -# 2238| mu2238_2(unknown) = AliasedDefinition : -# 2238| mu2238_3(unknown) = InitializeNonLocal : -# 2238| r2238_4(glval) = VariableAddress[b] : -# 2238| mu2238_5(bool) = InitializeParameter[b] : &:r2238_4 -# 2239| r2239_1(glval) = VariableAddress[s] : -# 2239| mu2239_2(String) = Uninitialized[s] : &:r2239_1 -# 2239| r2239_3(glval) = FunctionAddress[String] : -# 2239| v2239_4(void) = Call[String] : func:r2239_3, this:r2239_1 -# 2239| mu2239_5(unknown) = ^CallSideEffect : ~m? -# 2239| mu2239_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2239_1 -# 2240| r2240_1(glval) = VariableAddress[b] : -# 2240| r2240_2(bool) = Load[b] : &:r2240_1, ~m? -# 2240| v2240_3(void) = ConditionalBranch : r2240_2 -#-----| False -> Block 2 -#-----| True -> Block 1 +# 2238| v2238_1(void) = EnterFunction : +# 2238| mu2238_2(unknown) = AliasedDefinition : +# 2238| mu2238_3(unknown) = InitializeNonLocal : +# 2238| v2238_4(void) = NoOp : +# 2238| v2238_5(void) = ReturnVoid : +# 2238| v2238_6(void) = AliasedUse : ~m? +# 2238| v2238_7(void) = ExitFunction : -# 2241| Block 1 -# 2241| v2241_1(void) = NoOp : -# 2244| r2244_1(glval) = VariableAddress[s] : -# 2244| r2244_2(glval) = FunctionAddress[~String] : -# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1 -# 2244| mu2244_4(unknown) = ^CallSideEffect : ~m? -# 2244| v2244_5(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, ~m? -# 2244| mu2244_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1 -#-----| Goto -> Block 2 +# 2240| void IfReturnDestructors(bool) +# 2240| Block 0 +# 2240| v2240_1(void) = EnterFunction : +# 2240| mu2240_2(unknown) = AliasedDefinition : +# 2240| mu2240_3(unknown) = InitializeNonLocal : +# 2240| r2240_4(glval) = VariableAddress[b] : +# 2240| mu2240_5(bool) = InitializeParameter[b] : &:r2240_4 +# 2241| r2241_1(glval) = VariableAddress[s] : +# 2241| mu2241_2(String) = Uninitialized[s] : &:r2241_1 +# 2241| r2241_3(glval) = FunctionAddress[String] : +# 2241| v2241_4(void) = Call[String] : func:r2241_3, this:r2241_1 +# 2241| mu2241_5(unknown) = ^CallSideEffect : ~m? +# 2241| mu2241_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2241_1 +# 2242| r2242_1(glval) = VariableAddress[b] : +# 2242| r2242_2(bool) = Load[b] : &:r2242_1, ~m? +# 2242| v2242_3(void) = ConditionalBranch : r2242_2 +#-----| False -> Block 5 +#-----| True -> Block 4 -# 2243| Block 2 -# 2243| r2243_1(glval) = VariableAddress[s] : -# 2244| v2244_7(void) = NoOp : -# 2244| r2244_8(glval) = VariableAddress[s] : -# 2244| r2244_9(glval) = FunctionAddress[~String] : -# 2244| v2244_10(void) = Call[~String] : func:r2244_9, this:r2244_8 -# 2244| mu2244_11(unknown) = ^CallSideEffect : ~m? -# 2244| v2244_12(void) = ^IndirectReadSideEffect[-1] : &:r2244_8, ~m? -# 2244| mu2244_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_8 -# 2238| v2238_6(void) = ReturnVoid : -# 2238| v2238_7(void) = AliasedUse : ~m? -# 2238| v2238_8(void) = ExitFunction : +# 2240| Block 1 +# 2240| v2240_6(void) = ReturnVoid : +# 2240| v2240_7(void) = AliasedUse : ~m? +# 2240| v2240_8(void) = ExitFunction : + +# 2246| Block 6 +# 2246| r2246_5(glval) = FunctionAddress[VoidFunc] : +# 2246| v2246_6(void) = Call[VoidFunc] : func:r2246_1, func:r2246_5 +# 2246| mu2246_7(unknown) = ^CallSideEffect : ~m? +# 2246| v2246_8(void) = NoOp : + +# 2246| Block 6 + +# 2243| Block 4 +# 2243| v2243_1(void) = NoOp : +# 2249| r2249_7(glval) = VariableAddress[s] : +# 2249| r2249_8(glval) = FunctionAddress[~String] : +# 2249| v2249_9(void) = Call[~String] : func:r2249_8, this:r2249_7 +# 2249| mu2249_10(unknown) = ^CallSideEffect : ~m? +# 2249| v2249_11(void) = ^IndirectReadSideEffect[-1] : &:r2249_7, ~m? +# 2249| mu2249_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_7 +#-----| Goto -> Block 1 + +# 2245| Block 5 +# 2245| r2245_1(glval) = VariableAddress[b] : +# 2245| r2245_2(bool) = Load[b] : &:r2245_1, ~m? +# 2245| v2245_3(void) = ConditionalBranch : r2245_2 +#-----| False -> Block 8 +#-----| True -> Block 6 +#-----| True -> Block 6 + +# 2249| Block 7 +# 2249| r2249_1(glval) = VariableAddress[s] : +# 2249| r2249_2(glval) = FunctionAddress[~String] : +# 2249| v2249_3(void) = Call[~String] : func:r2249_14, func:r2249_2, this:r2249_1, this:r2249_13 +# 2249| mu2249_4(unknown) = ^CallSideEffect : ~m? +# 2249| v2249_5(void) = ^IndirectReadSideEffect[-1] : &:r2249_1, &:r2249_13, ~m? +# 2249| mu2249_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_1, &:r2249_13 +#-----| Goto -> Block 1 + +# 2249| Block 7 +#-----| Goto -> Block 1 + +# 2248| Block 8 +# 2248| r2248_1(glval) = VariableAddress[s] : +# 2249| v2249_19(void) = NoOp : +# 2249| r2249_20(glval) = VariableAddress[s] : +# 2249| r2249_21(glval) = FunctionAddress[~String] : +# 2249| v2249_22(void) = Call[~String] : func:r2249_21, this:r2249_20 +# 2249| mu2249_23(unknown) = ^CallSideEffect : ~m? +# 2249| v2249_24(void) = ^IndirectReadSideEffect[-1] : &:r2249_20, ~m? +# 2249| mu2249_25(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_20 +#-----| Goto -> Block 1 + +# 2251| int IfReturnDestructors3(bool) +# 2251| Block 0 +# 2251| v2251_1(void) = EnterFunction : +# 2251| mu2251_2(unknown) = AliasedDefinition : +# 2251| mu2251_3(unknown) = InitializeNonLocal : +# 2251| r2251_4(glval) = VariableAddress[b] : +# 2251| mu2251_5(bool) = InitializeParameter[b] : &:r2251_4 +# 2252| r2252_1(glval) = VariableAddress[s] : +# 2252| mu2252_2(String) = Uninitialized[s] : &:r2252_1 +# 2252| r2252_3(glval) = FunctionAddress[String] : +# 2252| v2252_4(void) = Call[String] : func:r2252_3, this:r2252_1 +# 2252| mu2252_5(unknown) = ^CallSideEffect : ~m? +# 2252| mu2252_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2252_1 +# 2253| r2253_1(glval) = VariableAddress[b] : +# 2253| r2253_2(bool) = Load[b] : &:r2253_1, ~m? +# 2253| v2253_3(void) = ConditionalBranch : r2253_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2251| Block 1 +# 2251| r2251_6(glval) = VariableAddress[#return] : +# 2251| v2251_7(void) = ReturnValue : &:r2251_6, ~m? +# 2251| v2251_8(void) = AliasedUse : ~m? +# 2251| v2251_9(void) = ExitFunction : + +# 2254| Block 2 +# 2254| r2254_1(glval) = VariableAddress[#return] : +# 2254| r2254_2(int) = Constant[1] : +# 2254| mu2254_3(int) = Store[#return] : &:r2254_1, r2254_2 +# 2257| r2257_1(glval) = VariableAddress[s] : +# 2257| r2257_2(glval) = FunctionAddress[~String] : +# 2257| v2257_3(void) = Call[~String] : func:r2257_2, this:r2257_1 +# 2257| mu2257_4(unknown) = ^CallSideEffect : ~m? +# 2257| v2257_5(void) = ^IndirectReadSideEffect[-1] : &:r2257_1, ~m? +# 2257| mu2257_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2257_1 +#-----| Goto -> Block 1 + +# 2256| Block 3 +# 2256| r2256_1(glval) = VariableAddress[#return] : +# 2256| r2256_2(int) = Constant[0] : +# 2256| mu2256_3(int) = Store[#return] : &:r2256_1, r2256_2 +# 2257| r2257_7(glval) = VariableAddress[s] : +# 2257| r2257_8(glval) = FunctionAddress[~String] : +# 2257| v2257_9(void) = Call[~String] : func:r2257_8, this:r2257_7 +# 2257| mu2257_10(unknown) = ^CallSideEffect : ~m? +# 2257| v2257_11(void) = ^IndirectReadSideEffect[-1] : &:r2257_7, ~m? +# 2257| mu2257_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2257_7 +#-----| Goto -> Block 1 perf-regression.cpp: # 6| void Big::Big() diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 598accf931b..a25d47fac12 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -7,6 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:2138:21:2138:21 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | +| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 598accf931b..a25d47fac12 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -7,6 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:2138:21:2138:21 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | +| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From b174aa65a35aad402d1751c9dcc7c111179e38f2 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 19 Feb 2024 10:30:48 +0100 Subject: [PATCH 054/207] Bazel: empty out `WORKSPACE.bazel` --- CODEOWNERS | 1 + WORKSPACE.bazel | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index a4f85a04475..1869b38b7c9 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -25,6 +25,7 @@ # Bazel (excluding BUILD.bazel files) WORKSPACE.bazel @github/codeql-ci-reviewers +MODULE.bazel @github/codeql-ci-reviewers .bazelversion @github/codeql-ci-reviewers .bazelrc @github/codeql-ci-reviewers **/*.bzl @github/codeql-ci-reviewers diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 12e40472055..e6af3594b05 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -1,4 +1,2 @@ -# Please notice that any bazel targets and definitions in this repository are currently experimental -# and for internal use only. - -workspace(name = "codeql") +# plase use MODULE.bazel to add dependencies +# this empty file is required by internal repositories, don't remove it From f842eee7842e5dc446cc1fbe94a5add940dacefa Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 19 Feb 2024 14:06:18 +0100 Subject: [PATCH 055/207] Swift: use `includes` in `picosha2` --- swift/third_party/BUILD.picosha2.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swift/third_party/BUILD.picosha2.bazel b/swift/third_party/BUILD.picosha2.bazel index c8d2d8e01a1..b6eb4292cb8 100644 --- a/swift/third_party/BUILD.picosha2.bazel +++ b/swift/third_party/BUILD.picosha2.bazel @@ -1,6 +1,6 @@ cc_library( name = "picosha2", hdrs = glob(["*.h"]), - strip_include_prefix = ".", + includes = ["."], visibility = ["//visibility:public"], ) From 75f66c21911a5d98ca3372ab055ea376bd5e5f97 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Tue, 20 Feb 2024 13:48:20 +0000 Subject: [PATCH 056/207] Add four more sink types. --- .../automodel/src/AutomodelEndpointTypes.qll | 20 +++++++++++++++++++ java/ql/automodel/src/AutomodelJavaUtil.qll | 15 +------------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/java/ql/automodel/src/AutomodelEndpointTypes.qll b/java/ql/automodel/src/AutomodelEndpointTypes.qll index e37cc80099f..f4f7bc8eb7b 100644 --- a/java/ql/automodel/src/AutomodelEndpointTypes.qll +++ b/java/ql/automodel/src/AutomodelEndpointTypes.qll @@ -50,6 +50,26 @@ class CommandInjectionSinkType extends SinkType { CommandInjectionSinkType() { this = "command-injection" } } +/** A sink relevant to file storage. */ +class FileContentStoreSinkType extends SinkType { + FileContentStoreSinkType() { this = "file-content-store" } +} + +/** A sink relevant to HTML injection. */ +class HtmlInjectionSinkType extends SinkType { + HtmlInjectionSinkType() { this = "html-injection" } +} + +/** A sink relevant to LDAP injection. */ +class LdapInjectionSinkType extends SinkType { + LdapInjectionSinkType() { this = "ldap-injection" } +} + +/** A sink relevant to URL redirection. */ +class UrlRedirectionSinkType extends SinkType { + UrlRedirectionSinkType() { this = "url-redirection" } +} + /** A class for source types that can be predicted by a classifier. */ abstract class SourceType extends EndpointType { bindingset[this] diff --git a/java/ql/automodel/src/AutomodelJavaUtil.qll b/java/ql/automodel/src/AutomodelJavaUtil.qll index ba42806e953..368fb172483 100644 --- a/java/ql/automodel/src/AutomodelJavaUtil.qll +++ b/java/ql/automodel/src/AutomodelJavaUtil.qll @@ -28,20 +28,7 @@ class DollarAtString extends string { * descriptions. */ predicate isKnownKind(string kind, AutomodelEndpointTypes::EndpointType type) { - kind = "path-injection" and - type instanceof AutomodelEndpointTypes::PathInjectionSinkType - or - kind = "sql-injection" and - type instanceof AutomodelEndpointTypes::SqlInjectionSinkType - or - kind = "request-forgery" and - type instanceof AutomodelEndpointTypes::RequestForgerySinkType - or - kind = "command-injection" and - type instanceof AutomodelEndpointTypes::CommandInjectionSinkType - or - kind = "remote" and - type instanceof AutomodelEndpointTypes::RemoteSourceType + kind = type.getKind() } /** From 10da4d14d9f20479d2c470dea96b723c11805a3a Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 20 Feb 2024 15:07:29 +0000 Subject: [PATCH 057/207] Add addtional arguments as sinks to certain methods --- ...4-02-20-activerecord-sql-sink-arguments.md | 5 + .../codeql/ruby/frameworks/ActiveRecord.qll | 9 +- .../security/cwe-089/ActiveRecordInjection.rb | 8 + .../security/cwe-089/SqlInjection.expected | 170 +++++++++++------- 4 files changed, 121 insertions(+), 71 deletions(-) create mode 100644 ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md diff --git a/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md b/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md new file mode 100644 index 00000000000..fffc9d6f064 --- /dev/null +++ b/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md @@ -0,0 +1,5 @@ + +--- +category: minorAnalysis +--- +* Additional arguments beyond the first of calls to the `ActiveRecord` methods `select`, `reselect`, `order`, `reorder`, `joins`, `group`, and `pluck` are now recognized as sql injection sinks. \ No newline at end of file diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll index 4596c432070..17921b16a28 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll @@ -176,11 +176,16 @@ private predicate sqlFragmentArgumentInner(DataFlow::CallNode call, DataFlow::No activeRecordQueryBuilderCall([ "delete_all", "delete_by", "destroy_all", "destroy_by", "exists?", "find_by", "find_by!", "find_or_create_by", "find_or_create_by!", "find_or_initialize_by", "find_by_sql", "from", - "group", "having", "joins", "lock", "not", "order", "reorder", "pluck", "where", "rewhere", - "select", "reselect" + "having", "lock", "not", "where", "rewhere" ]) and sink = call.getArgument(0) or + call = + activeRecordQueryBuilderCall([ + "group", "joins", "order", "reorder", "pluck", "select", "reselect" + ]) and + sink = call.getArgument(_) + or call = activeRecordQueryBuilderCall("calculate") and sink = call.getArgument(1) or diff --git a/ruby/ql/test/query-tests/security/cwe-089/ActiveRecordInjection.rb b/ruby/ql/test/query-tests/security/cwe-089/ActiveRecordInjection.rb index c63f384b091..9a94e48708d 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/ActiveRecordInjection.rb +++ b/ruby/ql/test/query-tests/security/cwe-089/ActiveRecordInjection.rb @@ -105,6 +105,14 @@ class FooController < ActionController::Base User.reorder(params[:direction]) + User.select('a','b', params[:column]) + User.reselect('a','b', params[:column]) + User.order('a ASC', "b #{params[:direction]}") + User.reorder('a ASC', "b #{params[:direction]}") + User.group('a', params[:column]) + User.pluck('a', params[:column]) + User.joins(:a, params[:column]) + User.count_by_sql(params[:custom_sql_query]) end end diff --git a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected index 1f9b8483f3b..726aefe7a20 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected @@ -34,35 +34,44 @@ edges | ActiveRecordInjection.rb:104:30:104:35 | call to params | ActiveRecordInjection.rb:104:30:104:51 | ...[...] | provenance | | | ActiveRecordInjection.rb:104:30:104:51 | ...[...] | ActiveRecordInjection.rb:104:19:104:54 | "name = '#{...}'" | provenance | | | ActiveRecordInjection.rb:106:18:106:23 | call to params | ActiveRecordInjection.rb:106:18:106:35 | ...[...] | provenance | | -| ActiveRecordInjection.rb:108:23:108:28 | call to params | ActiveRecordInjection.rb:108:23:108:47 | ...[...] | provenance | | -| ActiveRecordInjection.rb:114:5:114:6 | ps | ActiveRecordInjection.rb:115:11:115:12 | ps | provenance | | -| ActiveRecordInjection.rb:114:10:114:15 | call to params | ActiveRecordInjection.rb:114:5:114:6 | ps | provenance | | -| ActiveRecordInjection.rb:115:5:115:7 | uid | ActiveRecordInjection.rb:116:5:116:9 | uidEq | provenance | | -| ActiveRecordInjection.rb:115:11:115:12 | ps | ActiveRecordInjection.rb:115:11:115:17 | ...[...] | provenance | | -| ActiveRecordInjection.rb:115:11:115:17 | ...[...] | ActiveRecordInjection.rb:115:5:115:7 | uid | provenance | | -| ActiveRecordInjection.rb:116:5:116:9 | uidEq | ActiveRecordInjection.rb:120:20:120:32 | ... + ... | provenance | | -| ActiveRecordInjection.rb:116:5:116:9 | uidEq | ActiveRecordInjection.rb:120:28:120:32 | uidEq | provenance | | -| ActiveRecordInjection.rb:120:20:120:32 | ... + ... [element] | ActiveRecordInjection.rb:120:20:120:32 | ... + ... | provenance | | -| ActiveRecordInjection.rb:120:28:120:32 | uidEq | ActiveRecordInjection.rb:120:20:120:32 | ... + ... [element] | provenance | | -| ActiveRecordInjection.rb:153:21:153:26 | call to params | ActiveRecordInjection.rb:153:21:153:44 | ...[...] | provenance | | -| ActiveRecordInjection.rb:153:21:153:26 | call to params | ActiveRecordInjection.rb:153:21:153:44 | ...[...] | provenance | | -| ActiveRecordInjection.rb:153:21:153:44 | ...[...] | ActiveRecordInjection.rb:20:22:20:30 | condition | provenance | | -| ActiveRecordInjection.rb:167:59:167:64 | call to params | ActiveRecordInjection.rb:167:59:167:74 | ...[...] | provenance | | -| ActiveRecordInjection.rb:167:59:167:74 | ...[...] | ActiveRecordInjection.rb:167:27:167:76 | "this is an unsafe annotation:..." | provenance | | -| ActiveRecordInjection.rb:178:5:178:13 | my_params | ActiveRecordInjection.rb:179:47:179:55 | my_params | provenance | | -| ActiveRecordInjection.rb:178:17:178:32 | call to permitted_params | ActiveRecordInjection.rb:178:5:178:13 | my_params | provenance | | -| ActiveRecordInjection.rb:179:5:179:9 | query | ActiveRecordInjection.rb:180:37:180:41 | query | provenance | | -| ActiveRecordInjection.rb:179:47:179:55 | my_params | ActiveRecordInjection.rb:179:47:179:65 | ...[...] | provenance | | -| ActiveRecordInjection.rb:179:47:179:65 | ...[...] | ActiveRecordInjection.rb:179:5:179:9 | query | provenance | | -| ActiveRecordInjection.rb:185:5:185:10 | call to params | ActiveRecordInjection.rb:185:5:185:27 | call to require | provenance | | -| ActiveRecordInjection.rb:185:5:185:27 | call to require | ActiveRecordInjection.rb:185:5:185:59 | call to permit | provenance | | -| ActiveRecordInjection.rb:185:5:185:59 | call to permit | ActiveRecordInjection.rb:178:17:178:32 | call to permitted_params | provenance | | -| ActiveRecordInjection.rb:185:5:185:59 | call to permit | ActiveRecordInjection.rb:189:77:189:92 | call to permitted_params | provenance | | -| ActiveRecordInjection.rb:185:5:185:59 | call to permit | ActiveRecordInjection.rb:190:69:190:84 | call to permitted_params | provenance | | -| ActiveRecordInjection.rb:189:77:189:92 | call to permitted_params | ActiveRecordInjection.rb:189:77:189:102 | ...[...] | provenance | | -| ActiveRecordInjection.rb:189:77:189:102 | ...[...] | ActiveRecordInjection.rb:189:43:189:104 | "SELECT * FROM users WHERE id ..." | provenance | | -| ActiveRecordInjection.rb:190:69:190:84 | call to permitted_params | ActiveRecordInjection.rb:190:69:190:94 | ...[...] | provenance | | -| ActiveRecordInjection.rb:190:69:190:94 | ...[...] | ActiveRecordInjection.rb:190:35:190:96 | "SELECT * FROM users WHERE id ..." | provenance | | +| ActiveRecordInjection.rb:108:26:108:31 | call to params | ActiveRecordInjection.rb:108:26:108:40 | ...[...] | provenance | | +| ActiveRecordInjection.rb:109:28:109:33 | call to params | ActiveRecordInjection.rb:109:28:109:42 | ...[...] | provenance | | +| ActiveRecordInjection.rb:110:30:110:35 | call to params | ActiveRecordInjection.rb:110:30:110:47 | ...[...] | provenance | | +| ActiveRecordInjection.rb:110:30:110:47 | ...[...] | ActiveRecordInjection.rb:110:25:110:49 | "b #{...}" | provenance | | +| ActiveRecordInjection.rb:111:32:111:37 | call to params | ActiveRecordInjection.rb:111:32:111:49 | ...[...] | provenance | | +| ActiveRecordInjection.rb:111:32:111:49 | ...[...] | ActiveRecordInjection.rb:111:27:111:51 | "b #{...}" | provenance | | +| ActiveRecordInjection.rb:112:21:112:26 | call to params | ActiveRecordInjection.rb:112:21:112:35 | ...[...] | provenance | | +| ActiveRecordInjection.rb:113:21:113:26 | call to params | ActiveRecordInjection.rb:113:21:113:35 | ...[...] | provenance | | +| ActiveRecordInjection.rb:114:20:114:25 | call to params | ActiveRecordInjection.rb:114:20:114:34 | ...[...] | provenance | | +| ActiveRecordInjection.rb:116:23:116:28 | call to params | ActiveRecordInjection.rb:116:23:116:47 | ...[...] | provenance | | +| ActiveRecordInjection.rb:122:5:122:6 | ps | ActiveRecordInjection.rb:123:11:123:12 | ps | provenance | | +| ActiveRecordInjection.rb:122:10:122:15 | call to params | ActiveRecordInjection.rb:122:5:122:6 | ps | provenance | | +| ActiveRecordInjection.rb:123:5:123:7 | uid | ActiveRecordInjection.rb:124:5:124:9 | uidEq | provenance | | +| ActiveRecordInjection.rb:123:11:123:12 | ps | ActiveRecordInjection.rb:123:11:123:17 | ...[...] | provenance | | +| ActiveRecordInjection.rb:123:11:123:17 | ...[...] | ActiveRecordInjection.rb:123:5:123:7 | uid | provenance | | +| ActiveRecordInjection.rb:124:5:124:9 | uidEq | ActiveRecordInjection.rb:128:20:128:32 | ... + ... | provenance | | +| ActiveRecordInjection.rb:124:5:124:9 | uidEq | ActiveRecordInjection.rb:128:28:128:32 | uidEq | provenance | | +| ActiveRecordInjection.rb:128:20:128:32 | ... + ... [element] | ActiveRecordInjection.rb:128:20:128:32 | ... + ... | provenance | | +| ActiveRecordInjection.rb:128:28:128:32 | uidEq | ActiveRecordInjection.rb:128:20:128:32 | ... + ... [element] | provenance | | +| ActiveRecordInjection.rb:161:21:161:26 | call to params | ActiveRecordInjection.rb:161:21:161:44 | ...[...] | provenance | | +| ActiveRecordInjection.rb:161:21:161:26 | call to params | ActiveRecordInjection.rb:161:21:161:44 | ...[...] | provenance | | +| ActiveRecordInjection.rb:161:21:161:44 | ...[...] | ActiveRecordInjection.rb:20:22:20:30 | condition | provenance | | +| ActiveRecordInjection.rb:175:59:175:64 | call to params | ActiveRecordInjection.rb:175:59:175:74 | ...[...] | provenance | | +| ActiveRecordInjection.rb:175:59:175:74 | ...[...] | ActiveRecordInjection.rb:175:27:175:76 | "this is an unsafe annotation:..." | provenance | | +| ActiveRecordInjection.rb:186:5:186:13 | my_params | ActiveRecordInjection.rb:187:47:187:55 | my_params | provenance | | +| ActiveRecordInjection.rb:186:17:186:32 | call to permitted_params | ActiveRecordInjection.rb:186:5:186:13 | my_params | provenance | | +| ActiveRecordInjection.rb:187:5:187:9 | query | ActiveRecordInjection.rb:188:37:188:41 | query | provenance | | +| ActiveRecordInjection.rb:187:47:187:55 | my_params | ActiveRecordInjection.rb:187:47:187:65 | ...[...] | provenance | | +| ActiveRecordInjection.rb:187:47:187:65 | ...[...] | ActiveRecordInjection.rb:187:5:187:9 | query | provenance | | +| ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:193:5:193:27 | call to require | provenance | | +| ActiveRecordInjection.rb:193:5:193:27 | call to require | ActiveRecordInjection.rb:193:5:193:59 | call to permit | provenance | | +| ActiveRecordInjection.rb:193:5:193:59 | call to permit | ActiveRecordInjection.rb:186:17:186:32 | call to permitted_params | provenance | | +| ActiveRecordInjection.rb:193:5:193:59 | call to permit | ActiveRecordInjection.rb:197:77:197:92 | call to permitted_params | provenance | | +| ActiveRecordInjection.rb:193:5:193:59 | call to permit | ActiveRecordInjection.rb:198:69:198:84 | call to permitted_params | provenance | | +| ActiveRecordInjection.rb:197:77:197:92 | call to permitted_params | ActiveRecordInjection.rb:197:77:197:102 | ...[...] | provenance | | +| ActiveRecordInjection.rb:197:77:197:102 | ...[...] | ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | provenance | | +| ActiveRecordInjection.rb:198:69:198:84 | call to permitted_params | ActiveRecordInjection.rb:198:69:198:94 | ...[...] | provenance | | +| ActiveRecordInjection.rb:198:69:198:94 | ...[...] | ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | provenance | | | ArelInjection.rb:4:5:4:8 | name | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | provenance | | | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:4:12:4:29 | ...[...] | provenance | | | ArelInjection.rb:4:12:4:29 | ...[...] | ArelInjection.rb:4:5:4:8 | name | provenance | | @@ -133,38 +142,54 @@ nodes | ActiveRecordInjection.rb:104:30:104:51 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:106:18:106:23 | call to params | semmle.label | call to params | | ActiveRecordInjection.rb:106:18:106:35 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:108:23:108:28 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:108:23:108:47 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:114:5:114:6 | ps | semmle.label | ps | -| ActiveRecordInjection.rb:114:10:114:15 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:115:5:115:7 | uid | semmle.label | uid | -| ActiveRecordInjection.rb:115:11:115:12 | ps | semmle.label | ps | -| ActiveRecordInjection.rb:115:11:115:17 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:116:5:116:9 | uidEq | semmle.label | uidEq | -| ActiveRecordInjection.rb:120:20:120:32 | ... + ... | semmle.label | ... + ... | -| ActiveRecordInjection.rb:120:20:120:32 | ... + ... [element] | semmle.label | ... + ... [element] | -| ActiveRecordInjection.rb:120:28:120:32 | uidEq | semmle.label | uidEq | -| ActiveRecordInjection.rb:153:21:153:26 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:153:21:153:44 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:153:21:153:44 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:167:27:167:76 | "this is an unsafe annotation:..." | semmle.label | "this is an unsafe annotation:..." | -| ActiveRecordInjection.rb:167:59:167:64 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:167:59:167:74 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:178:5:178:13 | my_params | semmle.label | my_params | -| ActiveRecordInjection.rb:178:17:178:32 | call to permitted_params | semmle.label | call to permitted_params | -| ActiveRecordInjection.rb:179:5:179:9 | query | semmle.label | query | -| ActiveRecordInjection.rb:179:47:179:55 | my_params | semmle.label | my_params | -| ActiveRecordInjection.rb:179:47:179:65 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:180:37:180:41 | query | semmle.label | query | -| ActiveRecordInjection.rb:185:5:185:10 | call to params | semmle.label | call to params | -| ActiveRecordInjection.rb:185:5:185:27 | call to require | semmle.label | call to require | -| ActiveRecordInjection.rb:185:5:185:59 | call to permit | semmle.label | call to permit | -| ActiveRecordInjection.rb:189:43:189:104 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | -| ActiveRecordInjection.rb:189:77:189:92 | call to permitted_params | semmle.label | call to permitted_params | -| ActiveRecordInjection.rb:189:77:189:102 | ...[...] | semmle.label | ...[...] | -| ActiveRecordInjection.rb:190:35:190:96 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | -| ActiveRecordInjection.rb:190:69:190:84 | call to permitted_params | semmle.label | call to permitted_params | -| ActiveRecordInjection.rb:190:69:190:94 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:108:26:108:31 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:108:26:108:40 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:109:28:109:33 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:109:28:109:42 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:110:25:110:49 | "b #{...}" | semmle.label | "b #{...}" | +| ActiveRecordInjection.rb:110:30:110:35 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:110:30:110:47 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:111:27:111:51 | "b #{...}" | semmle.label | "b #{...}" | +| ActiveRecordInjection.rb:111:32:111:37 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:111:32:111:49 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:112:21:112:26 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:112:21:112:35 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:113:21:113:26 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:113:21:113:35 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:114:20:114:25 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:114:20:114:34 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:116:23:116:28 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:116:23:116:47 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:122:5:122:6 | ps | semmle.label | ps | +| ActiveRecordInjection.rb:122:10:122:15 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:123:5:123:7 | uid | semmle.label | uid | +| ActiveRecordInjection.rb:123:11:123:12 | ps | semmle.label | ps | +| ActiveRecordInjection.rb:123:11:123:17 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:124:5:124:9 | uidEq | semmle.label | uidEq | +| ActiveRecordInjection.rb:128:20:128:32 | ... + ... | semmle.label | ... + ... | +| ActiveRecordInjection.rb:128:20:128:32 | ... + ... [element] | semmle.label | ... + ... [element] | +| ActiveRecordInjection.rb:128:28:128:32 | uidEq | semmle.label | uidEq | +| ActiveRecordInjection.rb:161:21:161:26 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:161:21:161:44 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:161:21:161:44 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:175:27:175:76 | "this is an unsafe annotation:..." | semmle.label | "this is an unsafe annotation:..." | +| ActiveRecordInjection.rb:175:59:175:64 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:175:59:175:74 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:186:5:186:13 | my_params | semmle.label | my_params | +| ActiveRecordInjection.rb:186:17:186:32 | call to permitted_params | semmle.label | call to permitted_params | +| ActiveRecordInjection.rb:187:5:187:9 | query | semmle.label | query | +| ActiveRecordInjection.rb:187:47:187:55 | my_params | semmle.label | my_params | +| ActiveRecordInjection.rb:187:47:187:65 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:188:37:188:41 | query | semmle.label | query | +| ActiveRecordInjection.rb:193:5:193:10 | call to params | semmle.label | call to params | +| ActiveRecordInjection.rb:193:5:193:27 | call to require | semmle.label | call to require | +| ActiveRecordInjection.rb:193:5:193:59 | call to permit | semmle.label | call to permit | +| ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | +| ActiveRecordInjection.rb:197:77:197:92 | call to permitted_params | semmle.label | call to permitted_params | +| ActiveRecordInjection.rb:197:77:197:102 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | +| ActiveRecordInjection.rb:198:69:198:84 | call to permitted_params | semmle.label | call to permitted_params | +| ActiveRecordInjection.rb:198:69:198:94 | ...[...] | semmle.label | ...[...] | | ArelInjection.rb:4:5:4:8 | name | semmle.label | name | | ArelInjection.rb:4:12:4:17 | call to params | semmle.label | call to params | | ArelInjection.rb:4:12:4:29 | ...[...] | semmle.label | ...[...] | @@ -186,7 +211,7 @@ subpaths #select | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | ActiveRecordInjection.rb:70:23:70:28 | call to params | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:70:23:70:28 | call to params | user-provided value | | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | ActiveRecordInjection.rb:70:38:70:43 | call to params | ActiveRecordInjection.rb:10:33:10:67 | "name='#{...}' and pass='#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:70:38:70:43 | call to params | user-provided value | -| ActiveRecordInjection.rb:23:16:23:24 | condition | ActiveRecordInjection.rb:153:21:153:26 | call to params | ActiveRecordInjection.rb:23:16:23:24 | condition | This SQL query depends on a $@. | ActiveRecordInjection.rb:153:21:153:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:23:16:23:24 | condition | ActiveRecordInjection.rb:161:21:161:26 | call to params | ActiveRecordInjection.rb:23:16:23:24 | condition | This SQL query depends on a $@. | ActiveRecordInjection.rb:161:21:161:26 | call to params | user-provided value | | ActiveRecordInjection.rb:35:30:35:44 | ...[...] | ActiveRecordInjection.rb:35:30:35:35 | call to params | ActiveRecordInjection.rb:35:30:35:44 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:35:30:35:35 | call to params | user-provided value | | ActiveRecordInjection.rb:39:18:39:32 | ...[...] | ActiveRecordInjection.rb:39:18:39:23 | call to params | ActiveRecordInjection.rb:39:18:39:32 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:39:18:39:23 | call to params | user-provided value | | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | ActiveRecordInjection.rb:43:29:43:34 | call to params | ActiveRecordInjection.rb:43:20:43:42 | "id = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:43:29:43:34 | call to params | user-provided value | @@ -204,13 +229,20 @@ subpaths | ActiveRecordInjection.rb:100:20:100:55 | "name = '#{...}'" | ActiveRecordInjection.rb:100:31:100:36 | call to params | ActiveRecordInjection.rb:100:20:100:55 | "name = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:100:31:100:36 | call to params | user-provided value | | ActiveRecordInjection.rb:104:19:104:54 | "name = '#{...}'" | ActiveRecordInjection.rb:104:30:104:35 | call to params | ActiveRecordInjection.rb:104:19:104:54 | "name = '#{...}'" | This SQL query depends on a $@. | ActiveRecordInjection.rb:104:30:104:35 | call to params | user-provided value | | ActiveRecordInjection.rb:106:18:106:35 | ...[...] | ActiveRecordInjection.rb:106:18:106:23 | call to params | ActiveRecordInjection.rb:106:18:106:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:106:18:106:23 | call to params | user-provided value | -| ActiveRecordInjection.rb:108:23:108:47 | ...[...] | ActiveRecordInjection.rb:108:23:108:28 | call to params | ActiveRecordInjection.rb:108:23:108:47 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:108:23:108:28 | call to params | user-provided value | -| ActiveRecordInjection.rb:120:20:120:32 | ... + ... | ActiveRecordInjection.rb:114:10:114:15 | call to params | ActiveRecordInjection.rb:120:20:120:32 | ... + ... | This SQL query depends on a $@. | ActiveRecordInjection.rb:114:10:114:15 | call to params | user-provided value | -| ActiveRecordInjection.rb:153:21:153:44 | ...[...] | ActiveRecordInjection.rb:153:21:153:26 | call to params | ActiveRecordInjection.rb:153:21:153:44 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:153:21:153:26 | call to params | user-provided value | -| ActiveRecordInjection.rb:167:27:167:76 | "this is an unsafe annotation:..." | ActiveRecordInjection.rb:167:59:167:64 | call to params | ActiveRecordInjection.rb:167:27:167:76 | "this is an unsafe annotation:..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:167:59:167:64 | call to params | user-provided value | -| ActiveRecordInjection.rb:180:37:180:41 | query | ActiveRecordInjection.rb:185:5:185:10 | call to params | ActiveRecordInjection.rb:180:37:180:41 | query | This SQL query depends on a $@. | ActiveRecordInjection.rb:185:5:185:10 | call to params | user-provided value | -| ActiveRecordInjection.rb:189:43:189:104 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:185:5:185:10 | call to params | ActiveRecordInjection.rb:189:43:189:104 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:185:5:185:10 | call to params | user-provided value | -| ActiveRecordInjection.rb:190:35:190:96 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:185:5:185:10 | call to params | ActiveRecordInjection.rb:190:35:190:96 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:185:5:185:10 | call to params | user-provided value | +| ActiveRecordInjection.rb:108:26:108:40 | ...[...] | ActiveRecordInjection.rb:108:26:108:31 | call to params | ActiveRecordInjection.rb:108:26:108:40 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:108:26:108:31 | call to params | user-provided value | +| ActiveRecordInjection.rb:109:28:109:42 | ...[...] | ActiveRecordInjection.rb:109:28:109:33 | call to params | ActiveRecordInjection.rb:109:28:109:42 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:109:28:109:33 | call to params | user-provided value | +| ActiveRecordInjection.rb:110:25:110:49 | "b #{...}" | ActiveRecordInjection.rb:110:30:110:35 | call to params | ActiveRecordInjection.rb:110:25:110:49 | "b #{...}" | This SQL query depends on a $@. | ActiveRecordInjection.rb:110:30:110:35 | call to params | user-provided value | +| ActiveRecordInjection.rb:111:27:111:51 | "b #{...}" | ActiveRecordInjection.rb:111:32:111:37 | call to params | ActiveRecordInjection.rb:111:27:111:51 | "b #{...}" | This SQL query depends on a $@. | ActiveRecordInjection.rb:111:32:111:37 | call to params | user-provided value | +| ActiveRecordInjection.rb:112:21:112:35 | ...[...] | ActiveRecordInjection.rb:112:21:112:26 | call to params | ActiveRecordInjection.rb:112:21:112:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:112:21:112:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:113:21:113:35 | ...[...] | ActiveRecordInjection.rb:113:21:113:26 | call to params | ActiveRecordInjection.rb:113:21:113:35 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:113:21:113:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:114:20:114:34 | ...[...] | ActiveRecordInjection.rb:114:20:114:25 | call to params | ActiveRecordInjection.rb:114:20:114:34 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:114:20:114:25 | call to params | user-provided value | +| ActiveRecordInjection.rb:116:23:116:47 | ...[...] | ActiveRecordInjection.rb:116:23:116:28 | call to params | ActiveRecordInjection.rb:116:23:116:47 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:116:23:116:28 | call to params | user-provided value | +| ActiveRecordInjection.rb:128:20:128:32 | ... + ... | ActiveRecordInjection.rb:122:10:122:15 | call to params | ActiveRecordInjection.rb:128:20:128:32 | ... + ... | This SQL query depends on a $@. | ActiveRecordInjection.rb:122:10:122:15 | call to params | user-provided value | +| ActiveRecordInjection.rb:161:21:161:44 | ...[...] | ActiveRecordInjection.rb:161:21:161:26 | call to params | ActiveRecordInjection.rb:161:21:161:44 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:161:21:161:26 | call to params | user-provided value | +| ActiveRecordInjection.rb:175:27:175:76 | "this is an unsafe annotation:..." | ActiveRecordInjection.rb:175:59:175:64 | call to params | ActiveRecordInjection.rb:175:27:175:76 | "this is an unsafe annotation:..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:175:59:175:64 | call to params | user-provided value | +| ActiveRecordInjection.rb:188:37:188:41 | query | ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:188:37:188:41 | query | This SQL query depends on a $@. | ActiveRecordInjection.rb:193:5:193:10 | call to params | user-provided value | +| ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:193:5:193:10 | call to params | user-provided value | +| ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:193:5:193:10 | call to params | user-provided value | | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value | | PgInjection.rb:14:15:14:18 | qry1 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:14:15:14:18 | qry1 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value | | PgInjection.rb:15:21:15:24 | qry1 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:15:21:15:24 | qry1 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value | From 54d7805e4ae9ce4c4be74cea3d3383ced27bcaea Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 30 Jan 2024 18:07:08 -0500 Subject: [PATCH 058/207] Modify Java threat model link to be Java-specific --- .../customizing-library-models-for-java-and-kotlin.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst index 063bcf1e4a1..233feb4fc8b 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst @@ -61,7 +61,7 @@ Extensible predicates used to create custom models in Java and Kotlin The CodeQL library for Java and Kotlin analysis exposes the following extensible predicates: -- ``sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. The ``kind`` of the sources defined using this predicate determine which threat model they are associated with. Different threat models can be used to customize the sources used in an analysis. For more information, see ":ref:`Threat models `." +- ``sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. The ``kind`` of the sources defined using this predicate determine which threat model they are associated with. Different threat models can be used to customize the sources used in an analysis. For more information, see ":ref:`Threat models `." - ``sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data maybe used in a way that makes the code vulnerable. - ``summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. - ``neutralModel(package, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. @@ -151,7 +151,7 @@ The sixth value should be left empty and is out of scope for this documentation. The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the source. - The seventh value ``ReturnValue`` is the access path to the return of the method, which means that it is the return value that should be considered a source of tainted input. -- The eighth value ``remote`` is the kind of the source. The source kind is used to define the threat model where the source is in scope. ``remote`` applies to many of the security related queries as it means a remote source of untrusted data. As an example the SQL injection query uses ``remote`` sources. For more information, see ":ref:`Threat models `." +- The eighth value ``remote`` is the kind of the source. The source kind is used to define the threat model where the source is in scope. ``remote`` applies to many of the security related queries as it means a remote source of untrusted data. As an example the SQL injection query uses ``remote`` sources. For more information, see ":ref:`Threat models `." - The ninth value ``manual`` is the provenance of the source, which is used to identify the origin of the source. Example: Add flow through the ``concat`` method @@ -292,7 +292,7 @@ The first four values identify the callable (in this case a method) to be modele - The fifth value ``summary`` is the kind of the neutral. - The sixth value ``manual`` is the provenance of the neutral. -.. _threat-models: +.. _threat-models-java: Threat models ------------- From 77ef63a0512fb3a51ba83c720318e852ed4217e5 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Thu, 8 Feb 2024 14:36:47 -0500 Subject: [PATCH 059/207] Modify Java docs to use common models-as-data beta notice --- .../customizing-library-models-for-java-and-kotlin.rst | 2 +- docs/codeql/codeql-language-guides/extensible-predicates.rst | 2 +- docs/codeql/reusables/beta-note-model-packs-java.rst | 5 ----- 3 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 docs/codeql/reusables/beta-note-model-packs-java.rst diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst index 233feb4fc8b..513b488dbe9 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst @@ -7,7 +7,7 @@ You can model the methods and callables that control data flow in any framework .. include:: ../reusables/kotlin-beta-note.rst -.. include:: ../reusables/beta-note-model-packs-java.rst +.. include:: ../reusables/beta-note-customizing-library-models.rst About this article ------------------ diff --git a/docs/codeql/codeql-language-guides/extensible-predicates.rst b/docs/codeql/codeql-language-guides/extensible-predicates.rst index 0ed962df4af..7b00f09785e 100644 --- a/docs/codeql/codeql-language-guides/extensible-predicates.rst +++ b/docs/codeql/codeql-language-guides/extensible-predicates.rst @@ -8,7 +8,7 @@ Extensible predicates and their interaction with data extensions You can use data extensions to model the methods and callables that control dataflow in any framework or library. This is especially useful for custom frameworks or niche libraries, that are not supported by the standard CodeQL libraries. -.. include:: ../reusables/beta-note-model-packs-java.rst +.. include:: ../reusables/beta-note-customizing-library-models.rst About this article ------------------ diff --git a/docs/codeql/reusables/beta-note-model-packs-java.rst b/docs/codeql/reusables/beta-note-model-packs-java.rst deleted file mode 100644 index 049621a57f7..00000000000 --- a/docs/codeql/reusables/beta-note-model-packs-java.rst +++ /dev/null @@ -1,5 +0,0 @@ -.. pull-quote:: - - Note - - CodeQL model packs are currently in beta and subject to change. During the beta, model packs are supported only by Java/Kotlin analysis. To use this beta functionality, install the latest version of the CodeQL CLI bundle from: https://github.com/github/codeql-action/releases. From 698109ae10278a1e1406385ebccc556ef41532bc Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 30 Jan 2024 18:08:01 -0500 Subject: [PATCH 060/207] Introduce C# MaD documentation --- .../codeql-for-csharp.rst | 2 + .../customizing-library-models-for-csharp.rst | 351 ++++++++++++++++++ 2 files changed, 353 insertions(+) create mode 100644 docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst diff --git a/docs/codeql/codeql-language-guides/codeql-for-csharp.rst b/docs/codeql/codeql-language-guides/codeql-for-csharp.rst index 9b692094841..42122129c2b 100644 --- a/docs/codeql/codeql-language-guides/codeql-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/codeql-for-csharp.rst @@ -11,6 +11,7 @@ Experiment and learn how to write effective and efficient queries for CodeQL dat basic-query-for-csharp-code codeql-library-for-csharp analyzing-data-flow-in-csharp + customizing-library-models-for-csharp - :doc:`Basic query for C# code `: Learn to write and run a simple CodeQL query. @@ -18,4 +19,5 @@ Experiment and learn how to write effective and efficient queries for CodeQL dat - :doc:`Analyzing data flow in C# `: You can use CodeQL to track the flow of data through a C# program to its use. +- :doc:`Customizing library models for C# `: You can model frameworks and libraries that your code base depends on using data extensions and publish them as CodeQL model packs. diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst new file mode 100644 index 00000000000..4a3137cec80 --- /dev/null +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -0,0 +1,351 @@ +.. _customizing-library-models-for-csharp: + +Customizing library models for C# +================================= + +You can model the methods and callables that control data flow in any framework or library. This is especially useful for custom frameworks or niche libraries, that are not supported by the standard CodeQL libraries. + +.. include:: ../reusables/beta-note-customizing-library-models.rst + +About this article +------------------ + +This article contains reference material about how to define custom models for sources, sinks and flow summaries for C# dependencies in data extension files. + +The best way to create your own models is using the CodeQL model editor in the CodeQL extension for Visual Studio Code. The model editor automatically guides you through the process of defining models, displaying the properties you need to define and the options available. You can save the resulting models as data extension files in CodeQL model packs and use them without worrying about the syntax. + +For more information, see ":ref:`Using the CodeQL model editor `." + +About data extensions +--------------------- + +You can customize analysis by defining models (summaries, sinks, and sources) of your code's C#/.NET dependencies in data extension files. Each model defines the behavior of one or more elements of your library or framework, such as methods, properties, and callables. When you run dataflow analysis, these models expand the potential sources and sinks tracked by dataflow analysis and improve the precision of results. + +Most of the security queries search for paths from a source of untrusted input to a sink that represents a vulnerability. This is known as taint tracking. Each source is a starting point for dataflow analysis to track tainted data and each sink is an end point. + +Taint tracking queries also need to know how data can flow through elements that are not included in the source code. These are modeled as summaries. A summary model enables queries to synthesize the flow behavior through elements in dependency code that is not stored in your repository. + +Syntax used to define an element in an extension file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each model of an element is defined using a data extension where each tuple constitutes a model. +A data extension file to extend the standard C# queries included with CodeQL is a YAML file with the form: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: + data: + - + - + - ... + +Each YAML file may contain one or more top-level extensions. + +- ``addsTo`` defines the CodeQL pack name and extensible predicate that the extension is injected into. +- ``data`` defines one or more rows of tuples that are injected as values into the extensible predicate. The number of columns and their types must match the definition of the extensible predicate. + +Data extensions use union semantics, which means that the tuples of all extensions for a single extensible predicate are combined, duplicates are removed, and all of the remaining tuples are queryable by referencing the extensible predicate. + +Publish data extension files in a CodeQL model pack to share +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can group one or more data extension files into a CodeQL model pack and publish it to the GitHub Container Registry. This makes it easy for anyone to download the model pack and use it to extend their analysis. For more information, see `Creating a CodeQL model pack `__ and `Publishing and using CodeQL packs `__ in the CodeQL CLI documentation. + +Extensible predicates used to create custom models in C# +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The CodeQL library for C# analysis exposes the following extensible predicates: + +- ``sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. The ``kind`` of the sources defined using this predicate determine which threat model they are associated with. Different threat models can be used to customize the sources used in an analysis. For more information, see ":ref:`Threat models `." +- ``sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data maybe used in a way that makes the code vulnerable. +- ``summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. +- ``neutralModel(namespace, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. + +The extensible predicates are populated using the models defined in data extension files. + +Examples of custom model definitions +------------------------------------ + +The examples in this section are taken from the standard CodeQL C# query pack published by GitHub. They demonstrate how to add tuples to extend extensible predicates that are used by the standard queries. + +Example: Taint sink in the ``System.Data.SqlClient`` namespace +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This example shows how the C# query pack models the argument of the ``SqlCommand`` constructor as a SQL injection sink. +This is the constructor of the ``SqlCommand`` class, which is located in the ``System.Data.SqlClient`` namespace. + +.. code-block:: csharp + + public static void TaintSink(SqlConnection conn, string query) { + using (connection) { + SqlCommand command = new SqlCommand(query, connection) // The argument to this method is a SQL injection sink. + ... + } + } + +We need to add a tuple to the ``sinkModel``\(namespace, type, subtypes, name, signature, ext, input, kind, provenance) extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: sinkModel + data: + - ["System.Data.SqlClient", "SqlCommand", False, "SqlCommand", "(System.String,System.Data.SqlClient.SqlConnection)", "", "Argument[0]", "sql-injection", "manual"] + +Since we want to add a new sink, we need to add a tuple to the ``sinkModel`` extensible predicate. +The first five values identify the callable (in this case a method) to be modeled as a sink. + +- The first value ``System.Data.SqlClient`` is the namespace name. +- The second value ``SqlCommand`` is the name of the class (type) that contains the method. +- The third value ``False`` is a flag that indicates whether or not the sink also applies to all overrides of the method. +- The fourth value ``SqlCommand`` is the method name. Constructors are named after the class. +- The fifth value ``(System.String,System.Data.SqlClient.SqlConnection)`` is the method input type signature. The type names must be fully qualified. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the sink. + +- The seventh value ``Argument[0]`` is the ``access path`` to the first argument passed to the method, which means that this is the location of the sink. +- The eighth value ``sql-injection`` is the kind of the sink. The sink kind is used to define the queries where the sink is in scope. In this case - the SQL injection queries. +- The ninth value ``manual`` is the provenance of the sink, which is used to identify the origin of the sink. + +Example: Taint source from the ``System.Net.Sockets`` namespace +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how the C# query pack models the return value from the ``GetStream`` method as a ``remote`` source. +This is the ``GetStream`` method in the ``TcpClient`` class, which is located in the ``System.Net.Sockets`` namespace. + +.. code-block:: csharp + + public static void Tainted(TcpClient client) { + NetworkStream stream = client.GetStream(); // The return value of this method is a remote source of taint. + ... + } + +We need to add a tuple to the ``sourceModel``\(namespace, type, subtypes, name, signature, ext, output, kind, provenance) extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: sourceModel + data: + - ["System.Net.Sockets", "TcpClient", False, "GetStream", "()", "", "ReturnValue", "remote", "manual"] + + +Since we are adding a new source, we need to add a tuple to the ``sourceModel`` extensible predicate. +The first five values identify the callable (in this case a method) to be modeled as a source. + +- The first value ``System.Net.Sockets`` is the namespace name. +- The second value ``TcpClient`` is the name of the class (type) that contains the source. +- The third value ``False`` is a flag that indicates whether or not the source also applies to all overrides of the method. +- The fourth value ``GetStream`` is the method name. +- The fifth value ``()`` is the method input type signature. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the source. + +- The seventh value ``ReturnValue`` is the access path to the return of the method, which means that it is the return value that should be considered a source of tainted input. +- The eighth value ``remote`` is the kind of the source. The source kind is used to define the threat model where the source is in scope. ``remote`` applies to many of the security related queries as it means a remote source of untrusted data. As an example the SQL injection query uses ``remote`` sources. For more information, see ":ref:`Threat models `." +- The ninth value ``manual`` is the provenance of the source, which is used to identify the origin of the source. + +Example: Add flow through the ``Concat`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how the C# query pack models flow through a method for a simple case. +This pattern covers many of the cases where we need to summarize flow through a method that is stored in a library or framework outside the repository. + +.. code-block:: csharp + + public static void TaintFlow(string s1, string s2) { + string t = String.Concat(s1, s2); // There is taint flow from s1 and s2 to t. + ... + } + +We need to add tuples to the ``summaryModel``\(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance) extensible predicate by updating a data extension file: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System", "String", False, "Concat", "(System.Object,System.Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["System", "String", False, "Concat", "(System.Object,System.Object)", "", "Argument[1]", "ReturnValue", "taint", "manual"] + +Since we are adding flow through a method, we need to add tuples to the ``summaryModel`` extensible predicate. +Each tuple defines flow from one argument to the return value. +The first row defines flow from the first argument (``s1`` in the example) to the return value (``t`` in the example) and the second row defines flow from the second argument (``s2`` in the example) to the return value (``t`` in the example). + +The first five values identify the callable (in this case a method) to be modeled as a summary. +These are the same for both of the rows above as we are adding two summaries for the same method. + +- The first value ``System`` is the namespace name. +- The second value ``String`` is the class (type) name. +- The third value ``False`` is a flag that indicates whether or not the summary also applies to all overrides of the method. +- The fourth value ``Concat`` is the method name. +- The fifth value ``(System.Object,System.Object)`` is the method input type signature. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the summary. + +- The seventh value is the access path to the input (where data flows from). ``Argument[0]`` is the access path to the first argument (``s1`` in the example) and ``Argument[1]`` is the access path to the second argument (``s2`` in the example). +- The eighth value ``ReturnValue`` is the access path to the output (where data flows to), in this case ``ReturnValue``, which means that the input flows to the return value. +- The ninth value ``taint`` is the kind of the flow. ``taint`` means that taint is propagated through the call. +- The tenth value ``manual`` is the provenance of the summary, which is used to identify the origin of the summary. + +Example: Add flow through the ``Trim`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how the C# query pack models flow through a method for a simple case. + +.. code-block:: csharp + + public static void TaintFlow(string s) { + string t = s.Trim(); // There is taint flow from s to t. + ... + } + +We need to add a tuple to the ``summaryModel``\(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance) extensible predicate by updating a data extension file: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System", "String", False, "Trim", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + +Since we are adding flow through a method, we need to add tuples to the ``summaryModel`` extensible predicate. +Each tuple defines flow from one argument to the return value. +The first row defines flow from the qualifier of the method call (``s1`` in the example) to the return value (``t`` in the example). + +The first five values identify the callable (in this case a method) to be modeled as a summary. +These are the same for both of the rows above as we are adding two summaries for the same method. + +- The first value ``System`` is the namespace name. +- The second value ``String`` is the class (type) name. +- The third value ``False`` is a flag that indicates whether or not the summary also applies to all overrides of the method. +- The fourth value ``Trim`` is the method name. +- The fifth value ``()`` is the method input type signature. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the summary. + +- The seventh value is the access path to the input (where data flows from). ``Argument[this]`` is the access path to the qualifier (``s`` in the example). +- The eighth value ``ReturnValue`` is the access path to the output (where data flows to), in this case ``ReturnValue``, which means that the input flows to the return value. +- The ninth value ``taint`` is the kind of the flow. ``taint`` means that taint is propagated through the call. +- The tenth value ``manual`` is the provenance of the summary, which is used to identify the origin of the summary. + +Example: Add flow through the ``Select`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how the C# query pack models a more complex flow through a method. +Here we model flow through higher order methods and collection types, as well as how to handle extension methods and generics. + +.. code-block:: csharp + + public static void TaintFlow(IEnumerable stream) { + IEnumerable lines = stream.Select(item => item + "\n"); + ... + } + +We need to add tuples to the ``summaryModel``\(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance) extensible predicate by updating a data extension file: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System.Linq", "Enumerable", False, "Select", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] + - ["System.Linq", "Enumerable", False, "Select", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[1].ReturnValue", "ReturnValue.Element", "value", "manual"] + + +Since we are adding flow through a method, we need to add tuples to the ``summaryModel`` extensible predicate. +Each tuple defines part of the flow that comprises the total flow through the ``Select`` method. +The first five values identify the callable (in this case a method) to be modeled as a summary. +These are the same for both of the rows above as we are adding two summaries for the same method. + +- The first value ``System.Linq`` is the namespace name. +- The second value ``Enumerable`` is the class (type) name. +- The third value ``False`` is a flag that indicates whether or not the summary also applies to all overrides of the method. +- The fourth value ``Select`` is the method name, along with the generics for the method. The names of the generic type parameters provided in the model must match the names of the generic type parameters in the method signature in the source code. +- The fifth value ``(System.Collections.Generic.IEnumerable,System.Func)`` is the method input type signature. The generics in the signature must match the generics in the method signature in the source code. + +The sixth value should be left empty and is out of scope for this documentation. +The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the summary definition. + +- The seventh value is the access path to the ``input`` (where data flows from). +- The eighth value is the access path to the ``output`` (where data flows to). + +For the first row: + +- The seventh value is ``Argument[this].Element``, which is the access path to the elements of the qualifier (the elements of the enumerable ``stream`` in the example). +- The eight value is ``Argument[0].Parameter[0]``, which is the access path to the first parameter of the ``System.Func`` argument of ``Select`` (the lambda parameter ``item`` in the example). + +For the second row: + +- The seventh value is ``Argument[0].ReturnValue``, which is the access path to the return value of the ``System.Func`` argument of ``Select`` (the return value of the lambda in the example). +- The eighth value is ``ReturnValue.Element``, which is the access path to the elements of the return value of ``Select`` (the elements of the enumerable ``lines`` in the example). + +For the remaining values for both rows: + +- The ninth value ``value`` is the kind of the flow. ``value`` means that the value is preserved. +- The tenth value ``manual`` is the provenance of the summary, which is used to identify the origin of the summary. + +That is, the first row specifies that values can flow from the elements of the qualifier enumerable into the first argument of the function provided to ``Select``. The second row specifies that values can flow from the return value of the function to the elements of the enumerable returned from ``Select``. + +Example: Add a ``neutral`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example shows how we can model a method as being neutral with respect to flow. We will also cover how to model a property by modeling the getter of the ``Now`` property of the ``DateTime`` class as neutral. +A neutral model is used to define that there is no flow through a method. + +.. code-block:: csharp + + public static void TaintFlow() { + System.DateTime t = System.DateTime.Now; // There is no flow from Now to t. + ... + } + +We need to add a tuple to the ``neutralModel``\(namespace, type, name, signature, kind, provenance) extensible predicate by updating a data extension file. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: neutralModel + data: + - ["System", "DateTime", "get_Now", "()", "summary", "manual"] + + +Since we are adding a neutral model, we need to add tuples to the ``neutralModel`` extensible predicate. +The first four values identify the callable (in this case the getter of the ``Now`` property) to be modeled as a neutral, the fifth value is the kind, and the sixth value is the provenance (origin) of the neutral. + +- The first value ``System`` is the namespace name. +- The second value ``DateTime`` is the class (type) name. +- The third value ``get_Now`` is the method name. Getter and setter methods are named ``get_`` and ``set_`` respectively. +- The fourth value ``()`` is the method input type signature. +- The fifth value ``summary`` is the kind of the neutral. +- The sixth value ``manual`` is the provenance of the neutral. + +.. _threat-models-csharp: + +Threat models +------------- + +.. include:: ../reusables/beta-note-threat-models-java.rst + +A threat model is a named class of dataflow sources that can be enabled or disabled independently. Threat models allow you to control the set of dataflow sources that you want to consider unsafe. For example, one codebase may only consider remote HTTP requests to be tainted, whereas another may also consider data from local files to be unsafe. You can use threat models to ensure that the relevant taint sources are used in a CodeQL analysis. + +The ``kind`` property of the ``sourceModel`` determines which threat model a source is associated with. There are two main categories: + +- ``remote`` which represents requests and responses from the network. +- ``local`` which represents data from local files (``file``), command-line arguments (``commandargs``), database reads (``database``), and environment variables(``environment``). + +When running a CodeQL analysis, the ``remote`` threat model is included by default. You can optionally include other threat models as appropriate when using the CodeQL CLI and in GitHub code scanning. For more information, see `Analyzing your code with CodeQL queries `__ and `Customizing your advanced setup for code scanning `__. From bb86ce5749d8fff7ed055dc95d62af610662fb0a Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 6 Feb 2024 16:37:44 -0500 Subject: [PATCH 061/207] Remove references to model editor --- .../customizing-library-models-for-csharp.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst index 4a3137cec80..c89ffe12aae 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -12,10 +12,6 @@ About this article This article contains reference material about how to define custom models for sources, sinks and flow summaries for C# dependencies in data extension files. -The best way to create your own models is using the CodeQL model editor in the CodeQL extension for Visual Studio Code. The model editor automatically guides you through the process of defining models, displaying the properties you need to define and the options available. You can save the resulting models as data extension files in CodeQL model packs and use them without worrying about the syntax. - -For more information, see ":ref:`Using the CodeQL model editor `." - About data extensions --------------------- From 65db990c9746e0b0a3845b3431eb61c4853dd760 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 6 Feb 2024 16:53:57 -0500 Subject: [PATCH 062/207] Remove threat model mentions --- .../customizing-library-models-for-csharp.rst | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst index c89ffe12aae..4d2e0dc0442 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -55,7 +55,7 @@ Extensible predicates used to create custom models in C# The CodeQL library for C# analysis exposes the following extensible predicates: -- ``sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. The ``kind`` of the sources defined using this predicate determine which threat model they are associated with. Different threat models can be used to customize the sources used in an analysis. For more information, see ":ref:`Threat models `." +- ``sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. - ``sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data maybe used in a way that makes the code vulnerable. - ``summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. - ``neutralModel(namespace, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. @@ -146,7 +146,7 @@ The sixth value should be left empty and is out of scope for this documentation. The remaining values are used to define the ``access path``, the ``kind``, and the ``provenance`` (origin) of the source. - The seventh value ``ReturnValue`` is the access path to the return of the method, which means that it is the return value that should be considered a source of tainted input. -- The eighth value ``remote`` is the kind of the source. The source kind is used to define the threat model where the source is in scope. ``remote`` applies to many of the security related queries as it means a remote source of untrusted data. As an example the SQL injection query uses ``remote`` sources. For more information, see ":ref:`Threat models `." +- The eighth value ``remote`` is the kind of the source. The source kind is used to define the threat model where the source is in scope. ``remote`` applies to many of the security related queries as it means a remote source of untrusted data. As an example the SQL injection query uses ``remote`` sources. - The ninth value ``manual`` is the provenance of the source, which is used to identify the origin of the source. Example: Add flow through the ``Concat`` method @@ -329,19 +329,3 @@ The first four values identify the callable (in this case the getter of the ``No - The fourth value ``()`` is the method input type signature. - The fifth value ``summary`` is the kind of the neutral. - The sixth value ``manual`` is the provenance of the neutral. - -.. _threat-models-csharp: - -Threat models -------------- - -.. include:: ../reusables/beta-note-threat-models-java.rst - -A threat model is a named class of dataflow sources that can be enabled or disabled independently. Threat models allow you to control the set of dataflow sources that you want to consider unsafe. For example, one codebase may only consider remote HTTP requests to be tainted, whereas another may also consider data from local files to be unsafe. You can use threat models to ensure that the relevant taint sources are used in a CodeQL analysis. - -The ``kind`` property of the ``sourceModel`` determines which threat model a source is associated with. There are two main categories: - -- ``remote`` which represents requests and responses from the network. -- ``local`` which represents data from local files (``file``), command-line arguments (``commandargs``), database reads (``database``), and environment variables(``environment``). - -When running a CodeQL analysis, the ``remote`` threat model is included by default. You can optionally include other threat models as appropriate when using the CodeQL CLI and in GitHub code scanning. For more information, see `Analyzing your code with CodeQL queries `__ and `Customizing your advanced setup for code scanning `__. From 3f10dd06f2703f43688159956af436fd6acb42ed Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Fri, 9 Feb 2024 14:24:50 -0500 Subject: [PATCH 063/207] Correct indices in example --- .../customizing-library-models-for-csharp.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst index 4d2e0dc0442..0f2b90767c9 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -281,12 +281,12 @@ The remaining values are used to define the ``access path``, the ``kind``, and t For the first row: -- The seventh value is ``Argument[this].Element``, which is the access path to the elements of the qualifier (the elements of the enumerable ``stream`` in the example). -- The eight value is ``Argument[0].Parameter[0]``, which is the access path to the first parameter of the ``System.Func`` argument of ``Select`` (the lambda parameter ``item`` in the example). +- The seventh value is ``Argument[0].Element``, which is the access path to the elements of the qualifier (the elements of the enumerable ``stream`` in the example). +- The eight value is ``Argument[1].Parameter[0]``, which is the access path to the first parameter of the ``System.Func`` argument of ``Select`` (the lambda parameter ``item`` in the example). For the second row: -- The seventh value is ``Argument[0].ReturnValue``, which is the access path to the return value of the ``System.Func`` argument of ``Select`` (the return value of the lambda in the example). +- The seventh value is ``Argument[1].ReturnValue``, which is the access path to the return value of the ``System.Func`` argument of ``Select`` (the return value of the lambda in the example). - The eighth value is ``ReturnValue.Element``, which is the access path to the elements of the return value of ``Select`` (the elements of the enumerable ``lines`` in the example). For the remaining values for both rows: From ae59ea3152e8254b5507525532a58e97499979b4 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Fri, 9 Feb 2024 14:31:59 -0500 Subject: [PATCH 064/207] Oxford comma --- .../customizing-library-models-for-csharp.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst index 0f2b90767c9..cf30bea99da 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -10,7 +10,7 @@ You can model the methods and callables that control data flow in any framework About this article ------------------ -This article contains reference material about how to define custom models for sources, sinks and flow summaries for C# dependencies in data extension files. +This article contains reference material about how to define custom models for sources, sinks, and flow summaries for C# dependencies in data extension files. About data extensions --------------------- From 6665248c19497d13519c06eaa989a6ea7bb6c85f Mon Sep 17 00:00:00 2001 From: Edward Minnix III Date: Mon, 12 Feb 2024 10:50:47 -0500 Subject: [PATCH 065/207] Review suggestions Co-authored-by: Michael Nebel --- .../customizing-library-models-for-csharp.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst index cf30bea99da..7f53c81060f 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -56,7 +56,7 @@ Extensible predicates used to create custom models in C# The CodeQL library for C# analysis exposes the following extensible predicates: - ``sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. -- ``sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data maybe used in a way that makes the code vulnerable. +- ``sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data may be used in a way that makes the code vulnerable. - ``summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. - ``neutralModel(namespace, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. @@ -76,10 +76,8 @@ This is the constructor of the ``SqlCommand`` class, which is located in the ``S .. code-block:: csharp public static void TaintSink(SqlConnection conn, string query) { - using (connection) { SqlCommand command = new SqlCommand(query, connection) // The argument to this method is a SQL injection sink. ... - } } We need to add a tuple to the ``sinkModel``\(namespace, type, subtypes, name, signature, ext, input, kind, provenance) extensible predicate by updating a data extension file. @@ -270,7 +268,7 @@ These are the same for both of the rows above as we are adding two summaries for - The first value ``System.Linq`` is the namespace name. - The second value ``Enumerable`` is the class (type) name. - The third value ``False`` is a flag that indicates whether or not the summary also applies to all overrides of the method. -- The fourth value ``Select`` is the method name, along with the generics for the method. The names of the generic type parameters provided in the model must match the names of the generic type parameters in the method signature in the source code. +- The fourth value ``Select`` is the method name, along with the type parameters for the method. The names of the generic type parameters provided in the model must match the names of the generic type parameters in the method signature in the source code. - The fifth value ``(System.Collections.Generic.IEnumerable,System.Func)`` is the method input type signature. The generics in the signature must match the generics in the method signature in the source code. The sixth value should be left empty and is out of scope for this documentation. From 8058096d7da026d06b03d95396aa8b0816953bae Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 13 Feb 2024 12:02:26 -0500 Subject: [PATCH 066/207] Add note about neutrals to Java documentation --- .../customizing-library-models-for-java-and-kotlin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst index 513b488dbe9..659bb95c208 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst @@ -64,7 +64,7 @@ The CodeQL library for Java and Kotlin analysis exposes the following extensible - ``sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. The ``kind`` of the sources defined using this predicate determine which threat model they are associated with. Different threat models can be used to customize the sources used in an analysis. For more information, see ":ref:`Threat models `." - ``sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data maybe used in a way that makes the code vulnerable. - ``summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. -- ``neutralModel(package, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. +- ``neutralModel(package, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. Manual neutral models (those with a provenance such as ``manual`` or ``ai-manual``) override generated summary models (those with a provenance such as ``df-generated``) such that the summary will be ignored. Other than that, neutral models have a slight impact on the dataflow dispatch logic, which is out of scope for this documentation. The extensible predicates are populated using the models defined in data extension files. From e2511cdbe4f1c33b38a9f677f15c2cfd1165862e Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 13 Feb 2024 12:02:57 -0500 Subject: [PATCH 067/207] Add neutral model note to C# documentation --- .../customizing-library-models-for-csharp.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst index 7f53c81060f..6365995acd1 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -58,7 +58,7 @@ The CodeQL library for C# analysis exposes the following extensible predicates: - ``sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. - ``sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data may be used in a way that makes the code vulnerable. - ``summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. -- ``neutralModel(namespace, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. +- ``neutralModel(namespace, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. Manual neutral models (those with a provenance such as ``manual`` or ``ai-manual``) can be used to override generated summary models (those a provenance such as ``df-generated``), such that the summary model will be ignored. Other than that, neutral models have no effect. The extensible predicates are populated using the models defined in data extension files. From 8be9b8b818dcd9f4d010cd7b9b79c43c3ea18396 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 13 Feb 2024 12:08:17 -0500 Subject: [PATCH 068/207] Add note about collapsing multiple rows into one --- .../customizing-library-models-for-csharp.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst index 6365995acd1..be7f2fa203c 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -192,6 +192,19 @@ The remaining values are used to define the ``access path``, the ``kind``, and t - The ninth value ``taint`` is the kind of the flow. ``taint`` means that taint is propagated through the call. - The tenth value ``manual`` is the provenance of the summary, which is used to identify the origin of the summary. +It would also be possible to merge the two rows into one by using a comma separated list in the seventh value. This would be useful if the method has many arguments and the flow is the same for all of them. + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System", "String", False, "Concat", "(System.Object,System.Object)", "", "Argument[0,1]", "ReturnValue", "taint", "manual"] + +This row defines flow from both the first and the second argument to the return value. The seventh value ``Argument[0,1]`` is shorthand for specifying an access path to both ``Argument[0]`` and ``Argument[1]``. + Example: Add flow through the ``Trim`` method ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This example shows how the C# query pack models flow through a method for a simple case. From c5dbaa6bfd97fc46abe9e2333dc7c6f00c70a4f8 Mon Sep 17 00:00:00 2001 From: Edward Minnix III Date: Mon, 19 Feb 2024 12:04:17 -0500 Subject: [PATCH 069/207] Docs team review suggestions Co-authored-by: Ben Ahmady <32935794+subatoi@users.noreply.github.com> --- docs/codeql/codeql-language-guides/codeql-for-csharp.rst | 2 +- .../customizing-library-models-for-csharp.rst | 4 ++-- .../customizing-library-models-for-java-and-kotlin.rst | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/codeql/codeql-language-guides/codeql-for-csharp.rst b/docs/codeql/codeql-language-guides/codeql-for-csharp.rst index 42122129c2b..491b7bf9de7 100644 --- a/docs/codeql/codeql-language-guides/codeql-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/codeql-for-csharp.rst @@ -19,5 +19,5 @@ Experiment and learn how to write effective and efficient queries for CodeQL dat - :doc:`Analyzing data flow in C# `: You can use CodeQL to track the flow of data through a C# program to its use. -- :doc:`Customizing library models for C# `: You can model frameworks and libraries that your code base depends on using data extensions and publish them as CodeQL model packs. +- :doc:`Customizing library models for C# `: You can model frameworks and libraries that your codebase depends on using data extensions and publish them as CodeQL model packs. diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst index be7f2fa203c..165ce7b623e 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-csharp.rst @@ -58,7 +58,7 @@ The CodeQL library for C# analysis exposes the following extensible predicates: - ``sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. - ``sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data may be used in a way that makes the code vulnerable. - ``summaryModel(namespace, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. -- ``neutralModel(namespace, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. Manual neutral models (those with a provenance such as ``manual`` or ``ai-manual``) can be used to override generated summary models (those a provenance such as ``df-generated``), such that the summary model will be ignored. Other than that, neutral models have no effect. +- ``neutralModel(namespace, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. Manual neutral models (those with a provenance such as ``manual`` or ``ai-manual``) can be used to override generated summary models (those with a provenance such as ``df-generated``), so that the summary model will be ignored. Other than that, neutral models have no effect. The extensible predicates are populated using the models defined in data extension files. @@ -192,7 +192,7 @@ The remaining values are used to define the ``access path``, the ``kind``, and t - The ninth value ``taint`` is the kind of the flow. ``taint`` means that taint is propagated through the call. - The tenth value ``manual`` is the provenance of the summary, which is used to identify the origin of the summary. -It would also be possible to merge the two rows into one by using a comma separated list in the seventh value. This would be useful if the method has many arguments and the flow is the same for all of them. +It would also be possible to merge the two rows into one by using a comma-separated list in the seventh value. This would be useful if the method has many arguments and the flow is the same for all of them. .. code-block:: yaml diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst index 659bb95c208..7ccb12c3060 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-java-and-kotlin.rst @@ -64,7 +64,7 @@ The CodeQL library for Java and Kotlin analysis exposes the following extensible - ``sourceModel(package, type, subtypes, name, signature, ext, output, kind, provenance)``. This is used to model sources of potentially tainted data. The ``kind`` of the sources defined using this predicate determine which threat model they are associated with. Different threat models can be used to customize the sources used in an analysis. For more information, see ":ref:`Threat models `." - ``sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance)``. This is used to model sinks where tainted data maybe used in a way that makes the code vulnerable. - ``summaryModel(package, type, subtypes, name, signature, ext, input, output, kind, provenance)``. This is used to model flow through elements. -- ``neutralModel(package, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. Manual neutral models (those with a provenance such as ``manual`` or ``ai-manual``) override generated summary models (those with a provenance such as ``df-generated``) such that the summary will be ignored. Other than that, neutral models have a slight impact on the dataflow dispatch logic, which is out of scope for this documentation. +- ``neutralModel(package, type, name, signature, kind, provenance)``. This is similar to a summary model but used to model the flow of values that have only a minor impact on the dataflow analysis. Manual neutral models (those with a provenance such as ``manual`` or ``ai-manual``) override generated summary models (those with a provenance such as ``df-generated``) so that the summary will be ignored. Other than that, neutral models have a slight impact on the dataflow dispatch logic, which is out of scope for this documentation. The extensible predicates are populated using the models defined in data extension files. From 009ea1bcfd2f49344b59d1074eece020a34c31c4 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 19 Feb 2024 15:54:01 +0100 Subject: [PATCH 070/207] C#: Add test examples for record flow and update expected test output. --- .../constructors/ConstructorFlow.expected | 20 +++++++++++++++++++ .../dataflow/constructors/Constructors.cs | 11 ++++++++++ 2 files changed, 31 insertions(+) diff --git a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected index fc211507a1c..8091ce270aa 100644 --- a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected @@ -78,6 +78,14 @@ edges | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | provenance | | | Constructors.cs:133:14:133:15 | access to local variable c4 : C4 [property Obj1] : Object | Constructors.cs:133:14:133:20 | access to property Obj1 | provenance | | | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | provenance | | +| Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:143:25:143:26 | access to local variable o1 : Object | provenance | | +| Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:143:29:143:30 | access to local variable o2 : Object | provenance | | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | provenance | | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | provenance | | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | provenance | | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | provenance | | +| Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | provenance | | +| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | provenance | | nodes | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | semmle.label | [post] this access : C_no_ctor [field s1] : Object | | Constructors.cs:5:29:5:45 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -164,6 +172,16 @@ nodes | Constructors.cs:133:14:133:20 | access to property Obj1 | semmle.label | access to property Obj1 | | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | semmle.label | access to local variable c4 : C4 [property Obj2] : Object | | Constructors.cs:134:14:134:20 | access to property Obj2 | semmle.label | access to property Obj2 | +| Constructors.cs:141:18:141:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:142:18:142:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | semmle.label | object creation of type R1 : R1 [property Obj1] : Object | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | semmle.label | object creation of type R1 : R1 [property Obj2] : Object | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | semmle.label | access to local variable r1 : R1 [property Obj1] : Object | +| Constructors.cs:144:14:144:20 | access to property Obj1 | semmle.label | access to property Obj1 | +| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | semmle.label | access to local variable r1 : R1 [property Obj2] : Object | +| Constructors.cs:145:14:145:20 | access to property Obj2 | semmle.label | access to property Obj2 | subpaths | Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:19 | SSA def(o1) : Object | Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:41:26:41:26 | o : Object | Constructors.cs:41:32:41:34 | [post] this access : C1 [field Obj] : Object | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | @@ -191,3 +209,5 @@ subpaths | Constructors.cs:113:14:113:21 | access to property Obj31 | Constructors.cs:111:19:111:35 | call to method Source : Object | Constructors.cs:113:14:113:21 | access to property Obj31 | $@ | Constructors.cs:111:19:111:35 | call to method Source : Object | call to method Source : Object | | Constructors.cs:133:14:133:20 | access to property Obj1 | Constructors.cs:130:18:130:34 | call to method Source : Object | Constructors.cs:133:14:133:20 | access to property Obj1 | $@ | Constructors.cs:130:18:130:34 | call to method Source : Object | call to method Source : Object | | Constructors.cs:134:14:134:20 | access to property Obj2 | Constructors.cs:131:18:131:34 | call to method Source : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | $@ | Constructors.cs:131:18:131:34 | call to method Source : Object | call to method Source : Object | +| Constructors.cs:144:14:144:20 | access to property Obj1 | Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | $@ | Constructors.cs:141:18:141:34 | call to method Source : Object | call to method Source : Object | +| Constructors.cs:145:14:145:20 | access to property Obj2 | Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | $@ | Constructors.cs:142:18:142:35 | call to method Source : Object | call to method Source : Object | diff --git a/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs b/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs index af83b9896e2..9eae5079d84 100644 --- a/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs +++ b/csharp/ql/test/library-tests/dataflow/constructors/Constructors.cs @@ -134,6 +134,17 @@ public class Constructors Sink(c4.Obj2); // $ hasValueFlow=8 } + public record R1(object Obj1, object Obj2); + + public void M7() + { + var o1 = Source(9); + var o2 = Source(10); + var r1 = new R1(o1, o2); + Sink(r1.Obj1); // $ hasValueFlow=9 + Sink(r1.Obj2); // $ hasValueFlow=10 + } + public static void Sink(object o) { } public static T Source(object source) => throw null; From 132b8baa57016e652227acd9608c080d5185d4a0 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 19 Feb 2024 15:57:38 +0100 Subject: [PATCH 071/207] C#: Delete summarized callable implementation for record flow and update expected output. --- .../dataflow/internal/FlowSummaryImpl.qll | 57 ------------------- .../constructors/ConstructorFlow.expected | 22 +------ 2 files changed, 2 insertions(+), 77 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll index 1804c976e52..19972a86ab6 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll @@ -358,63 +358,6 @@ private module BidirectionalImports { private import semmle.code.csharp.frameworks.EntityFramework } -private predicate recordConstructorFlow(Constructor c, int i, Property p) { - c = any(RecordType r).getAMember() and - exists(string name | - c.getParameter(i).getName() = name and - c.getDeclaringType().getAMember(name) = p - ) -} - -private class RecordConstructorFlow extends Impl::Private::SummarizedCallableImpl { - RecordConstructorFlow() { recordConstructorFlow(this, _, _) } - - predicate propagatesFlowImpl( - Impl::Private::SummaryComponentStack input, Impl::Private::SummaryComponentStack output, - boolean preservesValue - ) { - exists(int i, Property p | - recordConstructorFlow(this, i, p) and - input = Private::SummaryComponentStack::argument(i) and - output = - Private::SummaryComponentStack::propertyOf(p, Private::SummaryComponentStack::return()) and - preservesValue = true - ) - } - - override predicate propagatesFlow( - Impl::Private::SummaryComponentStack input, Impl::Private::SummaryComponentStack output, - boolean preservesValue - ) { - this.propagatesFlowImpl(input, output, preservesValue) - } - - override predicate hasProvenance(Public::Provenance provenance) { provenance = "manual" } -} - -// see `SummarizedCallableImpl` qldoc -private class RecordConstructorFlowAdapter extends Impl::Public::SummarizedCallable instanceof RecordConstructorFlow -{ - override predicate propagatesFlow(string input, string output, boolean preservesValue) { none() } - - override predicate hasProvenance(Public::Provenance provenance) { - RecordConstructorFlow.super.hasProvenance(provenance) - } -} - -private class RecordConstructorFlowRequiredSummaryComponentStack extends Impl::Private::RequiredSummaryComponentStack -{ - override predicate required( - Impl::Private::SummaryComponent head, Impl::Private::SummaryComponentStack tail - ) { - exists(Property p | - recordConstructorFlow(_, _, p) and - head = Private::SummaryComponent::property(p) and - tail = Private::SummaryComponentStack::return() - ) - } -} - private import semmle.code.csharp.frameworks.system.linq.Expressions private predicate mayInvokeCallback(Callable c, int n) { diff --git a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected index 8091ce270aa..ecb3815a45a 100644 --- a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected @@ -1,4 +1,6 @@ testFailures +| Constructors.cs:144:24:144:42 | // ... | Missing result:hasValueFlow=9 | +| Constructors.cs:145:24:145:43 | // ... | Missing result:hasValueFlow=10 | edges | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:5:29:5:45 | call to method Source : Object | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | provenance | | @@ -78,14 +80,6 @@ edges | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | provenance | | | Constructors.cs:133:14:133:15 | access to local variable c4 : C4 [property Obj1] : Object | Constructors.cs:133:14:133:20 | access to property Obj1 | provenance | | | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | provenance | | -| Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:143:25:143:26 | access to local variable o1 : Object | provenance | | -| Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:143:29:143:30 | access to local variable o2 : Object | provenance | | -| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | provenance | | -| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | provenance | | -| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | provenance | | -| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | provenance | | -| Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | provenance | | -| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | provenance | | nodes | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | semmle.label | [post] this access : C_no_ctor [field s1] : Object | | Constructors.cs:5:29:5:45 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -172,16 +166,6 @@ nodes | Constructors.cs:133:14:133:20 | access to property Obj1 | semmle.label | access to property Obj1 | | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | semmle.label | access to local variable c4 : C4 [property Obj2] : Object | | Constructors.cs:134:14:134:20 | access to property Obj2 | semmle.label | access to property Obj2 | -| Constructors.cs:141:18:141:34 | call to method Source : Object | semmle.label | call to method Source : Object | -| Constructors.cs:142:18:142:35 | call to method Source : Object | semmle.label | call to method Source : Object | -| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | semmle.label | object creation of type R1 : R1 [property Obj1] : Object | -| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | semmle.label | object creation of type R1 : R1 [property Obj2] : Object | -| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | -| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | -| Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | semmle.label | access to local variable r1 : R1 [property Obj1] : Object | -| Constructors.cs:144:14:144:20 | access to property Obj1 | semmle.label | access to property Obj1 | -| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | semmle.label | access to local variable r1 : R1 [property Obj2] : Object | -| Constructors.cs:145:14:145:20 | access to property Obj2 | semmle.label | access to property Obj2 | subpaths | Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:19 | SSA def(o1) : Object | Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:41:26:41:26 | o : Object | Constructors.cs:41:32:41:34 | [post] this access : C1 [field Obj] : Object | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | @@ -209,5 +193,3 @@ subpaths | Constructors.cs:113:14:113:21 | access to property Obj31 | Constructors.cs:111:19:111:35 | call to method Source : Object | Constructors.cs:113:14:113:21 | access to property Obj31 | $@ | Constructors.cs:111:19:111:35 | call to method Source : Object | call to method Source : Object | | Constructors.cs:133:14:133:20 | access to property Obj1 | Constructors.cs:130:18:130:34 | call to method Source : Object | Constructors.cs:133:14:133:20 | access to property Obj1 | $@ | Constructors.cs:130:18:130:34 | call to method Source : Object | call to method Source : Object | | Constructors.cs:134:14:134:20 | access to property Obj2 | Constructors.cs:131:18:131:34 | call to method Source : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | $@ | Constructors.cs:131:18:131:34 | call to method Source : Object | call to method Source : Object | -| Constructors.cs:144:14:144:20 | access to property Obj1 | Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | $@ | Constructors.cs:141:18:141:34 | call to method Source : Object | call to method Source : Object | -| Constructors.cs:145:14:145:20 | access to property Obj2 | Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | $@ | Constructors.cs:142:18:142:35 | call to method Source : Object | call to method Source : Object | From b76a27bba220abbae4fe10c918ccc82119034112 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 19 Feb 2024 16:40:56 +0100 Subject: [PATCH 072/207] C#: Make a store step from explicit parameter nodes on primary constructors to the property of the same name for record types. --- .../code/csharp/dataflow/internal/DataFlowPrivate.qll | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 0b97a268d5d..3f2ffbd8c9d 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -2074,7 +2074,13 @@ predicate storeStep(Node node1, ContentSet c, Node node2) { exists(Parameter p | node1 = TExplicitParameterNode(p) and node2 = TPrimaryConstructorThisAccessNode(p, true) and - c.(PrimaryConstructorParameterContent).getParameter() = p + exists(Type t | t = p.getCallable().getDeclaringType() | + not t instanceof RecordType and + c.(PrimaryConstructorParameterContent).getParameter() = p + or + t instanceof RecordType and + c.(PropertyContent).getProperty().getName() = p.getName() + ) ) or FlowSummaryImpl::Private::Steps::summaryStoreStep(node1.(FlowSummaryNode).getSummaryNode(), c, From 0d32192f62fe739305b13738e91dcc37d34c3bd2 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 19 Feb 2024 16:41:22 +0100 Subject: [PATCH 073/207] C#: Update expected test output. --- .../constructors/ConstructorFlow.expected | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected index ecb3815a45a..177f14a8948 100644 --- a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected @@ -1,6 +1,4 @@ testFailures -| Constructors.cs:144:24:144:42 | // ... | Missing result:hasValueFlow=9 | -| Constructors.cs:145:24:145:43 | // ... | Missing result:hasValueFlow=10 | edges | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:5:29:5:45 | call to method Source : Object | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | provenance | | @@ -80,6 +78,16 @@ edges | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | provenance | | | Constructors.cs:133:14:133:15 | access to local variable c4 : C4 [property Obj1] : Object | Constructors.cs:133:14:133:20 | access to property Obj1 | provenance | | | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | provenance | | +| Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:143:25:143:26 | access to local variable o1 : Object | provenance | | +| Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:143:29:143:30 | access to local variable o2 : Object | provenance | | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | provenance | | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | provenance | | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:137:29:137:32 | Obj1 : Object | provenance | | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | provenance | | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:137:42:137:45 | Obj2 : Object | provenance | | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | provenance | | +| Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | provenance | | +| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | provenance | | nodes | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | semmle.label | [post] this access : C_no_ctor [field s1] : Object | | Constructors.cs:5:29:5:45 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -166,6 +174,18 @@ nodes | Constructors.cs:133:14:133:20 | access to property Obj1 | semmle.label | access to property Obj1 | | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | semmle.label | access to local variable c4 : C4 [property Obj2] : Object | | Constructors.cs:134:14:134:20 | access to property Obj2 | semmle.label | access to property Obj2 | +| Constructors.cs:137:29:137:32 | Obj1 : Object | semmle.label | Obj1 : Object | +| Constructors.cs:137:42:137:45 | Obj2 : Object | semmle.label | Obj2 : Object | +| Constructors.cs:141:18:141:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:142:18:142:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | semmle.label | object creation of type R1 : R1 [property Obj1] : Object | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | semmle.label | object creation of type R1 : R1 [property Obj2] : Object | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | semmle.label | access to local variable r1 : R1 [property Obj1] : Object | +| Constructors.cs:144:14:144:20 | access to property Obj1 | semmle.label | access to property Obj1 | +| Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | semmle.label | access to local variable r1 : R1 [property Obj2] : Object | +| Constructors.cs:145:14:145:20 | access to property Obj2 | semmle.label | access to property Obj2 | subpaths | Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:19 | SSA def(o1) : Object | Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:41:26:41:26 | o : Object | Constructors.cs:41:32:41:34 | [post] this access : C1 [field Obj] : Object | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | @@ -181,6 +201,8 @@ subpaths | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | this : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | access to parameter o31param : Object | Constructors.cs:113:14:113:21 | access to property Obj31 | | Constructors.cs:132:25:132:26 | access to local variable o1 : Object | Constructors.cs:121:26:121:28 | oc1 : Object | Constructors.cs:123:13:123:16 | [post] this access : C4 [property Obj1] : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:121:38:121:40 | oc2 : Object | Constructors.cs:124:13:124:16 | [post] this access : C4 [property Obj2] : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | +| Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:137:29:137:32 | Obj1 : Object | Constructors.cs:137:29:137:32 | Obj1 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | +| Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:137:42:137:45 | Obj2 : Object | Constructors.cs:137:42:137:45 | Obj2 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | #select | Constructors.cs:15:18:15:19 | access to field s1 | Constructors.cs:5:29:5:45 | call to method Source : Object | Constructors.cs:15:18:15:19 | access to field s1 | $@ | Constructors.cs:5:29:5:45 | call to method Source : Object | call to method Source : Object | | Constructors.cs:33:18:33:19 | access to field s1 | Constructors.cs:21:29:21:45 | call to method Source : Object | Constructors.cs:33:18:33:19 | access to field s1 | $@ | Constructors.cs:21:29:21:45 | call to method Source : Object | call to method Source : Object | @@ -193,3 +215,5 @@ subpaths | Constructors.cs:113:14:113:21 | access to property Obj31 | Constructors.cs:111:19:111:35 | call to method Source : Object | Constructors.cs:113:14:113:21 | access to property Obj31 | $@ | Constructors.cs:111:19:111:35 | call to method Source : Object | call to method Source : Object | | Constructors.cs:133:14:133:20 | access to property Obj1 | Constructors.cs:130:18:130:34 | call to method Source : Object | Constructors.cs:133:14:133:20 | access to property Obj1 | $@ | Constructors.cs:130:18:130:34 | call to method Source : Object | call to method Source : Object | | Constructors.cs:134:14:134:20 | access to property Obj2 | Constructors.cs:131:18:131:34 | call to method Source : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | $@ | Constructors.cs:131:18:131:34 | call to method Source : Object | call to method Source : Object | +| Constructors.cs:144:14:144:20 | access to property Obj1 | Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:144:14:144:20 | access to property Obj1 | $@ | Constructors.cs:141:18:141:34 | call to method Source : Object | call to method Source : Object | +| Constructors.cs:145:14:145:20 | access to property Obj2 | Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:145:14:145:20 | access to property Obj2 | $@ | Constructors.cs:142:18:142:35 | call to method Source : Object | call to method Source : Object | From a0b44c0fc1c2570f069988dd129ee06b86bc3072 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 20 Feb 2024 11:58:15 +0100 Subject: [PATCH 074/207] C#: Update other tests expected output. --- .../library-tests/dataflow/fields/FieldFlow.expected | 12 ++++++++++++ .../library-tests/dataflow/tuples/Tuples.expected | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected index b5c1624c251..4ab54cac22b 100644 --- a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected @@ -814,6 +814,8 @@ edges | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | provenance | | +| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | provenance | | | J.cs:22:34:22:34 | access to local variable o : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | provenance | | | J.cs:22:34:22:34 | access to local variable o : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | provenance | | | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:21 | access to property Prop1 | provenance | | @@ -836,6 +838,8 @@ edges | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | provenance | | +| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | provenance | | | J.cs:42:35:42:35 | access to local variable o : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | provenance | | | J.cs:42:35:42:35 | access to local variable o : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | provenance | | | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:21 | access to property Prop1 | provenance | | @@ -1781,6 +1785,10 @@ nodes | I.cs:40:14:40:14 | access to parameter i : I [field Field1] : Object | semmle.label | access to parameter i : I [field Field1] : Object | | I.cs:40:14:40:21 | access to field Field1 | semmle.label | access to field Field1 | | I.cs:40:14:40:21 | access to field Field1 | semmle.label | access to field Field1 | +| J.cs:6:40:6:44 | Prop1 : Object | semmle.label | Prop1 : Object | +| J.cs:6:40:6:44 | Prop1 : Object | semmle.label | Prop1 : Object | +| J.cs:8:42:8:46 | Prop1 : Object | semmle.label | Prop1 : Object | +| J.cs:8:42:8:46 | Prop1 : Object | semmle.label | Prop1 : Object | | J.cs:14:26:14:30 | field : Object | semmle.label | field : Object | | J.cs:14:26:14:30 | field : Object | semmle.label | field : Object | | J.cs:14:40:14:43 | prop : Object | semmle.label | prop : Object | @@ -2022,6 +2030,10 @@ subpaths | H.cs:147:25:147:38 | call to method Source : A | H.cs:138:27:138:27 | o : A | H.cs:142:16:142:34 | access to field FieldB : A | H.cs:147:17:147:39 | call to method Through : A | | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:153:32:153:32 | o : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:153:32:153:32 | o : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | +| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | J.cs:6:40:6:44 | Prop1 : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | +| J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | J.cs:6:40:6:44 | Prop1 : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | +| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | J.cs:8:42:8:46 | Prop1 : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | +| J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | J.cs:8:42:8:46 | Prop1 : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | J.cs:14:50:14:54 | [post] this access : Struct [field Field] : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | J.cs:14:50:14:54 | [post] this access : Struct [field Field] : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:14:40:14:43 | prop : Object | J.cs:14:57:14:60 | [post] this access : Struct [property Prop] : Object | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | diff --git a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected index e93d25ad84a..ef98026832c 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected @@ -148,6 +148,8 @@ edges | Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:100:24:100:24 | access to local variable o : String | provenance | | | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | provenance | | +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | provenance | | | Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | provenance | | | Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | provenance | | | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:16 | access to property i | provenance | | @@ -359,6 +361,8 @@ nodes | Tuples.cs:89:18:89:18 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:90:18:90:18 | access to local variable r | semmle.label | access to local variable r | | Tuples.cs:90:18:90:18 | access to local variable r | semmle.label | access to local variable r | +| Tuples.cs:95:22:95:22 | i : String | semmle.label | i : String | +| Tuples.cs:95:22:95:22 | i : String | semmle.label | i : String | | Tuples.cs:99:17:99:33 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:99:17:99:33 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | semmle.label | object creation of type R1 : R1 [property i] : String | @@ -412,6 +416,8 @@ nodes | Tuples.cs:134:14:134:15 | access to local variable y4 | semmle.label | access to local variable y4 | | Tuples.cs:134:14:134:15 | access to local variable y4 | semmle.label | access to local variable y4 | subpaths +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | Tuples.cs:95:22:95:22 | i : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | Tuples.cs:95:22:95:22 | i : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | #select | Tuples.cs:12:14:12:14 | access to local variable a | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:12:14:12:14 | access to local variable a | $@ | Tuples.cs:7:18:7:34 | call to method Source : Object | call to method Source : Object | | Tuples.cs:12:14:12:14 | access to local variable a | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:12:14:12:14 | access to local variable a | $@ | Tuples.cs:7:18:7:34 | call to method Source : Object | call to method Source : Object | From 61bfe7e520a527171e84452b7326cc06e7e590de Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 21 Feb 2024 16:48:23 +0100 Subject: [PATCH 075/207] Bazel: rename internal module to `semmle_code` --- .bazelrc | 2 +- MODULE.bazel | 4 +- javascript/BUILD.bazel | 6 +-- javascript/downgrades/BUILD.bazel | 2 +- javascript/externs/BUILD.bazel | 2 +- javascript/extractor/BUILD.bazel | 48 +++++++++---------- .../extractor/lib/typescript/BUILD.bazel | 2 +- .../com/semmle/js/extractor/test/BUILD.bazel | 2 +- .../MODULE.bazel | 2 +- .../WORKSPACE.bazel | 0 10 files changed, 35 insertions(+), 35 deletions(-) rename misc/bazel/{codeql_internal_stub => semmle_code_stub}/MODULE.bazel (50%) rename misc/bazel/{codeql_internal_stub => semmle_code_stub}/WORKSPACE.bazel (100%) diff --git a/.bazelrc b/.bazelrc index af3769c38ff..754f85b0542 100644 --- a/.bazelrc +++ b/.bazelrc @@ -2,7 +2,7 @@ common --enable_platform_specific_config --experimental_enable_bzlmod # when using repo standalone, we want still to unlock loading the internal repository module # actually using things from that module will obviously end up in an error -common --override_module=codeql_internal=%workspace%/misc/bazel/codeql_internal_stub +common --override_module=semmle_code=%workspace%/misc/bazel/semmle_code_stub build --repo_env=CC=clang --repo_env=CXX=clang++ diff --git a/MODULE.bazel b/MODULE.bazel index 02cd6a8baa4..a8f2f1515b2 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -5,9 +5,9 @@ module( # this points to our internal repository when `codeql` is checked out as a submodule thereof # when building things from `codeql` independently this is stubbed out in `.bazelrc` -bazel_dep(name = "codeql_internal", version = "0.0") +bazel_dep(name = "semmle_code", version = "0.0") local_path_override( - module_name = "codeql_internal", + module_name = "semmle_code", path = "..", ) diff --git a/javascript/BUILD.bazel b/javascript/BUILD.bazel index d0469367741..eacfa554a8e 100644 --- a/javascript/BUILD.bazel +++ b/javascript/BUILD.bazel @@ -1,6 +1,6 @@ -load("@codeql_internal//:dist.bzl", "dist") +load("@semmle_code//:dist.bzl", "dist") load("@rules_pkg//pkg:mappings.bzl", "pkg_files") -load("@codeql_internal//buildutils-internal:zipmerge.bzl", "zipmerge") +load("@semmle_code//buildutils-internal:zipmerge.bzl", "zipmerge") package(default_visibility = ["//visibility:public"]) @@ -30,7 +30,7 @@ dist( "//javascript/downgrades", "//javascript/externs", "//javascript/extractor:tools-extractor", - "@codeql_internal//language-packs/javascript:resources", + "@semmle_code//language-packs/javascript:resources", ], prefix = "javascript", ) diff --git a/javascript/downgrades/BUILD.bazel b/javascript/downgrades/BUILD.bazel index 73cc099d08e..3d56c33c359 100644 --- a/javascript/downgrades/BUILD.bazel +++ b/javascript/downgrades/BUILD.bazel @@ -1,4 +1,4 @@ -load("@codeql_internal//:dist.bzl", "pack_zip") +load("@semmle_code//:dist.bzl", "pack_zip") pack_zip( name = "downgrades", diff --git a/javascript/externs/BUILD.bazel b/javascript/externs/BUILD.bazel index 5ee0c396b6e..233cf242b53 100644 --- a/javascript/externs/BUILD.bazel +++ b/javascript/externs/BUILD.bazel @@ -1,4 +1,4 @@ -load("@codeql_internal//:dist.bzl", "pack_zip") +load("@semmle_code//:dist.bzl", "pack_zip") pack_zip( name = "externs", diff --git a/javascript/extractor/BUILD.bazel b/javascript/extractor/BUILD.bazel index 433d70a815e..bd7159eea11 100644 --- a/javascript/extractor/BUILD.bazel +++ b/javascript/extractor/BUILD.bazel @@ -1,21 +1,21 @@ -load("@codeql_internal//:common.bzl", "codeql_fat_jar", "codeql_java_project") +load("@semmle_code//:common.bzl", "codeql_fat_jar", "codeql_java_project") load("@rules_pkg//pkg:mappings.bzl", "pkg_files") java_library( name = "deps", visibility = [":__subpackages__"], exports = [ - "@codeql_internal//extractor:html", - "@codeql_internal//extractor:yaml", - "@codeql_internal//resources/lib/java:commons-compress", - "@codeql_internal//resources/lib/java:gson", - "@codeql_internal//resources/lib/java:jericho-html", - "@codeql_internal//resources/lib/java:slf4j-api", - "@codeql_internal//resources/lib/java:snakeyaml", - "@codeql_internal//third_party:jackson", - "@codeql_internal//third_party:logback", - "@codeql_internal//util-java7", - "@codeql_internal//util-java8", + "@semmle_code//extractor:html", + "@semmle_code//extractor:yaml", + "@semmle_code//resources/lib/java:commons-compress", + "@semmle_code//resources/lib/java:gson", + "@semmle_code//resources/lib/java:jericho-html", + "@semmle_code//resources/lib/java:slf4j-api", + "@semmle_code//resources/lib/java:snakeyaml", + "@semmle_code//third_party:jackson", + "@semmle_code//third_party:logback", + "@semmle_code//util-java7", + "@semmle_code//util-java8", ], ) @@ -36,18 +36,18 @@ codeql_fat_jar( name = "extractor-javascript", srcs = [ ":extractor", - "@codeql_internal//extractor:html", - "@codeql_internal//extractor:xml-trap-writer", - "@codeql_internal//extractor:yaml", - "@codeql_internal//resources/lib/java:commons-compress", - "@codeql_internal//resources/lib/java:gson", - "@codeql_internal//resources/lib/java:jericho-html", - "@codeql_internal//resources/lib/java:slf4j-api", - "@codeql_internal//resources/lib/java:snakeyaml", - "@codeql_internal//third_party:jackson", - "@codeql_internal//third_party:logback", - "@codeql_internal//util-java7", - "@codeql_internal//util-java8", + "@semmle_code//extractor:html", + "@semmle_code//extractor:xml-trap-writer", + "@semmle_code//extractor:yaml", + "@semmle_code//resources/lib/java:commons-compress", + "@semmle_code//resources/lib/java:gson", + "@semmle_code//resources/lib/java:jericho-html", + "@semmle_code//resources/lib/java:slf4j-api", + "@semmle_code//resources/lib/java:snakeyaml", + "@semmle_code//third_party:jackson", + "@semmle_code//third_party:logback", + "@semmle_code//util-java7", + "@semmle_code//util-java8", ], files = [":javascript-extractor-resources"], main_class = "com.semmle.js.extractor.Main", diff --git a/javascript/extractor/lib/typescript/BUILD.bazel b/javascript/extractor/lib/typescript/BUILD.bazel index 4bee768f93b..904331e4c64 100644 --- a/javascript/extractor/lib/typescript/BUILD.bazel +++ b/javascript/extractor/lib/typescript/BUILD.bazel @@ -1,4 +1,4 @@ -load("@codeql_internal//:common.bzl", "on_windows") +load("@semmle_code//:common.bzl", "on_windows") # Builds a zip file of the compiled typscript-parser-wrapper and its dependencies. genrule( diff --git a/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel b/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel index 1c865c31d7f..45d6790e8a9 100644 --- a/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel +++ b/javascript/extractor/test/com/semmle/js/extractor/test/BUILD.bazel @@ -16,6 +16,6 @@ java_test( "//javascript/extractor", "//javascript/extractor:deps", "@bazel_tools//tools/java/runfiles", - "@codeql_internal//resources/lib/java/DO_NOT_DISTRIBUTE:junit", + "@semmle_code//resources/lib/java/DO_NOT_DISTRIBUTE:junit", ], ) diff --git a/misc/bazel/codeql_internal_stub/MODULE.bazel b/misc/bazel/semmle_code_stub/MODULE.bazel similarity index 50% rename from misc/bazel/codeql_internal_stub/MODULE.bazel rename to misc/bazel/semmle_code_stub/MODULE.bazel index 412f621a5ae..4efbb69d1bb 100644 --- a/misc/bazel/codeql_internal_stub/MODULE.bazel +++ b/misc/bazel/semmle_code_stub/MODULE.bazel @@ -1,4 +1,4 @@ module( - name = "codeql_internal", + name = "semmle_code", version = "0.0", ) diff --git a/misc/bazel/codeql_internal_stub/WORKSPACE.bazel b/misc/bazel/semmle_code_stub/WORKSPACE.bazel similarity index 100% rename from misc/bazel/codeql_internal_stub/WORKSPACE.bazel rename to misc/bazel/semmle_code_stub/WORKSPACE.bazel From 3ca9d701005248929c9a2841bc7ccd1469c60640 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 21 Feb 2024 16:53:08 +0100 Subject: [PATCH 076/207] Bazel: drop `experimental` from bzlmod flag --- .bazelrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bazelrc b/.bazelrc index 754f85b0542..0580c4422e8 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,4 +1,4 @@ -common --enable_platform_specific_config --experimental_enable_bzlmod +common --enable_platform_specific_config --enable_bzlmod # when using repo standalone, we want still to unlock loading the internal repository module # actually using things from that module will obviously end up in an error From f9d391d08723ebd14c1c6213b75e9164c6d4df5c Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 21 Feb 2024 16:10:24 +0100 Subject: [PATCH 077/207] C++: Support destructors for range-based for-loops --- .../library-tests/ir/ir/PrintAST.expected | 68 ++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 913a5d55bba..4423145ca31 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -9450,8 +9450,12 @@ ir.cpp: # 1068| : # 1068| getParameter(0): [Parameter] (unnamed parameter 0) # 1068| Type = [IntType] int +# 1069| [Destructor] void vector::~vector() +# 1069| : # 1069| [Destructor] void vector::~vector() # 1069| : +# 1069| [Destructor] void vector::~vector() +# 1069| : # 1070| [ConstMemberFunction] vector::iterator vector::begin() const # 1070| : # 1070| [ConstMemberFunction] vector::iterator vector::begin() const @@ -16622,6 +16626,18 @@ ir.cpp: # 2155| Type = [PlainCharType] char # 2155| Value = [CharLiteral] 97 # 2155| ValueCategory = prvalue +# 2154| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2154| Type = [VoidType] void +# 2154| ValueCategory = prvalue +# 2154| getQualifier(): [VariableAccess] y +# 2154| Type = [Class] ClassWithDestructor +# 2154| ValueCategory = lvalue +# 2154| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2154| Type = [VoidType] void +# 2154| ValueCategory = prvalue +# 2154| getQualifier(): [VariableAccess] ys +# 2154| Type = [ClassTemplateInstantiation,Struct] vector +# 2154| ValueCategory = lvalue # 2154| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2154| Type = [NestedStruct] iterator # 2154| ValueCategory = lvalue @@ -16754,12 +16770,36 @@ ir.cpp: # 2159| Value = [CStyleCast] 98 # 2159| ValueCategory = prvalue # 2160| getThen(): [ReturnStmt] return ... -# 2172| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2157| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] y +# 2157| Type = [Class] ClassWithDestructor +# 2157| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(1): [DestructorCall] call to ~vector +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] ys +# 2157| Type = [ClassTemplateInstantiation,Struct] vector +# 2157| ValueCategory = lvalue +# 2172| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor # 2172| Type = [VoidType] void # 2172| ValueCategory = prvalue # 2172| getQualifier(): [VariableAccess] x # 2172| Type = [Class] ClassWithDestructor # 2172| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] y +# 2157| Type = [Class] ClassWithDestructor +# 2157| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] ys +# 2157| Type = [ClassTemplateInstantiation,Struct] vector +# 2157| ValueCategory = lvalue # 2157| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2157| Type = [NestedStruct] iterator # 2157| ValueCategory = lvalue @@ -16867,12 +16907,24 @@ ir.cpp: # 2164| Value = [Literal] 1 # 2164| ValueCategory = prvalue # 2165| getThen(): [ReturnStmt] return ... -# 2172| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2163| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2163| Type = [VoidType] void +# 2163| ValueCategory = prvalue +# 2163| getQualifier(): [VariableAccess] ys +# 2163| Type = [ClassTemplateInstantiation,Struct] vector +# 2163| ValueCategory = lvalue +# 2172| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor # 2172| Type = [VoidType] void # 2172| ValueCategory = prvalue # 2172| getQualifier(): [VariableAccess] x # 2172| Type = [Class] ClassWithDestructor # 2172| ValueCategory = lvalue +# 2163| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2163| Type = [VoidType] void +# 2163| ValueCategory = prvalue +# 2163| getQualifier(): [VariableAccess] ys +# 2163| Type = [ClassTemplateInstantiation,Struct] vector +# 2163| ValueCategory = lvalue # 2163| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2163| Type = [NestedStruct] iterator # 2163| ValueCategory = lvalue @@ -16996,6 +17048,18 @@ ir.cpp: # 2171| getQualifier(): [VariableAccess] z1 # 2171| Type = [Class] ClassWithDestructor # 2171| ValueCategory = lvalue +# 2168| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor +# 2168| Type = [VoidType] void +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] y +# 2168| Type = [Class] ClassWithDestructor +# 2168| ValueCategory = lvalue +# 2168| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2168| Type = [VoidType] void +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] ys +# 2168| Type = [ClassTemplateInstantiation,Struct] vector +# 2168| ValueCategory = lvalue # 2168| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2168| Type = [NestedStruct] iterator # 2168| ValueCategory = lvalue From 5ecdc29808e6bfc09ea9c9cb130ab51e72ba4fb5 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Wed, 21 Feb 2024 17:00:23 +0000 Subject: [PATCH 078/207] Kotlin: Accept some loc changes in library-tests/exprs These aren't ideal, but I think they will be improve once we handle pre/post inc/decrement properly. --- .../library-tests/exprs/exprs.expected | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected index 4eab44316e1..d29fa731d6e 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected @@ -2002,38 +2002,38 @@ | exprs.kt:333:9:333:10 | l1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:333:20:333:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | LongLiteral | | exprs.kt:334:5:334:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:334:5:334:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:334:5:334:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:334:5:334:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:334:5:334:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:334:5:334:8 | tmp6 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:334:5:334:8 | tmp6 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:334:5:334:8 | tmp6 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:334:5:334:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:335:5:335:6 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:335:5:335:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:335:5:335:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:335:5:335:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:335:5:335:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:335:7:335:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:335:7:335:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:335:7:335:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:335:7:335:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:335:7:335:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:336:5:336:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:336:5:336:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:336:5:336:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:336:5:336:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:336:5:336:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:336:5:336:8 | tmp7 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:336:5:336:8 | tmp7 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:336:5:336:8 | tmp7 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:336:5:336:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:337:5:337:6 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:337:5:337:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:337:5:337:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:337:5:337:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:337:5:337:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:337:7:337:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:337:7:337:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:337:7:337:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:337:7:337:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:337:7:337:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | From 1b98dc16ba0b6e47e75b4d3a5c7c1bdee23bd896 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Wed, 21 Feb 2024 17:02:59 +0000 Subject: [PATCH 079/207] Kotlin: Accept some more loc changes in library-tests/exprs --- java/ql/test-kotlin2/library-tests/exprs/exprs.expected | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected index d29fa731d6e..4ea8da459c2 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected @@ -1997,9 +1997,9 @@ | exprs.kt:331:5:331:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:331:5:331:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:331:6:331:6 | l | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:332:9:332:10 | l0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:332:5:332:20 | l0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:332:20:332:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | LongLiteral | -| exprs.kt:333:9:333:10 | l1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:333:5:333:20 | l1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:333:20:333:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | LongLiteral | | exprs.kt:334:5:334:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:334:5:334:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | From 212d5def168c7455e78019ebcc5b2cf9b543b9a5 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Wed, 21 Feb 2024 17:04:49 +0000 Subject: [PATCH 080/207] Kotlin: Accept more loc changes in library-tests/exprs These are more instances of the same changes as the previous 2 commits --- .../library-tests/exprs/exprs.expected | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected index 4ea8da459c2..bd3a544c522 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected @@ -1793,43 +1793,43 @@ | exprs.kt:289:5:289:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:289:5:289:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:289:6:289:6 | d | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:290:9:290:10 | i0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:290:5:290:14 | i0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:290:14:290:14 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | -| exprs.kt:291:9:291:10 | i1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:291:5:291:14 | i1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:291:14:291:14 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | | exprs.kt:292:5:292:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:292:5:292:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:292:5:292:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:292:5:292:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:292:5:292:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:292:5:292:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:292:5:292:8 | tmp0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:292:5:292:8 | tmp0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:292:5:292:8 | tmp0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:293:5:293:6 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:293:5:293:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:293:5:293:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:293:5:293:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:293:5:293:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:293:7:293:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:293:7:293:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:293:7:293:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:293:7:293:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:293:7:293:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:294:5:294:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:294:5:294:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:294:5:294:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:294:5:294:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:294:5:294:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:294:5:294:8 | tmp1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:294:5:294:8 | tmp1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:294:5:294:8 | tmp1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:294:5:294:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:295:5:295:6 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:295:5:295:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:295:5:295:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:295:5:295:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:295:5:295:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:295:7:295:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:295:7:295:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:295:7:295:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:295:7:295:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:295:7:295:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | @@ -1861,43 +1861,43 @@ | exprs.kt:303:5:303:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:303:5:303:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:303:6:303:6 | b | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:304:9:304:10 | b0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:304:5:304:20 | b0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:304:20:304:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | -| exprs.kt:305:9:305:10 | b1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:305:5:305:20 | b1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:305:20:305:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | | exprs.kt:306:5:306:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:306:5:306:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:306:5:306:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:306:5:306:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:306:5:306:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:306:5:306:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:306:5:306:8 | tmp2 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:306:5:306:8 | tmp2 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:306:5:306:8 | tmp2 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:307:5:307:6 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:307:5:307:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:307:5:307:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:307:5:307:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:307:5:307:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:307:7:307:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:307:7:307:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:307:7:307:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:307:7:307:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:307:7:307:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:308:5:308:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:308:5:308:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:308:5:308:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:308:5:308:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:308:5:308:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:308:5:308:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:308:5:308:8 | tmp3 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:308:5:308:8 | tmp3 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:308:5:308:8 | tmp3 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:309:5:309:6 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:309:5:309:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:309:5:309:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:309:5:309:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:309:5:309:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:309:7:309:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:309:7:309:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:309:7:309:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:309:7:309:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:309:7:309:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | @@ -1929,43 +1929,43 @@ | exprs.kt:317:5:317:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:317:5:317:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:317:6:317:6 | s | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:318:9:318:10 | s0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:318:5:318:21 | s0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:318:21:318:21 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | -| exprs.kt:319:9:319:10 | s1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:319:5:319:21 | s1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | | exprs.kt:319:21:319:21 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | | exprs.kt:320:5:320:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:320:5:320:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:320:5:320:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:320:5:320:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:320:5:320:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:320:5:320:8 | tmp4 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:320:5:320:8 | tmp4 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:320:5:320:8 | tmp4 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:320:5:320:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:321:5:321:6 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:321:5:321:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:321:5:321:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:321:5:321:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:321:5:321:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:321:7:321:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:321:7:321:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:321:7:321:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:321:7:321:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:321:7:321:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:322:5:322:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:322:5:322:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:322:5:322:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:322:5:322:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | | exprs.kt:322:5:322:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:322:5:322:8 | tmp5 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | -| exprs.kt:322:5:322:8 | tmp5 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | -| exprs.kt:322:5:322:8 | tmp5 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:322:5:322:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:323:5:323:6 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | | exprs.kt:323:5:323:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | | exprs.kt:323:5:323:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | | exprs.kt:323:5:323:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | -| exprs.kt:323:5:323:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | -| exprs.kt:323:7:323:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:323:7:323:7 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | | exprs.kt:323:7:323:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:323:7:323:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | | exprs.kt:323:7:323:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | From 36b304d9a1b99a69ee565b7bafb6e2d97e9587f6 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Wed, 21 Feb 2024 17:13:50 +0000 Subject: [PATCH 081/207] Kotlin: Accept some locations in library-tests/exprs --- java/ql/test-kotlin2/library-tests/exprs/exprs.expected | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected index bd3a544c522..99831f5aea1 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected @@ -1757,9 +1757,9 @@ | exprs.kt:274:3:274:9 | updated | exprs.kt:267:1:276:1 | inPlaceOperators | VarAccess | | exprs.kt:274:3:274:14 | ...%=... | exprs.kt:267:1:276:1 | inPlaceOperators | AssignRemExpr | | exprs.kt:274:14:274:14 | 1 | exprs.kt:267:1:276:1 | inPlaceOperators | IntegerLiteral | -| exprs.kt:278:8:278:66 | T | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:278:8:278:66 | T[] | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:278:52:278:66 | | exprs.kt:278:8:278:66 | getEnumValues | ErrorExpr | +| exprs.kt:278:1:278:66 | T | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:278:1:278:66 | T[] | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:278:52:278:66 | | exprs.kt:278:1:278:66 | getEnumValues | ErrorExpr | | exprs.kt:280:1:283:1 | Unit | file://:0:0:0:0 | | TypeAccess | | exprs.kt:281:5:281:23 | | exprs.kt:280:1:283:1 | callToEnumValues | ImplicitCoercionToUnitExpr | | exprs.kt:281:5:281:23 | Color | exprs.kt:280:1:283:1 | callToEnumValues | TypeAccess | From 006b682333a3e236e27fd07fca273dbd45c27aba Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Wed, 21 Feb 2024 17:18:06 +0000 Subject: [PATCH 082/207] Kotlin: Accept more loc changes in library-tests/exprs --- .../library-tests/exprs/exprs.expected | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected index 99831f5aea1..8d51d04efc3 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected @@ -1609,16 +1609,16 @@ | exprs.kt:215:13:215:14 | d0 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | | exprs.kt:215:18:215:44 | Color | exprs.kt:206:5:217:5 | x | TypeAccess | | exprs.kt:215:18:215:44 | valueOf(...) | exprs.kt:206:5:217:5 | x | MethodCall | -| exprs.kt:215:38:215:42 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | +| exprs.kt:215:37:215:43 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | | exprs.kt:216:13:216:14 | d1 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | | exprs.kt:216:24:216:39 | Color | exprs.kt:206:5:217:5 | x | TypeAccess | | exprs.kt:216:24:216:39 | valueOf(...) | exprs.kt:206:5:217:5 | x | MethodCall | -| exprs.kt:216:33:216:37 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | +| exprs.kt:216:32:216:38 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | | exprs.kt:220:1:222:1 | Unit | file://:0:0:0:0 | | TypeAccess | | exprs.kt:221:5:221:10 | StandardKt | exprs.kt:220:1:222:1 | todo | TypeAccess | | exprs.kt:221:5:221:10 | TODO(...) | exprs.kt:220:1:222:1 | todo | MethodCall | | exprs.kt:225:1:227:1 | Unit | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:226:9:226:9 | x | exprs.kt:225:1:227:1 | fnClassRef | LocalVariableDeclExpr | +| exprs.kt:226:5:226:29 | x | exprs.kt:225:1:227:1 | fnClassRef | LocalVariableDeclExpr | | exprs.kt:226:13:226:29 | SomeClass1 | exprs.kt:225:1:227:1 | fnClassRef | TypeAccess | | exprs.kt:226:13:226:29 | SomeClass1.class | exprs.kt:225:1:227:1 | fnClassRef | TypeLiteral | | exprs.kt:229:1:250:1 | Unit | file://:0:0:0:0 | | TypeAccess | @@ -1719,23 +1719,23 @@ | exprs.kt:256:30:256:39 | double | file://:0:0:0:0 | | TypeAccess | | exprs.kt:257:18:257:26 | float | file://:0:0:0:0 | | TypeAccess | | exprs.kt:257:29:257:37 | float | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:259:7:259:7 | i | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:259:3:259:15 | i | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:259:11:259:11 | x | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:259:11:259:15 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:259:15:259:15 | y | exprs.kt:252:1:265:1 | mulOperators | VarAccess | -| exprs.kt:260:7:260:7 | b | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:260:3:260:19 | b | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:260:11:260:13 | byx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:260:11:260:19 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:260:17:260:19 | byy | exprs.kt:252:1:265:1 | mulOperators | VarAccess | -| exprs.kt:261:7:261:7 | l | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:261:3:261:17 | l | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:261:11:261:12 | lx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:261:11:261:17 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:261:16:261:17 | ly | exprs.kt:252:1:265:1 | mulOperators | VarAccess | -| exprs.kt:262:7:262:7 | d | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:262:3:262:17 | d | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:262:11:262:12 | dx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:262:11:262:17 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:262:16:262:17 | dy | exprs.kt:252:1:265:1 | mulOperators | VarAccess | -| exprs.kt:263:7:263:7 | f | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:263:3:263:17 | f | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | | exprs.kt:263:11:263:12 | fx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | | exprs.kt:263:11:263:17 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | | exprs.kt:263:16:263:17 | fy | exprs.kt:252:1:265:1 | mulOperators | VarAccess | From e6f70385f46dc1fa1b55aa01848d61023932ef74 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Wed, 21 Feb 2024 17:23:03 +0000 Subject: [PATCH 083/207] Kotlin: Accept more loc changes in library-tests/exprs --- .../ql/test-kotlin2/library-tests/exprs/exprs.expected | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected index 8d51d04efc3..45d5606d1ac 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected @@ -1521,27 +1521,27 @@ | exprs.kt:179:5:179:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:179:5:179:18 | Color | file://:0:0:0:0 | | TypeAccess | | exprs.kt:179:5:179:18 | Color.RED | exprs.kt:0:0:0:0 | | VarAccess | -| exprs.kt:179:5:179:18 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:179:8:179:17 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | | exprs.kt:179:9:179:16 | 16711680 | exprs.kt:0:0:0:0 | | IntegerLiteral | | exprs.kt:180:5:180:20 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | | exprs.kt:180:5:180:20 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:180:5:180:20 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:180:5:180:20 | Color | file://:0:0:0:0 | | TypeAccess | | exprs.kt:180:5:180:20 | Color.GREEN | exprs.kt:0:0:0:0 | | VarAccess | -| exprs.kt:180:5:180:20 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:180:10:180:19 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | | exprs.kt:180:11:180:18 | 65280 | exprs.kt:0:0:0:0 | | IntegerLiteral | | exprs.kt:181:5:181:18 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | | exprs.kt:181:5:181:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:181:5:181:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | | exprs.kt:181:5:181:18 | Color | file://:0:0:0:0 | | TypeAccess | | exprs.kt:181:5:181:18 | Color.BLUE | exprs.kt:0:0:0:0 | | VarAccess | -| exprs.kt:181:5:181:18 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:181:9:181:18 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | | exprs.kt:181:10:181:17 | 255 | exprs.kt:0:0:0:0 | | IntegerLiteral | | exprs.kt:184:1:187:1 | Unit | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:185:9:185:13 | south | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | +| exprs.kt:185:5:185:31 | south | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | | exprs.kt:185:27:185:31 | Direction | exprs.kt:184:1:187:1 | enums | TypeAccess | | exprs.kt:185:27:185:31 | Direction.SOUTH | exprs.kt:184:1:187:1 | enums | VarAccess | -| exprs.kt:186:9:186:13 | green | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | +| exprs.kt:186:5:186:27 | green | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | | exprs.kt:186:23:186:27 | Color | exprs.kt:184:1:187:1 | enums | TypeAccess | | exprs.kt:186:23:186:27 | Color.GREEN | exprs.kt:184:1:187:1 | enums | VarAccess | | exprs.kt:192:5:192:14 | ...=... | exprs.kt:191:1:199:1 | Class1 | KtInitializerAssignExpr | From e0c7849f52f317a3150aa4ac97a8bc2c2b0f2f66 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Wed, 21 Feb 2024 20:35:58 +0000 Subject: [PATCH 084/207] C++: fix incorrect use of getChildInternal --- .../raw/internal/TranslatedStmt.qll | 2 +- .../library-tests/ir/ir/aliased_ir.expected | 58 +++++++++++-------- .../ir/ir/aliased_ssa_consistency.expected | 1 - .../aliased_ssa_consistency_unsound.expected | 1 - .../ir/ir/operand_locations.expected | 38 +++++++++--- .../ir/ir/raw_consistency.expected | 1 - .../test/library-tests/ir/ir/raw_ir.expected | 36 +++++------- .../ir/ir/unaliased_ssa_consistency.expected | 1 - ...unaliased_ssa_consistency_unsound.expected | 1 - 9 files changed, 81 insertions(+), 58 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index a3f2f8560d9..64ce45d45f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -482,7 +482,7 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = OnlyInstructionTag() and if this.hasAnImplicitDestructorCall() - then result = this.getChildInternal(1).getFirstInstruction(kind) + then result = this.getChild(1).getFirstInstruction(kind) else result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) } diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 55103759057..29940d80f69 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -13526,21 +13526,21 @@ ir.cpp: #-----| True -> Block 3 # 2240| Block 1 -# 2240| m2240_7(unknown) = Phi : from 3:~m2249_5, from 6:~m2249_14 +# 2240| m2240_7(unknown) = Phi : from 2:~m2249_21, from 2:~m2249_5, from 5:~m2249_21, from 5:~m2249_5, from 3:~m2249_13, from 2:~m2249_21, from 2:~m2249_5, from 5:~m2249_21, from 5:~m2249_5, from 6:~m2249_30 # 2240| v2240_8(void) = ReturnVoid : # 2240| v2240_9(void) = AliasedUse : ~m2240_7 # 2240| v2240_10(void) = ExitFunction : # 2243| Block 3 -# 2243| v2243_1(void) = NoOp : -# 2249| r2249_1(glval) = VariableAddress[s] : -# 2249| r2249_2(glval) = FunctionAddress[~String] : -# 2249| v2249_3(void) = Call[~String] : func:r2249_2, this:r2249_1 -# 2249| m2249_4(unknown) = ^CallSideEffect : ~m2241_6 -# 2249| m2249_5(unknown) = Chi : total:m2241_6, partial:m2249_4 -# 2249| v2249_6(void) = ^IndirectReadSideEffect[-1] : &:r2249_1, m2241_8 -# 2249| m2249_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_1 -# 2249| m2249_8(String) = Chi : total:m2241_8, partial:m2249_7 +# 2243| v2243_1(void) = NoOp : +# 2249| r2249_9(glval) = VariableAddress[s] : +# 2249| r2249_10(glval) = FunctionAddress[~String] : +# 2249| v2249_11(void) = Call[~String] : func:r2249_10, this:r2249_9 +# 2249| m2249_12(unknown) = ^CallSideEffect : ~m2241_6 +# 2249| m2249_13(unknown) = Chi : total:m2241_6, partial:m2249_12 +# 2249| v2249_14(void) = ^IndirectReadSideEffect[-1] : &:r2249_9, m2241_8 +# 2249| m2249_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_9 +# 2249| m2249_16(String) = Chi : total:m2241_8, partial:m2249_15 #-----| Goto -> Block 1 # 2245| Block 4 @@ -13552,25 +13552,35 @@ ir.cpp: #-----| True -> Block 5 # 2246| Block 5 -# 2246| r2246_6(glval) = FunctionAddress[VoidFunc] : -# 2246| v2246_7(void) = Call[VoidFunc] : func:r2246_1, func:r2246_6 -# 2246| m2246_8(unknown) = ^CallSideEffect : ~m2241_6 -# 2246| m2246_9(unknown) = Chi : total:m2241_6, partial:m2246_3, partial:m2246_8 -# 2246| v2246_5(void) = NoOp : +# 2246| r2246_6(glval) = FunctionAddress[VoidFunc] : +# 2246| v2246_7(void) = Call[VoidFunc] : func:r2246_1, func:r2246_6 +# 2246| m2246_8(unknown) = ^CallSideEffect : ~m2241_6 +# 2246| m2246_9(unknown) = Chi : total:m2241_6, partial:m2246_3, partial:m2246_8 +# 2246| v2246_5(void) = NoOp : +# 2249| r2249_1(glval) = VariableAddress[s] : +# 2249| r2249_2(glval) = FunctionAddress[~String] : +# 2249| v2249_3(void) = Call[~String] : func:r2249_18, func:r2249_2, this:r2249_1, this:r2249_17 +# 2249| m2249_4(unknown) = ^CallSideEffect : ~m2246_4, ~m2246_9 +# 2249| m2249_5(unknown) = Chi : total:m2246_4, total:m2246_9, partial:m2249_20, partial:m2249_4 +# 2249| v2249_6(void) = ^IndirectReadSideEffect[-1] : &:r2249_1, &:r2249_17, m2241_8 +# 2249| m2249_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_1, &:r2249_17 +# 2249| m2249_8(String) = Chi : total:m2241_8, partial:m2249_23, partial:m2249_7 +#-----| Goto -> Block 1 # 2246| Block 5 +#-----| Goto -> Block 1 # 2248| Block 6 # 2248| r2248_1(glval) = VariableAddress[s] : -# 2249| v2249_9(void) = NoOp : -# 2249| r2249_10(glval) = VariableAddress[s] : -# 2249| r2249_11(glval) = FunctionAddress[~String] : -# 2249| v2249_12(void) = Call[~String] : func:r2249_11, this:r2249_10 -# 2249| m2249_13(unknown) = ^CallSideEffect : ~m2241_6 -# 2249| m2249_14(unknown) = Chi : total:m2241_6, partial:m2249_13 -# 2249| v2249_15(void) = ^IndirectReadSideEffect[-1] : &:r2249_10, m2241_8 -# 2249| m2249_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_10 -# 2249| m2249_17(String) = Chi : total:m2241_8, partial:m2249_16 +# 2249| v2249_25(void) = NoOp : +# 2249| r2249_26(glval) = VariableAddress[s] : +# 2249| r2249_27(glval) = FunctionAddress[~String] : +# 2249| v2249_28(void) = Call[~String] : func:r2249_27, this:r2249_26 +# 2249| m2249_29(unknown) = ^CallSideEffect : ~m2241_6 +# 2249| m2249_30(unknown) = Chi : total:m2241_6, partial:m2249_29 +# 2249| v2249_31(void) = ^IndirectReadSideEffect[-1] : &:r2249_26, m2241_8 +# 2249| m2249_32(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_26 +# 2249| m2249_33(String) = Chi : total:m2241_8, partial:m2249_32 #-----| Goto -> Block 1 # 2251| int IfReturnDestructors3(bool) diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 0d7951927c7..4b738909c63 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -7,7 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:2138:21:2138:21 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 0d7951927c7..4b738909c63 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -7,7 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:2138:21:2138:21 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 8ab3a48185a..024e60b17c5 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -11047,8 +11047,12 @@ | ir.cpp:2238:6:2238:13 | SideEffect | m2238_3 | | ir.cpp:2240:6:2240:24 | ChiPartial | partial:m2240_3 | | ir.cpp:2240:6:2240:24 | ChiTotal | total:m2240_2 | -| ir.cpp:2240:6:2240:24 | Phi | from 3:~m2249_5 | -| ir.cpp:2240:6:2240:24 | Phi | from 6:~m2249_14 | +| ir.cpp:2240:6:2240:24 | Phi | from 2:~m2249_5 | +| ir.cpp:2240:6:2240:24 | Phi | from 2:~m2249_21 | +| ir.cpp:2240:6:2240:24 | Phi | from 3:~m2249_13 | +| ir.cpp:2240:6:2240:24 | Phi | from 5:~m2249_5 | +| ir.cpp:2240:6:2240:24 | Phi | from 5:~m2249_21 | +| ir.cpp:2240:6:2240:24 | Phi | from 6:~m2249_30 | | ir.cpp:2240:6:2240:24 | SideEffect | ~m2240_7 | | ir.cpp:2240:31:2240:31 | Address | &:r2240_5 | | ir.cpp:2241:12:2241:12 | Address | &:r2241_1 | @@ -11074,24 +11078,42 @@ | ir.cpp:2246:16:2246:23 | SideEffect | ~m2241_6 | | ir.cpp:2249:1:2249:1 | Address | &:r2249_1 | | ir.cpp:2249:1:2249:1 | Address | &:r2249_1 | -| ir.cpp:2249:1:2249:1 | Address | &:r2249_10 | -| ir.cpp:2249:1:2249:1 | Address | &:r2249_10 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_9 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_9 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_17 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_17 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_26 | +| ir.cpp:2249:1:2249:1 | Address | &:r2249_26 | | ir.cpp:2249:1:2249:1 | Arg(this) | this:r2249_1 | -| ir.cpp:2249:1:2249:1 | Arg(this) | this:r2249_10 | +| ir.cpp:2249:1:2249:1 | Arg(this) | this:r2249_9 | +| ir.cpp:2249:1:2249:1 | Arg(this) | this:r2249_17 | +| ir.cpp:2249:1:2249:1 | Arg(this) | this:r2249_26 | | ir.cpp:2249:1:2249:1 | CallTarget | func:r2249_2 | -| ir.cpp:2249:1:2249:1 | CallTarget | func:r2249_11 | +| ir.cpp:2249:1:2249:1 | CallTarget | func:r2249_10 | +| ir.cpp:2249:1:2249:1 | CallTarget | func:r2249_18 | +| ir.cpp:2249:1:2249:1 | CallTarget | func:r2249_27 | | ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_4 | | ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_7 | -| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_13 | -| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_16 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_12 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_15 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_20 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_23 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_29 | +| ir.cpp:2249:1:2249:1 | ChiPartial | partial:m2249_32 | | ir.cpp:2249:1:2249:1 | ChiTotal | total:m2241_6 | | ir.cpp:2249:1:2249:1 | ChiTotal | total:m2241_6 | | ir.cpp:2249:1:2249:1 | ChiTotal | total:m2241_8 | | ir.cpp:2249:1:2249:1 | ChiTotal | total:m2241_8 | +| ir.cpp:2249:1:2249:1 | ChiTotal | total:m2241_8 | +| ir.cpp:2249:1:2249:1 | ChiTotal | total:m2246_4 | +| ir.cpp:2249:1:2249:1 | ChiTotal | total:m2246_9 | +| ir.cpp:2249:1:2249:1 | SideEffect | m2241_8 | | ir.cpp:2249:1:2249:1 | SideEffect | m2241_8 | | ir.cpp:2249:1:2249:1 | SideEffect | m2241_8 | | ir.cpp:2249:1:2249:1 | SideEffect | ~m2241_6 | | ir.cpp:2249:1:2249:1 | SideEffect | ~m2241_6 | +| ir.cpp:2249:1:2249:1 | SideEffect | ~m2246_4 | +| ir.cpp:2249:1:2249:1 | SideEffect | ~m2246_9 | | ir.cpp:2251:5:2251:24 | Address | &:r2251_9 | | ir.cpp:2251:5:2251:24 | ChiPartial | partial:m2251_3 | | ir.cpp:2251:5:2251:24 | ChiTotal | total:m2251_2 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index cc9b824239b..4c39a53588d 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -10,7 +10,6 @@ instructionWithoutSuccessor | ir.cpp:2140:39:2140:39 | IndirectMayWriteSideEffect: call to ClassWithDestructor | Instruction 'IndirectMayWriteSideEffect: call to ClassWithDestructor' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | | ir.cpp:2140:42:2140:76 | Constant: initialization_with_destructor_bool | Instruction 'Constant: initialization_with_destructor_bool' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | | ir.cpp:2141:9:2141:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index d2acb933606..86d33d696c6 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12711,23 +12711,15 @@ ir.cpp: # 2242| r2242_1(glval) = VariableAddress[b] : # 2242| r2242_2(bool) = Load[b] : &:r2242_1, ~m? # 2242| v2242_3(void) = ConditionalBranch : r2242_2 -#-----| False -> Block 5 -#-----| True -> Block 4 +#-----| False -> Block 4 +#-----| True -> Block 3 # 2240| Block 1 # 2240| v2240_6(void) = ReturnVoid : # 2240| v2240_7(void) = AliasedUse : ~m? # 2240| v2240_8(void) = ExitFunction : -# 2246| Block 6 -# 2246| r2246_5(glval) = FunctionAddress[VoidFunc] : -# 2246| v2246_6(void) = Call[VoidFunc] : func:r2246_1, func:r2246_5 -# 2246| mu2246_7(unknown) = ^CallSideEffect : ~m? -# 2246| v2246_8(void) = NoOp : - -# 2246| Block 6 - -# 2243| Block 4 +# 2243| Block 3 # 2243| v2243_1(void) = NoOp : # 2249| r2249_7(glval) = VariableAddress[s] : # 2249| r2249_8(glval) = FunctionAddress[~String] : @@ -12737,27 +12729,31 @@ ir.cpp: # 2249| mu2249_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_7 #-----| Goto -> Block 1 -# 2245| Block 5 +# 2245| Block 4 # 2245| r2245_1(glval) = VariableAddress[b] : # 2245| r2245_2(bool) = Load[b] : &:r2245_1, ~m? # 2245| v2245_3(void) = ConditionalBranch : r2245_2 -#-----| False -> Block 8 -#-----| True -> Block 6 -#-----| True -> Block 6 +#-----| False -> Block 6 +#-----| True -> Block 5 +#-----| True -> Block 5 -# 2249| Block 7 -# 2249| r2249_1(glval) = VariableAddress[s] : -# 2249| r2249_2(glval) = FunctionAddress[~String] : +# 2246| Block 5 +# 2246| r2246_5(glval) = FunctionAddress[VoidFunc] : +# 2246| v2246_6(void) = Call[VoidFunc] : func:r2246_1, func:r2246_5 +# 2246| mu2246_7(unknown) = ^CallSideEffect : ~m? +# 2246| v2246_8(void) = NoOp : +# 2249| r2249_13(glval) = VariableAddress[s] : +# 2249| r2249_14(glval) = FunctionAddress[~String] : # 2249| v2249_3(void) = Call[~String] : func:r2249_14, func:r2249_2, this:r2249_1, this:r2249_13 # 2249| mu2249_4(unknown) = ^CallSideEffect : ~m? # 2249| v2249_5(void) = ^IndirectReadSideEffect[-1] : &:r2249_1, &:r2249_13, ~m? # 2249| mu2249_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2249_1, &:r2249_13 #-----| Goto -> Block 1 -# 2249| Block 7 +# 2246| Block 5 #-----| Goto -> Block 1 -# 2248| Block 8 +# 2248| Block 6 # 2248| r2248_1(glval) = VariableAddress[s] : # 2249| v2249_19(void) = NoOp : # 2249| r2249_20(glval) = VariableAddress[s] : diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index a25d47fac12..598accf931b 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -7,7 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:2138:21:2138:21 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index a25d47fac12..598accf931b 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -7,7 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:2138:21:2138:21 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2246:9:2246:26 | NoOp: return ... | Instruction 'NoOp: return ...' has no successors in function '$@'. | ir.cpp:2240:6:2240:24 | void IfReturnDestructors(bool) | void IfReturnDestructors(bool) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From 66743fb0dbc9bd4eb2a75487637a9141b9dbc744 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Wed, 21 Feb 2024 20:50:30 +0000 Subject: [PATCH 085/207] C++: refactor TranslatedReturnStmt --- .../raw/internal/TranslatedStmt.qll | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 64ce45d45f8..42e0a5271de 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -404,6 +404,19 @@ abstract class TranslatedReturnStmt extends TranslatedStmt { final TranslatedFunction getEnclosingFunction() { result = getTranslatedFunction(stmt.getEnclosingFunction()) } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + exists(int id | + child = this.getChild(id) and + id >= this.getFirstDestructorCallIndex() and + ( + result = this.getChild(id + 1).getFirstInstruction(kind) + or + not exists(this.getChild(id + 1)) and + result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) + ) + ) + } } /** @@ -421,15 +434,7 @@ class TranslatedReturnValueStmt extends TranslatedReturnStmt, TranslatedVariable override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { result = TranslatedVariableInitialization.super.getChildSuccessorInternal(child, kind) or - exists(int id | - this.getChild(id) = child and - ( - result = this.getChild(id + 1).getFirstInstruction(kind) - or - not exists(this.getChild(id + 1)) and - result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) - ) - ) + result = TranslatedReturnStmt.super.getChildSuccessorInternal(child, kind) } final override TranslatedElement getChildInternal(int id) { @@ -491,19 +496,7 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { result = this.getInstruction(OnlyInstructionTag()) and kind instanceof GotoEdge or - exists(int id | - child = this.getChild(id) and - id >= this.getFirstDestructorCallIndex() and - result = this.getChild(id + 1).getFirstInstruction(kind) - ) - or - exists(int id | - child = this.getChild(id) and - id >= this.getFirstDestructorCallIndex() and - exists(this.getChild(id)) and - not exists(this.getChild(id + 1)) and - result = this.getEnclosingFunction().getReturnSuccessorInstruction(kind) - ) + result = TranslatedReturnStmt.super.getChildSuccessorInternal(child, kind) } private TranslatedExpr getExpr() { result = getTranslatedExpr(stmt.getExpr()) } @@ -580,6 +573,12 @@ class TranslatedNoValueReturnStmt extends TranslatedReturnStmt, TranslatedVariab result = TranslatedVariableInitialization.super.getChildInternal(id) } + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + result = TranslatedVariableInitialization.super.getChildSuccessorInternal(child, kind) + or + result = TranslatedReturnStmt.super.getChildSuccessorInternal(child, kind) + } + final override Type getTargetType() { result = this.getEnclosingFunction().getReturnType() } final override TranslatedInitialization getInitialization() { none() } @@ -587,6 +586,8 @@ class TranslatedNoValueReturnStmt extends TranslatedReturnStmt, TranslatedVariab final override IRVariable getIRVariable() { result = this.getEnclosingFunction().getReturnVariable() } + + override predicate handlesDestructorsExplicitly() { any() } } /** From 007d08ea63a7e7d7e47f479598d575eab15bc4fe Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 22 Feb 2024 09:39:01 +0100 Subject: [PATCH 086/207] Ruby: Add another variable capture test --- .../library-tests/dataflow/global/Flow.expected | 1 + .../dataflow/global/captured_variables.rb | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/ruby/ql/test/library-tests/dataflow/global/Flow.expected b/ruby/ql/test/library-tests/dataflow/global/Flow.expected index 5f019f306d3..8b5507d6db6 100644 --- a/ruby/ql/test/library-tests/dataflow/global/Flow.expected +++ b/ruby/ql/test/library-tests/dataflow/global/Flow.expected @@ -1,4 +1,5 @@ testFailures +| captured_variables.rb:227:13:227:31 | # $ hasValueFlow=18 | Missing result:hasValueFlow=18 | edges | blocks.rb:14:12:14:20 | call to source | blocks.rb:8:10:8:14 | yield ... | provenance | | | captured_variables.rb:9:24:9:24 | x | captured_variables.rb:10:10:10:23 | -> { ... } [captured x] | provenance | | diff --git a/ruby/ql/test/library-tests/dataflow/global/captured_variables.rb b/ruby/ql/test/library-tests/dataflow/global/captured_variables.rb index 63e2188fcee..79d1fc83b76 100644 --- a/ruby/ql/test/library-tests/dataflow/global/captured_variables.rb +++ b/ruby/ql/test/library-tests/dataflow/global/captured_variables.rb @@ -214,3 +214,17 @@ class CaptureOverwrite fn.call() end + +def multi_capture + x = taint(18) + y = 123 + + fn1 = -> { + y = x + } + + fn1.call() + sink(y) # $ hasValueFlow=18 +end + +multi_capture From 23869fc8e64dd23afeb796c74db5fdf1d0f2023d Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 22 Feb 2024 09:43:52 +0100 Subject: [PATCH 087/207] Ruby: Fix bug in `allowParameterReturnInSelf` --- .../ruby/dataflow/internal/DataFlowPrivate.qll | 2 +- .../library-tests/dataflow/global/Flow.expected | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index dca2a310c9f..d2fe2a78ab3 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -2177,7 +2177,7 @@ predicate allowParameterReturnInSelf(ParameterNodeImpl p) { FlowSummaryImpl::Private::summaryAllowParameterReturnInSelf(c.asLibraryCallable(), pos) ) or - VariableCapture::Flow::heuristicAllowInstanceParameterReturnInSelf(p.(SelfParameterNode) + VariableCapture::Flow::heuristicAllowInstanceParameterReturnInSelf(p.(LambdaSelfReferenceNode) .getCallable()) } diff --git a/ruby/ql/test/library-tests/dataflow/global/Flow.expected b/ruby/ql/test/library-tests/dataflow/global/Flow.expected index 8b5507d6db6..fb836e8488c 100644 --- a/ruby/ql/test/library-tests/dataflow/global/Flow.expected +++ b/ruby/ql/test/library-tests/dataflow/global/Flow.expected @@ -1,5 +1,4 @@ testFailures -| captured_variables.rb:227:13:227:31 | # $ hasValueFlow=18 | Missing result:hasValueFlow=18 | edges | blocks.rb:14:12:14:20 | call to source | blocks.rb:8:10:8:14 | yield ... | provenance | | | captured_variables.rb:9:24:9:24 | x | captured_variables.rb:10:10:10:23 | -> { ... } [captured x] | provenance | | @@ -117,6 +116,12 @@ edges | captured_variables.rb:194:1:194:1 | c [@x] | captured_variables.rb:185:5:189:7 | self in baz [@x] | provenance | | | captured_variables.rb:197:9:197:17 | call to taint | captured_variables.rb:199:10:199:10 | x | provenance | | | captured_variables.rb:206:13:206:21 | call to taint | captured_variables.rb:208:14:208:14 | x | provenance | | +| captured_variables.rb:219:9:219:17 | call to taint | captured_variables.rb:222:11:224:5 | -> { ... } [captured x] | provenance | | +| captured_variables.rb:219:9:219:17 | call to taint | captured_variables.rb:226:5:226:7 | fn1 [captured x] | provenance | | +| captured_variables.rb:222:5:222:7 | fn1 [captured x] | captured_variables.rb:226:5:226:7 | fn1 [captured x] | provenance | | +| captured_variables.rb:222:11:224:5 | -> { ... } [captured x] | captured_variables.rb:222:5:222:7 | fn1 [captured x] | provenance | | +| captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | captured_variables.rb:227:10:227:10 | y | provenance | | +| captured_variables.rb:226:5:226:7 | fn1 [captured x] | captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | provenance | | | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:18:11:18 | x | provenance | | | instance_variables.rb:11:18:11:18 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | provenance | | | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:16:14:21 | self [@field] | provenance | | @@ -375,6 +380,12 @@ nodes | captured_variables.rb:199:10:199:10 | x | semmle.label | x | | captured_variables.rb:206:13:206:21 | call to taint | semmle.label | call to taint | | captured_variables.rb:208:14:208:14 | x | semmle.label | x | +| captured_variables.rb:219:9:219:17 | call to taint | semmle.label | call to taint | +| captured_variables.rb:222:5:222:7 | fn1 [captured x] | semmle.label | fn1 [captured x] | +| captured_variables.rb:222:11:224:5 | -> { ... } [captured x] | semmle.label | -> { ... } [captured x] | +| captured_variables.rb:226:5:226:7 | [post] fn1 [captured y] | semmle.label | [post] fn1 [captured y] | +| captured_variables.rb:226:5:226:7 | fn1 [captured x] | semmle.label | fn1 [captured x] | +| captured_variables.rb:227:10:227:10 | y | semmle.label | y | | instance_variables.rb:10:19:10:19 | x | semmle.label | x | | instance_variables.rb:11:9:11:14 | [post] self [@field] | semmle.label | [post] self [@field] | | instance_variables.rb:11:18:11:18 | x | semmle.label | x | @@ -584,6 +595,7 @@ subpaths | captured_variables.rb:187:18:187:19 | @x | captured_variables.rb:178:14:178:22 | call to taint | captured_variables.rb:187:18:187:19 | @x | $@ | captured_variables.rb:178:14:178:22 | call to taint | call to taint | | captured_variables.rb:199:10:199:10 | x | captured_variables.rb:197:9:197:17 | call to taint | captured_variables.rb:199:10:199:10 | x | $@ | captured_variables.rb:197:9:197:17 | call to taint | call to taint | | captured_variables.rb:208:14:208:14 | x | captured_variables.rb:206:13:206:21 | call to taint | captured_variables.rb:208:14:208:14 | x | $@ | captured_variables.rb:206:13:206:21 | call to taint | call to taint | +| captured_variables.rb:227:10:227:10 | y | captured_variables.rb:219:9:219:17 | call to taint | captured_variables.rb:227:10:227:10 | y | $@ | captured_variables.rb:219:9:219:17 | call to taint | call to taint | | instance_variables.rb:20:10:20:13 | @foo | instance_variables.rb:19:12:19:21 | call to taint | instance_variables.rb:20:10:20:13 | @foo | $@ | instance_variables.rb:19:12:19:21 | call to taint | call to taint | | instance_variables.rb:36:10:36:33 | call to get_field | instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:36:10:36:33 | call to get_field | $@ | instance_variables.rb:36:14:36:22 | call to taint | call to taint | | instance_variables.rb:39:6:39:33 | call to get_field | instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:39:6:39:33 | call to get_field | $@ | instance_variables.rb:39:14:39:22 | call to taint | call to taint | From ebee35b385744675d8f79dc0ba489b9020e32876 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 22 Feb 2024 10:26:24 +0100 Subject: [PATCH 088/207] Ruby: No `fieldFlowBranchLimit` for `SummarizedCallable`s --- .../ruby/dataflow/internal/DataFlowImplSpecific.qll | 2 ++ shared/dataflow/codeql/dataflow/DataFlow.qll | 3 +++ shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll | 8 ++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplSpecific.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplSpecific.qll index 65521d913d0..7a8e6dad9f8 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplSpecific.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplSpecific.qll @@ -31,4 +31,6 @@ module RubyDataFlow implements InputSig { predicate mayBenefitFromCallContext = Private::mayBenefitFromCallContext/1; predicate viableImplInCallContext = Private::viableImplInCallContext/2; + + predicate ignoreFieldFlowBranchLimit(DataFlowCallable c) { exists(c.asLibraryCallable()) } } diff --git a/shared/dataflow/codeql/dataflow/DataFlow.qll b/shared/dataflow/codeql/dataflow/DataFlow.qll index 1c9c900530f..bad80247861 100644 --- a/shared/dataflow/codeql/dataflow/DataFlow.qll +++ b/shared/dataflow/codeql/dataflow/DataFlow.qll @@ -273,6 +273,9 @@ signature module InputSig { ) { any() } + + /** Holds if `fieldFlowBranchLimit` should be ignored for flow going into/out of `c`. */ + default predicate ignoreFieldFlowBranchLimit(DataFlowCallable c) { none() } } module Configs { diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index 3773a2225dd..840e67e9fa7 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -1117,7 +1117,9 @@ module MakeImpl { exists(int b, int j | b = branch(ret) and j = join(out) and - if b.minimum(j) <= Config::fieldFlowBranchLimit() + if + b.minimum(j) <= Config::fieldFlowBranchLimit() or + ignoreFieldFlowBranchLimit(ret.getEnclosingCallable()) then allowsFieldFlow = true else allowsFieldFlow = false ) @@ -1136,7 +1138,9 @@ module MakeImpl { exists(int b, int j | b = branch(arg) and j = join(p) and - if b.minimum(j) <= Config::fieldFlowBranchLimit() + if + b.minimum(j) <= Config::fieldFlowBranchLimit() or + ignoreFieldFlowBranchLimit(p.getEnclosingCallable()) then allowsFieldFlow = true else allowsFieldFlow = false ) From 21aa025db2af1ac2e7ea89fb488135ce2d055255 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 10:40:54 +0100 Subject: [PATCH 089/207] Update csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll Co-authored-by: Tom Hvitved --- .../code/csharp/dataflow/internal/DataFlowPrivate.qll | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 3f2ffbd8c9d..95fed08f931 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -2075,11 +2075,10 @@ predicate storeStep(Node node1, ContentSet c, Node node2) { node1 = TExplicitParameterNode(p) and node2 = TPrimaryConstructorThisAccessNode(p, true) and exists(Type t | t = p.getCallable().getDeclaringType() | - not t instanceof RecordType and - c.(PrimaryConstructorParameterContent).getParameter() = p - or - t instanceof RecordType and - c.(PropertyContent).getProperty().getName() = p.getName() + if t instanceof RecordType then + c.(PropertyContent).getProperty().getName() = p.getName() + else + c.(PrimaryConstructorParameterContent).getParameter() = p ) ) or From 92bdd637a3b664e22be07c5b05d241da22e208a3 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 22 Feb 2024 09:55:46 +0000 Subject: [PATCH 090/207] Address reveiw comment - add `create` nd remove `select_insert` --- ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll | 6 +++--- .../frameworks/active_record/ActiveRecord.expected | 4 ++-- .../library-tests/frameworks/active_record/ActiveRecord.rb | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll index b0462170a9a..5a4ae0a0bcf 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll @@ -203,9 +203,9 @@ private predicate sqlFragmentArgumentInner(DataFlow::CallNode call, DataFlow::No call = activeRecordConnectionInstance() .getAMethodCall([ - "delete", "exec_query", "exec_delete", "exec_insert", "exec_update", "execute", - "insert", "select_all", "select_one", "select_rows", "select_value", "select_values", - "select_update", "update" + "create", "delete", "exec_query", "exec_delete", "exec_insert", "exec_update", + "execute", "insert", "select_all", "select_one", "select_rows", "select_value", + "select_values", "update" ]) and sink = call.getArgument(0) or diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected index f4fc841112c..5dd0dbd9a15 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected @@ -122,8 +122,8 @@ activeRecordInstances activeRecordSqlExecutionRanges | ActiveRecord.rb:9:33:9:67 | "name='#{...}' and pass='#{...}'" | | ActiveRecord.rb:17:23:17:23 | q | -| ActiveRecord.rb:18:27:18:27 | q | -| ActiveRecord.rb:19:28:19:28 | q | +| ActiveRecord.rb:18:23:18:23 | q | +| ActiveRecord.rb:19:27:19:27 | q | | ActiveRecord.rb:20:28:20:28 | q | | ActiveRecord.rb:21:28:21:28 | q | | ActiveRecord.rb:22:28:22:28 | q | diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb index 763d90fffaa..3c1468acf45 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.rb @@ -14,12 +14,12 @@ class User < ApplicationRecord end def exec(q) + connection.create(q) connection.delete(q) connection.exec_query(q) connection.exec_insert(q) connection.exec_delete(q) connection.exec_update(q) - connection.exec_insert(q) connection.execute(q) connection.insert(q) connection.select_all(q) From 7410522660883dcfaddf33cc248ad465d83f0e95 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 22 Feb 2024 11:08:33 +0100 Subject: [PATCH 091/207] Bazel: bump version to 6.5.0 --- .bazelversion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bazelversion b/.bazelversion index dc0208aba8e..f22d756da39 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -6.3.1 +6.5.0 From cda4ca68f8e13be36674d95a2c2b003e938aa702 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 22 Feb 2024 11:08:50 +0100 Subject: [PATCH 092/207] Bazel: tweak `.bazelrc` --- .bazelrc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.bazelrc b/.bazelrc index 0580c4422e8..9cd23b70a3a 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,7 +1,9 @@ -common --enable_platform_specific_config --enable_bzlmod +common --enable_platform_specific_config +common --enable_bzlmod -# when using repo standalone, we want still to unlock loading the internal repository module -# actually using things from that module will obviously end up in an error +# when building from this repository in isolation, the internal repository will not be found at .. +# where `MODULE.bazel` looks for it. The following will get us past the module loading phase, so +# that we can build things that do not rely on that common --override_module=semmle_code=%workspace%/misc/bazel/semmle_code_stub build --repo_env=CC=clang --repo_env=CXX=clang++ From 67222f8f7e304635aa2857d9944469247e251cd3 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 22 Feb 2024 11:09:15 +0100 Subject: [PATCH 093/207] Bazel: add module lock file --- .bazelrc | 1 + MODULE.bazel.lock | 2634 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2635 insertions(+) create mode 100644 MODULE.bazel.lock diff --git a/.bazelrc b/.bazelrc index 9cd23b70a3a..758e95f782d 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,5 +1,6 @@ common --enable_platform_specific_config common --enable_bzlmod +common --lockfile_mode=update # when building from this repository in isolation, the internal repository will not be found at .. # where `MODULE.bazel` looks for it. The following will get us past the module loading phase, so diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock new file mode 100644 index 00000000000..89baf2f2188 --- /dev/null +++ b/MODULE.bazel.lock @@ -0,0 +1,2634 @@ +{ + "lockFileVersion": 3, + "moduleFileHash": "a44a9a52b93017e8e3ad7a9cf9f717941277506efabfbb1adbc9689d48841290", + "flags": { + "cmdRegistries": [ + "https://bcr.bazel.build/" + ], + "cmdModuleOverrides": { + "semmle_code": "/workspaces/semmle-code/ql/misc/bazel/semmle_code_stub" + }, + "allowedYankedVersions": [], + "envVarAllowedYankedVersions": "", + "ignoreDevDependency": false, + "directDependenciesMode": "WARNING", + "compatibilityMode": "ERROR" + }, + "localOverrideHashes": { + "bazel_tools": "0cc38516259ab87144b82461dd874e139f093d8e356667c3a3c5a52441ac448f", + "semmle_code": "aa25f5fa6da11fef06837e0679e5aac0c09848a4a5cd72886016b9c6a831c9eb" + }, + "moduleDepGraph": { + "": { + "name": "codeql", + "version": "0.0", + "key": "", + "repoName": "codeql", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@nodejs_toolchains//:all" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_python//python/extensions:pip.bzl", + "extensionName": "pip", + "usingModule": "", + "location": { + "file": "@@//:MODULE.bazel", + "line": 25, + "column": 20 + }, + "imports": { + "codegen_deps": "codegen_deps" + }, + "devImports": [], + "tags": [ + { + "tagName": "parse", + "attributeValues": { + "hub_name": "codegen_deps", + "python_version": "3.11", + "requirements_lock": "//misc/codegen:requirements_lock.txt" + }, + "devDependency": false, + "location": { + "file": "@@//:MODULE.bazel", + "line": 26, + "column": 10 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@codeql//swift/third_party:load.bzl", + "extensionName": "swift_deps", + "usingModule": "", + "location": { + "file": "@@//:MODULE.bazel", + "line": 33, + "column": 27 + }, + "imports": { + "binlog": "binlog", + "picosha2": "picosha2", + "swift_prebuilt_darwin_x86_64": "swift_prebuilt_darwin_x86_64", + "swift_prebuilt_linux": "swift_prebuilt_linux", + "swift_toolchain_linux": "swift_toolchain_linux", + "swift_toolchain_macos": "swift_toolchain_macos" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@rules_nodejs//nodejs:extensions.bzl", + "extensionName": "node", + "usingModule": "", + "location": { + "file": "@@//:MODULE.bazel", + "line": 44, + "column": 21 + }, + "imports": { + "nodejs": "nodejs", + "nodejs_toolchains": "nodejs_toolchains" + }, + "devImports": [], + "tags": [ + { + "tagName": "toolchain", + "attributeValues": { + "name": "nodejs", + "node_version": "18.15.0" + }, + "devDependency": false, + "location": { + "file": "@@//:MODULE.bazel", + "line": 45, + "column": 15 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "semmle_code": "semmle_code@_", + "platforms": "platforms@0.0.8", + "rules_pkg": "rules_pkg@0.9.1", + "rules_nodejs": "rules_nodejs@6.0.3", + "rules_python": "rules_python@0.29.0", + "bazel_skylib": "bazel_skylib@1.5.0", + "absl": "abseil-cpp@20240116.0", + "json": "nlohmann_json@3.11.3", + "fmt": "fmt@10.0.0", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + } + }, + "semmle_code@_": { + "name": "semmle_code", + "version": "0.0", + "key": "semmle_code@_", + "repoName": "semmle_code", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + } + }, + "platforms@0.0.8": { + "name": "platforms", + "version": "0.0.8", + "key": "platforms@0.0.8", + "repoName": "platforms", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "rules_license": "rules_license@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "platforms", + "urls": [ + "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz" + ], + "integrity": "sha256-gVBAZgU4ns7LbaB8vLUJ1WN6OrmiS8abEQFTE2fYnXQ=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "rules_pkg@0.9.1": { + "name": "rules_pkg", + "version": "0.9.1", + "key": "rules_pkg@0.9.1", + "repoName": "rules_pkg", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "rules_license": "rules_license@0.0.7", + "bazel_skylib": "bazel_skylib@1.5.0", + "rules_python": "rules_python@0.29.0", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_pkg~0.9.1", + "urls": [ + "https://github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz" + ], + "integrity": "sha256-j57i3BDBrlFO5ZmotC7Zn6Jit1cFj2WtPDhCif9wxLg=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "rules_nodejs@6.0.3": { + "name": "rules_nodejs", + "version": "6.0.3", + "key": "rules_nodejs@6.0.3", + "repoName": "rules_nodejs", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@nodejs_toolchains//:all" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_nodejs//nodejs:extensions.bzl", + "extensionName": "node", + "usingModule": "rules_nodejs@6.0.3", + "location": { + "file": "https://bcr.bazel.build/modules/rules_nodejs/6.0.3/MODULE.bazel", + "line": 12, + "column": 21 + }, + "imports": { + "nodejs_toolchains": "nodejs_toolchains" + }, + "devImports": [], + "tags": [ + { + "tagName": "toolchain", + "attributeValues": { + "name": "nodejs" + }, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/rules_nodejs/6.0.3/MODULE.bazel", + "line": 16, + "column": 15 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_skylib": "bazel_skylib@1.5.0", + "platforms": "platforms@0.0.8", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_nodejs~6.0.3", + "urls": [ + "https://github.com/bazelbuild/rules_nodejs/releases/download/v6.0.3/rules_nodejs-v6.0.3.tar.gz" + ], + "integrity": "sha256-825KR0chAzF2cDPcMHKK498IVuiOz9xIoAd7qHTbFsM=", + "strip_prefix": "rules_nodejs-6.0.3", + "remote_patches": { + "https://bcr.bazel.build/modules/rules_nodejs/6.0.3/patches/module_dot_bazel_version.patch": "sha256-/Qzzf6CPPzlexZh3ZFFqSthBDeYANhTOf7FB76Y3Aq4=" + }, + "remote_patch_strip": 1 + } + } + }, + "rules_python@0.29.0": { + "name": "rules_python", + "version": "0.29.0", + "key": "rules_python@0.29.0", + "repoName": "rules_python", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@pythons_hub//:all" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_python//python/private/bzlmod:internal_deps.bzl", + "extensionName": "internal_deps", + "usingModule": "rules_python@0.29.0", + "location": { + "file": "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel", + "line": 15, + "column": 30 + }, + "imports": { + "rules_python_internal": "rules_python_internal", + "pypi__build": "pypi__build", + "pypi__click": "pypi__click", + "pypi__colorama": "pypi__colorama", + "pypi__importlib_metadata": "pypi__importlib_metadata", + "pypi__installer": "pypi__installer", + "pypi__more_itertools": "pypi__more_itertools", + "pypi__packaging": "pypi__packaging", + "pypi__pep517": "pypi__pep517", + "pypi__pip": "pypi__pip", + "pypi__pip_tools": "pypi__pip_tools", + "pypi__pyproject_hooks": "pypi__pyproject_hooks", + "pypi__setuptools": "pypi__setuptools", + "pypi__tomli": "pypi__tomli", + "pypi__wheel": "pypi__wheel", + "pypi__zipp": "pypi__zipp" + }, + "devImports": [], + "tags": [ + { + "tagName": "install", + "attributeValues": {}, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel", + "line": 16, + "column": 22 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@rules_python//python/extensions:python.bzl", + "extensionName": "python", + "usingModule": "rules_python@0.29.0", + "location": { + "file": "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel", + "line": 41, + "column": 23 + }, + "imports": { + "pythons_hub": "pythons_hub" + }, + "devImports": [], + "tags": [ + { + "tagName": "toolchain", + "attributeValues": { + "is_default": true, + "python_version": "3.11" + }, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel", + "line": 47, + "column": 17 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_features": "bazel_features@1.1.1", + "bazel_skylib": "bazel_skylib@1.5.0", + "platforms": "platforms@0.0.8", + "rules_proto": "rules_proto@5.3.0-21.7", + "com_google_protobuf": "protobuf@21.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0", + "urls": [ + "https://github.com/bazelbuild/rules_python/releases/download/0.29.0/rules_python-0.29.0.tar.gz" + ], + "integrity": "sha256-1x0sZ+C86YbhxadzG0aTImhnxFv+C3xeAGciilNvxYA=", + "strip_prefix": "rules_python-0.29.0", + "remote_patches": { + "https://bcr.bazel.build/modules/rules_python/0.29.0/patches/module_dot_bazel_version.patch": "sha256-JihmZ3F8ZYIsWe5XaP3/YN7+judegp21u1hNjmCBZOI=" + }, + "remote_patch_strip": 1 + } + } + }, + "bazel_skylib@1.5.0": { + "name": "bazel_skylib", + "version": "1.5.0", + "key": "bazel_skylib@1.5.0", + "repoName": "bazel_skylib", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "//toolchains/unittest:cmd_toolchain", + "//toolchains/unittest:bash_toolchain" + ], + "extensionUsages": [], + "deps": { + "platforms": "platforms@0.0.8", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "bazel_skylib~1.5.0", + "urls": [ + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz" + ], + "integrity": "sha256-zVWgYudjuTSZIfD124w5MyiNyLpPdt2UFqrGis7jy5Q=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "abseil-cpp@20240116.0": { + "name": "abseil-cpp", + "version": "20240116.0", + "key": "abseil-cpp@20240116.0", + "repoName": "abseil-cpp", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.5.0", + "com_google_googletest": "googletest@1.14.0.bcr.1", + "platforms": "platforms@0.0.8", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "abseil-cpp~20240116.0", + "urls": [ + "https://github.com/abseil/abseil-cpp/releases/download/20240116.0/abseil-cpp-20240116.0.tar.gz" + ], + "integrity": "sha256-M4QgRIsUDw39Gh6jw85xs7wXIHHyT02aV9WbRQN9pEA=", + "strip_prefix": "abseil-cpp-20240116.0", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "nlohmann_json@3.11.3": { + "name": "nlohmann_json", + "version": "3.11.3", + "key": "nlohmann_json@3.11.3", + "repoName": "nlohmann_json", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "nlohmann_json~3.11.3", + "urls": [ + "https://github.com/nlohmann/json/releases/download/v3.11.3/include.zip" + ], + "integrity": "sha256-oiRh0TEZrFx48gXT3x2xNAPljOG7F5TtyTE2dzE/Sp0=", + "strip_prefix": "", + "remote_patches": { + "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/patches/module_dot_bazel.patch": "sha256-OmeSCp1IqWbHGPJs0v5taUiPLEsI9KEJPLsnPpKB/B8=" + }, + "remote_patch_strip": 0 + } + } + }, + "fmt@10.0.0": { + "name": "fmt", + "version": "10.0.0", + "key": "fmt@10.0.0", + "repoName": "fmt", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "fmt~10.0.0", + "urls": [ + "https://github.com/fmtlib/fmt/releases/download/10.0.0/fmt-10.0.0.zip" + ], + "integrity": "sha256-SUPLFl8/WH8m2oNNMFbuhzPDl+AkFFyn0qipa7cawoE=", + "strip_prefix": "fmt-10.0.0", + "remote_patches": { + "https://bcr.bazel.build/modules/fmt/10.0.0/patches/add_build_file.patch": "sha256-bUYJz9G64DPC99/aSnVNx3JD1nStIA4zXK89OvIDmfY=", + "https://bcr.bazel.build/modules/fmt/10.0.0/patches/module_dot_bazel.patch": "sha256-q0XolQgLsu7qcDqqEiCj/+oPO/MU7f7tU111Df0xv7s=" + }, + "remote_patch_strip": 0 + } + } + }, + "bazel_tools@_": { + "name": "bazel_tools", + "version": "", + "key": "bazel_tools@_", + "repoName": "bazel_tools", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@local_config_cc_toolchains//:all", + "@local_config_sh//:local_sh_toolchain" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@bazel_tools//tools/cpp:cc_configure.bzl", + "extensionName": "cc_configure_extension", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 13, + "column": 29 + }, + "imports": { + "local_config_cc": "local_config_cc", + "local_config_cc_toolchains": "local_config_cc_toolchains" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@bazel_tools//tools/osx:xcode_configure.bzl", + "extensionName": "xcode_configure_extension", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 17, + "column": 32 + }, + "imports": { + "local_config_xcode": "local_config_xcode" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@rules_java//java:extensions.bzl", + "extensionName": "toolchains", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 20, + "column": 32 + }, + "imports": { + "local_jdk": "local_jdk", + "remote_java_tools": "remote_java_tools", + "remote_java_tools_linux": "remote_java_tools_linux", + "remote_java_tools_windows": "remote_java_tools_windows", + "remote_java_tools_darwin_x86_64": "remote_java_tools_darwin_x86_64", + "remote_java_tools_darwin_arm64": "remote_java_tools_darwin_arm64" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@bazel_tools//tools/sh:sh_configure.bzl", + "extensionName": "sh_configure_extension", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 31, + "column": 39 + }, + "imports": { + "local_config_sh": "local_config_sh" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@bazel_tools//tools/test:extensions.bzl", + "extensionName": "remote_coverage_tools_extension", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 35, + "column": 48 + }, + "imports": { + "remote_coverage_tools": "remote_coverage_tools" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@bazel_tools//tools/android:android_extensions.bzl", + "extensionName": "remote_android_tools_extensions", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 38, + "column": 42 + }, + "imports": { + "android_gmaven_r8": "android_gmaven_r8", + "android_tools": "android_tools" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "rules_cc": "rules_cc@0.0.9", + "rules_java": "rules_java@5.5.1", + "rules_license": "rules_license@0.0.7", + "rules_proto": "rules_proto@5.3.0-21.7", + "rules_python": "rules_python@0.29.0", + "platforms": "platforms@0.0.8", + "com_google_protobuf": "protobuf@21.7", + "zlib": "zlib@1.2.13", + "local_config_platform": "local_config_platform@_" + } + }, + "local_config_platform@_": { + "name": "local_config_platform", + "version": "", + "key": "local_config_platform@_", + "repoName": "local_config_platform", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "platforms": "platforms@0.0.8", + "bazel_tools": "bazel_tools@_" + } + }, + "rules_license@0.0.7": { + "name": "rules_license", + "version": "0.0.7", + "key": "rules_license@0.0.7", + "repoName": "rules_license", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_license~0.0.7", + "urls": [ + "https://github.com/bazelbuild/rules_license/releases/download/0.0.7/rules_license-0.0.7.tar.gz" + ], + "integrity": "sha256-RTHezLkTY5ww5cdRKgVNXYdWmNrrddjPkPKEN1/nw2A=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "bazel_features@1.1.1": { + "name": "bazel_features", + "version": "1.1.1", + "key": "bazel_features@1.1.1", + "repoName": "bazel_features", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [ + { + "extensionBzlFile": "@bazel_features//private:extensions.bzl", + "extensionName": "version_extension", + "usingModule": "bazel_features@1.1.1", + "location": { + "file": "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel", + "line": 6, + "column": 24 + }, + "imports": { + "bazel_features_globals": "bazel_features_globals", + "bazel_features_version": "bazel_features_version" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "bazel_features~1.1.1", + "urls": [ + "https://github.com/bazel-contrib/bazel_features/releases/download/v1.1.1/bazel_features-v1.1.1.tar.gz" + ], + "integrity": "sha256-YsJuQn5cvHUQJERpJ2IuOYqdzfMsZDJSOIFXCdEcEag=", + "strip_prefix": "bazel_features-1.1.1", + "remote_patches": { + "https://bcr.bazel.build/modules/bazel_features/1.1.1/patches/module_dot_bazel_version.patch": "sha256-+56MAEsc7bYN/Pzhn252ZQUxiRzZg9bynXj1qpsmCYs=" + }, + "remote_patch_strip": 1 + } + } + }, + "rules_proto@5.3.0-21.7": { + "name": "rules_proto", + "version": "5.3.0-21.7", + "key": "rules_proto@5.3.0-21.7", + "repoName": "rules_proto", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.5.0", + "com_google_protobuf": "protobuf@21.7", + "rules_cc": "rules_cc@0.0.9", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_proto~5.3.0-21.7", + "urls": [ + "https://github.com/bazelbuild/rules_proto/archive/refs/tags/5.3.0-21.7.tar.gz" + ], + "integrity": "sha256-3D+yBqLLNEG0heseQjFlsjEjWh6psDG0Qzz3vB+kYN0=", + "strip_prefix": "rules_proto-5.3.0-21.7", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "protobuf@21.7": { + "name": "protobuf", + "version": "21.7", + "key": "protobuf@21.7", + "repoName": "protobuf", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_jvm_external//:extensions.bzl", + "extensionName": "maven", + "usingModule": "protobuf@21.7", + "location": { + "file": "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel", + "line": 22, + "column": 22 + }, + "imports": { + "maven": "maven" + }, + "devImports": [], + "tags": [ + { + "tagName": "install", + "attributeValues": { + "name": "maven", + "artifacts": [ + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.code.gson:gson:2.8.9", + "com.google.errorprone:error_prone_annotations:2.3.2", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.guava:guava:31.1-jre", + "com.google.guava:guava-testlib:31.1-jre", + "com.google.truth:truth:1.1.2", + "junit:junit:4.13.2", + "org.mockito:mockito-core:4.3.1" + ] + }, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel", + "line": 24, + "column": 14 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_skylib": "bazel_skylib@1.5.0", + "rules_python": "rules_python@0.29.0", + "rules_cc": "rules_cc@0.0.9", + "rules_proto": "rules_proto@5.3.0-21.7", + "rules_java": "rules_java@5.5.1", + "rules_pkg": "rules_pkg@0.9.1", + "com_google_abseil": "abseil-cpp@20240116.0", + "zlib": "zlib@1.2.13", + "upb": "upb@0.0.0-20220923-a547704", + "rules_jvm_external": "rules_jvm_external@4.4.2", + "com_google_googletest": "googletest@1.14.0.bcr.1", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "protobuf~21.7", + "urls": [ + "https://github.com/protocolbuffers/protobuf/releases/download/v21.7/protobuf-all-21.7.zip" + ], + "integrity": "sha256-VJOiH17T/FAuZv7GuUScBqVRztYwAvpIkDxA36jeeko=", + "strip_prefix": "protobuf-21.7", + "remote_patches": { + "https://bcr.bazel.build/modules/protobuf/21.7/patches/add_module_dot_bazel.patch": "sha256-q3V2+eq0v2XF0z8z+V+QF4cynD6JvHI1y3kI/+rzl5s=", + "https://bcr.bazel.build/modules/protobuf/21.7/patches/add_module_dot_bazel_for_examples.patch": "sha256-O7YP6s3lo/1opUiO0jqXYORNHdZ/2q3hjz1QGy8QdIU=", + "https://bcr.bazel.build/modules/protobuf/21.7/patches/relative_repo_names.patch": "sha256-RK9RjW8T5UJNG7flIrnFiNE9vKwWB+8uWWtJqXYT0w4=", + "https://bcr.bazel.build/modules/protobuf/21.7/patches/add_missing_files.patch": "sha256-Hyne4DG2u5bXcWHNxNMirA2QFAe/2Cl8oMm1XJdkQIY=" + }, + "remote_patch_strip": 1 + } + } + }, + "googletest@1.14.0.bcr.1": { + "name": "googletest", + "version": "1.14.0.bcr.1", + "key": "googletest@1.14.0.bcr.1", + "repoName": "googletest", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "com_google_absl": "abseil-cpp@20240116.0", + "platforms": "platforms@0.0.8", + "rules_cc": "rules_cc@0.0.9", + "com_googlesource_code_re2": "re2@2023-09-01", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "googletest~1.14.0.bcr.1", + "urls": [ + "https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz" + ], + "integrity": "sha256-itWYxzrXluDYKAsILOvYKmMNc+c808cAV5OKZQG7pdc=", + "strip_prefix": "googletest-1.14.0", + "remote_patches": { + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/patches/module_dot_bazel.patch": "sha256-jijctisPYOzP4X4cl0K7neRh/kqJB+yODNHf8V8heCE=" + }, + "remote_patch_strip": 0 + } + } + }, + "rules_cc@0.0.9": { + "name": "rules_cc", + "version": "0.0.9", + "key": "rules_cc@0.0.9", + "repoName": "rules_cc", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@local_config_cc_toolchains//:all" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@bazel_tools//tools/cpp:cc_configure.bzl", + "extensionName": "cc_configure_extension", + "usingModule": "rules_cc@0.0.9", + "location": { + "file": "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel", + "line": 9, + "column": 29 + }, + "imports": { + "local_config_cc_toolchains": "local_config_cc_toolchains" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "platforms": "platforms@0.0.8", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_cc~0.0.9", + "urls": [ + "https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz" + ], + "integrity": "sha256-IDeHW5pEVtzkp50RKorohbvEqtlo5lh9ym5k86CQDN8=", + "strip_prefix": "rules_cc-0.0.9", + "remote_patches": { + "https://bcr.bazel.build/modules/rules_cc/0.0.9/patches/module_dot_bazel_version.patch": "sha256-mM+qzOI0SgAdaJBlWOSMwMPKpaA9b7R37Hj/tp5bb4g=" + }, + "remote_patch_strip": 0 + } + } + }, + "rules_java@5.5.1": { + "name": "rules_java", + "version": "5.5.1", + "key": "rules_java@5.5.1", + "repoName": "rules_java", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "//toolchains:all", + "@local_jdk//:runtime_toolchain_definition", + "@remotejdk11_linux_toolchain_config_repo//:toolchain", + "@remotejdk11_macos_toolchain_config_repo//:toolchain", + "@remotejdk11_macos_aarch64_toolchain_config_repo//:toolchain", + "@remotejdk11_win_toolchain_config_repo//:toolchain", + "@remotejdk17_linux_toolchain_config_repo//:toolchain", + "@remotejdk17_macos_toolchain_config_repo//:toolchain", + "@remotejdk17_macos_aarch64_toolchain_config_repo//:toolchain", + "@remotejdk17_win_toolchain_config_repo//:toolchain", + "@remotejdk19_linux_toolchain_config_repo//:toolchain", + "@remotejdk19_macos_toolchain_config_repo//:toolchain", + "@remotejdk19_macos_aarch64_toolchain_config_repo//:toolchain", + "@remotejdk19_win_toolchain_config_repo//:toolchain", + "@remotejdk11_linux_aarch64_toolchain_config_repo//:toolchain", + "@remotejdk11_linux_ppc64le_toolchain_config_repo//:toolchain", + "@remotejdk11_linux_s390x_toolchain_config_repo//:toolchain" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_java//java:extensions.bzl", + "extensionName": "toolchains", + "usingModule": "rules_java@5.5.1", + "location": { + "file": "https://bcr.bazel.build/modules/rules_java/5.5.1/MODULE.bazel", + "line": 16, + "column": 27 + }, + "imports": { + "remote_java_tools": "remote_java_tools", + "remote_java_tools_linux": "remote_java_tools_linux", + "remote_java_tools_windows": "remote_java_tools_windows", + "remote_java_tools_darwin_x86_64": "remote_java_tools_darwin_x86_64", + "remote_java_tools_darwin_arm64": "remote_java_tools_darwin_arm64", + "local_jdk": "local_jdk", + "remotejdk11_linux_toolchain_config_repo": "remotejdk11_linux_toolchain_config_repo", + "remotejdk11_macos_toolchain_config_repo": "remotejdk11_macos_toolchain_config_repo", + "remotejdk11_macos_aarch64_toolchain_config_repo": "remotejdk11_macos_aarch64_toolchain_config_repo", + "remotejdk11_win_toolchain_config_repo": "remotejdk11_win_toolchain_config_repo", + "remotejdk17_linux_toolchain_config_repo": "remotejdk17_linux_toolchain_config_repo", + "remotejdk17_macos_toolchain_config_repo": "remotejdk17_macos_toolchain_config_repo", + "remotejdk17_macos_aarch64_toolchain_config_repo": "remotejdk17_macos_aarch64_toolchain_config_repo", + "remotejdk17_win_toolchain_config_repo": "remotejdk17_win_toolchain_config_repo", + "remotejdk19_linux_toolchain_config_repo": "remotejdk19_linux_toolchain_config_repo", + "remotejdk19_macos_toolchain_config_repo": "remotejdk19_macos_toolchain_config_repo", + "remotejdk19_macos_aarch64_toolchain_config_repo": "remotejdk19_macos_aarch64_toolchain_config_repo", + "remotejdk19_win_toolchain_config_repo": "remotejdk19_win_toolchain_config_repo", + "remotejdk11_linux_aarch64_toolchain_config_repo": "remotejdk11_linux_aarch64_toolchain_config_repo", + "remotejdk11_linux_ppc64le_toolchain_config_repo": "remotejdk11_linux_ppc64le_toolchain_config_repo", + "remotejdk11_linux_s390x_toolchain_config_repo": "remotejdk11_linux_s390x_toolchain_config_repo" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "platforms": "platforms@0.0.8", + "rules_cc": "rules_cc@0.0.9", + "bazel_skylib": "bazel_skylib@1.5.0", + "rules_proto": "rules_proto@5.3.0-21.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1", + "urls": [ + "https://github.com/bazelbuild/rules_java/releases/download/5.5.1/rules_java-5.5.1.tar.gz" + ], + "integrity": "sha256-c7iPNNwlG857xsRy6zhqbCsxLtW0c8gf5GhVwkj3kuA=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "zlib@1.2.13": { + "name": "zlib", + "version": "1.2.13", + "key": "zlib@1.2.13", + "repoName": "zlib", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "zlib~1.2.13", + "urls": [ + "https://github.com/madler/zlib/archive/refs/tags/v1.2.13.zip" + ], + "integrity": "sha256-woVpUbvzDjCGGs43ZVldhroT8s8BJ52QH2xiJYxX9P8=", + "strip_prefix": "zlib-1.2.13", + "remote_patches": { + "https://bcr.bazel.build/modules/zlib/1.2.13/patches/add_build_file.patch": "sha256-Z2ig1F01/dfdG63H+GwYRMcGbW/zAGIUWnKKrwKSEaQ=", + "https://bcr.bazel.build/modules/zlib/1.2.13/patches/module_dot_bazel.patch": "sha256-Nc7xP02Dl6yHQvkiZWSQnlnw1T277yS4cJxxONWJ/Ic=" + }, + "remote_patch_strip": 0 + } + } + }, + "upb@0.0.0-20220923-a547704": { + "name": "upb", + "version": "0.0.0-20220923-a547704", + "key": "upb@0.0.0-20220923-a547704", + "repoName": "upb", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.5.0", + "rules_proto": "rules_proto@5.3.0-21.7", + "com_google_protobuf": "protobuf@21.7", + "com_google_absl": "abseil-cpp@20240116.0", + "platforms": "platforms@0.0.8", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "upb~0.0.0-20220923-a547704", + "urls": [ + "https://github.com/protocolbuffers/upb/archive/a5477045acaa34586420942098f5fecd3570f577.tar.gz" + ], + "integrity": "sha256-z39x6v+QskwaKLSWRan/A6mmwecTQpHOcJActj5zZLU=", + "strip_prefix": "upb-a5477045acaa34586420942098f5fecd3570f577", + "remote_patches": { + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/patches/module_dot_bazel.patch": "sha256-wH4mNS6ZYy+8uC0HoAft/c7SDsq2Kxf+J8dUakXhaB0=" + }, + "remote_patch_strip": 0 + } + } + }, + "rules_jvm_external@4.4.2": { + "name": "rules_jvm_external", + "version": "4.4.2", + "key": "rules_jvm_external@4.4.2", + "repoName": "rules_jvm_external", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_jvm_external//:non-module-deps.bzl", + "extensionName": "non_module_deps", + "usingModule": "rules_jvm_external@4.4.2", + "location": { + "file": "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel", + "line": 9, + "column": 32 + }, + "imports": { + "io_bazel_rules_kotlin": "io_bazel_rules_kotlin" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": ":extensions.bzl", + "extensionName": "maven", + "usingModule": "rules_jvm_external@4.4.2", + "location": { + "file": "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel", + "line": 16, + "column": 22 + }, + "imports": { + "rules_jvm_external_deps": "rules_jvm_external_deps" + }, + "devImports": [], + "tags": [ + { + "tagName": "install", + "attributeValues": { + "name": "rules_jvm_external_deps", + "artifacts": [ + "com.google.cloud:google-cloud-core:1.93.10", + "com.google.cloud:google-cloud-storage:1.113.4", + "com.google.code.gson:gson:2.9.0", + "org.apache.maven:maven-artifact:3.8.6", + "software.amazon.awssdk:s3:2.17.183" + ], + "lock_file": "@rules_jvm_external//:rules_jvm_external_deps_install.json" + }, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel", + "line": 18, + "column": 14 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_skylib": "bazel_skylib@1.5.0", + "io_bazel_stardoc": "stardoc@0.5.1", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_jvm_external~4.4.2", + "urls": [ + "https://github.com/bazelbuild/rules_jvm_external/archive/refs/tags/4.4.2.zip" + ], + "integrity": "sha256-c1YC9QgT6y6pPKP15DsZWb2AshO4NqB6YqKddXZwt3s=", + "strip_prefix": "rules_jvm_external-4.4.2", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "re2@2023-09-01": { + "name": "re2", + "version": "2023-09-01", + "key": "re2@2023-09-01", + "repoName": "re2", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [ + { + "extensionBzlFile": "@pybind11_bazel//:python_configure.bzl", + "extensionName": "extension", + "usingModule": "re2@2023-09-01", + "location": { + "file": "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel", + "line": 22, + "column": 33 + }, + "imports": { + "local_config_python": "local_config_python", + "pybind11": "pybind11" + }, + "devImports": [], + "tags": [ + { + "tagName": "toolchain", + "attributeValues": { + "python_version": "3" + }, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel", + "line": 23, + "column": 27 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "platforms": "platforms@0.0.8", + "rules_cc": "rules_cc@0.0.9", + "com_google_absl": "abseil-cpp@20240116.0", + "rules_python": "rules_python@0.29.0", + "pybind11_bazel": "pybind11_bazel@2.11.1", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "re2~2023-09-01", + "urls": [ + "https://github.com/google/re2/releases/download/2023-09-01/re2-2023-09-01.zip" + ], + "integrity": "sha256-IkuDUdxGM7EBLb2EdWTgYKRr5goioUY9S1uZP9S/Wcw=", + "strip_prefix": "re2-2023-09-01", + "remote_patches": { + "https://bcr.bazel.build/modules/re2/2023-09-01/patches/module_dot_bazel.patch": "sha256-MUQkRNgPJ0lbYqOXoBu2m2vLH7IuKEbK/VWTw7WWrnA=" + }, + "remote_patch_strip": 0 + } + } + }, + "stardoc@0.5.1": { + "name": "stardoc", + "version": "0.5.1", + "key": "stardoc@0.5.1", + "repoName": "stardoc", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.5.0", + "rules_java": "rules_java@5.5.1", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "stardoc~0.5.1", + "urls": [ + "https://github.com/bazelbuild/stardoc/releases/download/0.5.1/stardoc-0.5.1.tar.gz" + ], + "integrity": "sha256-qoFNrgrEALurLoiB+ZFcb0fElmS/CHxAmhX5BDjSwj4=", + "strip_prefix": "", + "remote_patches": { + "https://bcr.bazel.build/modules/stardoc/0.5.1/patches/module_dot_bazel.patch": "sha256-UAULCuTpJE7SG0YrR9XLjMfxMRmbP+za3uW9ONZ5rjI=" + }, + "remote_patch_strip": 0 + } + } + }, + "pybind11_bazel@2.11.1": { + "name": "pybind11_bazel", + "version": "2.11.1", + "key": "pybind11_bazel@2.11.1", + "repoName": "pybind11_bazel", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "platforms": "platforms@0.0.8", + "rules_cc": "rules_cc@0.0.9", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "pybind11_bazel~2.11.1", + "urls": [ + "https://github.com/pybind/pybind11_bazel/releases/download/v2.11.1/pybind11_bazel-2.11.1.zip" + ], + "integrity": "sha256-LEZsmzzKeFK0fgeFADEomE/PDV1hoaLkxazu/ZNawiA=", + "strip_prefix": "pybind11_bazel-2.11.1", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + } + }, + "moduleExtensions": { + "//swift/third_party:load.bzl%swift_deps": { + "general": { + "bzlTransitiveDigest": "sb8oxwz4X2YEkeO5BZQfH2A1YkljDQ1BAZegKwhAzOo=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "swift_toolchain_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "_main~swift_deps~swift_toolchain_linux", + "url": "https://download.swift.org/swift-5.9.2-release/ubuntu2004/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu20.04.tar.gz", + "sha256": "93477b80db16f3e5085738ade05478ed435793e39864418e737a10ac306cbd8c", + "build_file": "@@//swift/third_party:BUILD.swift-toolchain-linux.bazel", + "strip_prefix": "swift-5.9.2-RELEASE-ubuntu20.04" + } + }, + "swift_prebuilt_darwin_x86_64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "_main~swift_deps~swift_prebuilt_darwin_x86_64", + "url": "https://github.com/dsp-testing/codeql-swift-artifacts/releases/download/swift-5.9.2-RELEASE.299/swift-prebuilt-macOS-X64.zip", + "build_file": "@@//swift/third_party:BUILD.swift-llvm-support.bazel", + "sha256": "16f3a248269a06b00c6a40567ca06d5494d9a0ce24e7dd7cb8534828639418e8", + "patch_args": [ + "-p1" + ], + "patches": [ + "@@//swift/third_party/swift-llvm-support:patches/remove-redundant-operators.patch", + "@@//swift/third_party/swift-llvm-support:patches/add-constructor-to-Compilation.patch" + ] + } + }, + "picosha2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "_main~swift_deps~picosha2", + "url": "https://github.com/okdshin/PicoSHA2/archive/27fcf6979298949e8a462e16d09a0351c18fcaf2.zip", + "strip_prefix": "PicoSHA2-27fcf6979298949e8a462e16d09a0351c18fcaf2", + "build_file": "@@//swift/third_party:BUILD.picosha2.bazel", + "sha256": "d6647ca45a8b7bdaf027ecb68d041b22a899a0218b7206dee755c558a2725abb" + } + }, + "swift_prebuilt_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "_main~swift_deps~swift_prebuilt_linux", + "url": "https://github.com/dsp-testing/codeql-swift-artifacts/releases/download/swift-5.9.2-RELEASE.299/swift-prebuilt-Linux-X64.zip", + "build_file": "@@//swift/third_party:BUILD.swift-llvm-support.bazel", + "sha256": "19e8150251601e7b27e76d1a405a72c459f9a3e2949a1e360fde15ebb4d87409", + "patch_args": [ + "-p1" + ], + "patches": [ + "@@//swift/third_party/swift-llvm-support:patches/remove-redundant-operators.patch", + "@@//swift/third_party/swift-llvm-support:patches/add-constructor-to-Compilation.patch" + ] + } + }, + "binlog": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "_main~swift_deps~binlog", + "url": "https://github.com/morganstanley/binlog/archive/3fef8846f5ef98e64211e7982c2ead67e0b185a6.zip", + "strip_prefix": "binlog-3fef8846f5ef98e64211e7982c2ead67e0b185a6", + "build_file": "@@//swift/third_party:BUILD.binlog.bazel", + "sha256": "f5c61d90a6eff341bf91771f2f465be391fd85397023e1b391c17214f9cbd045" + } + }, + "swift_toolchain_macos": { + "bzlFile": "@@//swift/third_party:load.bzl", + "ruleClassName": "_pkg_archive", + "attributes": { + "name": "_main~swift_deps~swift_toolchain_macos", + "url": "https://download.swift.org/swift-5.9.2-release/xcode/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-osx.pkg", + "sha256": "68951c313b4b559878fc5be27e460c877f98d14e161f755220b063123919e896", + "build_file": "@@//swift/third_party:BUILD.swift-toolchain-macos.bazel", + "strip_prefix": "swift-5.9.2-RELEASE-osx" + } + } + } + } + }, + "@bazel_features~1.1.1//private:extensions.bzl%version_extension": { + "general": { + "bzlTransitiveDigest": "xm7Skm1Las5saxzFWt2hbS+e68BWi+MXyt6+lKIhjPA=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "bazel_features_version": { + "bzlFile": "@@bazel_features~1.1.1//private:version_repo.bzl", + "ruleClassName": "version_repo", + "attributes": { + "name": "bazel_features~1.1.1~version_extension~bazel_features_version" + } + }, + "bazel_features_globals": { + "bzlFile": "@@bazel_features~1.1.1//private:globals_repo.bzl", + "ruleClassName": "globals_repo", + "attributes": { + "name": "bazel_features~1.1.1~version_extension~bazel_features_globals", + "globals": { + "RunEnvironmentInfo": "5.3.0", + "DefaultInfo": "0.0.1", + "__TestingOnly_NeverAvailable": "1000000000.0.0" + } + } + } + } + } + }, + "@bazel_tools//tools/cpp:cc_configure.bzl%cc_configure_extension": { + "general": { + "bzlTransitiveDigest": "sftnIlf92nP/IUiWiMkgL9Sh8Drk9kKhTXHvoavVJZg=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_cc": { + "bzlFile": "@@bazel_tools//tools/cpp:cc_configure.bzl", + "ruleClassName": "cc_autoconf", + "attributes": { + "name": "bazel_tools~cc_configure_extension~local_config_cc" + } + }, + "local_config_cc_toolchains": { + "bzlFile": "@@bazel_tools//tools/cpp:cc_configure.bzl", + "ruleClassName": "cc_autoconf_toolchains", + "attributes": { + "name": "bazel_tools~cc_configure_extension~local_config_cc_toolchains" + } + } + } + } + }, + "@bazel_tools//tools/sh:sh_configure.bzl%sh_configure_extension": { + "general": { + "bzlTransitiveDigest": "hp4NgmNjEg5+xgvzfh6L83bt9/aiiWETuNpwNuF1MSU=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_sh": { + "bzlFile": "@@bazel_tools//tools/sh:sh_configure.bzl", + "ruleClassName": "sh_config", + "attributes": { + "name": "bazel_tools~sh_configure_extension~local_config_sh" + } + } + } + } + }, + "@rules_java~5.5.1//java:extensions.bzl%toolchains": { + "general": { + "bzlTransitiveDigest": "IFVnLAj9sdT9p8x0XTGG1Ea54qqosuXfcRu2egn7Sqw=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "remotejdk19_macos_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk19_macos_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_19\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"19\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk19_macos_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk17_macos_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_macos_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos//:jdk\",\n)\n" + } + }, + "remotejdk17_linux_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_linux_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux//:jdk\",\n)\n" + } + }, + "remote_java_tools_darwin": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remote_java_tools_darwin", + "sha256": "abc434be713ee9e1fd6525d7a7bd9d7cdff6e27ae3ca9d96420490e7ff6e28a3", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_darwin_x86_64-v12.0.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_darwin_x86_64-v12.0.zip" + ] + } + }, + "remotejdk17_macos_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_macos_aarch64", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "54247dde248ffbcd3c048675504b1c503b81daf2dc0d64a79e353c48d383c977", + "strip_prefix": "zulu17.32.13-ca-jdk17.0.2-macosx_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-macosx_aarch64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-macosx_aarch64.tar.gz" + ] + } + }, + "remote_java_tools_windows": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remote_java_tools_windows", + "sha256": "7b938f0c67d9d390f10489b1b9a4dabb51e39ecc94532c3acdf8c4c16900457f", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_windows-v12.0.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_windows-v12.0.zip" + ] + } + }, + "remotejdk11_win": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_win", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "a106c77389a63b6bd963a087d5f01171bd32aa3ee7377ecef87531390dcb9050", + "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-win_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-win_x64.zip", + "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-win_x64.zip" + ] + } + }, + "remotejdk11_win_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_win_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_aarch64", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "fc7c41a0005180d4ca471c90d01e049469e0614cf774566d4cf383caa29d1a97", + "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-linux_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu-embedded/bin/zulu11.56.19-ca-jdk11.0.15-linux_aarch64.tar.gz", + "https://cdn.azul.com/zulu-embedded/bin/zulu11.56.19-ca-jdk11.0.15-linux_aarch64.tar.gz" + ] + } + }, + "remotejdk17_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_linux", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "73d5c4bae20325ca41b606f7eae64669db3aac638c5b3ead4a975055846ad6de", + "strip_prefix": "zulu17.32.13-ca-jdk17.0.2-linux_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-linux_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-linux_x64.tar.gz" + ] + } + }, + "remotejdk11_linux_s390x_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_s390x_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_s390x//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux//:jdk\",\n)\n" + } + }, + "remotejdk11_macos": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_macos", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "2614e5c5de8e989d4d81759de4c333aa5b867b17ab9ee78754309ba65c7f6f55", + "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-macosx_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_x64.tar.gz" + ] + } + }, + "remotejdk11_win_arm64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_win_arm64", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "b8a28e6e767d90acf793ea6f5bed0bb595ba0ba5ebdf8b99f395266161e53ec2", + "strip_prefix": "jdk-11.0.13+8", + "urls": [ + "https://mirror.bazel.build/aka.ms/download-jdk/microsoft-jdk-11.0.13.8.1-windows-aarch64.zip" + ] + } + }, + "remotejdk17_macos": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_macos", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "89d04b2d99b05dcb25114178e65f6a1c5ca742e125cab0a63d87e7e42f3fcb80", + "strip_prefix": "zulu17.32.13-ca-jdk17.0.2-macosx_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-macosx_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-macosx_x64.tar.gz" + ] + } + }, + "remotejdk17_macos_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_macos_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk17_win": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_win", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "e965aa0ea7a0661a3446cf8f10ee00684b851f883b803315289f26b4aa907fdb", + "strip_prefix": "zulu17.32.13-ca-jdk17.0.2-win_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-win_x64.zip", + "https://cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-win_x64.zip" + ] + } + }, + "remotejdk11_macos_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_macos_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_ppc64le_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_ppc64le_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_ppc64le//:jdk\",\n)\n" + } + }, + "remote_java_tools_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remote_java_tools_linux", + "sha256": "4b8366b780387fc5ce69527ed287f2b444ee429d3325305ad062c92ac43c7fb6", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_linux-v12.0.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_linux-v12.0.zip" + ] + } + }, + "remotejdk19_macos_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk19_macos_aarch64", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "177d058d968b2fbe7a5ff5eceb18cdc16f6376ce291004f1a3139e78b2fb6391", + "strip_prefix": "zulu19.32.13-ca-jdk19.0.2-macosx_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-macosx_aarch64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-macosx_aarch64.tar.gz" + ] + } + }, + "remotejdk19_win_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk19_win_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_19\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"19\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk19_win//:jdk\",\n)\n" + } + }, + "remotejdk19_macos_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk19_macos_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_19\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"19\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk19_macos//:jdk\",\n)\n" + } + }, + "remotejdk19_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk19_linux", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "4a994aded1d9b35258d543a59d4963d2687a1094a818b79a21f00273fbbc5bca", + "strip_prefix": "zulu19.32.13-ca-jdk19.0.2-linux_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-linux_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-linux_x64.tar.gz" + ] + } + }, + "remotejdk11_linux_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_s390x": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_s390x", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "a58fc0361966af0a5d5a31a2d8a208e3c9bb0f54f345596fd80b99ea9a39788b", + "strip_prefix": "jdk-11.0.15+10", + "urls": [ + "https://mirror.bazel.build/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.15_10.tar.gz", + "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.15_10.tar.gz" + ] + } + }, + "remotejdk17_win_arm64_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_win_arm64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win_arm64//:jdk\",\n)\n" + } + }, + "remotejdk11_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_linux", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "e064b61d93304012351242bf0823c6a2e41d9e28add7ea7f05378b7243d34247", + "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-linux_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-linux_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-linux_x64.tar.gz" + ] + } + }, + "remotejdk11_macos_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_macos_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos//:jdk\",\n)\n" + } + }, + "remotejdk19_win": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk19_win", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "d6c768c5ec3252f936bd0562c25458f7c753c62835ca3e91166f975f7a5fe9f1", + "strip_prefix": "zulu19.32.13-ca-jdk19.0.2-win_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-win_x64.zip", + "https://cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-win_x64.zip" + ] + } + }, + "remotejdk17_win_arm64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_win_arm64", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "811d7e7591bac4f081dfb00ba6bd15b6fc5969e1f89f0f327ef75147027c3877", + "strip_prefix": "zulu17.30.15-ca-jdk17.0.1-win_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip", + "https://cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip" + ] + } + }, + "remotejdk19_macos": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk19_macos", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "2804575ae9ac63e39caa910e57610bf52b0f9e2d671928a98d18e2fcc9f62ac1", + "strip_prefix": "zulu19.32.13-ca-jdk19.0.2-macosx_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-macosx_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-macosx_x64.tar.gz" + ] + } + }, + "remotejdk19_linux_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk19_linux_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_19\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"19\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk19_linux//:jdk\",\n)\n" + } + }, + "remote_java_tools_darwin_arm64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remote_java_tools_darwin_arm64", + "sha256": "24a47a5557ee2ccdacd10a54fe4c15d627c6aeaf7596a5dccf2e11a866a5a32a", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_darwin_arm64-v12.0.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_darwin_arm64-v12.0.zip" + ] + } + }, + "remotejdk11_win_arm64_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_win_arm64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win_arm64//:jdk\",\n)\n" + } + }, + "local_jdk": { + "bzlFile": "@@rules_java~5.5.1//toolchains:local_java_repository.bzl", + "ruleClassName": "_local_java_repository_rule", + "attributes": { + "name": "rules_java~5.5.1~toolchains~local_jdk", + "target_name": "local_jdk", + "java_home": "", + "version": "", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD" + } + }, + "remote_java_tools_darwin_x86_64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remote_java_tools_darwin_x86_64", + "sha256": "abc434be713ee9e1fd6525d7a7bd9d7cdff6e27ae3ca9d96420490e7ff6e28a3", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_darwin_x86_64-v12.0.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_darwin_x86_64-v12.0.zip" + ] + } + }, + "remote_java_tools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remote_java_tools", + "sha256": "6efab6ca6e16e02c90e62bbd08ca65f61527984ab78564ea7ad7a2692b2ffdbb", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools-v12.0.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools-v12.0.zip" + ] + } + }, + "remotejdk17_win_toolchain_config_repo": { + "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk17_win_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_ppc64le": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_ppc64le", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "a8fba686f6eb8ae1d1a9566821dbd5a85a1108b96ad857fdbac5c1e4649fc56f", + "strip_prefix": "jdk-11.0.15+10", + "urls": [ + "https://mirror.bazel.build/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.15_10.tar.gz", + "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.15_10.tar.gz" + ] + } + }, + "remotejdk11_macos_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~5.5.1~toolchains~remotejdk11_macos_aarch64", + "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", + "sha256": "6bb0d2c6e8a29dcd9c577bbb2986352ba12481a9549ac2c0bcfd00ed60e538d2", + "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-macosx_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_aarch64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_aarch64.tar.gz" + ] + } + } + } + } + }, + "@rules_nodejs~6.0.3//nodejs:extensions.bzl%node": { + "general": { + "bzlTransitiveDigest": "eqSZz/NyLGaVPPEg+/9gv/EheVgW2R69KZ73JlD5GWE=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "nodejs_host": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs/private:nodejs_repo_host_os_alias.bzl", + "ruleClassName": "nodejs_repo_host_os_alias", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs_host", + "user_node_repository_name": "nodejs" + } + }, + "nodejs_linux_s390x": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs_linux_s390x", + "platform": "linux_s390x", + "node_version": "18.15.0" + } + }, + "nodejs_windows_amd64": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs_windows_amd64", + "platform": "windows_amd64", + "node_version": "18.15.0" + } + }, + "nodejs_toolchains": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs/private:toolchains_repo.bzl", + "ruleClassName": "toolchains_repo", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs_toolchains", + "user_node_repository_name": "nodejs" + } + }, + "nodejs_linux_amd64": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs_linux_amd64", + "platform": "linux_amd64", + "node_version": "18.15.0" + } + }, + "nodejs_linux_ppc64le": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs_linux_ppc64le", + "platform": "linux_ppc64le", + "node_version": "18.15.0" + } + }, + "nodejs_darwin_amd64": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs_darwin_amd64", + "platform": "darwin_amd64", + "node_version": "18.15.0" + } + }, + "nodejs_linux_arm64": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs_linux_arm64", + "platform": "linux_arm64", + "node_version": "18.15.0" + } + }, + "nodejs": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs/private:nodejs_repo_host_os_alias.bzl", + "ruleClassName": "nodejs_repo_host_os_alias", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs", + "user_node_repository_name": "nodejs" + } + }, + "nodejs_darwin_arm64": { + "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", + "attributes": { + "name": "rules_nodejs~6.0.3~node~nodejs_darwin_arm64", + "platform": "darwin_arm64", + "node_version": "18.15.0" + } + } + } + } + }, + "@rules_python~0.29.0//python/extensions:pip.bzl%pip": { + "os:linux,arch:amd64": { + "bzlTransitiveDigest": "wx5kTEjbB2zrDT61Y5ME2JZ6176Xr86NnjcdnCkvcqo=", + "accumulatedFileDigests": { + "@@//misc/codegen:requirements_lock.txt": "dc26eb4012e16e8623219eb63df85b86096f22550d755a29e6e45e09a3aaef75" + }, + "envVariables": {}, + "generatedRepoSpecs": { + "codegen_deps_311_pytest": { + "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "whl_library", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps_311_pytest", + "requirement": "pytest==8.0.0", + "repo": "codegen_deps_311", + "repo_prefix": "codegen_deps_311_", + "whl_patches": {}, + "experimental_target_platforms": [], + "python_interpreter": "", + "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "quiet": true, + "timeout": 600, + "isolated": true, + "extra_pip_args": [], + "download_only": false, + "pip_data_exclude": [], + "enable_implicit_namespace_pkgs": false, + "environment": {}, + "group_name": "", + "group_deps": [] + } + }, + "codegen_deps_311_iniconfig": { + "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "whl_library", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps_311_iniconfig", + "requirement": "iniconfig==2.0.0", + "repo": "codegen_deps_311", + "repo_prefix": "codegen_deps_311_", + "whl_patches": {}, + "experimental_target_platforms": [], + "python_interpreter": "", + "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "quiet": true, + "timeout": 600, + "isolated": true, + "extra_pip_args": [], + "download_only": false, + "pip_data_exclude": [], + "enable_implicit_namespace_pkgs": false, + "environment": {}, + "group_name": "", + "group_deps": [] + } + }, + "codegen_deps_311_pluggy": { + "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "whl_library", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps_311_pluggy", + "requirement": "pluggy==1.4.0", + "repo": "codegen_deps_311", + "repo_prefix": "codegen_deps_311_", + "whl_patches": {}, + "experimental_target_platforms": [], + "python_interpreter": "", + "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "quiet": true, + "timeout": 600, + "isolated": true, + "extra_pip_args": [], + "download_only": false, + "pip_data_exclude": [], + "enable_implicit_namespace_pkgs": false, + "environment": {}, + "group_name": "", + "group_deps": [] + } + }, + "codegen_deps_311_pystache": { + "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "whl_library", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps_311_pystache", + "requirement": "pystache==0.6.5", + "repo": "codegen_deps_311", + "repo_prefix": "codegen_deps_311_", + "whl_patches": {}, + "experimental_target_platforms": [], + "python_interpreter": "", + "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "quiet": true, + "timeout": 600, + "isolated": true, + "extra_pip_args": [], + "download_only": false, + "pip_data_exclude": [], + "enable_implicit_namespace_pkgs": false, + "environment": {}, + "group_name": "", + "group_deps": [] + } + }, + "codegen_deps_311__groups": { + "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "group_library", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps_311__groups", + "repo_prefix": "codegen_deps_311_", + "groups": {} + } + }, + "codegen_deps_311_packaging": { + "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "whl_library", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps_311_packaging", + "requirement": "packaging==23.2", + "repo": "codegen_deps_311", + "repo_prefix": "codegen_deps_311_", + "whl_patches": {}, + "experimental_target_platforms": [], + "python_interpreter": "", + "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "quiet": true, + "timeout": 600, + "isolated": true, + "extra_pip_args": [], + "download_only": false, + "pip_data_exclude": [], + "enable_implicit_namespace_pkgs": false, + "environment": {}, + "group_name": "", + "group_deps": [] + } + }, + "codegen_deps": { + "bzlFile": "@@rules_python~0.29.0//python/private/bzlmod:pip_repository.bzl", + "ruleClassName": "pip_repository", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps", + "repo_name": "codegen_deps", + "whl_map": { + "inflection": [ + "3.11" + ], + "iniconfig": [ + "3.11" + ], + "packaging": [ + "3.11" + ], + "pluggy": [ + "3.11" + ], + "pystache": [ + "3.11" + ], + "pytest": [ + "3.11" + ], + "pyyaml": [ + "3.11" + ], + "toposort": [ + "3.11" + ] + }, + "default_version": "3.11" + } + }, + "codegen_deps_311_pyyaml": { + "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "whl_library", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps_311_pyyaml", + "requirement": "pyyaml==6.0.1", + "repo": "codegen_deps_311", + "repo_prefix": "codegen_deps_311_", + "whl_patches": {}, + "experimental_target_platforms": [], + "python_interpreter": "", + "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "quiet": true, + "timeout": 600, + "isolated": true, + "extra_pip_args": [], + "download_only": false, + "pip_data_exclude": [], + "enable_implicit_namespace_pkgs": false, + "environment": {}, + "group_name": "", + "group_deps": [] + } + }, + "codegen_deps_311_inflection": { + "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "whl_library", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps_311_inflection", + "requirement": "inflection==0.5.1", + "repo": "codegen_deps_311", + "repo_prefix": "codegen_deps_311_", + "whl_patches": {}, + "experimental_target_platforms": [], + "python_interpreter": "", + "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "quiet": true, + "timeout": 600, + "isolated": true, + "extra_pip_args": [], + "download_only": false, + "pip_data_exclude": [], + "enable_implicit_namespace_pkgs": false, + "environment": {}, + "group_name": "", + "group_deps": [] + } + }, + "codegen_deps_311_toposort": { + "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "whl_library", + "attributes": { + "name": "rules_python~0.29.0~pip~codegen_deps_311_toposort", + "requirement": "toposort==1.10", + "repo": "codegen_deps_311", + "repo_prefix": "codegen_deps_311_", + "whl_patches": {}, + "experimental_target_platforms": [], + "python_interpreter": "", + "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "quiet": true, + "timeout": 600, + "isolated": true, + "extra_pip_args": [], + "download_only": false, + "pip_data_exclude": [], + "enable_implicit_namespace_pkgs": false, + "environment": {}, + "group_name": "", + "group_deps": [] + } + } + } + } + }, + "@rules_python~0.29.0//python/extensions:python.bzl%python": { + "general": { + "bzlTransitiveDigest": "cNIGKHSvB2M2cHTN5kfvsLpUAfasM6U9vMR8MNVYvxk=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "python_3_11_s390x-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.29.0~python~python_3_11_s390x-unknown-linux-gnu", + "sha256": "f9f19823dba3209cedc4647b00f46ed0177242917db20fb7fb539970e384531c", + "patches": [], + "platform": "s390x-unknown-linux-gnu", + "python_version": "3.11.6", + "release_filename": "20231002/cpython-3.11.6+20231002-s390x-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-s390x-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11_host": { + "bzlFile": "@@rules_python~0.29.0//python/private:toolchains_repo.bzl", + "ruleClassName": "host_toolchain", + "attributes": { + "name": "rules_python~0.29.0~python~python_3_11_host", + "python_version": "3.11.6", + "user_repository_name": "python_3_11", + "platforms": [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "ppc64le-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu" + ] + } + }, + "python_3_11": { + "bzlFile": "@@rules_python~0.29.0//python/private:toolchains_repo.bzl", + "ruleClassName": "toolchain_aliases", + "attributes": { + "name": "rules_python~0.29.0~python~python_3_11", + "python_version": "3.11.6", + "user_repository_name": "python_3_11", + "platforms": [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "ppc64le-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu" + ] + } + }, + "python_3_11_aarch64-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.29.0~python~python_3_11_aarch64-unknown-linux-gnu", + "sha256": "3e26a672df17708c4dc928475a5974c3fb3a34a9b45c65fb4bd1e50504cc84ec", + "patches": [], + "platform": "aarch64-unknown-linux-gnu", + "python_version": "3.11.6", + "release_filename": "20231002/cpython-3.11.6+20231002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-aarch64-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11_aarch64-apple-darwin": { + "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.29.0~python~python_3_11_aarch64-apple-darwin", + "sha256": "916c35125b5d8323a21526d7a9154ca626453f63d0878e95b9f613a95006c990", + "patches": [], + "platform": "aarch64-apple-darwin", + "python_version": "3.11.6", + "release_filename": "20231002/cpython-3.11.6+20231002-aarch64-apple-darwin-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-aarch64-apple-darwin-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11_ppc64le-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.29.0~python~python_3_11_ppc64le-unknown-linux-gnu", + "sha256": "7937035f690a624dba4d014ffd20c342e843dd46f89b0b0a1e5726b85deb8eaf", + "patches": [], + "platform": "ppc64le-unknown-linux-gnu", + "python_version": "3.11.6", + "release_filename": "20231002/cpython-3.11.6+20231002-ppc64le-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-ppc64le-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11_x86_64-apple-darwin": { + "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.29.0~python~python_3_11_x86_64-apple-darwin", + "sha256": "178cb1716c2abc25cb56ae915096c1a083e60abeba57af001996e8bc6ce1a371", + "patches": [], + "platform": "x86_64-apple-darwin", + "python_version": "3.11.6", + "release_filename": "20231002/cpython-3.11.6+20231002-x86_64-apple-darwin-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-x86_64-apple-darwin-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "pythons_hub": { + "bzlFile": "@@rules_python~0.29.0//python/private/bzlmod:pythons_hub.bzl", + "ruleClassName": "hub_repo", + "attributes": { + "name": "rules_python~0.29.0~python~pythons_hub", + "default_python_version": "3.11", + "toolchain_prefixes": [ + "_0000_python_3_11_" + ], + "toolchain_python_versions": [ + "3.11" + ], + "toolchain_set_python_version_constraints": [ + "False" + ], + "toolchain_user_repository_names": [ + "python_3_11" + ] + } + }, + "python_versions": { + "bzlFile": "@@rules_python~0.29.0//python/private:toolchains_repo.bzl", + "ruleClassName": "multi_toolchain_aliases", + "attributes": { + "name": "rules_python~0.29.0~python~python_versions", + "python_versions": { + "3.11": "python_3_11" + } + } + }, + "python_3_11_x86_64-pc-windows-msvc": { + "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.29.0~python~python_3_11_x86_64-pc-windows-msvc", + "sha256": "3933545e6d41462dd6a47e44133ea40995bc6efeed8c2e4cbdf1a699303e95ea", + "patches": [], + "platform": "x86_64-pc-windows-msvc", + "python_version": "3.11.6", + "release_filename": "20231002/cpython-3.11.6+20231002-x86_64-pc-windows-msvc-shared-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-x86_64-pc-windows-msvc-shared-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11_x86_64-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.29.0~python~python_3_11_x86_64-unknown-linux-gnu", + "sha256": "ee37a7eae6e80148c7e3abc56e48a397c1664f044920463ad0df0fc706eacea8", + "patches": [], + "platform": "x86_64-unknown-linux-gnu", + "python_version": "3.11.6", + "release_filename": "20231002/cpython-3.11.6+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + } + } + } + }, + "@rules_python~0.29.0//python/private/bzlmod:internal_deps.bzl%internal_deps": { + "general": { + "bzlTransitiveDigest": "b1XSTlsBBPzFeVVSavIGqXSs4RTzDSmIuifTyEhK+aQ=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "pypi__wheel": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__wheel", + "url": "https://files.pythonhosted.org/packages/b8/8b/31273bf66016be6ad22bb7345c37ff350276cfd46e389a0c2ac5da9d9073/wheel-0.41.2-py3-none-any.whl", + "sha256": "75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__click": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__click", + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", + "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__importlib_metadata": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__importlib_metadata", + "url": "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl", + "sha256": "3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pyproject_hooks": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__pyproject_hooks", + "url": "https://files.pythonhosted.org/packages/d5/ea/9ae603de7fbb3df820b23a70f6aff92bf8c7770043254ad8d2dc9d6bcba4/pyproject_hooks-1.0.0-py3-none-any.whl", + "sha256": "283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pep517": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__pep517", + "url": "https://files.pythonhosted.org/packages/ee/2f/ef63e64e9429111e73d3d6cbee80591672d16f2725e648ebc52096f3d323/pep517-0.13.0-py3-none-any.whl", + "sha256": "4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__packaging": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__packaging", + "url": "https://files.pythonhosted.org/packages/ab/c3/57f0601a2d4fe15de7a553c00adbc901425661bf048f2a22dfc500caf121/packaging-23.1-py3-none-any.whl", + "sha256": "994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pip_tools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__pip_tools", + "url": "https://files.pythonhosted.org/packages/e8/df/47e6267c6b5cdae867adbdd84b437393e6202ce4322de0a5e0b92960e1d6/pip_tools-7.3.0-py3-none-any.whl", + "sha256": "8717693288720a8c6ebd07149c93ab0be1fced0b5191df9e9decd3263e20d85e", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__setuptools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__setuptools", + "url": "https://files.pythonhosted.org/packages/4f/ab/0bcfebdfc3bfa8554b2b2c97a555569c4c1ebc74ea288741ea8326c51906/setuptools-68.1.2-py3-none-any.whl", + "sha256": "3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__zipp": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__zipp", + "url": "https://files.pythonhosted.org/packages/8c/08/d3006317aefe25ea79d3b76c9650afabaf6d63d1c8443b236e7405447503/zipp-3.16.2-py3-none-any.whl", + "sha256": "679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__colorama": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__colorama", + "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", + "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__build": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__build", + "url": "https://files.pythonhosted.org/packages/58/91/17b00d5fac63d3dca605f1b8269ba3c65e98059e1fd99d00283e42a454f0/build-0.10.0-py3-none-any.whl", + "sha256": "af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "rules_python_internal": { + "bzlFile": "@@rules_python~0.29.0//python/private:internal_config_repo.bzl", + "ruleClassName": "internal_config_repo", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~rules_python_internal" + } + }, + "pypi__pip": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__pip", + "url": "https://files.pythonhosted.org/packages/50/c2/e06851e8cc28dcad7c155f4753da8833ac06a5c704c109313b8d5a62968a/pip-23.2.1-py3-none-any.whl", + "sha256": "7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__installer": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__installer", + "url": "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", + "sha256": "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__more_itertools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__more_itertools", + "url": "https://files.pythonhosted.org/packages/5a/cb/6dce742ea14e47d6f565589e859ad225f2a5de576d7696e0623b784e226b/more_itertools-10.1.0-py3-none-any.whl", + "sha256": "64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__tomli": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.29.0~internal_deps~pypi__tomli", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", + "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + } + } + } + } + } +} From ef124695a5d68472eb02f60741f7ab5773618bcf Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 22 Feb 2024 10:11:49 +0000 Subject: [PATCH 094/207] Apply suggestions from documentation review Co-authored-by: Sam Browning <106113886+sabrowning1@users.noreply.github.com> --- .../CWE/CWE-287/AndroidInsecureKeys.qhelp | 16 ++++++++-------- .../Security/CWE/CWE-287/AndroidInsecureKeys.ql | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp index 95257fb020c..6b3546f85f5 100644 --- a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.qhelp @@ -5,9 +5,9 @@

    -Biometric authentication such as fingerprint recognition can be used alongside cryptographic keys stored in the Android KeyStore to protect sensitive parts of the application. However, -when a key generated for this purpose has certain parameters set insecurely, it can allow an attacker with physical access to bypass the -authentication check, using application hooking tools such as Frida. +Biometric authentication, such as fingerprint recognition, can be used alongside cryptographic keys stored in the Android KeyStore to protect sensitive parts of the application. However, +when a key generated for this purpose has certain parameters set insecurely, an attacker with physical access can bypass the +authentication check using application hooking tools such as Frida.

    @@ -16,9 +16,9 @@ authentication check, using application hooking tools such as Frida. When generating a key for use with biometric authentication, ensure that the following parameters of KeyGenParameterSpec.Builder are set:

      -
    • setUserAuthenticationRequired should be set to true; otherwise the key can be used without user authentication.
    • -
    • setInvalidatedByBiometricEnrollment should be set to true (the default); otherwise an attacker can use the key by enrolling additional biometrics on the device.
    • -
    • setUserAuthenticationValidityDurationSeconds, if used, should be set to -1; otherwise non-biometric (less secure) credentials can be used to access the key. setUserAuthenticationParameters is instead recommended to explicitly set both the timeout and the types of credentials that may be used.
    • +
    • setUserAuthenticationRequired should be set to true; otherwise, the key can be used without user authentication.
    • +
    • setInvalidatedByBiometricEnrollment should be set to true (the default); otherwise, an attacker can use the key by enrolling additional biometrics on the device.
    • +
    • setUserAuthenticationValidityDurationSeconds, if used, should be set to -1; otherwise, non-biometric (less secure) credentials can be used to access the key. We recommend using setUserAuthenticationParameters instead to explicitly set both the timeout and the types of credentials that may be used.
    @@ -33,10 +33,10 @@ When generating a key for use with biometric authentication, ensure that the fol
  • -WithSecure: How Secure is your Android Keystore Authentication? +WithSecure: How Secure is your Android Keystore Authentication?.
  • -Android Developers: KeyGenParameterSpec.Builder +Android Developers: KeyGenParameterSpec.Builder.
  • diff --git a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql index c8090f23c1d..52aaf8d885d 100644 --- a/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql +++ b/java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql @@ -1,6 +1,6 @@ /** * @name Insecurely generated keys for local authentication - * @description Keys used for local biometric authentication should be generated with secure parameters. + * @description Generation of keys with insecure parameters for local biometric authentication can allow attackers with physical access to bypass authentication checks. * @kind problem * @problem.severity warning * @security-severity 4.4 From a14c2ae8abdcdf67e9273934b9d89effa2293649 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 22 Feb 2024 11:14:53 +0100 Subject: [PATCH 095/207] Bazel: bump `rules_python` to 0.31.0 --- MODULE.bazel | 2 +- MODULE.bazel.lock | 254 ++++++++++++++++++++++++---------------------- 2 files changed, 132 insertions(+), 124 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index a8f2f1515b2..e8c79e8377f 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -16,7 +16,7 @@ local_path_override( bazel_dep(name = "platforms", version = "0.0.8") bazel_dep(name = "rules_pkg", version = "0.9.1") bazel_dep(name = "rules_nodejs", version = "6.0.3") -bazel_dep(name = "rules_python", version = "0.29.0") +bazel_dep(name = "rules_python", version = "0.31.0") bazel_dep(name = "bazel_skylib", version = "1.5.0") bazel_dep(name = "abseil-cpp", version = "20240116.0", repo_name = "absl") bazel_dep(name = "nlohmann_json", version = "3.11.3", repo_name = "json") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 89baf2f2188..1a2bc50817d 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -1,6 +1,6 @@ { "lockFileVersion": 3, - "moduleFileHash": "a44a9a52b93017e8e3ad7a9cf9f717941277506efabfbb1adbc9689d48841290", + "moduleFileHash": "09deccb1877acc1ce1eaf9039df5f1c064ada4c323e27531b91529a3fcafdc1b", "flags": { "cmdRegistries": [ "https://bcr.bazel.build/" @@ -121,7 +121,7 @@ "platforms": "platforms@0.0.8", "rules_pkg": "rules_pkg@0.9.1", "rules_nodejs": "rules_nodejs@6.0.3", - "rules_python": "rules_python@0.29.0", + "rules_python": "rules_python@0.31.0", "bazel_skylib": "bazel_skylib@1.5.0", "absl": "abseil-cpp@20240116.0", "json": "nlohmann_json@3.11.3", @@ -182,7 +182,7 @@ "deps": { "rules_license": "rules_license@0.0.7", "bazel_skylib": "bazel_skylib@1.5.0", - "rules_python": "rules_python@0.29.0", + "rules_python": "rules_python@0.31.0", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" }, @@ -265,10 +265,10 @@ } } }, - "rules_python@0.29.0": { + "rules_python@0.31.0": { "name": "rules_python", - "version": "0.29.0", - "key": "rules_python@0.29.0", + "version": "0.31.0", + "key": "rules_python@0.31.0", "repoName": "rules_python", "executionPlatformsToRegister": [], "toolchainsToRegister": [ @@ -278,9 +278,9 @@ { "extensionBzlFile": "@rules_python//python/private/bzlmod:internal_deps.bzl", "extensionName": "internal_deps", - "usingModule": "rules_python@0.29.0", + "usingModule": "rules_python@0.31.0", "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel", + "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", "line": 15, "column": 30 }, @@ -309,7 +309,7 @@ "attributeValues": {}, "devDependency": false, "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel", + "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", "line": 16, "column": 22 } @@ -321,9 +321,9 @@ { "extensionBzlFile": "@rules_python//python/extensions:python.bzl", "extensionName": "python", - "usingModule": "rules_python@0.29.0", + "usingModule": "rules_python@0.31.0", "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel", + "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", "line": 41, "column": 23 }, @@ -340,7 +340,7 @@ }, "devDependency": false, "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel", + "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", "line": 47, "column": 17 } @@ -363,14 +363,14 @@ "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0", + "name": "rules_python~0.31.0", "urls": [ - "https://github.com/bazelbuild/rules_python/releases/download/0.29.0/rules_python-0.29.0.tar.gz" + "https://github.com/bazelbuild/rules_python/releases/download/0.31.0/rules_python-0.31.0.tar.gz" ], - "integrity": "sha256-1x0sZ+C86YbhxadzG0aTImhnxFv+C3xeAGciilNvxYA=", - "strip_prefix": "rules_python-0.29.0", + "integrity": "sha256-xovcT77CXeW1STuIGc/Id8TqKZwNyxXCRMWgAgjN4xE=", + "strip_prefix": "rules_python-0.31.0", "remote_patches": { - "https://bcr.bazel.build/modules/rules_python/0.29.0/patches/module_dot_bazel_version.patch": "sha256-JihmZ3F8ZYIsWe5XaP3/YN7+judegp21u1hNjmCBZOI=" + "https://bcr.bazel.build/modules/rules_python/0.31.0/patches/module_dot_bazel_version.patch": "sha256-j2KF6j66J2fRAGtc56Zj7Hp1dTGqOWPAR3+IODr0oLQ=" }, "remote_patch_strip": 1 } @@ -622,7 +622,7 @@ "rules_java": "rules_java@5.5.1", "rules_license": "rules_license@0.0.7", "rules_proto": "rules_proto@5.3.0-21.7", - "rules_python": "rules_python@0.29.0", + "rules_python": "rules_python@0.31.0", "platforms": "platforms@0.0.8", "com_google_protobuf": "protobuf@21.7", "zlib": "zlib@1.2.13", @@ -799,7 +799,7 @@ ], "deps": { "bazel_skylib": "bazel_skylib@1.5.0", - "rules_python": "rules_python@0.29.0", + "rules_python": "rules_python@0.31.0", "rules_cc": "rules_cc@0.0.9", "rules_proto": "rules_proto@5.3.0-21.7", "rules_java": "rules_java@5.5.1", @@ -1195,7 +1195,7 @@ "platforms": "platforms@0.0.8", "rules_cc": "rules_cc@0.0.9", "com_google_absl": "abseil-cpp@20240116.0", - "rules_python": "rules_python@0.29.0", + "rules_python": "rules_python@0.31.0", "pybind11_bazel": "pybind11_bazel@2.11.1", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" @@ -1994,26 +1994,26 @@ } } }, - "@rules_python~0.29.0//python/extensions:pip.bzl%pip": { + "@rules_python~0.31.0//python/extensions:pip.bzl%pip": { "os:linux,arch:amd64": { - "bzlTransitiveDigest": "wx5kTEjbB2zrDT61Y5ME2JZ6176Xr86NnjcdnCkvcqo=", + "bzlTransitiveDigest": "BMHDw6+hKI5WPzSCA1XT6c2B14DXaea1fE9lp2N5jIs=", "accumulatedFileDigests": { "@@//misc/codegen:requirements_lock.txt": "dc26eb4012e16e8623219eb63df85b86096f22550d755a29e6e45e09a3aaef75" }, "envVariables": {}, "generatedRepoSpecs": { "codegen_deps_311_pytest": { - "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", "ruleClassName": "whl_library", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps_311_pytest", + "name": "rules_python~0.31.0~pip~codegen_deps_311_pytest", "requirement": "pytest==8.0.0", "repo": "codegen_deps_311", "repo_prefix": "codegen_deps_311_", "whl_patches": {}, "experimental_target_platforms": [], "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", "quiet": true, "timeout": 600, "isolated": true, @@ -2022,22 +2022,23 @@ "pip_data_exclude": [], "enable_implicit_namespace_pkgs": false, "environment": {}, + "envsubst": [], "group_name": "", "group_deps": [] } }, "codegen_deps_311_iniconfig": { - "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", "ruleClassName": "whl_library", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps_311_iniconfig", + "name": "rules_python~0.31.0~pip~codegen_deps_311_iniconfig", "requirement": "iniconfig==2.0.0", "repo": "codegen_deps_311", "repo_prefix": "codegen_deps_311_", "whl_patches": {}, "experimental_target_platforms": [], "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", "quiet": true, "timeout": 600, "isolated": true, @@ -2046,22 +2047,23 @@ "pip_data_exclude": [], "enable_implicit_namespace_pkgs": false, "environment": {}, + "envsubst": [], "group_name": "", "group_deps": [] } }, "codegen_deps_311_pluggy": { - "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", "ruleClassName": "whl_library", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps_311_pluggy", + "name": "rules_python~0.31.0~pip~codegen_deps_311_pluggy", "requirement": "pluggy==1.4.0", "repo": "codegen_deps_311", "repo_prefix": "codegen_deps_311_", "whl_patches": {}, "experimental_target_platforms": [], "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", "quiet": true, "timeout": 600, "isolated": true, @@ -2070,22 +2072,23 @@ "pip_data_exclude": [], "enable_implicit_namespace_pkgs": false, "environment": {}, + "envsubst": [], "group_name": "", "group_deps": [] } }, "codegen_deps_311_pystache": { - "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", "ruleClassName": "whl_library", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps_311_pystache", + "name": "rules_python~0.31.0~pip~codegen_deps_311_pystache", "requirement": "pystache==0.6.5", "repo": "codegen_deps_311", "repo_prefix": "codegen_deps_311_", "whl_patches": {}, "experimental_target_platforms": [], "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", "quiet": true, "timeout": 600, "isolated": true, @@ -2094,31 +2097,32 @@ "pip_data_exclude": [], "enable_implicit_namespace_pkgs": false, "environment": {}, + "envsubst": [], "group_name": "", "group_deps": [] } }, "codegen_deps_311__groups": { - "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", "ruleClassName": "group_library", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps_311__groups", + "name": "rules_python~0.31.0~pip~codegen_deps_311__groups", "repo_prefix": "codegen_deps_311_", "groups": {} } }, "codegen_deps_311_packaging": { - "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", "ruleClassName": "whl_library", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps_311_packaging", + "name": "rules_python~0.31.0~pip~codegen_deps_311_packaging", "requirement": "packaging==23.2", "repo": "codegen_deps_311", "repo_prefix": "codegen_deps_311_", "whl_patches": {}, "experimental_target_platforms": [], "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", "quiet": true, "timeout": 600, "isolated": true, @@ -2127,15 +2131,16 @@ "pip_data_exclude": [], "enable_implicit_namespace_pkgs": false, "environment": {}, + "envsubst": [], "group_name": "", "group_deps": [] } }, "codegen_deps": { - "bzlFile": "@@rules_python~0.29.0//python/private/bzlmod:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/private/bzlmod:pip_repository.bzl", "ruleClassName": "pip_repository", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps", + "name": "rules_python~0.31.0~pip~codegen_deps", "repo_name": "codegen_deps", "whl_map": { "inflection": [ @@ -2167,17 +2172,17 @@ } }, "codegen_deps_311_pyyaml": { - "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", "ruleClassName": "whl_library", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps_311_pyyaml", + "name": "rules_python~0.31.0~pip~codegen_deps_311_pyyaml", "requirement": "pyyaml==6.0.1", "repo": "codegen_deps_311", "repo_prefix": "codegen_deps_311_", "whl_patches": {}, "experimental_target_platforms": [], "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", "quiet": true, "timeout": 600, "isolated": true, @@ -2186,22 +2191,23 @@ "pip_data_exclude": [], "enable_implicit_namespace_pkgs": false, "environment": {}, + "envsubst": [], "group_name": "", "group_deps": [] } }, "codegen_deps_311_inflection": { - "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", "ruleClassName": "whl_library", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps_311_inflection", + "name": "rules_python~0.31.0~pip~codegen_deps_311_inflection", "requirement": "inflection==0.5.1", "repo": "codegen_deps_311", "repo_prefix": "codegen_deps_311_", "whl_patches": {}, "experimental_target_platforms": [], "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", "quiet": true, "timeout": 600, "isolated": true, @@ -2210,22 +2216,23 @@ "pip_data_exclude": [], "enable_implicit_namespace_pkgs": false, "environment": {}, + "envsubst": [], "group_name": "", "group_deps": [] } }, "codegen_deps_311_toposort": { - "bzlFile": "@@rules_python~0.29.0//python/pip_install:pip_repository.bzl", + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", "ruleClassName": "whl_library", "attributes": { - "name": "rules_python~0.29.0~pip~codegen_deps_311_toposort", + "name": "rules_python~0.31.0~pip~codegen_deps_311_toposort", "requirement": "toposort==1.10", "repo": "codegen_deps_311", "repo_prefix": "codegen_deps_311_", "whl_patches": {}, "experimental_target_platforms": [], "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.29.0~python~python_3_11_host//:python", + "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", "quiet": true, "timeout": 600, "isolated": true, @@ -2234,6 +2241,7 @@ "pip_data_exclude": [], "enable_implicit_namespace_pkgs": false, "environment": {}, + "envsubst": [], "group_name": "", "group_deps": [] } @@ -2241,24 +2249,24 @@ } } }, - "@rules_python~0.29.0//python/extensions:python.bzl%python": { + "@rules_python~0.31.0//python/extensions:python.bzl%python": { "general": { - "bzlTransitiveDigest": "cNIGKHSvB2M2cHTN5kfvsLpUAfasM6U9vMR8MNVYvxk=", + "bzlTransitiveDigest": "fmPfINnuiui2NGkExyTcMNIIdY9/an1Huy1glhwxx6I=", "accumulatedFileDigests": {}, "envVariables": {}, "generatedRepoSpecs": { "python_3_11_s390x-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", "ruleClassName": "python_repository", "attributes": { - "name": "rules_python~0.29.0~python~python_3_11_s390x-unknown-linux-gnu", - "sha256": "f9f19823dba3209cedc4647b00f46ed0177242917db20fb7fb539970e384531c", + "name": "rules_python~0.31.0~python~python_3_11_s390x-unknown-linux-gnu", + "sha256": "49520e3ff494708020f306e30b0964f079170be83e956be4504f850557378a22", "patches": [], "platform": "s390x-unknown-linux-gnu", - "python_version": "3.11.6", - "release_filename": "20231002/cpython-3.11.6+20231002-s390x-unknown-linux-gnu-install_only.tar.gz", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-s390x-unknown-linux-gnu-install_only.tar.gz", "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-s390x-unknown-linux-gnu-install_only.tar.gz" + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-s390x-unknown-linux-gnu-install_only.tar.gz" ], "distutils_content": "", "strip_prefix": "python", @@ -2267,11 +2275,11 @@ } }, "python_3_11_host": { - "bzlFile": "@@rules_python~0.29.0//python/private:toolchains_repo.bzl", + "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", "ruleClassName": "host_toolchain", "attributes": { - "name": "rules_python~0.29.0~python~python_3_11_host", - "python_version": "3.11.6", + "name": "rules_python~0.31.0~python~python_3_11_host", + "python_version": "3.11.7", "user_repository_name": "python_3_11", "platforms": [ "aarch64-apple-darwin", @@ -2285,11 +2293,11 @@ } }, "python_3_11": { - "bzlFile": "@@rules_python~0.29.0//python/private:toolchains_repo.bzl", + "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", "ruleClassName": "toolchain_aliases", "attributes": { - "name": "rules_python~0.29.0~python~python_3_11", - "python_version": "3.11.6", + "name": "rules_python~0.31.0~python~python_3_11", + "python_version": "3.11.7", "user_repository_name": "python_3_11", "platforms": [ "aarch64-apple-darwin", @@ -2303,17 +2311,17 @@ } }, "python_3_11_aarch64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", "ruleClassName": "python_repository", "attributes": { - "name": "rules_python~0.29.0~python~python_3_11_aarch64-unknown-linux-gnu", - "sha256": "3e26a672df17708c4dc928475a5974c3fb3a34a9b45c65fb4bd1e50504cc84ec", + "name": "rules_python~0.31.0~python~python_3_11_aarch64-unknown-linux-gnu", + "sha256": "b102eaf865eb715aa98a8a2ef19037b6cc3ae7dfd4a632802650f29de635aa13", "patches": [], "platform": "aarch64-unknown-linux-gnu", - "python_version": "3.11.6", - "release_filename": "20231002/cpython-3.11.6+20231002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-aarch64-unknown-linux-gnu-install_only.tar.gz", "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-aarch64-unknown-linux-gnu-install_only.tar.gz" + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-aarch64-unknown-linux-gnu-install_only.tar.gz" ], "distutils_content": "", "strip_prefix": "python", @@ -2322,17 +2330,17 @@ } }, "python_3_11_aarch64-apple-darwin": { - "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", "ruleClassName": "python_repository", "attributes": { - "name": "rules_python~0.29.0~python~python_3_11_aarch64-apple-darwin", - "sha256": "916c35125b5d8323a21526d7a9154ca626453f63d0878e95b9f613a95006c990", + "name": "rules_python~0.31.0~python~python_3_11_aarch64-apple-darwin", + "sha256": "b042c966920cf8465385ca3522986b12d745151a72c060991088977ca36d3883", "patches": [], "platform": "aarch64-apple-darwin", - "python_version": "3.11.6", - "release_filename": "20231002/cpython-3.11.6+20231002-aarch64-apple-darwin-install_only.tar.gz", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-aarch64-apple-darwin-install_only.tar.gz", "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-aarch64-apple-darwin-install_only.tar.gz" + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-aarch64-apple-darwin-install_only.tar.gz" ], "distutils_content": "", "strip_prefix": "python", @@ -2341,17 +2349,17 @@ } }, "python_3_11_ppc64le-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", "ruleClassName": "python_repository", "attributes": { - "name": "rules_python~0.29.0~python~python_3_11_ppc64le-unknown-linux-gnu", - "sha256": "7937035f690a624dba4d014ffd20c342e843dd46f89b0b0a1e5726b85deb8eaf", + "name": "rules_python~0.31.0~python~python_3_11_ppc64le-unknown-linux-gnu", + "sha256": "b44e1b74afe75c7b19143413632c4386708ae229117f8f950c2094e9681d34c7", "patches": [], "platform": "ppc64le-unknown-linux-gnu", - "python_version": "3.11.6", - "release_filename": "20231002/cpython-3.11.6+20231002-ppc64le-unknown-linux-gnu-install_only.tar.gz", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-ppc64le-unknown-linux-gnu-install_only.tar.gz", "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-ppc64le-unknown-linux-gnu-install_only.tar.gz" + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-ppc64le-unknown-linux-gnu-install_only.tar.gz" ], "distutils_content": "", "strip_prefix": "python", @@ -2360,17 +2368,17 @@ } }, "python_3_11_x86_64-apple-darwin": { - "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", "ruleClassName": "python_repository", "attributes": { - "name": "rules_python~0.29.0~python~python_3_11_x86_64-apple-darwin", - "sha256": "178cb1716c2abc25cb56ae915096c1a083e60abeba57af001996e8bc6ce1a371", + "name": "rules_python~0.31.0~python~python_3_11_x86_64-apple-darwin", + "sha256": "a0e615eef1fafdc742da0008425a9030b7ea68a4ae4e73ac557ef27b112836d4", "patches": [], "platform": "x86_64-apple-darwin", - "python_version": "3.11.6", - "release_filename": "20231002/cpython-3.11.6+20231002-x86_64-apple-darwin-install_only.tar.gz", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-x86_64-apple-darwin-install_only.tar.gz", "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-x86_64-apple-darwin-install_only.tar.gz" + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-x86_64-apple-darwin-install_only.tar.gz" ], "distutils_content": "", "strip_prefix": "python", @@ -2379,10 +2387,10 @@ } }, "pythons_hub": { - "bzlFile": "@@rules_python~0.29.0//python/private/bzlmod:pythons_hub.bzl", + "bzlFile": "@@rules_python~0.31.0//python/private/bzlmod:pythons_hub.bzl", "ruleClassName": "hub_repo", "attributes": { - "name": "rules_python~0.29.0~python~pythons_hub", + "name": "rules_python~0.31.0~python~pythons_hub", "default_python_version": "3.11", "toolchain_prefixes": [ "_0000_python_3_11_" @@ -2399,27 +2407,27 @@ } }, "python_versions": { - "bzlFile": "@@rules_python~0.29.0//python/private:toolchains_repo.bzl", + "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", "ruleClassName": "multi_toolchain_aliases", "attributes": { - "name": "rules_python~0.29.0~python~python_versions", + "name": "rules_python~0.31.0~python~python_versions", "python_versions": { "3.11": "python_3_11" } } }, "python_3_11_x86_64-pc-windows-msvc": { - "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", "ruleClassName": "python_repository", "attributes": { - "name": "rules_python~0.29.0~python~python_3_11_x86_64-pc-windows-msvc", - "sha256": "3933545e6d41462dd6a47e44133ea40995bc6efeed8c2e4cbdf1a699303e95ea", + "name": "rules_python~0.31.0~python~python_3_11_x86_64-pc-windows-msvc", + "sha256": "67077e6fa918e4f4fd60ba169820b00be7c390c497bf9bc9cab2c255ea8e6f3e", "patches": [], "platform": "x86_64-pc-windows-msvc", - "python_version": "3.11.6", - "release_filename": "20231002/cpython-3.11.6+20231002-x86_64-pc-windows-msvc-shared-install_only.tar.gz", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-x86_64-pc-windows-msvc-shared-install_only.tar.gz", "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-x86_64-pc-windows-msvc-shared-install_only.tar.gz" + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-x86_64-pc-windows-msvc-shared-install_only.tar.gz" ], "distutils_content": "", "strip_prefix": "python", @@ -2428,17 +2436,17 @@ } }, "python_3_11_x86_64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.29.0//python:repositories.bzl", + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", "ruleClassName": "python_repository", "attributes": { - "name": "rules_python~0.29.0~python~python_3_11_x86_64-unknown-linux-gnu", - "sha256": "ee37a7eae6e80148c7e3abc56e48a397c1664f044920463ad0df0fc706eacea8", + "name": "rules_python~0.31.0~python~python_3_11_x86_64-unknown-linux-gnu", + "sha256": "4a51ce60007a6facf64e5495f4cf322e311ba9f39a8cd3f3e4c026eae488e140", "patches": [], "platform": "x86_64-unknown-linux-gnu", - "python_version": "3.11.6", - "release_filename": "20231002/cpython-3.11.6+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-x86_64-unknown-linux-gnu-install_only.tar.gz", "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.11.6+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz" + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-x86_64-unknown-linux-gnu-install_only.tar.gz" ], "distutils_content": "", "strip_prefix": "python", @@ -2449,9 +2457,9 @@ } } }, - "@rules_python~0.29.0//python/private/bzlmod:internal_deps.bzl%internal_deps": { + "@rules_python~0.31.0//python/private/bzlmod:internal_deps.bzl%internal_deps": { "general": { - "bzlTransitiveDigest": "b1XSTlsBBPzFeVVSavIGqXSs4RTzDSmIuifTyEhK+aQ=", + "bzlTransitiveDigest": "+abBEhSfywKoYxs9So+PhsVWm5O5NC9mF9rSy2kvdv8=", "accumulatedFileDigests": {}, "envVariables": {}, "generatedRepoSpecs": { @@ -2459,7 +2467,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__wheel", + "name": "rules_python~0.31.0~internal_deps~pypi__wheel", "url": "https://files.pythonhosted.org/packages/b8/8b/31273bf66016be6ad22bb7345c37ff350276cfd46e389a0c2ac5da9d9073/wheel-0.41.2-py3-none-any.whl", "sha256": "75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8", "type": "zip", @@ -2470,7 +2478,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__click", + "name": "rules_python~0.31.0~internal_deps~pypi__click", "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", "type": "zip", @@ -2481,7 +2489,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__importlib_metadata", + "name": "rules_python~0.31.0~internal_deps~pypi__importlib_metadata", "url": "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl", "sha256": "3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", "type": "zip", @@ -2492,7 +2500,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__pyproject_hooks", + "name": "rules_python~0.31.0~internal_deps~pypi__pyproject_hooks", "url": "https://files.pythonhosted.org/packages/d5/ea/9ae603de7fbb3df820b23a70f6aff92bf8c7770043254ad8d2dc9d6bcba4/pyproject_hooks-1.0.0-py3-none-any.whl", "sha256": "283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8", "type": "zip", @@ -2503,7 +2511,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__pep517", + "name": "rules_python~0.31.0~internal_deps~pypi__pep517", "url": "https://files.pythonhosted.org/packages/ee/2f/ef63e64e9429111e73d3d6cbee80591672d16f2725e648ebc52096f3d323/pep517-0.13.0-py3-none-any.whl", "sha256": "4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b", "type": "zip", @@ -2514,7 +2522,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__packaging", + "name": "rules_python~0.31.0~internal_deps~pypi__packaging", "url": "https://files.pythonhosted.org/packages/ab/c3/57f0601a2d4fe15de7a553c00adbc901425661bf048f2a22dfc500caf121/packaging-23.1-py3-none-any.whl", "sha256": "994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", "type": "zip", @@ -2525,7 +2533,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__pip_tools", + "name": "rules_python~0.31.0~internal_deps~pypi__pip_tools", "url": "https://files.pythonhosted.org/packages/e8/df/47e6267c6b5cdae867adbdd84b437393e6202ce4322de0a5e0b92960e1d6/pip_tools-7.3.0-py3-none-any.whl", "sha256": "8717693288720a8c6ebd07149c93ab0be1fced0b5191df9e9decd3263e20d85e", "type": "zip", @@ -2536,7 +2544,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__setuptools", + "name": "rules_python~0.31.0~internal_deps~pypi__setuptools", "url": "https://files.pythonhosted.org/packages/4f/ab/0bcfebdfc3bfa8554b2b2c97a555569c4c1ebc74ea288741ea8326c51906/setuptools-68.1.2-py3-none-any.whl", "sha256": "3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b", "type": "zip", @@ -2547,7 +2555,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__zipp", + "name": "rules_python~0.31.0~internal_deps~pypi__zipp", "url": "https://files.pythonhosted.org/packages/8c/08/d3006317aefe25ea79d3b76c9650afabaf6d63d1c8443b236e7405447503/zipp-3.16.2-py3-none-any.whl", "sha256": "679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", "type": "zip", @@ -2558,7 +2566,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__colorama", + "name": "rules_python~0.31.0~internal_deps~pypi__colorama", "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", "type": "zip", @@ -2569,7 +2577,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__build", + "name": "rules_python~0.31.0~internal_deps~pypi__build", "url": "https://files.pythonhosted.org/packages/58/91/17b00d5fac63d3dca605f1b8269ba3c65e98059e1fd99d00283e42a454f0/build-0.10.0-py3-none-any.whl", "sha256": "af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171", "type": "zip", @@ -2577,17 +2585,17 @@ } }, "rules_python_internal": { - "bzlFile": "@@rules_python~0.29.0//python/private:internal_config_repo.bzl", + "bzlFile": "@@rules_python~0.31.0//python/private:internal_config_repo.bzl", "ruleClassName": "internal_config_repo", "attributes": { - "name": "rules_python~0.29.0~internal_deps~rules_python_internal" + "name": "rules_python~0.31.0~internal_deps~rules_python_internal" } }, "pypi__pip": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__pip", + "name": "rules_python~0.31.0~internal_deps~pypi__pip", "url": "https://files.pythonhosted.org/packages/50/c2/e06851e8cc28dcad7c155f4753da8833ac06a5c704c109313b8d5a62968a/pip-23.2.1-py3-none-any.whl", "sha256": "7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be", "type": "zip", @@ -2598,7 +2606,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__installer", + "name": "rules_python~0.31.0~internal_deps~pypi__installer", "url": "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", "sha256": "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", "type": "zip", @@ -2609,7 +2617,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__more_itertools", + "name": "rules_python~0.31.0~internal_deps~pypi__more_itertools", "url": "https://files.pythonhosted.org/packages/5a/cb/6dce742ea14e47d6f565589e859ad225f2a5de576d7696e0623b784e226b/more_itertools-10.1.0-py3-none-any.whl", "sha256": "64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6", "type": "zip", @@ -2620,7 +2628,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "rules_python~0.29.0~internal_deps~pypi__tomli", + "name": "rules_python~0.31.0~internal_deps~pypi__tomli", "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", "type": "zip", From 2afcc611ce6c4c09a873b65b5d68e35810942ef4 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 11:18:00 +0100 Subject: [PATCH 096/207] C#: Fix formatting. --- .../code/csharp/dataflow/internal/DataFlowPrivate.qll | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 95fed08f931..09be57f12c2 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -2075,10 +2075,9 @@ predicate storeStep(Node node1, ContentSet c, Node node2) { node1 = TExplicitParameterNode(p) and node2 = TPrimaryConstructorThisAccessNode(p, true) and exists(Type t | t = p.getCallable().getDeclaringType() | - if t instanceof RecordType then - c.(PropertyContent).getProperty().getName() = p.getName() - else - c.(PrimaryConstructorParameterContent).getParameter() = p + if t instanceof RecordType + then c.(PropertyContent).getProperty().getName() = p.getName() + else c.(PrimaryConstructorParameterContent).getParameter() = p ) ) or From f2c849c737795cfca144225f70e5f9ffb5b84f65 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 11:19:34 +0100 Subject: [PATCH 097/207] C#: Simplify. --- .../code/csharp/dataflow/internal/DataFlowPrivate.qll | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 09be57f12c2..260e805ea62 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -2074,11 +2074,9 @@ predicate storeStep(Node node1, ContentSet c, Node node2) { exists(Parameter p | node1 = TExplicitParameterNode(p) and node2 = TPrimaryConstructorThisAccessNode(p, true) and - exists(Type t | t = p.getCallable().getDeclaringType() | - if t instanceof RecordType - then c.(PropertyContent).getProperty().getName() = p.getName() - else c.(PrimaryConstructorParameterContent).getParameter() = p - ) + if p.getCallable().getDeclaringType() instanceof RecordType + then c.(PropertyContent).getProperty().getName() = p.getName() + else c.(PrimaryConstructorParameterContent).getParameter() = p ) or FlowSummaryImpl::Private::Steps::summaryStoreStep(node1.(FlowSummaryNode).getSummaryNode(), c, From f1bdd6bdda7c1550ecc340d0177ba61eb0b373f6 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 22 Feb 2024 11:26:39 +0100 Subject: [PATCH 098/207] Bazel: switch to erroring out by default on outdated lock file --- .bazelrc | 3 +- MODULE.bazel.lock | 1202 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1204 insertions(+), 1 deletion(-) diff --git a/.bazelrc b/.bazelrc index 758e95f782d..3ded124acb2 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,6 +1,7 @@ common --enable_platform_specific_config common --enable_bzlmod -common --lockfile_mode=update +# put common --lockfile_mode=update in your local.bazelrc if you want to auto-update the lock file +common --lockfile_mode=error # when building from this repository in isolation, the internal repository will not be found at .. # where `MODULE.bazel` looks for it. The following will get us past the module loading phase, so diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 1a2bc50817d..0e41ef4fffa 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -1394,6 +1394,33 @@ } } }, + "@bazel_tools//tools/android:android_extensions.bzl%remote_android_tools_extensions": { + "general": { + "bzlTransitiveDigest": "4+Dj2H7maLh8JtpJKiuaI7PSXiIZw6oWX9xsVhnJ5DU=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "android_tools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "bazel_tools~remote_android_tools_extensions~android_tools", + "sha256": "1afa4b7e13c82523c8b69e87f8d598c891ec7e2baa41d9e24e08becd723edb4d", + "url": "https://mirror.bazel.build/bazel_android_tools/android_tools_pkg-0.27.0.tar.gz" + } + }, + "android_gmaven_r8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_jar", + "attributes": { + "name": "bazel_tools~remote_android_tools_extensions~android_gmaven_r8", + "sha256": "ab1379835c7d3e5f21f80347c3c81e2f762e0b9b02748ae5232c3afa14adf702", + "url": "https://maven.google.com/com/android/tools/r8/8.0.40/r8-8.0.40.jar" + } + } + } + } + }, "@bazel_tools//tools/cpp:cc_configure.bzl%cc_configure_extension": { "general": { "bzlTransitiveDigest": "sftnIlf92nP/IUiWiMkgL9Sh8Drk9kKhTXHvoavVJZg=", @@ -1417,6 +1444,24 @@ } } }, + "@bazel_tools//tools/osx:xcode_configure.bzl%xcode_configure_extension": { + "general": { + "bzlTransitiveDigest": "CtmyZVPtInM72JKIFfarSKOF0R/GbDRl8HBuOsRWhRs=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_xcode": { + "bzlFile": "@@bazel_tools//tools/osx:xcode_configure.bzl", + "ruleClassName": "xcode_autoconf", + "attributes": { + "name": "bazel_tools~xcode_configure_extension~local_config_xcode", + "xcode_locator": "@bazel_tools//tools/osx:xcode_locator.m", + "remote_xcode": "" + } + } + } + } + }, "@bazel_tools//tools/sh:sh_configure.bzl%sh_configure_extension": { "general": { "bzlTransitiveDigest": "hp4NgmNjEg5+xgvzfh6L83bt9/aiiWETuNpwNuF1MSU=", @@ -1433,6 +1478,56 @@ } } }, + "@bazel_tools//tools/test:extensions.bzl%remote_coverage_tools_extension": { + "general": { + "bzlTransitiveDigest": "IWFtZ+6M0WGmNpfnHZMxnVFSDZ6pRTEWt7jixp7XffQ=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "remote_coverage_tools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "bazel_tools~remote_coverage_tools_extension~remote_coverage_tools", + "sha256": "7006375f6756819b7013ca875eab70a541cf7d89142d9c511ed78ea4fefa38af", + "urls": [ + "https://mirror.bazel.build/bazel_coverage_output_generator/releases/coverage_output_generator-v2.6.zip" + ] + } + } + } + } + }, + "@pybind11_bazel~2.11.1//:python_configure.bzl%extension": { + "general": { + "bzlTransitiveDigest": "sgbbaIxC3APaPN1jX6dINhHUkxY594QM1GSG37yca5A=", + "accumulatedFileDigests": { + "@@pybind11_bazel~2.11.1//:MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e" + }, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_python": { + "bzlFile": "@@pybind11_bazel~2.11.1//:python_configure.bzl", + "ruleClassName": "python_configure", + "attributes": { + "name": "pybind11_bazel~2.11.1~extension~local_config_python" + } + }, + "pybind11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "pybind11_bazel~2.11.1~extension~pybind11", + "build_file": "@@pybind11_bazel~2.11.1//:pybind11.BUILD", + "strip_prefix": "pybind11-2.11.1", + "urls": [ + "https://github.com/pybind/pybind11/archive/v2.11.1.zip" + ] + } + } + } + } + }, "@rules_java~5.5.1//java:extensions.bzl%toolchains": { "general": { "bzlTransitiveDigest": "IFVnLAj9sdT9p8x0XTGG1Ea54qqosuXfcRu2egn7Sqw=", @@ -1898,6 +1993,1113 @@ } } }, + "@rules_jvm_external~4.4.2//:extensions.bzl%maven": { + "general": { + "bzlTransitiveDigest": "istmyWP0h8op1Y4uAZZpKSZR6IiKJFC+0DDHxSqZeZU=", + "accumulatedFileDigests": { + "@@rules_jvm_external~4.4.2//:rules_jvm_external_deps_install.json": "10442a5ae27d9ff4c2003e5ab71643bf0d8b48dcf968b4173fa274c3232a8c06" + }, + "envVariables": {}, + "generatedRepoSpecs": { + "org_slf4j_slf4j_api_1_7_30": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~org_slf4j_slf4j_api_1_7_30", + "sha256": "cdba07964d1bb40a0761485c6b1e8c2f8fd9eb1d19c53928ac0d7f9510105c57", + "urls": [ + "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar", + "https://maven.google.com/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" + } + }, + "com_google_api_grpc_proto_google_common_protos_2_0_1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_api_grpc_proto_google_common_protos_2_0_1", + "sha256": "5ce71656118618731e34a5d4c61aa3a031be23446dc7de8b5a5e77b66ebcd6ef", + "urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar" + } + }, + "com_google_api_gax_1_60_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_api_gax_1_60_0", + "sha256": "02f37d4ff1a7b8d71dff8064cf9568aa4f4b61bcc4485085d16130f32afa5a79", + "urls": [ + "https://repo1.maven.org/maven2/com/google/api/gax/1.60.0/gax-1.60.0.jar", + "https://maven.google.com/com/google/api/gax/1.60.0/gax-1.60.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/gax/1.60.0/gax-1.60.0.jar" + } + }, + "com_google_guava_failureaccess_1_0_1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_guava_failureaccess_1_0_1", + "sha256": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26", + "urls": [ + "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", + "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" + } + }, + "commons_logging_commons_logging_1_2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~commons_logging_commons_logging_1_2", + "sha256": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636", + "urls": [ + "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", + "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" + } + }, + "com_google_http_client_google_http_client_appengine_1_38_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_http_client_google_http_client_appengine_1_38_0", + "sha256": "f97b495fd97ac3a3d59099eb2b55025f4948230da15a076f189b9cff37c6b4d2", + "urls": [ + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar", + "https://maven.google.com/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar" + } + }, + "com_google_cloud_google_cloud_storage_1_113_4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_cloud_google_cloud_storage_1_113_4", + "sha256": "796833e9bdab80c40bbc820e65087eb8f28c6bfbca194d2e3e00d98cb5bc55d6", + "urls": [ + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar", + "https://maven.google.com/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar" + } + }, + "io_grpc_grpc_context_1_33_1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_grpc_grpc_context_1_33_1", + "sha256": "99b8aea2b614fe0e61c3676e681259dc43c2de7f64620998e1a8435eb2976496", + "urls": [ + "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar", + "https://maven.google.com/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar" + } + }, + "com_google_api_grpc_proto_google_iam_v1_1_0_3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_api_grpc_proto_google_iam_v1_1_0_3", + "sha256": "64cee7383a97e846da8d8e160e6c8fe30561e507260552c59e6ccfc81301fdc8", + "urls": [ + "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar", + "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar" + } + }, + "com_google_api_api_common_1_10_1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_api_api_common_1_10_1", + "sha256": "2a033f24bb620383eda440ad307cb8077cfec1c7eadc684d65216123a1b9613a", + "urls": [ + "https://repo1.maven.org/maven2/com/google/api/api-common/1.10.1/api-common-1.10.1.jar", + "https://maven.google.com/com/google/api/api-common/1.10.1/api-common-1.10.1.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/api-common/1.10.1/api-common-1.10.1.jar" + } + }, + "com_google_auth_google_auth_library_oauth2_http_0_22_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_auth_google_auth_library_oauth2_http_0_22_0", + "sha256": "1722d895c42dc42ea1d1f392ddbec1fbb28f7a979022c3a6c29acc39cc777ad1", + "urls": [ + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar", + "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar" + } + }, + "com_typesafe_netty_netty_reactive_streams_2_0_5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_typesafe_netty_netty_reactive_streams_2_0_5", + "sha256": "f949849fc8ee75fde468ba3a35df2e04577fa31a2940b83b2a7dc9d14dac13d6", + "urls": [ + "https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar", + "https://maven.google.com/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar" + } + }, + "com_typesafe_netty_netty_reactive_streams_http_2_0_5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_typesafe_netty_netty_reactive_streams_http_2_0_5", + "sha256": "b39224751ad936758176e9d994230380ade5e9079e7c8ad778e3995779bcf303", + "urls": [ + "https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar", + "https://maven.google.com/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar" + } + }, + "javax_annotation_javax_annotation_api_1_3_2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~javax_annotation_javax_annotation_api_1_3_2", + "sha256": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b", + "urls": [ + "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", + "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" + } + }, + "com_google_j2objc_j2objc_annotations_1_3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_j2objc_j2objc_annotations_1_3", + "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", + "urls": [ + "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", + "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" + } + }, + "software_amazon_awssdk_metrics_spi_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_metrics_spi_2_17_183", + "sha256": "08a11dc8c4ba464beafbcc7ac05b8c724c1ccb93da99482e82a68540ac704e4a", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar" + } + }, + "org_reactivestreams_reactive_streams_1_0_3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~org_reactivestreams_reactive_streams_1_0_3", + "sha256": "1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865", + "urls": [ + "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", + "https://maven.google.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" + } + }, + "com_google_http_client_google_http_client_jackson2_1_38_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_http_client_google_http_client_jackson2_1_38_0", + "sha256": "e6504a82425fcc2168a4ca4175138ddcc085168daed8cdedb86d8f6fdc296e1e", + "urls": [ + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar", + "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar" + } + }, + "io_netty_netty_transport_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_transport_4_1_72_Final", + "sha256": "c5fb68e9a65b6e8a516adfcb9fa323479ee7b4d9449d8a529d2ecab3d3711d5a", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar" + } + }, + "io_netty_netty_codec_http2_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_codec_http2_4_1_72_Final", + "sha256": "c89a70500f59e8563e720aaa808263a514bd9e2bd91ba84eab8c2ccb45f234b2", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar" + } + }, + "io_opencensus_opencensus_api_0_24_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_opencensus_opencensus_api_0_24_0", + "sha256": "f561b1cc2673844288e596ddf5bb6596868a8472fd2cb8993953fc5c034b2352", + "urls": [ + "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", + "https://maven.google.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar" + } + }, + "rules_jvm_external_deps": { + "bzlFile": "@@rules_jvm_external~4.4.2//:coursier.bzl", + "ruleClassName": "pinned_coursier_fetch", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~rules_jvm_external_deps", + "repositories": [ + "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }" + ], + "artifacts": [ + "{\"artifact\":\"google-cloud-core\",\"group\":\"com.google.cloud\",\"version\":\"1.93.10\"}", + "{\"artifact\":\"google-cloud-storage\",\"group\":\"com.google.cloud\",\"version\":\"1.113.4\"}", + "{\"artifact\":\"gson\",\"group\":\"com.google.code.gson\",\"version\":\"2.9.0\"}", + "{\"artifact\":\"maven-artifact\",\"group\":\"org.apache.maven\",\"version\":\"3.8.6\"}", + "{\"artifact\":\"s3\",\"group\":\"software.amazon.awssdk\",\"version\":\"2.17.183\"}" + ], + "fetch_sources": true, + "fetch_javadoc": false, + "generate_compat_repositories": false, + "maven_install_json": "@@rules_jvm_external~4.4.2//:rules_jvm_external_deps_install.json", + "override_targets": {}, + "strict_visibility": false, + "strict_visibility_value": [ + "@@//visibility:private" + ], + "jetify": false, + "jetify_include_list": [ + "*" + ], + "additional_netrc_lines": [], + "fail_if_repin_required": false, + "use_starlark_android_rules": false, + "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl", + "duplicate_version_warning": "warn" + } + }, + "org_threeten_threetenbp_1_5_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~org_threeten_threetenbp_1_5_0", + "sha256": "dcf9c0f940739f2a825cd8626ff27113459a2f6eb18797c7152f93fff69c264f", + "urls": [ + "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar", + "https://maven.google.com/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar" + } + }, + "software_amazon_awssdk_http_client_spi_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_http_client_spi_2_17_183", + "sha256": "fe7120f175df9e47ebcc5d946d7f40110faf2ba0a30364f3b935d5b8a5a6c3c6", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar" + } + }, + "software_amazon_awssdk_third_party_jackson_core_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_third_party_jackson_core_2_17_183", + "sha256": "1bc27c9960993c20e1ab058012dd1ae04c875eec9f0f08f2b2ca41e578dee9a4", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar" + } + }, + "software_amazon_eventstream_eventstream_1_0_1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_eventstream_eventstream_1_0_1", + "sha256": "0c37d8e696117f02c302191b8110b0d0eb20fa412fce34c3a269ec73c16ce822", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar", + "https://maven.google.com/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar" + } + }, + "com_google_oauth_client_google_oauth_client_1_31_1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_oauth_client_google_oauth_client_1_31_1", + "sha256": "4ed4e2948251dbda66ce251bd7f3b32cd8570055e5cdb165a3c7aea8f43da0ff", + "urls": [ + "https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar", + "https://maven.google.com/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar" + } + }, + "maven": { + "bzlFile": "@@rules_jvm_external~4.4.2//:coursier.bzl", + "ruleClassName": "coursier_fetch", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~maven", + "repositories": [ + "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }" + ], + "artifacts": [ + "{\"artifact\":\"jsr305\",\"group\":\"com.google.code.findbugs\",\"version\":\"3.0.2\"}", + "{\"artifact\":\"gson\",\"group\":\"com.google.code.gson\",\"version\":\"2.8.9\"}", + "{\"artifact\":\"error_prone_annotations\",\"group\":\"com.google.errorprone\",\"version\":\"2.3.2\"}", + "{\"artifact\":\"j2objc-annotations\",\"group\":\"com.google.j2objc\",\"version\":\"1.3\"}", + "{\"artifact\":\"guava\",\"group\":\"com.google.guava\",\"version\":\"31.1-jre\"}", + "{\"artifact\":\"guava-testlib\",\"group\":\"com.google.guava\",\"version\":\"31.1-jre\"}", + "{\"artifact\":\"truth\",\"group\":\"com.google.truth\",\"version\":\"1.1.2\"}", + "{\"artifact\":\"junit\",\"group\":\"junit\",\"version\":\"4.13.2\"}", + "{\"artifact\":\"mockito-core\",\"group\":\"org.mockito\",\"version\":\"4.3.1\"}" + ], + "fail_on_missing_checksum": true, + "fetch_sources": true, + "fetch_javadoc": false, + "use_unsafe_shared_cache": false, + "excluded_artifacts": [], + "generate_compat_repositories": false, + "version_conflict_policy": "default", + "override_targets": {}, + "strict_visibility": false, + "strict_visibility_value": [ + "@@//visibility:private" + ], + "resolve_timeout": 600, + "jetify": false, + "jetify_include_list": [ + "*" + ], + "use_starlark_android_rules": false, + "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl", + "duplicate_version_warning": "warn" + } + }, + "software_amazon_awssdk_aws_xml_protocol_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_aws_xml_protocol_2_17_183", + "sha256": "566bba05d49256fa6994efd68fa625ae05a62ea45ee74bb9130d20ea20988363", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar" + } + }, + "software_amazon_awssdk_annotations_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_annotations_2_17_183", + "sha256": "8e4d72361ca805a0bd8bbd9017cd7ff77c8d170f2dd469c7d52d5653330bb3fd", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar" + } + }, + "software_amazon_awssdk_netty_nio_client_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_netty_nio_client_2_17_183", + "sha256": "a6d356f364c56d7b90006b0b7e503b8630010993a5587ce42e74b10b8dca2238", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar" + } + }, + "com_google_auto_value_auto_value_annotations_1_7_4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_auto_value_auto_value_annotations_1_7_4", + "sha256": "fedd59b0b4986c342f6ab2d182f2a4ee9fceb2c7e2d5bdc4dc764c92394a23d3", + "urls": [ + "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar", + "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar" + } + }, + "io_netty_netty_transport_native_unix_common_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_transport_native_unix_common_4_1_72_Final", + "sha256": "6f8f1cc29b5a234eeee9439a63eb3f03a5994aa540ff555cb0b2c88cefaf6877", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar" + } + }, + "io_opencensus_opencensus_contrib_http_util_0_24_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_opencensus_opencensus_contrib_http_util_0_24_0", + "sha256": "7155273bbb1ed3d477ea33cf19d7bbc0b285ff395f43b29ae576722cf247000f", + "urls": [ + "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", + "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" + } + }, + "com_fasterxml_jackson_core_jackson_core_2_11_3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_fasterxml_jackson_core_jackson_core_2_11_3", + "sha256": "78cd0a6b936232e06dd3e38da8a0345348a09cd1ff9c4d844c6ee72c75cfc402", + "urls": [ + "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar", + "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar" + } + }, + "com_google_cloud_google_cloud_core_1_93_10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_cloud_google_cloud_core_1_93_10", + "sha256": "832d74eca66f4601e162a8460d6f59f50d1d23f93c18b02654423b6b0d67c6ea", + "urls": [ + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar" + } + }, + "com_google_auth_google_auth_library_credentials_0_22_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_auth_google_auth_library_credentials_0_22_0", + "sha256": "42c76031276de5b520909e9faf88c5b3c9a722d69ee9cfdafedb1c52c355dfc5", + "urls": [ + "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar", + "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar" + } + }, + "com_google_guava_guava_30_0_android": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_guava_guava_30_0_android", + "sha256": "3345c82c2cc70a0053e8db9031edc6d71625ef0dea6a2c8f5ebd6cb76d2bf843", + "urls": [ + "https://repo1.maven.org/maven2/com/google/guava/guava/30.0-android/guava-30.0-android.jar", + "https://maven.google.com/com/google/guava/guava/30.0-android/guava-30.0-android.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/guava/guava/30.0-android/guava-30.0-android.jar" + } + }, + "software_amazon_awssdk_profiles_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_profiles_2_17_183", + "sha256": "78833b32fde3f1c5320373b9ea955c1bbc28f2c904010791c4784e610193ee56", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar" + } + }, + "org_apache_httpcomponents_httpcore_4_4_13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~org_apache_httpcomponents_httpcore_4_4_13", + "sha256": "e06e89d40943245fcfa39ec537cdbfce3762aecde8f9c597780d2b00c2b43424", + "urls": [ + "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", + "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" + } + }, + "io_netty_netty_common_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_common_4_1_72_Final", + "sha256": "8adb4c291260ceb2859a68c49f0adeed36bf49587608e2b81ecff6aaf06025e9", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar" + } + }, + "io_netty_netty_transport_classes_epoll_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_transport_classes_epoll_4_1_72_Final", + "sha256": "e1528a9751c1285aa7beaf3a1eb0597151716426ce38598ac9bc0891209b9e68", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar" + } + }, + "com_google_cloud_google_cloud_core_http_1_93_10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_cloud_google_cloud_core_http_1_93_10", + "sha256": "81ac67c14c7c4244d2b7db2607ad352416aca8d3bb2adf338964e8fea25b1b3c", + "urls": [ + "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar", + "https://maven.google.com/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar" + } + }, + "software_amazon_awssdk_utils_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_utils_2_17_183", + "sha256": "7bd849bb5aa71bfdf6b849643736ecab3a7b3f204795804eefe5754104231ec6", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar" + } + }, + "org_apache_commons_commons_lang3_3_8_1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~org_apache_commons_commons_lang3_3_8_1", + "sha256": "dac807f65b07698ff39b1b07bfef3d87ae3fd46d91bbf8a2bc02b2a831616f68", + "urls": [ + "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar", + "https://maven.google.com/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar" + } + }, + "software_amazon_awssdk_aws_core_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_aws_core_2_17_183", + "sha256": "bccbdbea689a665a702ff19828662d87fb7fe81529df13f02ef1e4c474ea9f93", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar" + } + }, + "com_google_api_gax_httpjson_0_77_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_api_gax_httpjson_0_77_0", + "sha256": "fd4dae47fa016d3b26e8d90b67ddc6c23c4c06e8bcdf085c70310ab7ef324bd6", + "urls": [ + "https://repo1.maven.org/maven2/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar", + "https://maven.google.com/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar" + } + }, + "unpinned_rules_jvm_external_deps": { + "bzlFile": "@@rules_jvm_external~4.4.2//:coursier.bzl", + "ruleClassName": "coursier_fetch", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~unpinned_rules_jvm_external_deps", + "repositories": [ + "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }" + ], + "artifacts": [ + "{\"artifact\":\"google-cloud-core\",\"group\":\"com.google.cloud\",\"version\":\"1.93.10\"}", + "{\"artifact\":\"google-cloud-storage\",\"group\":\"com.google.cloud\",\"version\":\"1.113.4\"}", + "{\"artifact\":\"gson\",\"group\":\"com.google.code.gson\",\"version\":\"2.9.0\"}", + "{\"artifact\":\"maven-artifact\",\"group\":\"org.apache.maven\",\"version\":\"3.8.6\"}", + "{\"artifact\":\"s3\",\"group\":\"software.amazon.awssdk\",\"version\":\"2.17.183\"}" + ], + "fail_on_missing_checksum": true, + "fetch_sources": true, + "fetch_javadoc": false, + "use_unsafe_shared_cache": false, + "excluded_artifacts": [], + "generate_compat_repositories": false, + "version_conflict_policy": "default", + "override_targets": {}, + "strict_visibility": false, + "strict_visibility_value": [ + "@@//visibility:private" + ], + "maven_install_json": "@@rules_jvm_external~4.4.2//:rules_jvm_external_deps_install.json", + "resolve_timeout": 600, + "jetify": false, + "jetify_include_list": [ + "*" + ], + "use_starlark_android_rules": false, + "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl", + "duplicate_version_warning": "warn" + } + }, + "software_amazon_awssdk_regions_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_regions_2_17_183", + "sha256": "d3079395f3ffc07d04ffcce16fca29fb5968197f6e9ea3dbff6be297102b40a5", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar" + } + }, + "com_google_errorprone_error_prone_annotations_2_4_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_errorprone_error_prone_annotations_2_4_0", + "sha256": "5f2a0648230a662e8be049df308d583d7369f13af683e44ddf5829b6d741a228", + "urls": [ + "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar", + "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar" + } + }, + "io_netty_netty_handler_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_handler_4_1_72_Final", + "sha256": "9cb6012af7e06361d738ac4e3bdc49a158f8cf87d9dee0f2744056b7d99c28d5", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar" + } + }, + "software_amazon_awssdk_aws_query_protocol_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_aws_query_protocol_2_17_183", + "sha256": "4dace03c76f80f3dec920cb3dedb2a95984c4366ef4fda728660cb90bed74848", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar" + } + }, + "io_netty_netty_codec_http_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_codec_http_4_1_72_Final", + "sha256": "fa6fec88010bfaf6a7415b5364671b6b18ffb6b35a986ab97b423fd8c3a0174b", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar" + } + }, + "io_netty_netty_resolver_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_resolver_4_1_72_Final", + "sha256": "6474598aab7cc9d8d6cfa06c05bd1b19adbf7f8451dbdd73070b33a6c60b1b90", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar" + } + }, + "software_amazon_awssdk_protocol_core_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_protocol_core_2_17_183", + "sha256": "10e7c4faa1f05e2d73055d0390dbd0bb6450e2e6cb85beda051b1e4693c826ce", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar" + } + }, + "org_checkerframework_checker_compat_qual_2_5_5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~org_checkerframework_checker_compat_qual_2_5_5", + "sha256": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a", + "urls": [ + "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", + "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" + } + }, + "com_google_apis_google_api_services_storage_v1_rev20200927_1_30_10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_apis_google_api_services_storage_v1_rev20200927_1_30_10", + "sha256": "52d26a9d105f8d8a0850807285f307a76cea8f3e0cdb2be4d3b15b1adfa77351", + "urls": [ + "https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar", + "https://maven.google.com/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar" + } + }, + "com_google_api_client_google_api_client_1_30_11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_api_client_google_api_client_1_30_11", + "sha256": "ee6f97865cc7de6c7c80955c3f37372cf3887bd75e4fc06f1058a6b4cd9bf4da", + "urls": [ + "https://repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar", + "https://maven.google.com/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar" + } + }, + "software_amazon_awssdk_s3_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_s3_2_17_183", + "sha256": "ab073b91107a9e4ed9f030314077d137fe627e055ad895fabb036980a050e360", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar" + } + }, + "org_apache_maven_maven_artifact_3_8_6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~org_apache_maven_maven_artifact_3_8_6", + "sha256": "de22a4c6f54fe31276a823b1bbd3adfd6823529e732f431b5eff0852c2b9252b", + "urls": [ + "https://repo1.maven.org/maven2/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar", + "https://maven.google.com/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar" + } + }, + "org_apache_httpcomponents_httpclient_4_5_13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~org_apache_httpcomponents_httpclient_4_5_13", + "sha256": "6fe9026a566c6a5001608cf3fc32196641f6c1e5e1986d1037ccdbd5f31ef743", + "urls": [ + "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar", + "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" + } + }, + "com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava", + "sha256": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", + "urls": [ + "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", + "https://maven.google.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" + } + }, + "com_google_http_client_google_http_client_1_38_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_http_client_google_http_client_1_38_0", + "sha256": "411f4a42519b6b78bdc0fcfdf74c9edcef0ee97afa4a667abe04045a508d6302", + "urls": [ + "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar", + "https://maven.google.com/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar" + } + }, + "software_amazon_awssdk_apache_client_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_apache_client_2_17_183", + "sha256": "78ceae502fce6a97bbe5ff8f6a010a52ab7ea3ae66cb1a4122e18185fce45022", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar" + } + }, + "software_amazon_awssdk_arns_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_arns_2_17_183", + "sha256": "659a185e191d66c71de81209490e66abeaccae208ea7b2831a738670823447aa", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar" + } + }, + "com_google_code_gson_gson_2_9_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_code_gson_gson_2_9_0", + "sha256": "c96d60551331a196dac54b745aa642cd078ef89b6f267146b705f2c2cbef052d", + "urls": [ + "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar", + "https://maven.google.com/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar" + } + }, + "io_netty_netty_buffer_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_buffer_4_1_72_Final", + "sha256": "568ff7cd9d8e2284ec980730c88924f686642929f8f219a74518b4e64755f3a1", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar" + } + }, + "com_google_code_findbugs_jsr305_3_0_2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_code_findbugs_jsr305_3_0_2", + "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", + "urls": [ + "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", + "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" + } + }, + "commons_codec_commons_codec_1_11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~commons_codec_commons_codec_1_11", + "sha256": "e599d5318e97aa48f42136a2927e6dfa4e8881dff0e6c8e3109ddbbff51d7b7d", + "urls": [ + "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", + "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" + } + }, + "software_amazon_awssdk_auth_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_auth_2_17_183", + "sha256": "8820c6636e5c14efc29399fb5565ce50212b0c1f4ed720a025a2c402d54e0978", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar" + } + }, + "software_amazon_awssdk_json_utils_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_json_utils_2_17_183", + "sha256": "51ab7f550adc06afcb49f5270cdf690f1bfaaee243abaa5d978095e2a1e4e1a5", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar" + } + }, + "org_codehaus_plexus_plexus_utils_3_3_1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~org_codehaus_plexus_plexus_utils_3_3_1", + "sha256": "4b570fcdbe5a894f249d2eb9b929358a9c88c3e548d227a80010461930222f2a", + "urls": [ + "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar", + "https://maven.google.com/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar" + } + }, + "com_google_protobuf_protobuf_java_util_3_13_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_protobuf_protobuf_java_util_3_13_0", + "sha256": "d9de66b8c9445905dfa7064f6d5213d47ce88a20d34e21d83c4a94a229e14e62", + "urls": [ + "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar", + "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar" + } + }, + "io_netty_netty_codec_4_1_72_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_codec_4_1_72_Final", + "sha256": "5d8591ca271a1e9c224e8de3873aa9936acb581ee0db514e7dc18523df36d16c", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar", + "https://maven.google.com/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar" + } + }, + "com_google_protobuf_protobuf_java_3_13_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~com_google_protobuf_protobuf_java_3_13_0", + "sha256": "97d5b2758408690c0dc276238707492a0b6a4d71206311b6c442cdc26c5973ff", + "urls": [ + "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar", + "https://maven.google.com/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar" + } + }, + "io_netty_netty_tcnative_classes_2_0_46_Final": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_tcnative_classes_2_0_46_Final", + "sha256": "d3ec888dcc4ac7915bf88b417c5e04fd354f4311032a748a6882df09347eed9a", + "urls": [ + "https://repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar", + "https://maven.google.com/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar" + } + }, + "software_amazon_awssdk_sdk_core_2_17_183": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_sdk_core_2_17_183", + "sha256": "677e9cc90fdd82c1f40f97b99cb115b13ad6c3f58beeeab1c061af6954d64c77", + "urls": [ + "https://repo1.maven.org/maven2/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar", + "https://maven.google.com/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar" + ], + "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar" + } + } + } + } + }, + "@rules_jvm_external~4.4.2//:non-module-deps.bzl%non_module_deps": { + "general": { + "bzlTransitiveDigest": "QlnkwH7xmrau2+KLjoV5wWr0r3Ne+JfXhrHUVpwVloQ=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "io_bazel_rules_kotlin": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_jvm_external~4.4.2~non_module_deps~io_bazel_rules_kotlin", + "sha256": "946747acdbeae799b085d12b240ec346f775ac65236dfcf18aa0cd7300f6de78", + "urls": [ + "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.7.0-RC-2/rules_kotlin_release.tgz" + ] + } + } + } + } + }, "@rules_nodejs~6.0.3//nodejs:extensions.bzl%node": { "general": { "bzlTransitiveDigest": "eqSZz/NyLGaVPPEg+/9gv/EheVgW2R69KZ73JlD5GWE=", From 48106575157c57ad7b7a72631e31b67ad1cced48 Mon Sep 17 00:00:00 2001 From: Felicity Chapman Date: Thu, 22 Feb 2024 10:50:45 +0000 Subject: [PATCH 099/207] Remove period from 'name' This is an error for the Docs content linter and does not match the style guide for query help. --- java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql b/java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql index 0311192740c..bccd1c98da7 100644 --- a/java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql +++ b/java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql @@ -1,5 +1,5 @@ /** - * @name Exposure of sensitive information to UI text views. + * @name Exposure of sensitive information to UI text views * @id java/android/sensitive-text * @kind path-problem * @description Sensitive information displayed in UI text views should be properly masked. From 0471287cdd1f2a1f981f94f97babf9b72ec8e807 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 22 Feb 2024 11:38:45 +0100 Subject: [PATCH 100/207] Bazel: remove unstable lock file --- .bazelrc | 4 +- MODULE.bazel.lock | 3844 --------------------------------------------- 2 files changed, 2 insertions(+), 3846 deletions(-) delete mode 100644 MODULE.bazel.lock diff --git a/.bazelrc b/.bazelrc index 3ded124acb2..12232b4bbd6 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,7 +1,7 @@ common --enable_platform_specific_config common --enable_bzlmod -# put common --lockfile_mode=update in your local.bazelrc if you want to auto-update the lock file -common --lockfile_mode=error +# because we use --override_module with `%workspace%`, the lock file is not stable +common --lockfile_mode=off # when building from this repository in isolation, the internal repository will not be found at .. # where `MODULE.bazel` looks for it. The following will get us past the module loading phase, so diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock deleted file mode 100644 index 0e41ef4fffa..00000000000 --- a/MODULE.bazel.lock +++ /dev/null @@ -1,3844 +0,0 @@ -{ - "lockFileVersion": 3, - "moduleFileHash": "09deccb1877acc1ce1eaf9039df5f1c064ada4c323e27531b91529a3fcafdc1b", - "flags": { - "cmdRegistries": [ - "https://bcr.bazel.build/" - ], - "cmdModuleOverrides": { - "semmle_code": "/workspaces/semmle-code/ql/misc/bazel/semmle_code_stub" - }, - "allowedYankedVersions": [], - "envVarAllowedYankedVersions": "", - "ignoreDevDependency": false, - "directDependenciesMode": "WARNING", - "compatibilityMode": "ERROR" - }, - "localOverrideHashes": { - "bazel_tools": "0cc38516259ab87144b82461dd874e139f093d8e356667c3a3c5a52441ac448f", - "semmle_code": "aa25f5fa6da11fef06837e0679e5aac0c09848a4a5cd72886016b9c6a831c9eb" - }, - "moduleDepGraph": { - "": { - "name": "codeql", - "version": "0.0", - "key": "", - "repoName": "codeql", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@nodejs_toolchains//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_python//python/extensions:pip.bzl", - "extensionName": "pip", - "usingModule": "", - "location": { - "file": "@@//:MODULE.bazel", - "line": 25, - "column": 20 - }, - "imports": { - "codegen_deps": "codegen_deps" - }, - "devImports": [], - "tags": [ - { - "tagName": "parse", - "attributeValues": { - "hub_name": "codegen_deps", - "python_version": "3.11", - "requirements_lock": "//misc/codegen:requirements_lock.txt" - }, - "devDependency": false, - "location": { - "file": "@@//:MODULE.bazel", - "line": 26, - "column": 10 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@codeql//swift/third_party:load.bzl", - "extensionName": "swift_deps", - "usingModule": "", - "location": { - "file": "@@//:MODULE.bazel", - "line": 33, - "column": 27 - }, - "imports": { - "binlog": "binlog", - "picosha2": "picosha2", - "swift_prebuilt_darwin_x86_64": "swift_prebuilt_darwin_x86_64", - "swift_prebuilt_linux": "swift_prebuilt_linux", - "swift_toolchain_linux": "swift_toolchain_linux", - "swift_toolchain_macos": "swift_toolchain_macos" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@rules_nodejs//nodejs:extensions.bzl", - "extensionName": "node", - "usingModule": "", - "location": { - "file": "@@//:MODULE.bazel", - "line": 44, - "column": 21 - }, - "imports": { - "nodejs": "nodejs", - "nodejs_toolchains": "nodejs_toolchains" - }, - "devImports": [], - "tags": [ - { - "tagName": "toolchain", - "attributeValues": { - "name": "nodejs", - "node_version": "18.15.0" - }, - "devDependency": false, - "location": { - "file": "@@//:MODULE.bazel", - "line": 45, - "column": 15 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "semmle_code": "semmle_code@_", - "platforms": "platforms@0.0.8", - "rules_pkg": "rules_pkg@0.9.1", - "rules_nodejs": "rules_nodejs@6.0.3", - "rules_python": "rules_python@0.31.0", - "bazel_skylib": "bazel_skylib@1.5.0", - "absl": "abseil-cpp@20240116.0", - "json": "nlohmann_json@3.11.3", - "fmt": "fmt@10.0.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - } - }, - "semmle_code@_": { - "name": "semmle_code", - "version": "0.0", - "key": "semmle_code@_", - "repoName": "semmle_code", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - } - }, - "platforms@0.0.8": { - "name": "platforms", - "version": "0.0.8", - "key": "platforms@0.0.8", - "repoName": "platforms", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "rules_license": "rules_license@0.0.7", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "platforms", - "urls": [ - "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz" - ], - "integrity": "sha256-gVBAZgU4ns7LbaB8vLUJ1WN6OrmiS8abEQFTE2fYnXQ=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "rules_pkg@0.9.1": { - "name": "rules_pkg", - "version": "0.9.1", - "key": "rules_pkg@0.9.1", - "repoName": "rules_pkg", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "rules_license": "rules_license@0.0.7", - "bazel_skylib": "bazel_skylib@1.5.0", - "rules_python": "rules_python@0.31.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_pkg~0.9.1", - "urls": [ - "https://github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz" - ], - "integrity": "sha256-j57i3BDBrlFO5ZmotC7Zn6Jit1cFj2WtPDhCif9wxLg=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "rules_nodejs@6.0.3": { - "name": "rules_nodejs", - "version": "6.0.3", - "key": "rules_nodejs@6.0.3", - "repoName": "rules_nodejs", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@nodejs_toolchains//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_nodejs//nodejs:extensions.bzl", - "extensionName": "node", - "usingModule": "rules_nodejs@6.0.3", - "location": { - "file": "https://bcr.bazel.build/modules/rules_nodejs/6.0.3/MODULE.bazel", - "line": 12, - "column": 21 - }, - "imports": { - "nodejs_toolchains": "nodejs_toolchains" - }, - "devImports": [], - "tags": [ - { - "tagName": "toolchain", - "attributeValues": { - "name": "nodejs" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_nodejs/6.0.3/MODULE.bazel", - "line": 16, - "column": 15 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_skylib": "bazel_skylib@1.5.0", - "platforms": "platforms@0.0.8", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_nodejs~6.0.3", - "urls": [ - "https://github.com/bazelbuild/rules_nodejs/releases/download/v6.0.3/rules_nodejs-v6.0.3.tar.gz" - ], - "integrity": "sha256-825KR0chAzF2cDPcMHKK498IVuiOz9xIoAd7qHTbFsM=", - "strip_prefix": "rules_nodejs-6.0.3", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_nodejs/6.0.3/patches/module_dot_bazel_version.patch": "sha256-/Qzzf6CPPzlexZh3ZFFqSthBDeYANhTOf7FB76Y3Aq4=" - }, - "remote_patch_strip": 1 - } - } - }, - "rules_python@0.31.0": { - "name": "rules_python", - "version": "0.31.0", - "key": "rules_python@0.31.0", - "repoName": "rules_python", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@pythons_hub//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_python//python/private/bzlmod:internal_deps.bzl", - "extensionName": "internal_deps", - "usingModule": "rules_python@0.31.0", - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", - "line": 15, - "column": 30 - }, - "imports": { - "rules_python_internal": "rules_python_internal", - "pypi__build": "pypi__build", - "pypi__click": "pypi__click", - "pypi__colorama": "pypi__colorama", - "pypi__importlib_metadata": "pypi__importlib_metadata", - "pypi__installer": "pypi__installer", - "pypi__more_itertools": "pypi__more_itertools", - "pypi__packaging": "pypi__packaging", - "pypi__pep517": "pypi__pep517", - "pypi__pip": "pypi__pip", - "pypi__pip_tools": "pypi__pip_tools", - "pypi__pyproject_hooks": "pypi__pyproject_hooks", - "pypi__setuptools": "pypi__setuptools", - "pypi__tomli": "pypi__tomli", - "pypi__wheel": "pypi__wheel", - "pypi__zipp": "pypi__zipp" - }, - "devImports": [], - "tags": [ - { - "tagName": "install", - "attributeValues": {}, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", - "line": 16, - "column": 22 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@rules_python//python/extensions:python.bzl", - "extensionName": "python", - "usingModule": "rules_python@0.31.0", - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", - "line": 41, - "column": 23 - }, - "imports": { - "pythons_hub": "pythons_hub" - }, - "devImports": [], - "tags": [ - { - "tagName": "toolchain", - "attributeValues": { - "is_default": true, - "python_version": "3.11" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", - "line": 47, - "column": 17 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_features": "bazel_features@1.1.1", - "bazel_skylib": "bazel_skylib@1.5.0", - "platforms": "platforms@0.0.8", - "rules_proto": "rules_proto@5.3.0-21.7", - "com_google_protobuf": "protobuf@21.7", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0", - "urls": [ - "https://github.com/bazelbuild/rules_python/releases/download/0.31.0/rules_python-0.31.0.tar.gz" - ], - "integrity": "sha256-xovcT77CXeW1STuIGc/Id8TqKZwNyxXCRMWgAgjN4xE=", - "strip_prefix": "rules_python-0.31.0", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_python/0.31.0/patches/module_dot_bazel_version.patch": "sha256-j2KF6j66J2fRAGtc56Zj7Hp1dTGqOWPAR3+IODr0oLQ=" - }, - "remote_patch_strip": 1 - } - } - }, - "bazel_skylib@1.5.0": { - "name": "bazel_skylib", - "version": "1.5.0", - "key": "bazel_skylib@1.5.0", - "repoName": "bazel_skylib", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "//toolchains/unittest:cmd_toolchain", - "//toolchains/unittest:bash_toolchain" - ], - "extensionUsages": [], - "deps": { - "platforms": "platforms@0.0.8", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "bazel_skylib~1.5.0", - "urls": [ - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz" - ], - "integrity": "sha256-zVWgYudjuTSZIfD124w5MyiNyLpPdt2UFqrGis7jy5Q=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "abseil-cpp@20240116.0": { - "name": "abseil-cpp", - "version": "20240116.0", - "key": "abseil-cpp@20240116.0", - "repoName": "abseil-cpp", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_skylib": "bazel_skylib@1.5.0", - "com_google_googletest": "googletest@1.14.0.bcr.1", - "platforms": "platforms@0.0.8", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "abseil-cpp~20240116.0", - "urls": [ - "https://github.com/abseil/abseil-cpp/releases/download/20240116.0/abseil-cpp-20240116.0.tar.gz" - ], - "integrity": "sha256-M4QgRIsUDw39Gh6jw85xs7wXIHHyT02aV9WbRQN9pEA=", - "strip_prefix": "abseil-cpp-20240116.0", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "nlohmann_json@3.11.3": { - "name": "nlohmann_json", - "version": "3.11.3", - "key": "nlohmann_json@3.11.3", - "repoName": "nlohmann_json", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "nlohmann_json~3.11.3", - "urls": [ - "https://github.com/nlohmann/json/releases/download/v3.11.3/include.zip" - ], - "integrity": "sha256-oiRh0TEZrFx48gXT3x2xNAPljOG7F5TtyTE2dzE/Sp0=", - "strip_prefix": "", - "remote_patches": { - "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/patches/module_dot_bazel.patch": "sha256-OmeSCp1IqWbHGPJs0v5taUiPLEsI9KEJPLsnPpKB/B8=" - }, - "remote_patch_strip": 0 - } - } - }, - "fmt@10.0.0": { - "name": "fmt", - "version": "10.0.0", - "key": "fmt@10.0.0", - "repoName": "fmt", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "fmt~10.0.0", - "urls": [ - "https://github.com/fmtlib/fmt/releases/download/10.0.0/fmt-10.0.0.zip" - ], - "integrity": "sha256-SUPLFl8/WH8m2oNNMFbuhzPDl+AkFFyn0qipa7cawoE=", - "strip_prefix": "fmt-10.0.0", - "remote_patches": { - "https://bcr.bazel.build/modules/fmt/10.0.0/patches/add_build_file.patch": "sha256-bUYJz9G64DPC99/aSnVNx3JD1nStIA4zXK89OvIDmfY=", - "https://bcr.bazel.build/modules/fmt/10.0.0/patches/module_dot_bazel.patch": "sha256-q0XolQgLsu7qcDqqEiCj/+oPO/MU7f7tU111Df0xv7s=" - }, - "remote_patch_strip": 0 - } - } - }, - "bazel_tools@_": { - "name": "bazel_tools", - "version": "", - "key": "bazel_tools@_", - "repoName": "bazel_tools", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@local_config_cc_toolchains//:all", - "@local_config_sh//:local_sh_toolchain" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@bazel_tools//tools/cpp:cc_configure.bzl", - "extensionName": "cc_configure_extension", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 13, - "column": 29 - }, - "imports": { - "local_config_cc": "local_config_cc", - "local_config_cc_toolchains": "local_config_cc_toolchains" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@bazel_tools//tools/osx:xcode_configure.bzl", - "extensionName": "xcode_configure_extension", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 17, - "column": 32 - }, - "imports": { - "local_config_xcode": "local_config_xcode" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@rules_java//java:extensions.bzl", - "extensionName": "toolchains", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 20, - "column": 32 - }, - "imports": { - "local_jdk": "local_jdk", - "remote_java_tools": "remote_java_tools", - "remote_java_tools_linux": "remote_java_tools_linux", - "remote_java_tools_windows": "remote_java_tools_windows", - "remote_java_tools_darwin_x86_64": "remote_java_tools_darwin_x86_64", - "remote_java_tools_darwin_arm64": "remote_java_tools_darwin_arm64" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@bazel_tools//tools/sh:sh_configure.bzl", - "extensionName": "sh_configure_extension", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 31, - "column": 39 - }, - "imports": { - "local_config_sh": "local_config_sh" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@bazel_tools//tools/test:extensions.bzl", - "extensionName": "remote_coverage_tools_extension", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 35, - "column": 48 - }, - "imports": { - "remote_coverage_tools": "remote_coverage_tools" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": "@bazel_tools//tools/android:android_extensions.bzl", - "extensionName": "remote_android_tools_extensions", - "usingModule": "bazel_tools@_", - "location": { - "file": "@@bazel_tools//:MODULE.bazel", - "line": 38, - "column": 42 - }, - "imports": { - "android_gmaven_r8": "android_gmaven_r8", - "android_tools": "android_tools" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "rules_cc": "rules_cc@0.0.9", - "rules_java": "rules_java@5.5.1", - "rules_license": "rules_license@0.0.7", - "rules_proto": "rules_proto@5.3.0-21.7", - "rules_python": "rules_python@0.31.0", - "platforms": "platforms@0.0.8", - "com_google_protobuf": "protobuf@21.7", - "zlib": "zlib@1.2.13", - "local_config_platform": "local_config_platform@_" - } - }, - "local_config_platform@_": { - "name": "local_config_platform", - "version": "", - "key": "local_config_platform@_", - "repoName": "local_config_platform", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "platforms": "platforms@0.0.8", - "bazel_tools": "bazel_tools@_" - } - }, - "rules_license@0.0.7": { - "name": "rules_license", - "version": "0.0.7", - "key": "rules_license@0.0.7", - "repoName": "rules_license", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_license~0.0.7", - "urls": [ - "https://github.com/bazelbuild/rules_license/releases/download/0.0.7/rules_license-0.0.7.tar.gz" - ], - "integrity": "sha256-RTHezLkTY5ww5cdRKgVNXYdWmNrrddjPkPKEN1/nw2A=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "bazel_features@1.1.1": { - "name": "bazel_features", - "version": "1.1.1", - "key": "bazel_features@1.1.1", - "repoName": "bazel_features", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@bazel_features//private:extensions.bzl", - "extensionName": "version_extension", - "usingModule": "bazel_features@1.1.1", - "location": { - "file": "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel", - "line": 6, - "column": 24 - }, - "imports": { - "bazel_features_globals": "bazel_features_globals", - "bazel_features_version": "bazel_features_version" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "bazel_features~1.1.1", - "urls": [ - "https://github.com/bazel-contrib/bazel_features/releases/download/v1.1.1/bazel_features-v1.1.1.tar.gz" - ], - "integrity": "sha256-YsJuQn5cvHUQJERpJ2IuOYqdzfMsZDJSOIFXCdEcEag=", - "strip_prefix": "bazel_features-1.1.1", - "remote_patches": { - "https://bcr.bazel.build/modules/bazel_features/1.1.1/patches/module_dot_bazel_version.patch": "sha256-+56MAEsc7bYN/Pzhn252ZQUxiRzZg9bynXj1qpsmCYs=" - }, - "remote_patch_strip": 1 - } - } - }, - "rules_proto@5.3.0-21.7": { - "name": "rules_proto", - "version": "5.3.0-21.7", - "key": "rules_proto@5.3.0-21.7", - "repoName": "rules_proto", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_skylib": "bazel_skylib@1.5.0", - "com_google_protobuf": "protobuf@21.7", - "rules_cc": "rules_cc@0.0.9", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_proto~5.3.0-21.7", - "urls": [ - "https://github.com/bazelbuild/rules_proto/archive/refs/tags/5.3.0-21.7.tar.gz" - ], - "integrity": "sha256-3D+yBqLLNEG0heseQjFlsjEjWh6psDG0Qzz3vB+kYN0=", - "strip_prefix": "rules_proto-5.3.0-21.7", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "protobuf@21.7": { - "name": "protobuf", - "version": "21.7", - "key": "protobuf@21.7", - "repoName": "protobuf", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_jvm_external//:extensions.bzl", - "extensionName": "maven", - "usingModule": "protobuf@21.7", - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel", - "line": 22, - "column": 22 - }, - "imports": { - "maven": "maven" - }, - "devImports": [], - "tags": [ - { - "tagName": "install", - "attributeValues": { - "name": "maven", - "artifacts": [ - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.code.gson:gson:2.8.9", - "com.google.errorprone:error_prone_annotations:2.3.2", - "com.google.j2objc:j2objc-annotations:1.3", - "com.google.guava:guava:31.1-jre", - "com.google.guava:guava-testlib:31.1-jre", - "com.google.truth:truth:1.1.2", - "junit:junit:4.13.2", - "org.mockito:mockito-core:4.3.1" - ] - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel", - "line": 24, - "column": 14 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_skylib": "bazel_skylib@1.5.0", - "rules_python": "rules_python@0.31.0", - "rules_cc": "rules_cc@0.0.9", - "rules_proto": "rules_proto@5.3.0-21.7", - "rules_java": "rules_java@5.5.1", - "rules_pkg": "rules_pkg@0.9.1", - "com_google_abseil": "abseil-cpp@20240116.0", - "zlib": "zlib@1.2.13", - "upb": "upb@0.0.0-20220923-a547704", - "rules_jvm_external": "rules_jvm_external@4.4.2", - "com_google_googletest": "googletest@1.14.0.bcr.1", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "protobuf~21.7", - "urls": [ - "https://github.com/protocolbuffers/protobuf/releases/download/v21.7/protobuf-all-21.7.zip" - ], - "integrity": "sha256-VJOiH17T/FAuZv7GuUScBqVRztYwAvpIkDxA36jeeko=", - "strip_prefix": "protobuf-21.7", - "remote_patches": { - "https://bcr.bazel.build/modules/protobuf/21.7/patches/add_module_dot_bazel.patch": "sha256-q3V2+eq0v2XF0z8z+V+QF4cynD6JvHI1y3kI/+rzl5s=", - "https://bcr.bazel.build/modules/protobuf/21.7/patches/add_module_dot_bazel_for_examples.patch": "sha256-O7YP6s3lo/1opUiO0jqXYORNHdZ/2q3hjz1QGy8QdIU=", - "https://bcr.bazel.build/modules/protobuf/21.7/patches/relative_repo_names.patch": "sha256-RK9RjW8T5UJNG7flIrnFiNE9vKwWB+8uWWtJqXYT0w4=", - "https://bcr.bazel.build/modules/protobuf/21.7/patches/add_missing_files.patch": "sha256-Hyne4DG2u5bXcWHNxNMirA2QFAe/2Cl8oMm1XJdkQIY=" - }, - "remote_patch_strip": 1 - } - } - }, - "googletest@1.14.0.bcr.1": { - "name": "googletest", - "version": "1.14.0.bcr.1", - "key": "googletest@1.14.0.bcr.1", - "repoName": "googletest", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "com_google_absl": "abseil-cpp@20240116.0", - "platforms": "platforms@0.0.8", - "rules_cc": "rules_cc@0.0.9", - "com_googlesource_code_re2": "re2@2023-09-01", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "googletest~1.14.0.bcr.1", - "urls": [ - "https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz" - ], - "integrity": "sha256-itWYxzrXluDYKAsILOvYKmMNc+c808cAV5OKZQG7pdc=", - "strip_prefix": "googletest-1.14.0", - "remote_patches": { - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/patches/module_dot_bazel.patch": "sha256-jijctisPYOzP4X4cl0K7neRh/kqJB+yODNHf8V8heCE=" - }, - "remote_patch_strip": 0 - } - } - }, - "rules_cc@0.0.9": { - "name": "rules_cc", - "version": "0.0.9", - "key": "rules_cc@0.0.9", - "repoName": "rules_cc", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@local_config_cc_toolchains//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@bazel_tools//tools/cpp:cc_configure.bzl", - "extensionName": "cc_configure_extension", - "usingModule": "rules_cc@0.0.9", - "location": { - "file": "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel", - "line": 9, - "column": 29 - }, - "imports": { - "local_config_cc_toolchains": "local_config_cc_toolchains" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "platforms": "platforms@0.0.8", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_cc~0.0.9", - "urls": [ - "https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz" - ], - "integrity": "sha256-IDeHW5pEVtzkp50RKorohbvEqtlo5lh9ym5k86CQDN8=", - "strip_prefix": "rules_cc-0.0.9", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_cc/0.0.9/patches/module_dot_bazel_version.patch": "sha256-mM+qzOI0SgAdaJBlWOSMwMPKpaA9b7R37Hj/tp5bb4g=" - }, - "remote_patch_strip": 0 - } - } - }, - "rules_java@5.5.1": { - "name": "rules_java", - "version": "5.5.1", - "key": "rules_java@5.5.1", - "repoName": "rules_java", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "//toolchains:all", - "@local_jdk//:runtime_toolchain_definition", - "@remotejdk11_linux_toolchain_config_repo//:toolchain", - "@remotejdk11_macos_toolchain_config_repo//:toolchain", - "@remotejdk11_macos_aarch64_toolchain_config_repo//:toolchain", - "@remotejdk11_win_toolchain_config_repo//:toolchain", - "@remotejdk17_linux_toolchain_config_repo//:toolchain", - "@remotejdk17_macos_toolchain_config_repo//:toolchain", - "@remotejdk17_macos_aarch64_toolchain_config_repo//:toolchain", - "@remotejdk17_win_toolchain_config_repo//:toolchain", - "@remotejdk19_linux_toolchain_config_repo//:toolchain", - "@remotejdk19_macos_toolchain_config_repo//:toolchain", - "@remotejdk19_macos_aarch64_toolchain_config_repo//:toolchain", - "@remotejdk19_win_toolchain_config_repo//:toolchain", - "@remotejdk11_linux_aarch64_toolchain_config_repo//:toolchain", - "@remotejdk11_linux_ppc64le_toolchain_config_repo//:toolchain", - "@remotejdk11_linux_s390x_toolchain_config_repo//:toolchain" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_java//java:extensions.bzl", - "extensionName": "toolchains", - "usingModule": "rules_java@5.5.1", - "location": { - "file": "https://bcr.bazel.build/modules/rules_java/5.5.1/MODULE.bazel", - "line": 16, - "column": 27 - }, - "imports": { - "remote_java_tools": "remote_java_tools", - "remote_java_tools_linux": "remote_java_tools_linux", - "remote_java_tools_windows": "remote_java_tools_windows", - "remote_java_tools_darwin_x86_64": "remote_java_tools_darwin_x86_64", - "remote_java_tools_darwin_arm64": "remote_java_tools_darwin_arm64", - "local_jdk": "local_jdk", - "remotejdk11_linux_toolchain_config_repo": "remotejdk11_linux_toolchain_config_repo", - "remotejdk11_macos_toolchain_config_repo": "remotejdk11_macos_toolchain_config_repo", - "remotejdk11_macos_aarch64_toolchain_config_repo": "remotejdk11_macos_aarch64_toolchain_config_repo", - "remotejdk11_win_toolchain_config_repo": "remotejdk11_win_toolchain_config_repo", - "remotejdk17_linux_toolchain_config_repo": "remotejdk17_linux_toolchain_config_repo", - "remotejdk17_macos_toolchain_config_repo": "remotejdk17_macos_toolchain_config_repo", - "remotejdk17_macos_aarch64_toolchain_config_repo": "remotejdk17_macos_aarch64_toolchain_config_repo", - "remotejdk17_win_toolchain_config_repo": "remotejdk17_win_toolchain_config_repo", - "remotejdk19_linux_toolchain_config_repo": "remotejdk19_linux_toolchain_config_repo", - "remotejdk19_macos_toolchain_config_repo": "remotejdk19_macos_toolchain_config_repo", - "remotejdk19_macos_aarch64_toolchain_config_repo": "remotejdk19_macos_aarch64_toolchain_config_repo", - "remotejdk19_win_toolchain_config_repo": "remotejdk19_win_toolchain_config_repo", - "remotejdk11_linux_aarch64_toolchain_config_repo": "remotejdk11_linux_aarch64_toolchain_config_repo", - "remotejdk11_linux_ppc64le_toolchain_config_repo": "remotejdk11_linux_ppc64le_toolchain_config_repo", - "remotejdk11_linux_s390x_toolchain_config_repo": "remotejdk11_linux_s390x_toolchain_config_repo" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "platforms": "platforms@0.0.8", - "rules_cc": "rules_cc@0.0.9", - "bazel_skylib": "bazel_skylib@1.5.0", - "rules_proto": "rules_proto@5.3.0-21.7", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1", - "urls": [ - "https://github.com/bazelbuild/rules_java/releases/download/5.5.1/rules_java-5.5.1.tar.gz" - ], - "integrity": "sha256-c7iPNNwlG857xsRy6zhqbCsxLtW0c8gf5GhVwkj3kuA=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "zlib@1.2.13": { - "name": "zlib", - "version": "1.2.13", - "key": "zlib@1.2.13", - "repoName": "zlib", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "zlib~1.2.13", - "urls": [ - "https://github.com/madler/zlib/archive/refs/tags/v1.2.13.zip" - ], - "integrity": "sha256-woVpUbvzDjCGGs43ZVldhroT8s8BJ52QH2xiJYxX9P8=", - "strip_prefix": "zlib-1.2.13", - "remote_patches": { - "https://bcr.bazel.build/modules/zlib/1.2.13/patches/add_build_file.patch": "sha256-Z2ig1F01/dfdG63H+GwYRMcGbW/zAGIUWnKKrwKSEaQ=", - "https://bcr.bazel.build/modules/zlib/1.2.13/patches/module_dot_bazel.patch": "sha256-Nc7xP02Dl6yHQvkiZWSQnlnw1T277yS4cJxxONWJ/Ic=" - }, - "remote_patch_strip": 0 - } - } - }, - "upb@0.0.0-20220923-a547704": { - "name": "upb", - "version": "0.0.0-20220923-a547704", - "key": "upb@0.0.0-20220923-a547704", - "repoName": "upb", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_skylib": "bazel_skylib@1.5.0", - "rules_proto": "rules_proto@5.3.0-21.7", - "com_google_protobuf": "protobuf@21.7", - "com_google_absl": "abseil-cpp@20240116.0", - "platforms": "platforms@0.0.8", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "upb~0.0.0-20220923-a547704", - "urls": [ - "https://github.com/protocolbuffers/upb/archive/a5477045acaa34586420942098f5fecd3570f577.tar.gz" - ], - "integrity": "sha256-z39x6v+QskwaKLSWRan/A6mmwecTQpHOcJActj5zZLU=", - "strip_prefix": "upb-a5477045acaa34586420942098f5fecd3570f577", - "remote_patches": { - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/patches/module_dot_bazel.patch": "sha256-wH4mNS6ZYy+8uC0HoAft/c7SDsq2Kxf+J8dUakXhaB0=" - }, - "remote_patch_strip": 0 - } - } - }, - "rules_jvm_external@4.4.2": { - "name": "rules_jvm_external", - "version": "4.4.2", - "key": "rules_jvm_external@4.4.2", - "repoName": "rules_jvm_external", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_jvm_external//:non-module-deps.bzl", - "extensionName": "non_module_deps", - "usingModule": "rules_jvm_external@4.4.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel", - "line": 9, - "column": 32 - }, - "imports": { - "io_bazel_rules_kotlin": "io_bazel_rules_kotlin" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - }, - { - "extensionBzlFile": ":extensions.bzl", - "extensionName": "maven", - "usingModule": "rules_jvm_external@4.4.2", - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel", - "line": 16, - "column": 22 - }, - "imports": { - "rules_jvm_external_deps": "rules_jvm_external_deps" - }, - "devImports": [], - "tags": [ - { - "tagName": "install", - "attributeValues": { - "name": "rules_jvm_external_deps", - "artifacts": [ - "com.google.cloud:google-cloud-core:1.93.10", - "com.google.cloud:google-cloud-storage:1.113.4", - "com.google.code.gson:gson:2.9.0", - "org.apache.maven:maven-artifact:3.8.6", - "software.amazon.awssdk:s3:2.17.183" - ], - "lock_file": "@rules_jvm_external//:rules_jvm_external_deps_install.json" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel", - "line": 18, - "column": 14 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_skylib": "bazel_skylib@1.5.0", - "io_bazel_stardoc": "stardoc@0.5.1", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_jvm_external~4.4.2", - "urls": [ - "https://github.com/bazelbuild/rules_jvm_external/archive/refs/tags/4.4.2.zip" - ], - "integrity": "sha256-c1YC9QgT6y6pPKP15DsZWb2AshO4NqB6YqKddXZwt3s=", - "strip_prefix": "rules_jvm_external-4.4.2", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "re2@2023-09-01": { - "name": "re2", - "version": "2023-09-01", - "key": "re2@2023-09-01", - "repoName": "re2", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [ - { - "extensionBzlFile": "@pybind11_bazel//:python_configure.bzl", - "extensionName": "extension", - "usingModule": "re2@2023-09-01", - "location": { - "file": "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel", - "line": 22, - "column": 33 - }, - "imports": { - "local_config_python": "local_config_python", - "pybind11": "pybind11" - }, - "devImports": [], - "tags": [ - { - "tagName": "toolchain", - "attributeValues": { - "python_version": "3" - }, - "devDependency": false, - "location": { - "file": "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel", - "line": 23, - "column": 27 - } - } - ], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "platforms": "platforms@0.0.8", - "rules_cc": "rules_cc@0.0.9", - "com_google_absl": "abseil-cpp@20240116.0", - "rules_python": "rules_python@0.31.0", - "pybind11_bazel": "pybind11_bazel@2.11.1", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "re2~2023-09-01", - "urls": [ - "https://github.com/google/re2/releases/download/2023-09-01/re2-2023-09-01.zip" - ], - "integrity": "sha256-IkuDUdxGM7EBLb2EdWTgYKRr5goioUY9S1uZP9S/Wcw=", - "strip_prefix": "re2-2023-09-01", - "remote_patches": { - "https://bcr.bazel.build/modules/re2/2023-09-01/patches/module_dot_bazel.patch": "sha256-MUQkRNgPJ0lbYqOXoBu2m2vLH7IuKEbK/VWTw7WWrnA=" - }, - "remote_patch_strip": 0 - } - } - }, - "stardoc@0.5.1": { - "name": "stardoc", - "version": "0.5.1", - "key": "stardoc@0.5.1", - "repoName": "stardoc", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_skylib": "bazel_skylib@1.5.0", - "rules_java": "rules_java@5.5.1", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "stardoc~0.5.1", - "urls": [ - "https://github.com/bazelbuild/stardoc/releases/download/0.5.1/stardoc-0.5.1.tar.gz" - ], - "integrity": "sha256-qoFNrgrEALurLoiB+ZFcb0fElmS/CHxAmhX5BDjSwj4=", - "strip_prefix": "", - "remote_patches": { - "https://bcr.bazel.build/modules/stardoc/0.5.1/patches/module_dot_bazel.patch": "sha256-UAULCuTpJE7SG0YrR9XLjMfxMRmbP+za3uW9ONZ5rjI=" - }, - "remote_patch_strip": 0 - } - } - }, - "pybind11_bazel@2.11.1": { - "name": "pybind11_bazel", - "version": "2.11.1", - "key": "pybind11_bazel@2.11.1", - "repoName": "pybind11_bazel", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "platforms": "platforms@0.0.8", - "rules_cc": "rules_cc@0.0.9", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "pybind11_bazel~2.11.1", - "urls": [ - "https://github.com/pybind/pybind11_bazel/releases/download/v2.11.1/pybind11_bazel-2.11.1.zip" - ], - "integrity": "sha256-LEZsmzzKeFK0fgeFADEomE/PDV1hoaLkxazu/ZNawiA=", - "strip_prefix": "pybind11_bazel-2.11.1", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - } - }, - "moduleExtensions": { - "//swift/third_party:load.bzl%swift_deps": { - "general": { - "bzlTransitiveDigest": "sb8oxwz4X2YEkeO5BZQfH2A1YkljDQ1BAZegKwhAzOo=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "swift_toolchain_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "_main~swift_deps~swift_toolchain_linux", - "url": "https://download.swift.org/swift-5.9.2-release/ubuntu2004/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu20.04.tar.gz", - "sha256": "93477b80db16f3e5085738ade05478ed435793e39864418e737a10ac306cbd8c", - "build_file": "@@//swift/third_party:BUILD.swift-toolchain-linux.bazel", - "strip_prefix": "swift-5.9.2-RELEASE-ubuntu20.04" - } - }, - "swift_prebuilt_darwin_x86_64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "_main~swift_deps~swift_prebuilt_darwin_x86_64", - "url": "https://github.com/dsp-testing/codeql-swift-artifacts/releases/download/swift-5.9.2-RELEASE.299/swift-prebuilt-macOS-X64.zip", - "build_file": "@@//swift/third_party:BUILD.swift-llvm-support.bazel", - "sha256": "16f3a248269a06b00c6a40567ca06d5494d9a0ce24e7dd7cb8534828639418e8", - "patch_args": [ - "-p1" - ], - "patches": [ - "@@//swift/third_party/swift-llvm-support:patches/remove-redundant-operators.patch", - "@@//swift/third_party/swift-llvm-support:patches/add-constructor-to-Compilation.patch" - ] - } - }, - "picosha2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "_main~swift_deps~picosha2", - "url": "https://github.com/okdshin/PicoSHA2/archive/27fcf6979298949e8a462e16d09a0351c18fcaf2.zip", - "strip_prefix": "PicoSHA2-27fcf6979298949e8a462e16d09a0351c18fcaf2", - "build_file": "@@//swift/third_party:BUILD.picosha2.bazel", - "sha256": "d6647ca45a8b7bdaf027ecb68d041b22a899a0218b7206dee755c558a2725abb" - } - }, - "swift_prebuilt_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "_main~swift_deps~swift_prebuilt_linux", - "url": "https://github.com/dsp-testing/codeql-swift-artifacts/releases/download/swift-5.9.2-RELEASE.299/swift-prebuilt-Linux-X64.zip", - "build_file": "@@//swift/third_party:BUILD.swift-llvm-support.bazel", - "sha256": "19e8150251601e7b27e76d1a405a72c459f9a3e2949a1e360fde15ebb4d87409", - "patch_args": [ - "-p1" - ], - "patches": [ - "@@//swift/third_party/swift-llvm-support:patches/remove-redundant-operators.patch", - "@@//swift/third_party/swift-llvm-support:patches/add-constructor-to-Compilation.patch" - ] - } - }, - "binlog": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "_main~swift_deps~binlog", - "url": "https://github.com/morganstanley/binlog/archive/3fef8846f5ef98e64211e7982c2ead67e0b185a6.zip", - "strip_prefix": "binlog-3fef8846f5ef98e64211e7982c2ead67e0b185a6", - "build_file": "@@//swift/third_party:BUILD.binlog.bazel", - "sha256": "f5c61d90a6eff341bf91771f2f465be391fd85397023e1b391c17214f9cbd045" - } - }, - "swift_toolchain_macos": { - "bzlFile": "@@//swift/third_party:load.bzl", - "ruleClassName": "_pkg_archive", - "attributes": { - "name": "_main~swift_deps~swift_toolchain_macos", - "url": "https://download.swift.org/swift-5.9.2-release/xcode/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-osx.pkg", - "sha256": "68951c313b4b559878fc5be27e460c877f98d14e161f755220b063123919e896", - "build_file": "@@//swift/third_party:BUILD.swift-toolchain-macos.bazel", - "strip_prefix": "swift-5.9.2-RELEASE-osx" - } - } - } - } - }, - "@bazel_features~1.1.1//private:extensions.bzl%version_extension": { - "general": { - "bzlTransitiveDigest": "xm7Skm1Las5saxzFWt2hbS+e68BWi+MXyt6+lKIhjPA=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "bazel_features_version": { - "bzlFile": "@@bazel_features~1.1.1//private:version_repo.bzl", - "ruleClassName": "version_repo", - "attributes": { - "name": "bazel_features~1.1.1~version_extension~bazel_features_version" - } - }, - "bazel_features_globals": { - "bzlFile": "@@bazel_features~1.1.1//private:globals_repo.bzl", - "ruleClassName": "globals_repo", - "attributes": { - "name": "bazel_features~1.1.1~version_extension~bazel_features_globals", - "globals": { - "RunEnvironmentInfo": "5.3.0", - "DefaultInfo": "0.0.1", - "__TestingOnly_NeverAvailable": "1000000000.0.0" - } - } - } - } - } - }, - "@bazel_tools//tools/android:android_extensions.bzl%remote_android_tools_extensions": { - "general": { - "bzlTransitiveDigest": "4+Dj2H7maLh8JtpJKiuaI7PSXiIZw6oWX9xsVhnJ5DU=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "android_tools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "bazel_tools~remote_android_tools_extensions~android_tools", - "sha256": "1afa4b7e13c82523c8b69e87f8d598c891ec7e2baa41d9e24e08becd723edb4d", - "url": "https://mirror.bazel.build/bazel_android_tools/android_tools_pkg-0.27.0.tar.gz" - } - }, - "android_gmaven_r8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_jar", - "attributes": { - "name": "bazel_tools~remote_android_tools_extensions~android_gmaven_r8", - "sha256": "ab1379835c7d3e5f21f80347c3c81e2f762e0b9b02748ae5232c3afa14adf702", - "url": "https://maven.google.com/com/android/tools/r8/8.0.40/r8-8.0.40.jar" - } - } - } - } - }, - "@bazel_tools//tools/cpp:cc_configure.bzl%cc_configure_extension": { - "general": { - "bzlTransitiveDigest": "sftnIlf92nP/IUiWiMkgL9Sh8Drk9kKhTXHvoavVJZg=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_cc": { - "bzlFile": "@@bazel_tools//tools/cpp:cc_configure.bzl", - "ruleClassName": "cc_autoconf", - "attributes": { - "name": "bazel_tools~cc_configure_extension~local_config_cc" - } - }, - "local_config_cc_toolchains": { - "bzlFile": "@@bazel_tools//tools/cpp:cc_configure.bzl", - "ruleClassName": "cc_autoconf_toolchains", - "attributes": { - "name": "bazel_tools~cc_configure_extension~local_config_cc_toolchains" - } - } - } - } - }, - "@bazel_tools//tools/osx:xcode_configure.bzl%xcode_configure_extension": { - "general": { - "bzlTransitiveDigest": "CtmyZVPtInM72JKIFfarSKOF0R/GbDRl8HBuOsRWhRs=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_xcode": { - "bzlFile": "@@bazel_tools//tools/osx:xcode_configure.bzl", - "ruleClassName": "xcode_autoconf", - "attributes": { - "name": "bazel_tools~xcode_configure_extension~local_config_xcode", - "xcode_locator": "@bazel_tools//tools/osx:xcode_locator.m", - "remote_xcode": "" - } - } - } - } - }, - "@bazel_tools//tools/sh:sh_configure.bzl%sh_configure_extension": { - "general": { - "bzlTransitiveDigest": "hp4NgmNjEg5+xgvzfh6L83bt9/aiiWETuNpwNuF1MSU=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_sh": { - "bzlFile": "@@bazel_tools//tools/sh:sh_configure.bzl", - "ruleClassName": "sh_config", - "attributes": { - "name": "bazel_tools~sh_configure_extension~local_config_sh" - } - } - } - } - }, - "@bazel_tools//tools/test:extensions.bzl%remote_coverage_tools_extension": { - "general": { - "bzlTransitiveDigest": "IWFtZ+6M0WGmNpfnHZMxnVFSDZ6pRTEWt7jixp7XffQ=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "remote_coverage_tools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "bazel_tools~remote_coverage_tools_extension~remote_coverage_tools", - "sha256": "7006375f6756819b7013ca875eab70a541cf7d89142d9c511ed78ea4fefa38af", - "urls": [ - "https://mirror.bazel.build/bazel_coverage_output_generator/releases/coverage_output_generator-v2.6.zip" - ] - } - } - } - } - }, - "@pybind11_bazel~2.11.1//:python_configure.bzl%extension": { - "general": { - "bzlTransitiveDigest": "sgbbaIxC3APaPN1jX6dINhHUkxY594QM1GSG37yca5A=", - "accumulatedFileDigests": { - "@@pybind11_bazel~2.11.1//:MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e" - }, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_python": { - "bzlFile": "@@pybind11_bazel~2.11.1//:python_configure.bzl", - "ruleClassName": "python_configure", - "attributes": { - "name": "pybind11_bazel~2.11.1~extension~local_config_python" - } - }, - "pybind11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "pybind11_bazel~2.11.1~extension~pybind11", - "build_file": "@@pybind11_bazel~2.11.1//:pybind11.BUILD", - "strip_prefix": "pybind11-2.11.1", - "urls": [ - "https://github.com/pybind/pybind11/archive/v2.11.1.zip" - ] - } - } - } - } - }, - "@rules_java~5.5.1//java:extensions.bzl%toolchains": { - "general": { - "bzlTransitiveDigest": "IFVnLAj9sdT9p8x0XTGG1Ea54qqosuXfcRu2egn7Sqw=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "remotejdk19_macos_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk19_macos_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_19\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"19\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk19_macos_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk17_macos_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_macos_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos//:jdk\",\n)\n" - } - }, - "remotejdk17_linux_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_linux_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux//:jdk\",\n)\n" - } - }, - "remote_java_tools_darwin": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remote_java_tools_darwin", - "sha256": "abc434be713ee9e1fd6525d7a7bd9d7cdff6e27ae3ca9d96420490e7ff6e28a3", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_darwin_x86_64-v12.0.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_darwin_x86_64-v12.0.zip" - ] - } - }, - "remotejdk17_macos_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_macos_aarch64", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "54247dde248ffbcd3c048675504b1c503b81daf2dc0d64a79e353c48d383c977", - "strip_prefix": "zulu17.32.13-ca-jdk17.0.2-macosx_aarch64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-macosx_aarch64.tar.gz", - "https://cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-macosx_aarch64.tar.gz" - ] - } - }, - "remote_java_tools_windows": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remote_java_tools_windows", - "sha256": "7b938f0c67d9d390f10489b1b9a4dabb51e39ecc94532c3acdf8c4c16900457f", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_windows-v12.0.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_windows-v12.0.zip" - ] - } - }, - "remotejdk11_win": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_win", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "a106c77389a63b6bd963a087d5f01171bd32aa3ee7377ecef87531390dcb9050", - "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-win_x64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-win_x64.zip", - "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-win_x64.zip" - ] - } - }, - "remotejdk11_win_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_win_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win//:jdk\",\n)\n" - } - }, - "remotejdk11_linux_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_aarch64", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "fc7c41a0005180d4ca471c90d01e049469e0614cf774566d4cf383caa29d1a97", - "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-linux_aarch64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu-embedded/bin/zulu11.56.19-ca-jdk11.0.15-linux_aarch64.tar.gz", - "https://cdn.azul.com/zulu-embedded/bin/zulu11.56.19-ca-jdk11.0.15-linux_aarch64.tar.gz" - ] - } - }, - "remotejdk17_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_linux", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "73d5c4bae20325ca41b606f7eae64669db3aac638c5b3ead4a975055846ad6de", - "strip_prefix": "zulu17.32.13-ca-jdk17.0.2-linux_x64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-linux_x64.tar.gz", - "https://cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-linux_x64.tar.gz" - ] - } - }, - "remotejdk11_linux_s390x_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_s390x_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_s390x//:jdk\",\n)\n" - } - }, - "remotejdk11_linux_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux//:jdk\",\n)\n" - } - }, - "remotejdk11_macos": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_macos", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "2614e5c5de8e989d4d81759de4c333aa5b867b17ab9ee78754309ba65c7f6f55", - "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-macosx_x64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_x64.tar.gz", - "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_x64.tar.gz" - ] - } - }, - "remotejdk11_win_arm64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_win_arm64", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "b8a28e6e767d90acf793ea6f5bed0bb595ba0ba5ebdf8b99f395266161e53ec2", - "strip_prefix": "jdk-11.0.13+8", - "urls": [ - "https://mirror.bazel.build/aka.ms/download-jdk/microsoft-jdk-11.0.13.8.1-windows-aarch64.zip" - ] - } - }, - "remotejdk17_macos": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_macos", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "89d04b2d99b05dcb25114178e65f6a1c5ca742e125cab0a63d87e7e42f3fcb80", - "strip_prefix": "zulu17.32.13-ca-jdk17.0.2-macosx_x64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-macosx_x64.tar.gz", - "https://cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-macosx_x64.tar.gz" - ] - } - }, - "remotejdk17_macos_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_macos_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk17_win": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_win", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "e965aa0ea7a0661a3446cf8f10ee00684b851f883b803315289f26b4aa907fdb", - "strip_prefix": "zulu17.32.13-ca-jdk17.0.2-win_x64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-win_x64.zip", - "https://cdn.azul.com/zulu/bin/zulu17.32.13-ca-jdk17.0.2-win_x64.zip" - ] - } - }, - "remotejdk11_macos_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_macos_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk11_linux_ppc64le_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_ppc64le_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_ppc64le//:jdk\",\n)\n" - } - }, - "remote_java_tools_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remote_java_tools_linux", - "sha256": "4b8366b780387fc5ce69527ed287f2b444ee429d3325305ad062c92ac43c7fb6", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_linux-v12.0.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_linux-v12.0.zip" - ] - } - }, - "remotejdk19_macos_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk19_macos_aarch64", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "177d058d968b2fbe7a5ff5eceb18cdc16f6376ce291004f1a3139e78b2fb6391", - "strip_prefix": "zulu19.32.13-ca-jdk19.0.2-macosx_aarch64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-macosx_aarch64.tar.gz", - "https://cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-macosx_aarch64.tar.gz" - ] - } - }, - "remotejdk19_win_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk19_win_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_19\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"19\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk19_win//:jdk\",\n)\n" - } - }, - "remotejdk19_macos_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk19_macos_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_19\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"19\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk19_macos//:jdk\",\n)\n" - } - }, - "remotejdk19_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk19_linux", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "4a994aded1d9b35258d543a59d4963d2687a1094a818b79a21f00273fbbc5bca", - "strip_prefix": "zulu19.32.13-ca-jdk19.0.2-linux_x64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-linux_x64.tar.gz", - "https://cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-linux_x64.tar.gz" - ] - } - }, - "remotejdk11_linux_aarch64_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_aarch64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_aarch64//:jdk\",\n)\n" - } - }, - "remotejdk11_linux_s390x": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_s390x", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "a58fc0361966af0a5d5a31a2d8a208e3c9bb0f54f345596fd80b99ea9a39788b", - "strip_prefix": "jdk-11.0.15+10", - "urls": [ - "https://mirror.bazel.build/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.15_10.tar.gz", - "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.15_10.tar.gz" - ] - } - }, - "remotejdk17_win_arm64_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_win_arm64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win_arm64//:jdk\",\n)\n" - } - }, - "remotejdk11_linux": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_linux", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "e064b61d93304012351242bf0823c6a2e41d9e28add7ea7f05378b7243d34247", - "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-linux_x64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-linux_x64.tar.gz", - "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-linux_x64.tar.gz" - ] - } - }, - "remotejdk11_macos_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_macos_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos//:jdk\",\n)\n" - } - }, - "remotejdk19_win": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk19_win", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "d6c768c5ec3252f936bd0562c25458f7c753c62835ca3e91166f975f7a5fe9f1", - "strip_prefix": "zulu19.32.13-ca-jdk19.0.2-win_x64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-win_x64.zip", - "https://cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-win_x64.zip" - ] - } - }, - "remotejdk17_win_arm64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_win_arm64", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "811d7e7591bac4f081dfb00ba6bd15b6fc5969e1f89f0f327ef75147027c3877", - "strip_prefix": "zulu17.30.15-ca-jdk17.0.1-win_aarch64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip", - "https://cdn.azul.com/zulu/bin/zulu17.30.15-ca-jdk17.0.1-win_aarch64.zip" - ] - } - }, - "remotejdk19_macos": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk19_macos", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "2804575ae9ac63e39caa910e57610bf52b0f9e2d671928a98d18e2fcc9f62ac1", - "strip_prefix": "zulu19.32.13-ca-jdk19.0.2-macosx_x64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-macosx_x64.tar.gz", - "https://cdn.azul.com/zulu/bin/zulu19.32.13-ca-jdk19.0.2-macosx_x64.tar.gz" - ] - } - }, - "remotejdk19_linux_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk19_linux_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_19\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"19\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk19_linux//:jdk\",\n)\n" - } - }, - "remote_java_tools_darwin_arm64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remote_java_tools_darwin_arm64", - "sha256": "24a47a5557ee2ccdacd10a54fe4c15d627c6aeaf7596a5dccf2e11a866a5a32a", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_darwin_arm64-v12.0.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_darwin_arm64-v12.0.zip" - ] - } - }, - "remotejdk11_win_arm64_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_win_arm64_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win_arm64//:jdk\",\n)\n" - } - }, - "local_jdk": { - "bzlFile": "@@rules_java~5.5.1//toolchains:local_java_repository.bzl", - "ruleClassName": "_local_java_repository_rule", - "attributes": { - "name": "rules_java~5.5.1~toolchains~local_jdk", - "target_name": "local_jdk", - "java_home": "", - "version": "", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD" - } - }, - "remote_java_tools_darwin_x86_64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remote_java_tools_darwin_x86_64", - "sha256": "abc434be713ee9e1fd6525d7a7bd9d7cdff6e27ae3ca9d96420490e7ff6e28a3", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools_darwin_x86_64-v12.0.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools_darwin_x86_64-v12.0.zip" - ] - } - }, - "remote_java_tools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remote_java_tools", - "sha256": "6efab6ca6e16e02c90e62bbd08ca65f61527984ab78564ea7ad7a2692b2ffdbb", - "urls": [ - "https://mirror.bazel.build/bazel_java_tools/releases/java/v12.0/java_tools-v12.0.zip", - "https://github.com/bazelbuild/java_tools/releases/download/java_v12.0/java_tools-v12.0.zip" - ] - } - }, - "remotejdk17_win_toolchain_config_repo": { - "bzlFile": "@@rules_java~5.5.1//toolchains:remote_java_repository.bzl", - "ruleClassName": "_toolchain_config", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk17_win_toolchain_config_repo", - "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win//:jdk\",\n)\n" - } - }, - "remotejdk11_linux_ppc64le": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_linux_ppc64le", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "a8fba686f6eb8ae1d1a9566821dbd5a85a1108b96ad857fdbac5c1e4649fc56f", - "strip_prefix": "jdk-11.0.15+10", - "urls": [ - "https://mirror.bazel.build/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.15_10.tar.gz", - "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.15_10.tar.gz" - ] - } - }, - "remotejdk11_macos_aarch64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_java~5.5.1~toolchains~remotejdk11_macos_aarch64", - "build_file": "@@rules_java~5.5.1//toolchains:jdk.BUILD", - "sha256": "6bb0d2c6e8a29dcd9c577bbb2986352ba12481a9549ac2c0bcfd00ed60e538d2", - "strip_prefix": "zulu11.56.19-ca-jdk11.0.15-macosx_aarch64", - "urls": [ - "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_aarch64.tar.gz", - "https://cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-macosx_aarch64.tar.gz" - ] - } - } - } - } - }, - "@rules_jvm_external~4.4.2//:extensions.bzl%maven": { - "general": { - "bzlTransitiveDigest": "istmyWP0h8op1Y4uAZZpKSZR6IiKJFC+0DDHxSqZeZU=", - "accumulatedFileDigests": { - "@@rules_jvm_external~4.4.2//:rules_jvm_external_deps_install.json": "10442a5ae27d9ff4c2003e5ab71643bf0d8b48dcf968b4173fa274c3232a8c06" - }, - "envVariables": {}, - "generatedRepoSpecs": { - "org_slf4j_slf4j_api_1_7_30": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~org_slf4j_slf4j_api_1_7_30", - "sha256": "cdba07964d1bb40a0761485c6b1e8c2f8fd9eb1d19c53928ac0d7f9510105c57", - "urls": [ - "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar", - "https://maven.google.com/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" - } - }, - "com_google_api_grpc_proto_google_common_protos_2_0_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_api_grpc_proto_google_common_protos_2_0_1", - "sha256": "5ce71656118618731e34a5d4c61aa3a031be23446dc7de8b5a5e77b66ebcd6ef", - "urls": [ - "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar" - } - }, - "com_google_api_gax_1_60_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_api_gax_1_60_0", - "sha256": "02f37d4ff1a7b8d71dff8064cf9568aa4f4b61bcc4485085d16130f32afa5a79", - "urls": [ - "https://repo1.maven.org/maven2/com/google/api/gax/1.60.0/gax-1.60.0.jar", - "https://maven.google.com/com/google/api/gax/1.60.0/gax-1.60.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/gax/1.60.0/gax-1.60.0.jar" - } - }, - "com_google_guava_failureaccess_1_0_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_guava_failureaccess_1_0_1", - "sha256": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26", - "urls": [ - "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", - "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" - } - }, - "commons_logging_commons_logging_1_2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~commons_logging_commons_logging_1_2", - "sha256": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636", - "urls": [ - "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar", - "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar" - } - }, - "com_google_http_client_google_http_client_appengine_1_38_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_http_client_google_http_client_appengine_1_38_0", - "sha256": "f97b495fd97ac3a3d59099eb2b55025f4948230da15a076f189b9cff37c6b4d2", - "urls": [ - "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar", - "https://maven.google.com/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar" - } - }, - "com_google_cloud_google_cloud_storage_1_113_4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_cloud_google_cloud_storage_1_113_4", - "sha256": "796833e9bdab80c40bbc820e65087eb8f28c6bfbca194d2e3e00d98cb5bc55d6", - "urls": [ - "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar", - "https://maven.google.com/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar" - } - }, - "io_grpc_grpc_context_1_33_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_grpc_grpc_context_1_33_1", - "sha256": "99b8aea2b614fe0e61c3676e681259dc43c2de7f64620998e1a8435eb2976496", - "urls": [ - "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar", - "https://maven.google.com/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar" - } - }, - "com_google_api_grpc_proto_google_iam_v1_1_0_3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_api_grpc_proto_google_iam_v1_1_0_3", - "sha256": "64cee7383a97e846da8d8e160e6c8fe30561e507260552c59e6ccfc81301fdc8", - "urls": [ - "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar", - "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar" - } - }, - "com_google_api_api_common_1_10_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_api_api_common_1_10_1", - "sha256": "2a033f24bb620383eda440ad307cb8077cfec1c7eadc684d65216123a1b9613a", - "urls": [ - "https://repo1.maven.org/maven2/com/google/api/api-common/1.10.1/api-common-1.10.1.jar", - "https://maven.google.com/com/google/api/api-common/1.10.1/api-common-1.10.1.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/api-common/1.10.1/api-common-1.10.1.jar" - } - }, - "com_google_auth_google_auth_library_oauth2_http_0_22_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_auth_google_auth_library_oauth2_http_0_22_0", - "sha256": "1722d895c42dc42ea1d1f392ddbec1fbb28f7a979022c3a6c29acc39cc777ad1", - "urls": [ - "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar", - "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar" - } - }, - "com_typesafe_netty_netty_reactive_streams_2_0_5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_typesafe_netty_netty_reactive_streams_2_0_5", - "sha256": "f949849fc8ee75fde468ba3a35df2e04577fa31a2940b83b2a7dc9d14dac13d6", - "urls": [ - "https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar", - "https://maven.google.com/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar" - } - }, - "com_typesafe_netty_netty_reactive_streams_http_2_0_5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_typesafe_netty_netty_reactive_streams_http_2_0_5", - "sha256": "b39224751ad936758176e9d994230380ade5e9079e7c8ad778e3995779bcf303", - "urls": [ - "https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar", - "https://maven.google.com/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar" - } - }, - "javax_annotation_javax_annotation_api_1_3_2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~javax_annotation_javax_annotation_api_1_3_2", - "sha256": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b", - "urls": [ - "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", - "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" - } - }, - "com_google_j2objc_j2objc_annotations_1_3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_j2objc_j2objc_annotations_1_3", - "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", - "urls": [ - "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" - } - }, - "software_amazon_awssdk_metrics_spi_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_metrics_spi_2_17_183", - "sha256": "08a11dc8c4ba464beafbcc7ac05b8c724c1ccb93da99482e82a68540ac704e4a", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar" - } - }, - "org_reactivestreams_reactive_streams_1_0_3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~org_reactivestreams_reactive_streams_1_0_3", - "sha256": "1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865", - "urls": [ - "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", - "https://maven.google.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" - } - }, - "com_google_http_client_google_http_client_jackson2_1_38_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_http_client_google_http_client_jackson2_1_38_0", - "sha256": "e6504a82425fcc2168a4ca4175138ddcc085168daed8cdedb86d8f6fdc296e1e", - "urls": [ - "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar", - "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar" - } - }, - "io_netty_netty_transport_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_transport_4_1_72_Final", - "sha256": "c5fb68e9a65b6e8a516adfcb9fa323479ee7b4d9449d8a529d2ecab3d3711d5a", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar" - } - }, - "io_netty_netty_codec_http2_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_codec_http2_4_1_72_Final", - "sha256": "c89a70500f59e8563e720aaa808263a514bd9e2bd91ba84eab8c2ccb45f234b2", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar" - } - }, - "io_opencensus_opencensus_api_0_24_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_opencensus_opencensus_api_0_24_0", - "sha256": "f561b1cc2673844288e596ddf5bb6596868a8472fd2cb8993953fc5c034b2352", - "urls": [ - "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar", - "https://maven.google.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar" - } - }, - "rules_jvm_external_deps": { - "bzlFile": "@@rules_jvm_external~4.4.2//:coursier.bzl", - "ruleClassName": "pinned_coursier_fetch", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~rules_jvm_external_deps", - "repositories": [ - "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }" - ], - "artifacts": [ - "{\"artifact\":\"google-cloud-core\",\"group\":\"com.google.cloud\",\"version\":\"1.93.10\"}", - "{\"artifact\":\"google-cloud-storage\",\"group\":\"com.google.cloud\",\"version\":\"1.113.4\"}", - "{\"artifact\":\"gson\",\"group\":\"com.google.code.gson\",\"version\":\"2.9.0\"}", - "{\"artifact\":\"maven-artifact\",\"group\":\"org.apache.maven\",\"version\":\"3.8.6\"}", - "{\"artifact\":\"s3\",\"group\":\"software.amazon.awssdk\",\"version\":\"2.17.183\"}" - ], - "fetch_sources": true, - "fetch_javadoc": false, - "generate_compat_repositories": false, - "maven_install_json": "@@rules_jvm_external~4.4.2//:rules_jvm_external_deps_install.json", - "override_targets": {}, - "strict_visibility": false, - "strict_visibility_value": [ - "@@//visibility:private" - ], - "jetify": false, - "jetify_include_list": [ - "*" - ], - "additional_netrc_lines": [], - "fail_if_repin_required": false, - "use_starlark_android_rules": false, - "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl", - "duplicate_version_warning": "warn" - } - }, - "org_threeten_threetenbp_1_5_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~org_threeten_threetenbp_1_5_0", - "sha256": "dcf9c0f940739f2a825cd8626ff27113459a2f6eb18797c7152f93fff69c264f", - "urls": [ - "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar", - "https://maven.google.com/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar" - } - }, - "software_amazon_awssdk_http_client_spi_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_http_client_spi_2_17_183", - "sha256": "fe7120f175df9e47ebcc5d946d7f40110faf2ba0a30364f3b935d5b8a5a6c3c6", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar" - } - }, - "software_amazon_awssdk_third_party_jackson_core_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_third_party_jackson_core_2_17_183", - "sha256": "1bc27c9960993c20e1ab058012dd1ae04c875eec9f0f08f2b2ca41e578dee9a4", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar" - } - }, - "software_amazon_eventstream_eventstream_1_0_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_eventstream_eventstream_1_0_1", - "sha256": "0c37d8e696117f02c302191b8110b0d0eb20fa412fce34c3a269ec73c16ce822", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar", - "https://maven.google.com/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar" - } - }, - "com_google_oauth_client_google_oauth_client_1_31_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_oauth_client_google_oauth_client_1_31_1", - "sha256": "4ed4e2948251dbda66ce251bd7f3b32cd8570055e5cdb165a3c7aea8f43da0ff", - "urls": [ - "https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar", - "https://maven.google.com/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar" - } - }, - "maven": { - "bzlFile": "@@rules_jvm_external~4.4.2//:coursier.bzl", - "ruleClassName": "coursier_fetch", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~maven", - "repositories": [ - "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }" - ], - "artifacts": [ - "{\"artifact\":\"jsr305\",\"group\":\"com.google.code.findbugs\",\"version\":\"3.0.2\"}", - "{\"artifact\":\"gson\",\"group\":\"com.google.code.gson\",\"version\":\"2.8.9\"}", - "{\"artifact\":\"error_prone_annotations\",\"group\":\"com.google.errorprone\",\"version\":\"2.3.2\"}", - "{\"artifact\":\"j2objc-annotations\",\"group\":\"com.google.j2objc\",\"version\":\"1.3\"}", - "{\"artifact\":\"guava\",\"group\":\"com.google.guava\",\"version\":\"31.1-jre\"}", - "{\"artifact\":\"guava-testlib\",\"group\":\"com.google.guava\",\"version\":\"31.1-jre\"}", - "{\"artifact\":\"truth\",\"group\":\"com.google.truth\",\"version\":\"1.1.2\"}", - "{\"artifact\":\"junit\",\"group\":\"junit\",\"version\":\"4.13.2\"}", - "{\"artifact\":\"mockito-core\",\"group\":\"org.mockito\",\"version\":\"4.3.1\"}" - ], - "fail_on_missing_checksum": true, - "fetch_sources": true, - "fetch_javadoc": false, - "use_unsafe_shared_cache": false, - "excluded_artifacts": [], - "generate_compat_repositories": false, - "version_conflict_policy": "default", - "override_targets": {}, - "strict_visibility": false, - "strict_visibility_value": [ - "@@//visibility:private" - ], - "resolve_timeout": 600, - "jetify": false, - "jetify_include_list": [ - "*" - ], - "use_starlark_android_rules": false, - "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl", - "duplicate_version_warning": "warn" - } - }, - "software_amazon_awssdk_aws_xml_protocol_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_aws_xml_protocol_2_17_183", - "sha256": "566bba05d49256fa6994efd68fa625ae05a62ea45ee74bb9130d20ea20988363", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar" - } - }, - "software_amazon_awssdk_annotations_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_annotations_2_17_183", - "sha256": "8e4d72361ca805a0bd8bbd9017cd7ff77c8d170f2dd469c7d52d5653330bb3fd", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar" - } - }, - "software_amazon_awssdk_netty_nio_client_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_netty_nio_client_2_17_183", - "sha256": "a6d356f364c56d7b90006b0b7e503b8630010993a5587ce42e74b10b8dca2238", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar" - } - }, - "com_google_auto_value_auto_value_annotations_1_7_4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_auto_value_auto_value_annotations_1_7_4", - "sha256": "fedd59b0b4986c342f6ab2d182f2a4ee9fceb2c7e2d5bdc4dc764c92394a23d3", - "urls": [ - "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar", - "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar" - } - }, - "io_netty_netty_transport_native_unix_common_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_transport_native_unix_common_4_1_72_Final", - "sha256": "6f8f1cc29b5a234eeee9439a63eb3f03a5994aa540ff555cb0b2c88cefaf6877", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar" - } - }, - "io_opencensus_opencensus_contrib_http_util_0_24_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_opencensus_opencensus_contrib_http_util_0_24_0", - "sha256": "7155273bbb1ed3d477ea33cf19d7bbc0b285ff395f43b29ae576722cf247000f", - "urls": [ - "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar", - "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar" - } - }, - "com_fasterxml_jackson_core_jackson_core_2_11_3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_fasterxml_jackson_core_jackson_core_2_11_3", - "sha256": "78cd0a6b936232e06dd3e38da8a0345348a09cd1ff9c4d844c6ee72c75cfc402", - "urls": [ - "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar", - "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar" - } - }, - "com_google_cloud_google_cloud_core_1_93_10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_cloud_google_cloud_core_1_93_10", - "sha256": "832d74eca66f4601e162a8460d6f59f50d1d23f93c18b02654423b6b0d67c6ea", - "urls": [ - "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar", - "https://maven.google.com/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar" - } - }, - "com_google_auth_google_auth_library_credentials_0_22_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_auth_google_auth_library_credentials_0_22_0", - "sha256": "42c76031276de5b520909e9faf88c5b3c9a722d69ee9cfdafedb1c52c355dfc5", - "urls": [ - "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar", - "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar" - } - }, - "com_google_guava_guava_30_0_android": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_guava_guava_30_0_android", - "sha256": "3345c82c2cc70a0053e8db9031edc6d71625ef0dea6a2c8f5ebd6cb76d2bf843", - "urls": [ - "https://repo1.maven.org/maven2/com/google/guava/guava/30.0-android/guava-30.0-android.jar", - "https://maven.google.com/com/google/guava/guava/30.0-android/guava-30.0-android.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/guava/guava/30.0-android/guava-30.0-android.jar" - } - }, - "software_amazon_awssdk_profiles_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_profiles_2_17_183", - "sha256": "78833b32fde3f1c5320373b9ea955c1bbc28f2c904010791c4784e610193ee56", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar" - } - }, - "org_apache_httpcomponents_httpcore_4_4_13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~org_apache_httpcomponents_httpcore_4_4_13", - "sha256": "e06e89d40943245fcfa39ec537cdbfce3762aecde8f9c597780d2b00c2b43424", - "urls": [ - "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar", - "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar" - } - }, - "io_netty_netty_common_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_common_4_1_72_Final", - "sha256": "8adb4c291260ceb2859a68c49f0adeed36bf49587608e2b81ecff6aaf06025e9", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar" - } - }, - "io_netty_netty_transport_classes_epoll_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_transport_classes_epoll_4_1_72_Final", - "sha256": "e1528a9751c1285aa7beaf3a1eb0597151716426ce38598ac9bc0891209b9e68", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar" - } - }, - "com_google_cloud_google_cloud_core_http_1_93_10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_cloud_google_cloud_core_http_1_93_10", - "sha256": "81ac67c14c7c4244d2b7db2607ad352416aca8d3bb2adf338964e8fea25b1b3c", - "urls": [ - "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar", - "https://maven.google.com/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar" - } - }, - "software_amazon_awssdk_utils_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_utils_2_17_183", - "sha256": "7bd849bb5aa71bfdf6b849643736ecab3a7b3f204795804eefe5754104231ec6", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar" - } - }, - "org_apache_commons_commons_lang3_3_8_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~org_apache_commons_commons_lang3_3_8_1", - "sha256": "dac807f65b07698ff39b1b07bfef3d87ae3fd46d91bbf8a2bc02b2a831616f68", - "urls": [ - "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar", - "https://maven.google.com/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar" - } - }, - "software_amazon_awssdk_aws_core_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_aws_core_2_17_183", - "sha256": "bccbdbea689a665a702ff19828662d87fb7fe81529df13f02ef1e4c474ea9f93", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar" - } - }, - "com_google_api_gax_httpjson_0_77_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_api_gax_httpjson_0_77_0", - "sha256": "fd4dae47fa016d3b26e8d90b67ddc6c23c4c06e8bcdf085c70310ab7ef324bd6", - "urls": [ - "https://repo1.maven.org/maven2/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar", - "https://maven.google.com/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar" - } - }, - "unpinned_rules_jvm_external_deps": { - "bzlFile": "@@rules_jvm_external~4.4.2//:coursier.bzl", - "ruleClassName": "coursier_fetch", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~unpinned_rules_jvm_external_deps", - "repositories": [ - "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }" - ], - "artifacts": [ - "{\"artifact\":\"google-cloud-core\",\"group\":\"com.google.cloud\",\"version\":\"1.93.10\"}", - "{\"artifact\":\"google-cloud-storage\",\"group\":\"com.google.cloud\",\"version\":\"1.113.4\"}", - "{\"artifact\":\"gson\",\"group\":\"com.google.code.gson\",\"version\":\"2.9.0\"}", - "{\"artifact\":\"maven-artifact\",\"group\":\"org.apache.maven\",\"version\":\"3.8.6\"}", - "{\"artifact\":\"s3\",\"group\":\"software.amazon.awssdk\",\"version\":\"2.17.183\"}" - ], - "fail_on_missing_checksum": true, - "fetch_sources": true, - "fetch_javadoc": false, - "use_unsafe_shared_cache": false, - "excluded_artifacts": [], - "generate_compat_repositories": false, - "version_conflict_policy": "default", - "override_targets": {}, - "strict_visibility": false, - "strict_visibility_value": [ - "@@//visibility:private" - ], - "maven_install_json": "@@rules_jvm_external~4.4.2//:rules_jvm_external_deps_install.json", - "resolve_timeout": 600, - "jetify": false, - "jetify_include_list": [ - "*" - ], - "use_starlark_android_rules": false, - "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl", - "duplicate_version_warning": "warn" - } - }, - "software_amazon_awssdk_regions_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_regions_2_17_183", - "sha256": "d3079395f3ffc07d04ffcce16fca29fb5968197f6e9ea3dbff6be297102b40a5", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar" - } - }, - "com_google_errorprone_error_prone_annotations_2_4_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_errorprone_error_prone_annotations_2_4_0", - "sha256": "5f2a0648230a662e8be049df308d583d7369f13af683e44ddf5829b6d741a228", - "urls": [ - "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar", - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar" - } - }, - "io_netty_netty_handler_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_handler_4_1_72_Final", - "sha256": "9cb6012af7e06361d738ac4e3bdc49a158f8cf87d9dee0f2744056b7d99c28d5", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar" - } - }, - "software_amazon_awssdk_aws_query_protocol_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_aws_query_protocol_2_17_183", - "sha256": "4dace03c76f80f3dec920cb3dedb2a95984c4366ef4fda728660cb90bed74848", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar" - } - }, - "io_netty_netty_codec_http_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_codec_http_4_1_72_Final", - "sha256": "fa6fec88010bfaf6a7415b5364671b6b18ffb6b35a986ab97b423fd8c3a0174b", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar" - } - }, - "io_netty_netty_resolver_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_resolver_4_1_72_Final", - "sha256": "6474598aab7cc9d8d6cfa06c05bd1b19adbf7f8451dbdd73070b33a6c60b1b90", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar" - } - }, - "software_amazon_awssdk_protocol_core_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_protocol_core_2_17_183", - "sha256": "10e7c4faa1f05e2d73055d0390dbd0bb6450e2e6cb85beda051b1e4693c826ce", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar" - } - }, - "org_checkerframework_checker_compat_qual_2_5_5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~org_checkerframework_checker_compat_qual_2_5_5", - "sha256": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a", - "urls": [ - "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", - "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" - } - }, - "com_google_apis_google_api_services_storage_v1_rev20200927_1_30_10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_apis_google_api_services_storage_v1_rev20200927_1_30_10", - "sha256": "52d26a9d105f8d8a0850807285f307a76cea8f3e0cdb2be4d3b15b1adfa77351", - "urls": [ - "https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar", - "https://maven.google.com/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar" - } - }, - "com_google_api_client_google_api_client_1_30_11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_api_client_google_api_client_1_30_11", - "sha256": "ee6f97865cc7de6c7c80955c3f37372cf3887bd75e4fc06f1058a6b4cd9bf4da", - "urls": [ - "https://repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar", - "https://maven.google.com/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar" - } - }, - "software_amazon_awssdk_s3_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_s3_2_17_183", - "sha256": "ab073b91107a9e4ed9f030314077d137fe627e055ad895fabb036980a050e360", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar" - } - }, - "org_apache_maven_maven_artifact_3_8_6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~org_apache_maven_maven_artifact_3_8_6", - "sha256": "de22a4c6f54fe31276a823b1bbd3adfd6823529e732f431b5eff0852c2b9252b", - "urls": [ - "https://repo1.maven.org/maven2/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar", - "https://maven.google.com/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar" - } - }, - "org_apache_httpcomponents_httpclient_4_5_13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~org_apache_httpcomponents_httpclient_4_5_13", - "sha256": "6fe9026a566c6a5001608cf3fc32196641f6c1e5e1986d1037ccdbd5f31ef743", - "urls": [ - "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar", - "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" - } - }, - "com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava", - "sha256": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", - "urls": [ - "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", - "https://maven.google.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" - } - }, - "com_google_http_client_google_http_client_1_38_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_http_client_google_http_client_1_38_0", - "sha256": "411f4a42519b6b78bdc0fcfdf74c9edcef0ee97afa4a667abe04045a508d6302", - "urls": [ - "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar", - "https://maven.google.com/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar" - } - }, - "software_amazon_awssdk_apache_client_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_apache_client_2_17_183", - "sha256": "78ceae502fce6a97bbe5ff8f6a010a52ab7ea3ae66cb1a4122e18185fce45022", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar" - } - }, - "software_amazon_awssdk_arns_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_arns_2_17_183", - "sha256": "659a185e191d66c71de81209490e66abeaccae208ea7b2831a738670823447aa", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar" - } - }, - "com_google_code_gson_gson_2_9_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_code_gson_gson_2_9_0", - "sha256": "c96d60551331a196dac54b745aa642cd078ef89b6f267146b705f2c2cbef052d", - "urls": [ - "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar", - "https://maven.google.com/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar" - } - }, - "io_netty_netty_buffer_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_buffer_4_1_72_Final", - "sha256": "568ff7cd9d8e2284ec980730c88924f686642929f8f219a74518b4e64755f3a1", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar" - } - }, - "com_google_code_findbugs_jsr305_3_0_2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_code_findbugs_jsr305_3_0_2", - "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", - "urls": [ - "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", - "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" - } - }, - "commons_codec_commons_codec_1_11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~commons_codec_commons_codec_1_11", - "sha256": "e599d5318e97aa48f42136a2927e6dfa4e8881dff0e6c8e3109ddbbff51d7b7d", - "urls": [ - "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar", - "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar" - } - }, - "software_amazon_awssdk_auth_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_auth_2_17_183", - "sha256": "8820c6636e5c14efc29399fb5565ce50212b0c1f4ed720a025a2c402d54e0978", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar" - } - }, - "software_amazon_awssdk_json_utils_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_json_utils_2_17_183", - "sha256": "51ab7f550adc06afcb49f5270cdf690f1bfaaee243abaa5d978095e2a1e4e1a5", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar" - } - }, - "org_codehaus_plexus_plexus_utils_3_3_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~org_codehaus_plexus_plexus_utils_3_3_1", - "sha256": "4b570fcdbe5a894f249d2eb9b929358a9c88c3e548d227a80010461930222f2a", - "urls": [ - "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar", - "https://maven.google.com/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar" - } - }, - "com_google_protobuf_protobuf_java_util_3_13_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_protobuf_protobuf_java_util_3_13_0", - "sha256": "d9de66b8c9445905dfa7064f6d5213d47ce88a20d34e21d83c4a94a229e14e62", - "urls": [ - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar" - } - }, - "io_netty_netty_codec_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_codec_4_1_72_Final", - "sha256": "5d8591ca271a1e9c224e8de3873aa9936acb581ee0db514e7dc18523df36d16c", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar", - "https://maven.google.com/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar" - } - }, - "com_google_protobuf_protobuf_java_3_13_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~com_google_protobuf_protobuf_java_3_13_0", - "sha256": "97d5b2758408690c0dc276238707492a0b6a4d71206311b6c442cdc26c5973ff", - "urls": [ - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar" - } - }, - "io_netty_netty_tcnative_classes_2_0_46_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~io_netty_netty_tcnative_classes_2_0_46_Final", - "sha256": "d3ec888dcc4ac7915bf88b417c5e04fd354f4311032a748a6882df09347eed9a", - "urls": [ - "https://repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar", - "https://maven.google.com/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar" - } - }, - "software_amazon_awssdk_sdk_core_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~4.4.2~maven~software_amazon_awssdk_sdk_core_2_17_183", - "sha256": "677e9cc90fdd82c1f40f97b99cb115b13ad6c3f58beeeab1c061af6954d64c77", - "urls": [ - "https://repo1.maven.org/maven2/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar", - "https://maven.google.com/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar" - ], - "downloaded_file_path": "v1/https/repo1.maven.org/maven2/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar" - } - } - } - } - }, - "@rules_jvm_external~4.4.2//:non-module-deps.bzl%non_module_deps": { - "general": { - "bzlTransitiveDigest": "QlnkwH7xmrau2+KLjoV5wWr0r3Ne+JfXhrHUVpwVloQ=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "io_bazel_rules_kotlin": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_jvm_external~4.4.2~non_module_deps~io_bazel_rules_kotlin", - "sha256": "946747acdbeae799b085d12b240ec346f775ac65236dfcf18aa0cd7300f6de78", - "urls": [ - "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.7.0-RC-2/rules_kotlin_release.tgz" - ] - } - } - } - } - }, - "@rules_nodejs~6.0.3//nodejs:extensions.bzl%node": { - "general": { - "bzlTransitiveDigest": "eqSZz/NyLGaVPPEg+/9gv/EheVgW2R69KZ73JlD5GWE=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "nodejs_host": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs/private:nodejs_repo_host_os_alias.bzl", - "ruleClassName": "nodejs_repo_host_os_alias", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs_host", - "user_node_repository_name": "nodejs" - } - }, - "nodejs_linux_s390x": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs_linux_s390x", - "platform": "linux_s390x", - "node_version": "18.15.0" - } - }, - "nodejs_windows_amd64": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs_windows_amd64", - "platform": "windows_amd64", - "node_version": "18.15.0" - } - }, - "nodejs_toolchains": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs/private:toolchains_repo.bzl", - "ruleClassName": "toolchains_repo", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs_toolchains", - "user_node_repository_name": "nodejs" - } - }, - "nodejs_linux_amd64": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs_linux_amd64", - "platform": "linux_amd64", - "node_version": "18.15.0" - } - }, - "nodejs_linux_ppc64le": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs_linux_ppc64le", - "platform": "linux_ppc64le", - "node_version": "18.15.0" - } - }, - "nodejs_darwin_amd64": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs_darwin_amd64", - "platform": "darwin_amd64", - "node_version": "18.15.0" - } - }, - "nodejs_linux_arm64": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs_linux_arm64", - "platform": "linux_arm64", - "node_version": "18.15.0" - } - }, - "nodejs": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs/private:nodejs_repo_host_os_alias.bzl", - "ruleClassName": "nodejs_repo_host_os_alias", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs", - "user_node_repository_name": "nodejs" - } - }, - "nodejs_darwin_arm64": { - "bzlFile": "@@rules_nodejs~6.0.3//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "name": "rules_nodejs~6.0.3~node~nodejs_darwin_arm64", - "platform": "darwin_arm64", - "node_version": "18.15.0" - } - } - } - } - }, - "@rules_python~0.31.0//python/extensions:pip.bzl%pip": { - "os:linux,arch:amd64": { - "bzlTransitiveDigest": "BMHDw6+hKI5WPzSCA1XT6c2B14DXaea1fE9lp2N5jIs=", - "accumulatedFileDigests": { - "@@//misc/codegen:requirements_lock.txt": "dc26eb4012e16e8623219eb63df85b86096f22550d755a29e6e45e09a3aaef75" - }, - "envVariables": {}, - "generatedRepoSpecs": { - "codegen_deps_311_pytest": { - "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", - "ruleClassName": "whl_library", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps_311_pytest", - "requirement": "pytest==8.0.0", - "repo": "codegen_deps_311", - "repo_prefix": "codegen_deps_311_", - "whl_patches": {}, - "experimental_target_platforms": [], - "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", - "quiet": true, - "timeout": 600, - "isolated": true, - "extra_pip_args": [], - "download_only": false, - "pip_data_exclude": [], - "enable_implicit_namespace_pkgs": false, - "environment": {}, - "envsubst": [], - "group_name": "", - "group_deps": [] - } - }, - "codegen_deps_311_iniconfig": { - "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", - "ruleClassName": "whl_library", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps_311_iniconfig", - "requirement": "iniconfig==2.0.0", - "repo": "codegen_deps_311", - "repo_prefix": "codegen_deps_311_", - "whl_patches": {}, - "experimental_target_platforms": [], - "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", - "quiet": true, - "timeout": 600, - "isolated": true, - "extra_pip_args": [], - "download_only": false, - "pip_data_exclude": [], - "enable_implicit_namespace_pkgs": false, - "environment": {}, - "envsubst": [], - "group_name": "", - "group_deps": [] - } - }, - "codegen_deps_311_pluggy": { - "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", - "ruleClassName": "whl_library", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps_311_pluggy", - "requirement": "pluggy==1.4.0", - "repo": "codegen_deps_311", - "repo_prefix": "codegen_deps_311_", - "whl_patches": {}, - "experimental_target_platforms": [], - "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", - "quiet": true, - "timeout": 600, - "isolated": true, - "extra_pip_args": [], - "download_only": false, - "pip_data_exclude": [], - "enable_implicit_namespace_pkgs": false, - "environment": {}, - "envsubst": [], - "group_name": "", - "group_deps": [] - } - }, - "codegen_deps_311_pystache": { - "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", - "ruleClassName": "whl_library", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps_311_pystache", - "requirement": "pystache==0.6.5", - "repo": "codegen_deps_311", - "repo_prefix": "codegen_deps_311_", - "whl_patches": {}, - "experimental_target_platforms": [], - "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", - "quiet": true, - "timeout": 600, - "isolated": true, - "extra_pip_args": [], - "download_only": false, - "pip_data_exclude": [], - "enable_implicit_namespace_pkgs": false, - "environment": {}, - "envsubst": [], - "group_name": "", - "group_deps": [] - } - }, - "codegen_deps_311__groups": { - "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", - "ruleClassName": "group_library", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps_311__groups", - "repo_prefix": "codegen_deps_311_", - "groups": {} - } - }, - "codegen_deps_311_packaging": { - "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", - "ruleClassName": "whl_library", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps_311_packaging", - "requirement": "packaging==23.2", - "repo": "codegen_deps_311", - "repo_prefix": "codegen_deps_311_", - "whl_patches": {}, - "experimental_target_platforms": [], - "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", - "quiet": true, - "timeout": 600, - "isolated": true, - "extra_pip_args": [], - "download_only": false, - "pip_data_exclude": [], - "enable_implicit_namespace_pkgs": false, - "environment": {}, - "envsubst": [], - "group_name": "", - "group_deps": [] - } - }, - "codegen_deps": { - "bzlFile": "@@rules_python~0.31.0//python/private/bzlmod:pip_repository.bzl", - "ruleClassName": "pip_repository", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps", - "repo_name": "codegen_deps", - "whl_map": { - "inflection": [ - "3.11" - ], - "iniconfig": [ - "3.11" - ], - "packaging": [ - "3.11" - ], - "pluggy": [ - "3.11" - ], - "pystache": [ - "3.11" - ], - "pytest": [ - "3.11" - ], - "pyyaml": [ - "3.11" - ], - "toposort": [ - "3.11" - ] - }, - "default_version": "3.11" - } - }, - "codegen_deps_311_pyyaml": { - "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", - "ruleClassName": "whl_library", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps_311_pyyaml", - "requirement": "pyyaml==6.0.1", - "repo": "codegen_deps_311", - "repo_prefix": "codegen_deps_311_", - "whl_patches": {}, - "experimental_target_platforms": [], - "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", - "quiet": true, - "timeout": 600, - "isolated": true, - "extra_pip_args": [], - "download_only": false, - "pip_data_exclude": [], - "enable_implicit_namespace_pkgs": false, - "environment": {}, - "envsubst": [], - "group_name": "", - "group_deps": [] - } - }, - "codegen_deps_311_inflection": { - "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", - "ruleClassName": "whl_library", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps_311_inflection", - "requirement": "inflection==0.5.1", - "repo": "codegen_deps_311", - "repo_prefix": "codegen_deps_311_", - "whl_patches": {}, - "experimental_target_platforms": [], - "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", - "quiet": true, - "timeout": 600, - "isolated": true, - "extra_pip_args": [], - "download_only": false, - "pip_data_exclude": [], - "enable_implicit_namespace_pkgs": false, - "environment": {}, - "envsubst": [], - "group_name": "", - "group_deps": [] - } - }, - "codegen_deps_311_toposort": { - "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", - "ruleClassName": "whl_library", - "attributes": { - "name": "rules_python~0.31.0~pip~codegen_deps_311_toposort", - "requirement": "toposort==1.10", - "repo": "codegen_deps_311", - "repo_prefix": "codegen_deps_311_", - "whl_patches": {}, - "experimental_target_platforms": [], - "python_interpreter": "", - "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_11_host//:python", - "quiet": true, - "timeout": 600, - "isolated": true, - "extra_pip_args": [], - "download_only": false, - "pip_data_exclude": [], - "enable_implicit_namespace_pkgs": false, - "environment": {}, - "envsubst": [], - "group_name": "", - "group_deps": [] - } - } - } - } - }, - "@rules_python~0.31.0//python/extensions:python.bzl%python": { - "general": { - "bzlTransitiveDigest": "fmPfINnuiui2NGkExyTcMNIIdY9/an1Huy1glhwxx6I=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "python_3_11_s390x-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.31.0~python~python_3_11_s390x-unknown-linux-gnu", - "sha256": "49520e3ff494708020f306e30b0964f079170be83e956be4504f850557378a22", - "patches": [], - "platform": "s390x-unknown-linux-gnu", - "python_version": "3.11.7", - "release_filename": "20240107/cpython-3.11.7+20240107-s390x-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-s390x-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_11_host": { - "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", - "ruleClassName": "host_toolchain", - "attributes": { - "name": "rules_python~0.31.0~python~python_3_11_host", - "python_version": "3.11.7", - "user_repository_name": "python_3_11", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_11": { - "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", - "ruleClassName": "toolchain_aliases", - "attributes": { - "name": "rules_python~0.31.0~python~python_3_11", - "python_version": "3.11.7", - "user_repository_name": "python_3_11", - "platforms": [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "ppc64le-unknown-linux-gnu", - "s390x-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" - ] - } - }, - "python_3_11_aarch64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.31.0~python~python_3_11_aarch64-unknown-linux-gnu", - "sha256": "b102eaf865eb715aa98a8a2ef19037b6cc3ae7dfd4a632802650f29de635aa13", - "patches": [], - "platform": "aarch64-unknown-linux-gnu", - "python_version": "3.11.7", - "release_filename": "20240107/cpython-3.11.7+20240107-aarch64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-aarch64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_11_aarch64-apple-darwin": { - "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.31.0~python~python_3_11_aarch64-apple-darwin", - "sha256": "b042c966920cf8465385ca3522986b12d745151a72c060991088977ca36d3883", - "patches": [], - "platform": "aarch64-apple-darwin", - "python_version": "3.11.7", - "release_filename": "20240107/cpython-3.11.7+20240107-aarch64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-aarch64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_11_ppc64le-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.31.0~python~python_3_11_ppc64le-unknown-linux-gnu", - "sha256": "b44e1b74afe75c7b19143413632c4386708ae229117f8f950c2094e9681d34c7", - "patches": [], - "platform": "ppc64le-unknown-linux-gnu", - "python_version": "3.11.7", - "release_filename": "20240107/cpython-3.11.7+20240107-ppc64le-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-ppc64le-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_11_x86_64-apple-darwin": { - "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.31.0~python~python_3_11_x86_64-apple-darwin", - "sha256": "a0e615eef1fafdc742da0008425a9030b7ea68a4ae4e73ac557ef27b112836d4", - "patches": [], - "platform": "x86_64-apple-darwin", - "python_version": "3.11.7", - "release_filename": "20240107/cpython-3.11.7+20240107-x86_64-apple-darwin-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-x86_64-apple-darwin-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "pythons_hub": { - "bzlFile": "@@rules_python~0.31.0//python/private/bzlmod:pythons_hub.bzl", - "ruleClassName": "hub_repo", - "attributes": { - "name": "rules_python~0.31.0~python~pythons_hub", - "default_python_version": "3.11", - "toolchain_prefixes": [ - "_0000_python_3_11_" - ], - "toolchain_python_versions": [ - "3.11" - ], - "toolchain_set_python_version_constraints": [ - "False" - ], - "toolchain_user_repository_names": [ - "python_3_11" - ] - } - }, - "python_versions": { - "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", - "ruleClassName": "multi_toolchain_aliases", - "attributes": { - "name": "rules_python~0.31.0~python~python_versions", - "python_versions": { - "3.11": "python_3_11" - } - } - }, - "python_3_11_x86_64-pc-windows-msvc": { - "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.31.0~python~python_3_11_x86_64-pc-windows-msvc", - "sha256": "67077e6fa918e4f4fd60ba169820b00be7c390c497bf9bc9cab2c255ea8e6f3e", - "patches": [], - "platform": "x86_64-pc-windows-msvc", - "python_version": "3.11.7", - "release_filename": "20240107/cpython-3.11.7+20240107-x86_64-pc-windows-msvc-shared-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-x86_64-pc-windows-msvc-shared-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - }, - "python_3_11_x86_64-unknown-linux-gnu": { - "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", - "ruleClassName": "python_repository", - "attributes": { - "name": "rules_python~0.31.0~python~python_3_11_x86_64-unknown-linux-gnu", - "sha256": "4a51ce60007a6facf64e5495f4cf322e311ba9f39a8cd3f3e4c026eae488e140", - "patches": [], - "platform": "x86_64-unknown-linux-gnu", - "python_version": "3.11.7", - "release_filename": "20240107/cpython-3.11.7+20240107-x86_64-unknown-linux-gnu-install_only.tar.gz", - "urls": [ - "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-x86_64-unknown-linux-gnu-install_only.tar.gz" - ], - "distutils_content": "", - "strip_prefix": "python", - "coverage_tool": "", - "ignore_root_user_error": false - } - } - } - } - }, - "@rules_python~0.31.0//python/private/bzlmod:internal_deps.bzl%internal_deps": { - "general": { - "bzlTransitiveDigest": "+abBEhSfywKoYxs9So+PhsVWm5O5NC9mF9rSy2kvdv8=", - "accumulatedFileDigests": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "pypi__wheel": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__wheel", - "url": "https://files.pythonhosted.org/packages/b8/8b/31273bf66016be6ad22bb7345c37ff350276cfd46e389a0c2ac5da9d9073/wheel-0.41.2-py3-none-any.whl", - "sha256": "75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__click": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__click", - "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", - "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__importlib_metadata": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__importlib_metadata", - "url": "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl", - "sha256": "3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__pyproject_hooks": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__pyproject_hooks", - "url": "https://files.pythonhosted.org/packages/d5/ea/9ae603de7fbb3df820b23a70f6aff92bf8c7770043254ad8d2dc9d6bcba4/pyproject_hooks-1.0.0-py3-none-any.whl", - "sha256": "283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__pep517": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__pep517", - "url": "https://files.pythonhosted.org/packages/ee/2f/ef63e64e9429111e73d3d6cbee80591672d16f2725e648ebc52096f3d323/pep517-0.13.0-py3-none-any.whl", - "sha256": "4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__packaging": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__packaging", - "url": "https://files.pythonhosted.org/packages/ab/c3/57f0601a2d4fe15de7a553c00adbc901425661bf048f2a22dfc500caf121/packaging-23.1-py3-none-any.whl", - "sha256": "994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__pip_tools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__pip_tools", - "url": "https://files.pythonhosted.org/packages/e8/df/47e6267c6b5cdae867adbdd84b437393e6202ce4322de0a5e0b92960e1d6/pip_tools-7.3.0-py3-none-any.whl", - "sha256": "8717693288720a8c6ebd07149c93ab0be1fced0b5191df9e9decd3263e20d85e", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__setuptools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__setuptools", - "url": "https://files.pythonhosted.org/packages/4f/ab/0bcfebdfc3bfa8554b2b2c97a555569c4c1ebc74ea288741ea8326c51906/setuptools-68.1.2-py3-none-any.whl", - "sha256": "3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__zipp": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__zipp", - "url": "https://files.pythonhosted.org/packages/8c/08/d3006317aefe25ea79d3b76c9650afabaf6d63d1c8443b236e7405447503/zipp-3.16.2-py3-none-any.whl", - "sha256": "679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__colorama": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__colorama", - "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", - "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__build": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__build", - "url": "https://files.pythonhosted.org/packages/58/91/17b00d5fac63d3dca605f1b8269ba3c65e98059e1fd99d00283e42a454f0/build-0.10.0-py3-none-any.whl", - "sha256": "af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "rules_python_internal": { - "bzlFile": "@@rules_python~0.31.0//python/private:internal_config_repo.bzl", - "ruleClassName": "internal_config_repo", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~rules_python_internal" - } - }, - "pypi__pip": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__pip", - "url": "https://files.pythonhosted.org/packages/50/c2/e06851e8cc28dcad7c155f4753da8833ac06a5c704c109313b8d5a62968a/pip-23.2.1-py3-none-any.whl", - "sha256": "7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__installer": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__installer", - "url": "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", - "sha256": "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__more_itertools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__more_itertools", - "url": "https://files.pythonhosted.org/packages/5a/cb/6dce742ea14e47d6f565589e859ad225f2a5de576d7696e0623b784e226b/more_itertools-10.1.0-py3-none-any.whl", - "sha256": "64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - }, - "pypi__tomli": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.31.0~internal_deps~pypi__tomli", - "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", - "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "type": "zip", - "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" - } - } - } - } - } - } -} From 3bea642d5c8f818e01f32bcdb27029dd008eec2f Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 22 Feb 2024 11:58:02 +0100 Subject: [PATCH 101/207] Bazel: fix typo --- WORKSPACE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index e6af3594b05..3f7ecf16770 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -1,2 +1,2 @@ -# plase use MODULE.bazel to add dependencies +# please use MODULE.bazel to add dependencies # this empty file is required by internal repositories, don't remove it From 976c627d52d197446925a8d585e7dec3881fc0d7 Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Thu, 22 Feb 2024 12:07:15 +0100 Subject: [PATCH 102/207] C#: Download latest dotnet SDK when missing --- .../CSharpAutobuilder.cs | 4 +- .../Semmle.Autobuild.CSharp/DotNetRule.cs | 47 ++++++++++++++++--- .../StandaloneBuildRule.cs | 46 +++++++----------- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs index 3a6c1bda85c..6f6faac802b 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs @@ -50,10 +50,10 @@ namespace Semmle.Autobuild.CSharp attempt = new BuildCommandRule(DotNetRule.WithDotNet).Analyse(this, false) & CheckExtractorRun(true); break; case CSharpBuildStrategy.Buildless: - attempt = DotNetRule.WithDotNet(this, (dotNetPath, env) => + attempt = DotNetRule.WithDotNet(this, ensureDotNetAvailable: true, (dotNetPath, env) => { // No need to check that the extractor has been executed in buildless mode - return new StandaloneBuildRule(dotNetPath).Analyse(this, false); + return new StandaloneBuildRule(dotNetPath, env).Analyse(this, false); }); break; case CSharpBuildStrategy.MSBuild: diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs index b85e6cc7732..2ea4ae29b3a 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs @@ -46,7 +46,7 @@ namespace Semmle.Autobuild.CSharp builder.Log(Severity.Info, "Attempting to build using .NET Core"); } - return WithDotNet(builder, (dotNetPath, environment) => + return WithDotNet(builder, ensureDotNetAvailable: false, (dotNetPath, environment) => { var ret = GetInfoCommand(builder.Actions, dotNetPath, environment); foreach (var projectOrSolution in builder.ProjectsOrSolutionsToBuild) @@ -79,10 +79,10 @@ namespace Semmle.Autobuild.CSharp /// variables needed by the installed .NET Core (null when no variables /// are needed). /// - public static BuildScript WithDotNet(IAutobuilder builder, Func?, BuildScript> f) + public static BuildScript WithDotNet(IAutobuilder builder, bool ensureDotNetAvailable, Func?, BuildScript> f) { var installDir = builder.Actions.PathCombine(FileUtils.GetTemporaryWorkingDirectory(builder.Actions.GetEnvironmentVariable, builder.Options.Language.UpperCaseName, out var _), ".dotnet"); - var installScript = DownloadDotNet(builder, installDir); + var installScript = DownloadDotNet(builder, installDir, ensureDotNetAvailable); return BuildScript.Bind(installScript, installed => { Dictionary? env; @@ -100,8 +100,12 @@ namespace Semmle.Autobuild.CSharp } else { + // The .NET SDK was not installed, either because the installation failed or because it was already installed. installDir = null; - env = null; + env = new Dictionary { + { "DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true" }, + { "MSBUILDDISABLENODEREUSE", "1" } + }; } return f(installDir, env); @@ -117,14 +121,14 @@ namespace Semmle.Autobuild.CSharp /// are needed). /// public static BuildScript WithDotNet(IAutobuilder builder, Func?, BuildScript> f) - => WithDotNet(builder, (_1, env) => f(env)); + => WithDotNet(builder, ensureDotNetAvailable: false, (_, env) => f(env)); /// /// Returns a script for downloading relevant versions of the /// .NET Core SDK. The SDK(s) will be installed at installDir /// (provided that the script succeeds). /// - private static BuildScript DownloadDotNet(IAutobuilder builder, string installDir) + private static BuildScript DownloadDotNet(IAutobuilder builder, string installDir, bool ensureDotNetAvailable) { if (!string.IsNullOrEmpty(builder.Options.DotNetVersion)) // Specific version supplied in configuration: always use that @@ -152,7 +156,28 @@ namespace Semmle.Autobuild.CSharp validGlobalJson = true; } - return validGlobalJson ? installScript : BuildScript.Failure; + if (validGlobalJson) + { + return installScript; + } + + if (ensureDotNetAvailable) + { + return BuildScript.Bind(GetInfoScript(builder.Actions), (infoLines, infoRet) => + { + if (infoRet == 0) + { + return BuildScript.Failure; + } + + const string latestDotNetSdkVersion = "8.0.101"; + builder.Log(Severity.Info, $"No .NET Core SDK found. Attempting to install version {latestDotNetSdkVersion}."); + return DownloadDotNetVersion(builder, installDir, latestDotNetSdkVersion); + }); + + } + + return BuildScript.Failure; } /// @@ -238,6 +263,14 @@ namespace Semmle.Autobuild.CSharp return listSdks.Script; } + private static BuildScript GetInfoScript(IBuildActions actions) + { + var info = new CommandBuilder(actions, silent: true). + RunCommand("dotnet"). + Argument("--info"); + return info.Script; + } + private static string DotNetCommand(IBuildActions actions, string? dotNetPath) => dotNetPath is not null ? actions.PathCombine(dotNetPath, "dotnet") : "dotnet"; diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs index c0444292020..02c98c4b3c5 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Collections.Generic; using Semmle.Autobuild.Shared; namespace Semmle.Autobuild.CSharp @@ -9,44 +9,34 @@ namespace Semmle.Autobuild.CSharp internal class StandaloneBuildRule : IBuildRule { private readonly string? dotNetPath; + private readonly IDictionary? env; - internal StandaloneBuildRule(string? dotNetPath) + internal StandaloneBuildRule(string? dotNetPath, IDictionary? env) { this.dotNetPath = dotNetPath; + this.env = env; } public BuildScript Analyse(IAutobuilder builder, bool auto) { - BuildScript GetCommand() - { - string standalone; - if (builder.CodeQLExtractorLangRoot is not null && builder.CodeQlPlatform is not null) - { - standalone = builder.Actions.PathCombine(builder.CodeQLExtractorLangRoot, "tools", builder.CodeQlPlatform, "Semmle.Extraction.CSharp.Standalone"); - } - else - { - return BuildScript.Failure; - } - - var cmd = new CommandBuilder(builder.Actions); - cmd.RunCommand(standalone); - - if (!string.IsNullOrEmpty(this.dotNetPath)) - { - cmd.Argument("--dotnet"); - cmd.QuoteArgument(this.dotNetPath); - } - - return cmd.Script; - } - - if (!builder.Options.Buildless) + if (!builder.Options.Buildless + || builder.CodeQLExtractorLangRoot is null + || builder.CodeQlPlatform is null) { return BuildScript.Failure; } - return GetCommand(); + var standalone = builder.Actions.PathCombine(builder.CodeQLExtractorLangRoot, "tools", builder.CodeQlPlatform, "Semmle.Extraction.CSharp.Standalone"); + var cmd = new CommandBuilder(builder.Actions, environment: this.env); + cmd.RunCommand(standalone); + + if (!string.IsNullOrEmpty(this.dotNetPath)) + { + cmd.Argument("--dotnet"); + cmd.QuoteArgument(this.dotNetPath); + } + + return cmd.Script; } } } From e74e5b3613e719de19f2ad48080e68cfc6539c61 Mon Sep 17 00:00:00 2001 From: erik-krogh Date: Thu, 22 Feb 2024 13:15:17 +0100 Subject: [PATCH 103/207] try to restrict the edges we follow (related to upper/lower-case) when contructing possible attack-strings for polynomial-redos --- .../regex/codeql/regex/nfa/SuperlinearBackTracking.qll | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/shared/regex/codeql/regex/nfa/SuperlinearBackTracking.qll b/shared/regex/codeql/regex/nfa/SuperlinearBackTracking.qll index b3c6e64837b..6eb18aeeebc 100644 --- a/shared/regex/codeql/regex/nfa/SuperlinearBackTracking.qll +++ b/shared/regex/codeql/regex/nfa/SuperlinearBackTracking.qll @@ -365,11 +365,19 @@ module Make { ) } - string getChar(CharNode t) { + private string getCharInternal(CharNode t) { exists(InputSymbol s1, InputSymbol s2, InputSymbol s3 | t = Step(s1, s2, s3, _) | result = getAThreewayIntersect(s1, s2, s3) ) } + + string getChar(CharNode t) { + result = getCharInternal(t) and + not ( + // skip the upper-case char if we have the lower-case version. + result.toLowerCase() != result and result.toLowerCase() = getCharInternal(t) + ) + } } /** From bf22f4a8705958397581e5f5fde231fdf5d34867 Mon Sep 17 00:00:00 2001 From: erik-krogh Date: Thu, 22 Feb 2024 13:21:11 +0100 Subject: [PATCH 104/207] update expected output --- .../CWE-400/ReDoS/PolynomialBackTracking.expected | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialBackTracking.expected b/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialBackTracking.expected index f5d780e3190..9a03bdcd34e 100644 --- a/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialBackTracking.expected +++ b/javascript/ql/test/query-tests/Security/CWE-400/ReDoS/PolynomialBackTracking.expected @@ -10,7 +10,7 @@ | highlight.js:19:56:19:61 | [^\\]]+ | Strings starting with '[' and with many repetitions of '.[' can start matching anywhere after the start of the preceeding (\\.\|\\.\\/\|\\/)?(""\|"[^"]+"\|''\|'[^']+'\|\\[\\]\|\\[[^\\]]+\\]\|[^\\s!"#%&'()*+,.\\/;<=>@\\[\\\\\\]^`{\|}~]+)((\\.\|\\/)(""\|"[^"]+"\|''\|'[^']+'\|\\[\\]\|\\[[^\\]]+\\]\|[^\\s!"#%&'()*+,.\\/;<=>@\\[\\\\\\]^`{\|}~]+))* | | highlight.js:22:12:22:82 | ((decltype\\(auto\\)\|(?:[a-zA-Z_]\\w*::)?[a-zA-Z_]\\w*(?:<.*?>)?)[\\*&\\s]+)+ | Strings with many repetitions of 'A\\t' can start matching anywhere after the start of the preceeding .*? | | highlight.js:22:43:22:45 | \\w* | Strings starting with 'A' and with many repetitions of 'A' can start matching anywhere after the start of the preceeding .*? | -| highlight.js:22:66:22:68 | .*? | Strings starting with 'A<' and with many repetitions of 'A<' can start matching anywhere after the start of the preceeding \\w* | +| highlight.js:22:66:22:68 | .*? | Strings starting with 'A<' and with many repetitions of 'a<' can start matching anywhere after the start of the preceeding \\w* | | highlight.js:22:73:22:80 | [\\*&\\s]+ | Strings starting with 'A' and with many repetitions of '\\tA\\t' can start matching anywhere after the start of the preceeding .*? | | highlight.js:23:13:23:82 | ((decltype\\(auto\\)\|([a-zA-Z_]\\w*::)?[a-zA-Z_]\\w*(<[^<>]+>)?)[\\*&\\s]+)+ | Strings with many repetitions of 'A\\t' can start matching anywhere after the start of the preceeding ((decltype\\(auto\\)\|([a-zA-Z_]\\w*::)?[a-zA-Z_]\\w*(<[^<>]+>)?)[\\*&\\s]+)+([a-zA-Z_]\\w*::)?[a-zA-Z]\\w*\\s*\\( | | highlight.js:23:42:23:44 | \\w* | Strings starting with 'A' and with many repetitions of 'A' can start matching anywhere after the start of the preceeding ((decltype\\(auto\\)\|([a-zA-Z_]\\w*::)?[a-zA-Z_]\\w*(<[^<>]+>)?)[\\*&\\s]+)+([a-zA-Z_]\\w*::)?[a-zA-Z]\\w*\\s*\\( | @@ -279,7 +279,7 @@ | regexplib/misc.js:117:25:117:26 | .+ | Strings starting with '(a}' and with many repetitions of 'a)' can start matching anywhere after the start of the preceeding .+ | | regexplib/misc.js:119:20:119:22 | \\w+ | Strings with many repetitions of '0' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/misc.js:119:52:119:57 | [^\\)]* | Strings starting with '0=(' and with many repetitions of '0<((' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | -| regexplib/misc.js:123:36:123:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[Aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | +| regexplib/misc.js:123:36:123:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | | regexplib/misc.js:126:15:126:20 | [a-z]+ | Strings starting with 'a' and with many repetitions of 'aa' can start matching anywhere after the start of the preceeding [a-z]+ | | regexplib/misc.js:141:15:141:19 | [^;]+ | Strings starting with '{\\\\f\\\\' and with many repetitions of '{\\\\f\\\\:' can start matching anywhere after the start of the preceeding (\\{\\\\f\\d*)\\\\([^;]+;) | | regexplib/misc.js:144:52:144:70 | [a-z0-9\\/\\.\\?\\=\\&]* | Strings starting with '".htm' and with many repetitions of '.asp' can start matching anywhere after the start of the preceeding [a-z0-9\\/\\.\\?\\=\\&]* | @@ -334,7 +334,7 @@ | regexplib/strings.js:54:20:54:22 | \\w+ | Strings with many repetitions of '0' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/strings.js:54:52:54:57 | [^\\)]* | Strings starting with '0=(' and with many repetitions of '0<((' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/strings.js:56:52:56:53 | .+ | Strings starting with 'AUX.' and with many repetitions of '.' can start matching anywhere after the start of the preceeding .* | -| regexplib/strings.js:57:36:57:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[Aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | +| regexplib/strings.js:57:36:57:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | | regexplib/strings.js:64:3:64:5 | \\w+ | Strings with many repetitions of '0' can start matching anywhere after the start of the preceeding (\\w+)\\s+\\1 | | regexplib/strings.js:70:6:70:17 | [a-zA-Z,\\s]+ | Strings with many repetitions of '\\t' can start matching anywhere after the start of the preceeding \\s* | | regexplib/strings.js:70:18:70:20 | \\s* | Strings starting with '\\t' and with many repetitions of '\\t' can start matching anywhere after the start of the preceeding \\s* | @@ -345,7 +345,7 @@ | regexplib/strings.js:74:2:74:3 | .* | Strings with many repetitions of 'a' can start matching anywhere after the start of the preceeding .*[Pp]re[Ss\\$]cr[iI1]pt.* | | regexplib/strings.js:75:2:75:3 | .* | Strings with many repetitions of 'a' can start matching anywhere after the start of the preceeding .*[Vv][Ii1]agr.* | | regexplib/strings.js:76:2:76:3 | .* | Strings with many repetitions of 'a' can start matching anywhere after the start of the preceeding .*[Oo0][Ee][Mm].* | -| regexplib/strings.js:81:36:81:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[Aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | +| regexplib/strings.js:81:36:81:38 | .*? | Strings starting with '?se[A' and with many repetitions of '?se[aa' can start matching anywhere after the start of the preceeding (?s)(?:\\e\\[(?:(\\d+);?)*([A-Za-z])(.*?))(?=\\e\\[\|\\z) | | regexplib/strings.js:82:20:82:22 | \\w+ | Strings with many repetitions of '0' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/strings.js:82:52:82:57 | [^\\)]* | Strings starting with '0=(' and with many repetitions of '0<((' can start matching anywhere after the start of the preceeding (NOT)?(\\s*\\(*)\\s*(\\w+)\\s*(=\|<>\|<\|>\|LIKE\|IN)\\s*(\\(([^\\)]*)\\)\|'([^']*)'\|(-?\\d*\\.?\\d+))(\\s*\\)*\\s*)(AND\|OR)? | | regexplib/strings.js:88:3:88:12 | [^\\.\\?\\!]* | Strings with many repetitions of ' ' can start matching anywhere after the start of the preceeding ([^\\.\\?\\!]*)[\\.\\?\\!] | From 245ce2208e85e64651878e303fc86ab69257eae3 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Thu, 22 Feb 2024 10:55:47 +0000 Subject: [PATCH 105/207] Kotlin: Update to 2.0.0-Beta4 --- java/kotlin-extractor/kotlin_plugin_versions.py | 2 +- .../{v_2_0_0-Beta3 => v_2_0_0-Beta4}/IrSymbolInternals.kt | 0 .../{v_2_0_0-Beta3 => v_2_0_0-Beta4}/JavaBinarySourceElement.kt | 0 .../JvmDefaultModeEnabled.kt | 0 .../versions/{v_2_0_255-SNAPSHOT => v_2_0_0-Beta4}/Psi2Ir.kt | 0 .../utils/versions/{v_2_0_0-Beta3 => v_2_0_0-Beta4}/parents.kt | 0 6 files changed, 1 insertion(+), 1 deletion(-) rename java/kotlin-extractor/src/main/kotlin/utils/versions/{v_2_0_0-Beta3 => v_2_0_0-Beta4}/IrSymbolInternals.kt (100%) rename java/kotlin-extractor/src/main/kotlin/utils/versions/{v_2_0_0-Beta3 => v_2_0_0-Beta4}/JavaBinarySourceElement.kt (100%) rename java/kotlin-extractor/src/main/kotlin/utils/versions/{v_2_0_255-SNAPSHOT => v_2_0_0-Beta4}/JvmDefaultModeEnabled.kt (100%) rename java/kotlin-extractor/src/main/kotlin/utils/versions/{v_2_0_255-SNAPSHOT => v_2_0_0-Beta4}/Psi2Ir.kt (100%) rename java/kotlin-extractor/src/main/kotlin/utils/versions/{v_2_0_0-Beta3 => v_2_0_0-Beta4}/parents.kt (100%) diff --git a/java/kotlin-extractor/kotlin_plugin_versions.py b/java/kotlin-extractor/kotlin_plugin_versions.py index 72085cba9d8..d385eb9e613 100755 --- a/java/kotlin-extractor/kotlin_plugin_versions.py +++ b/java/kotlin-extractor/kotlin_plugin_versions.py @@ -46,7 +46,7 @@ def version_string_to_version(version): # Version number used by CI. ci_version = '1.9.0' -many_versions = [ '1.5.0', '1.5.10', '1.5.20', '1.5.30', '1.6.0', '1.6.20', '1.7.0', '1.7.20', '1.8.0', '1.9.0-Beta', '1.9.20-Beta', '2.0.0-Beta3', '2.0.255-SNAPSHOT' ] +many_versions = [ '1.5.0', '1.5.10', '1.5.20', '1.5.30', '1.6.0', '1.6.20', '1.7.0', '1.7.20', '1.8.0', '1.9.0-Beta', '1.9.20-Beta', '2.0.0-Beta4', '2.0.255-SNAPSHOT' ] many_versions_versions = [version_string_to_version(v) for v in many_versions] many_versions_versions_asc = sorted(many_versions_versions, key = lambda v: v.toTupleWithTag()) diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/IrSymbolInternals.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/IrSymbolInternals.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/IrSymbolInternals.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/IrSymbolInternals.kt diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/JavaBinarySourceElement.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/JavaBinarySourceElement.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/JavaBinarySourceElement.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/JavaBinarySourceElement.kt diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_255-SNAPSHOT/JvmDefaultModeEnabled.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/JvmDefaultModeEnabled.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_255-SNAPSHOT/JvmDefaultModeEnabled.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/JvmDefaultModeEnabled.kt diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_255-SNAPSHOT/Psi2Ir.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/Psi2Ir.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_255-SNAPSHOT/Psi2Ir.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/Psi2Ir.kt diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/parents.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/parents.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta3/parents.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_0_0-Beta4/parents.kt From 14de39a854c43f8848d6ff2affb08962e4095913 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 20 Feb 2024 15:49:06 +0100 Subject: [PATCH 106/207] C#: Also add synthetic bodies and inititializers for default constructors. --- .../Entities/Constructor.cs | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs index b9682e7a183..74c4c09c0f9 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Constructor.cs @@ -32,9 +32,9 @@ namespace Semmle.Extraction.CSharp.Entities trapFile.constructors(this, Symbol.ContainingType.Name, ContainingType, (Constructor)OriginalDefinition); trapFile.constructor_location(this, Location); - if (IsPrimary) + if (MakeSynthetic) { - // Create a synthetic empty body for primary constructors. + // Create a synthetic empty body for primary and default constructors. Statements.SyntheticEmptyBlock.Create(Context, this, 0, Location); } @@ -49,9 +49,9 @@ namespace Semmle.Extraction.CSharp.Entities protected override void ExtractInitializers(TextWriter trapFile) { // Do not extract initializers for constructed types. - // Only extract initializers for constructors with a body and primary constructors. - if (Block is null && ExpressionBody is null && !IsPrimary || - !IsSourceDeclaration) + // Extract initializers for constructors with a body, primary constructors + // and default constructors for classes and structs declared in source code. + if (Block is null && ExpressionBody is null && !MakeSynthetic) { return; } @@ -161,6 +161,16 @@ namespace Semmle.Extraction.CSharp.Entities private bool IsPrimary => PrimaryConstructorSyntax is not null; + // This is a default constructor in a class or struct declared in source. + private bool IsDefault => + Symbol.IsImplicitlyDeclared && + Symbol.ContainingType.FromSource() && + Symbol.ContainingType.TypeKind is TypeKind.Class or TypeKind.Struct && + Symbol.ContainingType.IsSourceDeclaration() && + !Symbol.ContainingType.IsAnonymousType; + + private bool MakeSynthetic => IsPrimary || IsDefault; + [return: NotNullIfNotNull(nameof(constructor))] public static new Constructor? Create(Context cx, IMethodSymbol? constructor) { From cf9c3d5dd1c61530e5acec0ac7d991b0c19d98fb Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 11:15:00 +0100 Subject: [PATCH 107/207] C#: Remove un-needed code as we extract synthetic default constructors. --- .../code/csharp/dataflow/internal/DataFlowDispatch.qll | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll index 414310f655e..d69327cdfb9 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll @@ -20,13 +20,7 @@ private import semmle.code.csharp.frameworks.system.collections.Generic */ DotNet::Callable getCallableForDataFlow(DotNet::Callable c) { exists(DotNet::Callable unboundDecl | unboundDecl = c.getUnboundDeclaration() | - ( - result.hasBody() - or - // take synthesized bodies into account, e.g. implicit constructors - // with field initializer assignments - result = any(ControlFlow::Nodes::ElementNode n).getEnclosingCallable() - ) and + result.hasBody() and if unboundDecl.getFile().fromSource() then // C# callable with C# implementation in the database From d19c83228eda09613582b6672058862b00332332 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 13:14:48 +0100 Subject: [PATCH 108/207] C#: Do not bind comments to compiler generated statements. --- .../Semmle.Extraction.CSharp/Entities/Statement`1.cs | 7 +++++-- .../Entities/Statements/SyntheticEmptyBlock.cs | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs index d9b285a2410..d58698ff2eb 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs @@ -10,12 +10,15 @@ namespace Semmle.Extraction.CSharp.Entities protected readonly TSyntax Stmt; private readonly Location location; - protected Statement(Context cx, TSyntax stmt, Kinds.StmtKind kind, IStatementParentEntity parent, int child, Location location) + protected Statement(Context cx, TSyntax stmt, Kinds.StmtKind kind, IStatementParentEntity parent, int child, Location location, bool isCompilerGenerated = false) : base(cx, kind, parent, child) { Stmt = stmt; this.location = location; - cx.BindComments(this, location.Symbol); + if (!isCompilerGenerated) + { + cx.BindComments(this, location.Symbol); + } } protected Statement(Context cx, TSyntax stmt, Kinds.StmtKind kind, IStatementParentEntity parent, int child) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statements/SyntheticEmptyBlock.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statements/SyntheticEmptyBlock.cs index 0b292d208ff..670d338d2b3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statements/SyntheticEmptyBlock.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statements/SyntheticEmptyBlock.cs @@ -9,7 +9,7 @@ namespace Semmle.Extraction.CSharp.Entities.Statements internal class SyntheticEmptyBlock : Statement { private SyntheticEmptyBlock(Context cx, BlockSyntax block, IStatementParentEntity parent, int child, Location location) - : base(cx, block, StmtKind.BLOCK, parent, child, location) { } + : base(cx, block, StmtKind.BLOCK, parent, child, location, isCompilerGenerated: true) { } public static SyntheticEmptyBlock Create(Context cx, IStatementParentEntity parent, int child, Location location) { From a4ab16353290f3bf2eefebdedf2bea7361f02847 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 21 Feb 2024 14:48:46 +0100 Subject: [PATCH 109/207] C#: Update test output for cfg tests. --- .../controlflow/graph/BasicBlock.expected | 61 +- .../controlflow/graph/Dominance.expected | 468 ++++++++++++++- .../graph/EnclosingCallable.expected | 271 +++++++++ .../controlflow/graph/EntryElement.expected | 71 +++ .../controlflow/graph/ExitElement.expected | 71 +++ .../controlflow/graph/NodeGraph.expected | 545 +++++++++++++++++- .../controlflow/graph/Nodes.expected | 43 +- 7 files changed, 1516 insertions(+), 14 deletions(-) diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index 7eaeb6e690e..b2d49beeee3 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -1,3 +1,4 @@ +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | 5 | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | exit get_Item | 4 | | AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | exit set_Item | 4 | | AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | exit add_Event | 4 | @@ -11,10 +12,12 @@ | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | exit M7 | 24 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | exit M8 | 30 | | AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | exit M9 | 58 | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | 5 | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | exit M1 | 5 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | exit M2 | 6 | | ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | exit M3 | 8 | | ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | exit M4 | 13 | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | exit AssertTests | 5 | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:9:20:9:20 | access to parameter b | 4 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | exit M1 | 1 | | Assert.cs:9:20:9:32 | ... ? ... : ... | Assert.cs:10:22:10:30 | ... != ... | 6 | @@ -188,9 +191,11 @@ | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | 2 | | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | 2 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:138:10:138:12 | exit M13 (normal) | 4 | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | exit Assignments | 5 | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | exit M | 34 | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | exit (...) => ... | 4 | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | exit + | 6 | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | exit BreakInTry | 5 | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:7:33:7:36 | access to parameter args | 5 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 | 2 | | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | 1 | @@ -227,11 +232,14 @@ | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | 6 | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:68:21:68:26 | [finally: return] break; | 1 | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | 1 | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | 5 | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | exit Default | 6 | | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | exit Sizeof | 6 | | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | exit Typeof | 6 | | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | exit Nameof | 6 | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | 5 | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | exit M | 15 | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | 5 | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | 2 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 | 2 | | ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:28:3:38 | call to method ToString | 1 | @@ -268,6 +276,7 @@ | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:32:10:32:11 | exit M8 | 2 | | ConditionalAccess.cs:35:14:35:24 | call to method Out | ConditionalAccess.cs:35:14:35:24 | call to method Out | 1 | | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:26:41:38 | exit CommaJoinWith | 8 | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | exit Conditions | 5 | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:5:13:5:15 | access to parameter inc | 4 | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr | 2 | | Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | Conditions.cs:7:14:7:16 | [inc (line 3): true] access to parameter inc | 5 | @@ -370,6 +379,7 @@ | Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | Conditions.cs:146:13:146:13 | [b (line 143): false] access to parameter b | 5 | | Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:13:147:48 | call to method WriteLine | 5 | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:13:149:48 | call to method WriteLine | 5 | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | exit ExitMethods | 5 | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | exit M1 | 8 | | ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:14:10:14:11 | exit M2 | 8 | | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:20:10:20:11 | exit M3 | 7 | @@ -422,6 +432,7 @@ | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | exit ToBool | 8 | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | exit CallToInt32 | 5 | | Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | exit Main | 20 | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | exit Finally | 5 | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:11:13:11:37 | call to method WriteLine | 7 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | exit M1 | 1 | | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:7:10:7:11 | exit M1 (abnormal) | 5 | @@ -559,6 +570,9 @@ | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | 5 | | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | 5 | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:167:17:167:37 | call to method WriteLine | 5 | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA | 5 | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | exit ExceptionB | 5 | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | exit ExceptionC | 5 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:17:180:18 | access to parameter b1 | 6 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | exit M9 | 1 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 (abnormal) | 1 | @@ -647,6 +661,7 @@ | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | 1 | | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:263:10:263:12 | exit M13 (abnormal) | 10 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | exit M13 (normal) | 10 | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | exit Foreach | 5 | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:8:29:8:32 | access to parameter args | 3 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 | 2 | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | 1 | @@ -674,15 +689,19 @@ | Foreach.cs:36:10:36:11 | exit M6 (normal) | Foreach.cs:36:10:36:11 | exit M6 | 2 | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | 1 | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:39:11:39:11 | ; | 4 | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | exit Initializers | 4 | | 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:16:18:16 | enter H | Initializers.cs:18:16:18:16 | exit H | 5 | -| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor | 9 | +| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor | 11 | | 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 | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | exit Sub | 14 | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | exit IndexInitializers | 5 | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | exit Compound | 5 | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | exit Test | 105 | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | 5 | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:9:13:9:28 | ... == ... | 7 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 | 2 | | LoopUnrolling.cs:10:13:10:19 | return ...; | LoopUnrolling.cs:10:13:10:19 | return ...; | 1 | @@ -728,6 +747,11 @@ | LoopUnrolling.cs:94:10:94:12 | enter M11 | LoopUnrolling.cs:97:9:100:9 | [unroll (line 97)] foreach (... ... in ...) ... | 9 | | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | exit M11 | 2 | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | 6 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | {...} | 2 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | 1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | 1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | 2 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 | 2 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | 1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | 1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | 1 | @@ -798,8 +822,18 @@ | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | 1 | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (normal) | 2 | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (normal) | 2 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | {...} | 2 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | 1 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | 1 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | 2 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 | 2 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | 5 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | 5 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | {...} | 2 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | 1 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | 1 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | 2 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 | 2 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | 1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | enter M1 | 1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | 1 | @@ -807,6 +841,11 @@ | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | 4 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationB.cs:32:9:32:10 | exit M1 (abnormal) | 4 | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | exit M2 | 6 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | {...} | 2 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | 1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | 1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | 2 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 | 2 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | 2 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | exit get_P1 (normal) | 2 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | 1 | @@ -877,14 +916,25 @@ | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | 1 | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | 3 | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (abnormal) | 3 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | {...} | 2 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | 1 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | 1 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | 2 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 | 2 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | 5 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | 5 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | {...} | 2 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | 1 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | 1 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | 2 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 | 2 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | 1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | enter M1 | 1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | 1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | exit M1 | 1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | 2 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | 2 | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | 5 | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | 2 | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:9:3:10 | exit M1 | 3 | | NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:28:3:28 | 0 | 1 | @@ -924,6 +974,7 @@ | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | exit M6 | 4 | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | exit Partial | 12 | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | exit Partial | 12 | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | exit Patterns | 5 | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:8:18:8:23 | Int32 i1 | 8 | | Patterns.cs:8:13:8:23 | [false] ... is ... | Patterns.cs:8:13:8:23 | [false] ... is ... | 1 | | Patterns.cs:8:13:8:23 | [true] ... is ... | Patterns.cs:8:13:8:23 | [true] ... is ... | 1 | @@ -1017,6 +1068,7 @@ | Patterns.cs:95:29:95:38 | [no-match] ... or ... | Patterns.cs:95:29:95:38 | [no-match] ... or ... | 1 | | Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:36:95:38 | access to constant B | 1 | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:97:13:97:38 | call to method WriteLine | 4 | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | exit PostDominance | 5 | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | exit M1 | 7 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:12:18:12:21 | null | 5 | | PostDominance.cs:10:10:10:11 | exit M2 (normal) | PostDominance.cs:10:10:10:11 | exit M2 | 2 | @@ -1030,9 +1082,11 @@ | PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:19:13:19:21 | [true] ... is ... | 1 | | PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:17:10:17:11 | exit M3 (abnormal) | 4 | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | exit M3 (normal) | 4 | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | exit Qualifiers | 5 | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | exit Method | 4 | | Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | exit StaticMethod | 4 | | Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | exit M | 58 | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | exit Switch | 5 | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | exit M1 | 6 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:14:18:14:20 | "a" | 6 | | Switch.cs:10:10:10:11 | exit M2 | Switch.cs:10:10:10:11 | exit M2 | 1 | @@ -1143,17 +1197,20 @@ | Switch.cs:156:50:156:52 | "b" | Switch.cs:156:41:156:52 | ... => ... | 2 | | Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:48 | call to method WriteLine | 5 | | Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:48 | call to method WriteLine | 5 | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | 5 | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:18:7:22 | Int32 j | 13 | | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | 1 | | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | 1 | | TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:7:25:7:25 | ; | 1 | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | exit M | 5 | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | exit VarDecls | 5 | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | exit M1 | 19 | | VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | exit M2 | 13 | | VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:25:20:25:20 | access to parameter b | 11 | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:19:7:19:8 | exit M3 | 4 | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | 1 | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | 1 | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | exit C | 5 | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | exit Dispose | 4 | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:11:13:11:17 | ... > ... | 15 | | cflow.cs:5:17:5:20 | exit Main (normal) | cflow.cs:5:17:5:20 | exit Main | 2 | @@ -1325,6 +1382,7 @@ | cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | exit ControlFlowSub | 5 | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | exit ControlFlowSub | 5 | | cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | exit ControlFlowSub | 7 | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | exit DelegateCall | 5 | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | exit M | 6 | | cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | exit NegationInConstructor | 5 | | cflow.cs:298:10:298:10 | enter M | cflow.cs:300:46:300:50 | ... > ... | 7 | @@ -1332,5 +1390,6 @@ | cflow.cs:300:44:300:51 | [true] !... | cflow.cs:300:44:300:51 | [true] !... | 1 | | cflow.cs:300:44:300:64 | ... && ... | cflow.cs:298:10:298:10 | exit M | 5 | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:56:300:64 | ... != ... | 3 | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | exit LambdaGetter | 5 | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | exit (...) => ... | 9 | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | exit get__getter | 4 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index 7246b3dc24f..694fe9700df 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -1,4 +1,8 @@ dominance +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | {...} | +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | call to constructor Object | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:23:5:25 | exit get_Item | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | @@ -300,6 +304,10 @@ dominance | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:80:73:80 | 1 | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:74:73:82 | (..., ...) | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:78:73:81 | dynamic access to element | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | {...} | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | call to constructor Object | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:11:3:12 | exit M1 | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | @@ -328,6 +336,10 @@ dominance | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:31:9:52 | { ..., ... } | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:48:9:48 | 3 | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:43:9:50 | { ..., ... } | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | {...} | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | call to constructor Object | +| Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | exit AssertTests | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | exit AssertTests (normal) | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:8:5:12:5 | {...} | | Assert.cs:8:5:12:5 | {...} | Assert.cs:9:9:9:33 | ... ...; | | Assert.cs:9:9:9:33 | ... ...; | Assert.cs:9:20:9:20 | access to parameter b | @@ -867,6 +879,10 @@ dominance | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion success] call to method AssertTrueFalse | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | exit M13 (normal) | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | {...} | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | call to constructor Object | +| Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | exit Assignments | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | exit Assignments (normal) | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:4:5:15:5 | {...} | | Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:3:10:3:10 | exit M | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:5:9:5:18 | ... ...; | @@ -908,6 +924,10 @@ dominance | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:19:16:19:16 | access to parameter x | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:17:40:17:40 | exit + (normal) | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:9:19:17 | return ...; | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | {...} | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | call to constructor Object | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | exit BreakInTry | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:4:5:18:5 | {...} | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:5:9:17:9 | try {...} ... | @@ -1014,6 +1034,10 @@ dominance | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:68:21:68:26 | [finally: return] break; | | BreakInTry.cs:67:28:67:31 | [finally: return] null | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:21:67:31 | ... == ... | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | {...} | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:6:5:8:5 | {...} | | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:5:9:5:15 | exit Default | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:7:16:7:27 | default(...) | @@ -1034,6 +1058,10 @@ dominance | CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:20:12:20:17 | exit Nameof (normal) | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:9:22:25 | return ...; | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | {...} | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:29:5:41:5 | {...} | | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | CompileTimeOperators.cs:28:10:28:10 | exit M | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | @@ -1048,6 +1076,10 @@ dominance | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:32:40:36 | "End" | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | {...} | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | @@ -1123,6 +1155,10 @@ dominance | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:26:41:38 | exit CommaJoinWith (normal) | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:70:41:78 | ... + ... | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:70:41:83 | ... + ... | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | {...} | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | call to constructor Object | +| Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | exit Conditions | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | exit Conditions (normal) | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:4:5:9:5 | {...} | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:5:9:6:16 | if (...) ... | @@ -1496,6 +1532,10 @@ dominance | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:13:149:48 | call to method WriteLine | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:45:149:45 | access to local variable s | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:38:149:47 | $"..." | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | {...} | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | call to constructor Object | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | exit ExitMethods | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:9:5:12:5 | {...} | | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:8:10:8:11 | exit M1 | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:10:9:10:25 | ...; | @@ -1691,6 +1731,10 @@ dominance | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:25:9:25:14 | "true" | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | delegate creation of type Func | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:9:25:33 | call to method ToBool | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | {...} | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | call to constructor Object | +| Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | exit Finally | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | exit Finally (normal) | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:8:5:17:5 | {...} | | Finally.cs:8:5:17:5 | {...} | Finally.cs:9:9:16:9 | try {...} ... | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:10:9:12:9 | {...} | @@ -2133,6 +2177,18 @@ dominance | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:37 | call to method WriteLine | | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | {...} | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | exit ExceptionA | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | {...} | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | exit ExceptionB | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | {...} | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | exit ExceptionC | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:177:5:193:5 | {...} | | Finally.cs:177:5:193:5 | {...} | Finally.cs:178:9:192:9 | try {...} ... | | Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:179:9:181:9 | {...} | @@ -2403,6 +2459,10 @@ dominance | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | call to constructor Object | +| Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | exit Foreach | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | exit Foreach (normal) | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:7:5:10:5 | {...} | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:8:29:8:32 | access to parameter args | @@ -2453,6 +2513,9 @@ dominance | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:33:38:33 | Int32 y | | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:18:38:34 | (..., ...) | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | {...} | +| Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | exit Initializers | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | exit Initializers (normal) | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:6:9:6:9 | this access | @@ -2508,13 +2571,15 @@ dominance | Initializers.cs:18:16:18:16 | exit H (normal) | Initializers.cs:18:16:18:16 | exit H | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:16:18:16 | exit H (normal) | | 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 | call to constructor Object | Initializers.cs:22:23:22:23 | this access | +| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | call to constructor Object | | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | exit NoConstructor | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:27:22:27 | 0 | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:23:23:23:23 | this access | | Initializers.cs:22:27:22:27 | 0 | Initializers.cs:22:23:22:27 | ... = ... | | Initializers.cs:23:23:23:23 | this access | Initializers.cs:23:27:23:27 | 1 | -| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | +| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | {...} | | Initializers.cs:23:27:23:27 | 1 | Initializers.cs:23:23:23:27 | ... = ... | | Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | | Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | @@ -2548,6 +2613,14 @@ dominance | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:37:35:37 | access to parameter j | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:29:35:37 | ... = ... | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:33:35:37 | ... + ... | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | {...} | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | exit IndexInitializers | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | {...} | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | call to constructor Object | +| Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | exit Compound | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | exit Compound (normal) | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:52:5:66:5 | {...} | | Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:51:10:51:13 | exit Test | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:54:9:54:96 | ... ...; | @@ -2652,6 +2725,10 @@ dominance | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:59:64:61 | "1" | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:50:64:54 | ... + ... | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:46:64:61 | ... = ... | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | {...} | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:8:5:13:5 | {...} | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:9:9:10:19 | if (...) ... | @@ -2842,6 +2919,11 @@ dominance | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | {...} | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | @@ -2916,12 +2998,22 @@ dominance | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:34:24:34 | 0 | | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:20:22:20:31 | {...} | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:16:24:16 | access to property P | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | {...} | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:28:30:37 | throw ... | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | {...} | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:22:36:25 | null | @@ -2933,6 +3025,11 @@ dominance | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:22:37:25 | null | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:16:37:26 | throw ...; | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | {...} | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | exit get_P1 (normal) | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | @@ -3006,13 +3103,27 @@ dominance | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:34:22:34 | 1 | | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:18:22:18:36 | {...} | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:16:22:16 | access to property P | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | {...} | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | {...} | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | {...} | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | call to constructor Object | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:9:3:10 | exit M1 | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:28 | ... ?? ... | @@ -3091,6 +3202,10 @@ dominance | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:4:22:4:24 | {...} | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | {...} | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | call to constructor Object | +| Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | exit Patterns | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | exit Patterns (normal) | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:6:5:43:5 | {...} | | Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:5:10:5:11 | exit M1 | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:7:9:7:24 | ... ...; | @@ -3282,6 +3397,10 @@ dominance | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:97:13:97:39 | ...; | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:31:97:37 | "not C" | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:13:97:38 | call to method WriteLine | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | {...} | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | call to constructor Object | +| PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | exit PostDominance | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:6:5:8:5 | {...} | | PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:5:10:5:11 | exit M1 | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:7:9:7:29 | ...; | @@ -3313,6 +3432,10 @@ dominance | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:17:10:17:11 | exit M3 (normal) | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:27:21:27 | access to parameter s | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:9:21:28 | call to method WriteLine | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | {...} | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | call to constructor Object | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | exit Qualifiers | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:16:7:21 | exit Method | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:16:7:21 | exit Method (normal) | @@ -3376,6 +3499,10 @@ dominance | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:46 | call to method Method | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:9:30:46 | ... = ... | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | {...} | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | call to constructor Object | +| Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | exit Switch | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | exit Switch (normal) | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:6:5:8:5 | {...} | | Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:5:10:5:11 | exit M1 | | Switch.cs:6:5:8:5 | {...} | Switch.cs:7:9:7:22 | switch (...) {...} | @@ -3617,6 +3744,10 @@ dominance | Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:13:160:48 | call to method WriteLine | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:45:160:45 | access to local variable s | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:38:160:47 | $"..." | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | {...} | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | call to constructor Object | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:4:5:9:5 | {...} | | TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:3:10:3:10 | exit M | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:5:9:5:26 | ... ...; | @@ -3636,6 +3767,10 @@ dominance | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:17:8:27 | typeof(...) | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:3:10:3:10 | exit M (normal) | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:13:8:27 | Type t = ... | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | {...} | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | call to constructor Object | +| VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | exit VarDecls | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:6:5:11:5 | {...} | | VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:5:18:5:19 | exit M1 | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | @@ -3681,6 +3816,10 @@ dominance | VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:25:28:25:28 | access to local variable y | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:13:25:29 | return ...; | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | {...} | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | call to constructor Object | +| VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | exit C | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | exit C (normal) | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:51:28:53 | {...} | | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:41:28:47 | exit Dispose | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | @@ -4304,6 +4443,10 @@ dominance | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:34:286:45 | call to method ToString | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:5:286:18 | exit ControlFlowSub (normal) | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | {...} | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | call to constructor Object | +| cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | exit DelegateCall | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:12:291:12 | exit M | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:40:291:40 | 0 | @@ -4328,6 +4471,10 @@ dominance | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:61:300:64 | null | | cflow.cs:300:61:300:64 | null | cflow.cs:300:56:300:64 | ... != ... | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | {...} | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | call to constructor Object | +| cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | exit LambdaGetter | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | exit get__getter (normal) | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:307:5:310:5 | {...} | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | (...) => ... | @@ -4340,6 +4487,10 @@ dominance | cflow.cs:309:9:309:17 | return ...; | cflow.cs:306:60:310:5 | exit (...) => ... (normal) | | cflow.cs:309:16:309:16 | access to local variable x | cflow.cs:309:9:309:17 | return ...; | postDominance +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | {...} | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | call to constructor Object | | AccessorCalls.cs:5:23:5:25 | exit get_Item | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:23:5:25 | enter get_Item | @@ -4641,6 +4792,10 @@ postDominance | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:75:73:75 | 0 | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:80:73:80 | 1 | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:78:73:78 | access to local variable d | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | {...} | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | call to constructor Object | | ArrayCreation.cs:3:11:3:12 | exit M1 | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:27:3:27 | 0 | @@ -4669,6 +4824,10 @@ postDominance | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:48:9:48 | 3 | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:33:9:40 | { ..., ... } | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:45:9:45 | 2 | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | enter AssertTests | +| Assert.cs:5:7:5:17 | exit AssertTests | Assert.cs:5:7:5:17 | exit AssertTests (normal) | +| Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | {...} | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | call to constructor Object | | Assert.cs:7:10:7:11 | exit M1 (abnormal) | Assert.cs:10:9:10:31 | [assertion failure] call to method Assert | | Assert.cs:7:10:7:11 | exit M1 (normal) | Assert.cs:11:9:11:35 | call to method WriteLine | | Assert.cs:8:5:12:5 | {...} | Assert.cs:7:10:7:11 | enter M1 | @@ -5146,6 +5305,10 @@ postDominance | Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:25:140:26 | access to parameter b1 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:29:140:30 | access to parameter b2 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:140:9:140:35 | [assertion success] call to method AssertTrueFalse | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | enter Assignments | +| Assignments.cs:1:7:1:17 | exit Assignments | Assignments.cs:1:7:1:17 | exit Assignments (normal) | +| Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | {...} | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | call to constructor Object | | Assignments.cs:3:10:3:10 | exit M | Assignments.cs:3:10:3:10 | exit M (normal) | | Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:14:9:14:35 | ... += ... | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:3:10:3:10 | enter M | @@ -5187,6 +5350,10 @@ postDominance | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:17:40:17:40 | enter + | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:16:19:16 | access to parameter x | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:18:5:20:5 | {...} | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | enter BreakInTry | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry | BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | {...} | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | call to constructor Object | | BreakInTry.cs:3:10:3:11 | exit M1 | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:15:17:15:28 | ... == ... | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:16:17:16:17 | ; | @@ -5287,6 +5454,10 @@ postDominance | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:67:28:67:31 | [finally: return] null | | BreakInTry.cs:67:28:67:31 | [finally: return] null | BreakInTry.cs:67:21:67:23 | [finally: return] access to local variable arg | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:21:67:23 | access to local variable arg | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | {...} | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | | CompileTimeOperators.cs:5:9:5:15 | exit Default | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:7:9:7:28 | return ...; | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:5:9:5:15 | enter Default | @@ -5307,6 +5478,10 @@ postDominance | CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:21:5:23:5 | {...} | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | {...} | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | | CompileTimeOperators.cs:28:10:28:10 | exit M | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:28:10:28:10 | enter M | @@ -5321,6 +5496,10 @@ postDominance | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:40:32:40:36 | "End" | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:9:40:11 | End: | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:14:40:38 | ...; | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | {...} | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | | ConditionalAccess.cs:3:12:3:13 | exit M1 | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:28:3:38 | call to method ToString | @@ -5396,6 +5575,10 @@ postDominance | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:70:41:78 | ... + ... | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | enter Conditions | +| Conditions.cs:1:7:1:16 | exit Conditions | Conditions.cs:1:7:1:16 | exit Conditions (normal) | +| Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | {...} | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | call to constructor Object | | Conditions.cs:3:10:3:19 | exit IncrOrDecr | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:7:13:7:16 | [false] !... | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:8:13:8:15 | ...-- | @@ -5758,6 +5941,10 @@ postDominance | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:45:149:45 | access to local variable s | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:13:149:49 | ...; | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:40:149:43 | "b = " | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | enter ExitMethods | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods | ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | {...} | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | call to constructor Object | | ExitMethods.cs:8:10:8:11 | exit M1 | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:11:9:11:15 | return ...; | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:8:10:8:11 | enter M1 | @@ -5944,6 +6131,10 @@ postDominance | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:24:9:24:45 | call to method ToBool | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:9:25:14 | "true" | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | access to method Parse | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | enter Finally | +| Finally.cs:3:14:3:20 | exit Finally | Finally.cs:3:14:3:20 | exit Finally (normal) | +| Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | {...} | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | call to constructor Object | | Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | | Finally.cs:7:10:7:11 | exit M1 (normal) | Finally.cs:15:13:15:40 | call to method WriteLine | | Finally.cs:8:5:17:5 | {...} | Finally.cs:7:10:7:11 | enter M1 | @@ -6328,6 +6519,18 @@ postDominance | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:38 | ...; | | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | enter ExceptionA | +| Finally.cs:172:11:172:20 | exit ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | +| Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | {...} | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | enter ExceptionB | +| Finally.cs:173:11:173:20 | exit ExceptionB | Finally.cs:173:11:173:20 | exit ExceptionB (normal) | +| Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | {...} | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | enter ExceptionC | +| Finally.cs:174:11:174:20 | exit ExceptionC | Finally.cs:174:11:174:20 | exit ExceptionC (normal) | +| Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | {...} | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | call to constructor Exception | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | | Finally.cs:177:5:193:5 | {...} | Finally.cs:176:10:176:11 | enter M9 | @@ -6543,6 +6746,10 @@ postDominance | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:13 | access to parameter i | | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | enter Foreach | +| Foreach.cs:4:7:4:13 | exit Foreach | Foreach.cs:4:7:4:13 | exit Foreach (normal) | +| Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | {...} | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | call to constructor Object | | Foreach.cs:6:10:6:11 | exit M1 | Foreach.cs:6:10:6:11 | exit M1 (normal) | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:6:10:6:11 | enter M1 | @@ -6593,6 +6800,9 @@ postDominance | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:26:38:26 | String x | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:37:5:40:5 | {...} | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:38:18:38:34 | (..., ...) | +| Initializers.cs:3:7:3:18 | exit Initializers | Initializers.cs:3:7:3:18 | exit Initializers (normal) | +| Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | {...} | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | enter Initializers | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:8:5:8:16 | call to constructor Object | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:10:5:10:16 | call to constructor Object | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:5:13:5:17 | ... + ... | @@ -6648,9 +6858,11 @@ postDominance | Initializers.cs:18:16:18:16 | exit H (normal) | Initializers.cs:18:16:18:20 | ... = ... | | 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 | call to constructor Object | Initializers.cs:20:11:20:23 | enter NoConstructor | | 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 | +| Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | {...} | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:23:23:23:27 | ... = ... | +| Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | call to constructor Object | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:22:27:22:27 | 0 | | Initializers.cs:22:27:22:27 | 0 | Initializers.cs:22:23:22:23 | this access | | Initializers.cs:23:23:23:23 | this access | Initializers.cs:22:23:22:27 | ... = ... | @@ -6688,6 +6900,14 @@ postDominance | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:29:35:29 | this access | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:37:35:37 | access to parameter j | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:33:35:33 | access to parameter i | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | enter IndexInitializers | +| Initializers.cs:39:7:39:23 | exit IndexInitializers | Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | +| Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | {...} | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | enter Compound | +| Initializers.cs:41:11:41:18 | exit Compound | Initializers.cs:41:11:41:18 | exit Compound (normal) | +| Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | {...} | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | call to constructor Object | | Initializers.cs:51:10:51:13 | exit Test | Initializers.cs:51:10:51:13 | exit Test (normal) | | Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:57:13:65:9 | Compound compound = ... | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:51:10:51:13 | enter Test | @@ -6792,6 +7012,10 @@ postDominance | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:54:64:54 | 0 | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:50:64:50 | access to parameter i | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:50:64:54 | ... + ... | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | {...} | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | | LoopUnrolling.cs:7:10:7:11 | exit M1 | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:10:13:10:19 | return ...; | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | @@ -6980,6 +7204,11 @@ postDominance | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:98:9:100:9 | {...} | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:13:99:33 | ...; | +| MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | {...} | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | {...} | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | MultiImplementationA.cs:6:22:6:31 | throw ... | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:28:6:31 | null | @@ -7046,12 +7275,22 @@ postDominance | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:13:16:13:20 | ... = ... | | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:16:24:16 | access to property P | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:16:24:16 | this access | +| MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | {...} | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | {...} | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:28:30:37 | throw ... | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | {...} | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | {...} | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | MultiImplementationA.cs:36:16:36:26 | throw ...; | | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:22:36:25 | null | @@ -7061,6 +7300,11 @@ postDominance | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:9:37:10 | enter M2 | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:22:37:25 | null | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:14:37:28 | {...} | +| MultiImplementationB.cs:1:7:1:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | {...} | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | {...} | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | | MultiImplementationB.cs:3:22:3:22 | exit get_P1 (abnormal) | MultiImplementationA.cs:6:22:6:31 | throw ... | @@ -7124,13 +7368,27 @@ postDominance | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:11:16:11:20 | ... = ... | | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:16:22:16 | access to property P | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:16:22:16 | this access | +| MultiImplementationB.cs:25:7:25:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | {...} | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | {...} | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:28:30:37 | throw ... | +| MultiImplementationB.cs:30:15:30:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | {...} | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | {...} | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | | MultiImplementationB.cs:32:9:32:10 | exit M1 (abnormal) | MultiImplementationA.cs:36:16:36:26 | throw ...; | | MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | enter M1 | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | {...} | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | call to constructor Object | | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:23:3:28 | ... ?? ... | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:9:3:10 | enter M1 | @@ -7207,6 +7465,10 @@ postDominance | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:16:5:16 | access to property P | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | this access | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | enter Patterns | +| Patterns.cs:3:7:3:14 | exit Patterns | Patterns.cs:3:7:3:14 | exit Patterns (normal) | +| Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | {...} | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | call to constructor Object | | Patterns.cs:5:10:5:11 | exit M1 | Patterns.cs:5:10:5:11 | exit M1 (normal) | | Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:40:17:40:17 | access to local variable o | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:5:10:5:11 | enter M1 | @@ -7385,6 +7647,10 @@ postDominance | Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:97:31:97:37 | "not C" | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:96:9:98:9 | {...} | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:13:97:39 | ...; | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | enter PostDominance | +| PostDominance.cs:3:7:3:19 | exit PostDominance | PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | +| PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | {...} | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | call to constructor Object | | PostDominance.cs:5:10:5:11 | exit M1 | PostDominance.cs:5:10:5:11 | exit M1 (normal) | | PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:7:9:7:28 | call to method WriteLine | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:5:10:5:11 | enter M1 | @@ -7414,6 +7680,10 @@ postDominance | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:21:27:21:27 | access to parameter s | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:19:13:19:21 | [false] ... is ... | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:9:21:29 | ...; | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | enter Qualifiers | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers | Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | {...} | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | call to constructor Object | | Qualifiers.cs:7:16:7:21 | exit Method | Qualifiers.cs:7:16:7:21 | exit Method (normal) | | Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:16:7:21 | enter Method | @@ -7477,6 +7747,10 @@ postDominance | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:29:9:29:46 | ... = ... | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:9:30:47 | ...; | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | enter Switch | +| Switch.cs:3:7:3:12 | exit Switch | Switch.cs:3:7:3:12 | exit Switch (normal) | +| Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | {...} | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | call to constructor Object | | Switch.cs:5:10:5:11 | exit M1 | Switch.cs:5:10:5:11 | exit M1 (normal) | | Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:7:17:7:17 | access to parameter o | | Switch.cs:6:5:8:5 | {...} | Switch.cs:5:10:5:11 | enter M1 | @@ -7702,6 +7976,10 @@ postDominance | Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:45:160:45 | access to local variable s | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:13:160:49 | ...; | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:40:160:43 | "b = " | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | {...} | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | call to constructor Object | | TypeAccesses.cs:3:10:3:10 | exit M | TypeAccesses.cs:3:10:3:10 | exit M (normal) | | TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:8:13:8:27 | Type t = ... | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:3:10:3:10 | enter M | @@ -7721,6 +7999,10 @@ postDominance | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:7:25:7:25 | ; | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:17:8:27 | typeof(...) | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:9:8:28 | ... ...; | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | enter VarDecls | +| VarDecls.cs:3:7:3:14 | exit VarDecls | VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | +| VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | {...} | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | call to constructor Object | | VarDecls.cs:5:18:5:19 | exit M1 | VarDecls.cs:5:18:5:19 | exit M1 (normal) | | VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:9:13:9:29 | return ...; | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:5:18:5:19 | enter M1 | @@ -7766,6 +8048,10 @@ postDominance | VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:24:31:24:41 | C y = ... | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:28:25:28 | access to local variable y | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | enter C | +| VarDecls.cs:28:11:28:11 | exit C | VarDecls.cs:28:11:28:11 | exit C (normal) | +| VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | {...} | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | call to constructor Object | | VarDecls.cs:28:41:28:47 | exit Dispose | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:51:28:53 | {...} | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:41:28:47 | enter Dispose | @@ -8370,6 +8656,10 @@ postDominance | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:5:286:18 | enter ControlFlowSub | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:34 | access to parameter i | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | enter DelegateCall | +| cflow.cs:289:7:289:18 | exit DelegateCall | cflow.cs:289:7:289:18 | exit DelegateCall (normal) | +| cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | {...} | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | call to constructor Object | | cflow.cs:291:12:291:12 | exit M | cflow.cs:291:12:291:12 | exit M (normal) | | cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:38:291:41 | delegate call | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:12:291:12 | enter M | @@ -8394,6 +8684,10 @@ postDominance | cflow.cs:300:56:300:64 | ... != ... | cflow.cs:300:61:300:64 | null | | cflow.cs:300:61:300:64 | null | cflow.cs:300:56:300:56 | access to parameter s | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:44:300:64 | ... && ... | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | enter LambdaGetter | +| cflow.cs:304:7:304:18 | exit LambdaGetter | cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | +| cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | {...} | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | call to constructor Object | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | enter get__getter | | cflow.cs:306:60:310:5 | exit (...) => ... | cflow.cs:306:60:310:5 | exit (...) => ... (normal) | | cflow.cs:306:60:310:5 | exit (...) => ... (normal) | cflow.cs:309:9:309:17 | return ...; | @@ -8406,6 +8700,7 @@ postDominance | cflow.cs:309:9:309:17 | return ...; | cflow.cs:309:16:309:16 | access to local variable x | | cflow.cs:309:16:309:16 | access to local variable x | cflow.cs:308:16:308:20 | Object x = ... | blockDominance +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | enter get_Item | | AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | enter set_Item | | AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | enter add_Event | @@ -8419,10 +8714,12 @@ blockDominance | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | enter M7 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | enter M8 | | AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | enter M9 | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | enter M1 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | enter M2 | | ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | enter M3 | | ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | enter M4 | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | enter AssertTests | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | enter M1 | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | exit M1 | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:9:20:9:32 | ... ? ... : ... | @@ -9732,9 +10029,11 @@ blockDominance | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | enter Assignments | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | enter M | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | enter (...) => ... | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | enter + | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | enter BreakInTry | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | enter M1 | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | @@ -9849,11 +10148,14 @@ blockDominance | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:68:21:68:26 | [finally: return] break; | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:68:21:68:26 | [finally: return] break; | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | enter Default | | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | enter M | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | enter M1 | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:28:3:38 | call to method ToString | @@ -9925,6 +10227,7 @@ blockDominance | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | | ConditionalAccess.cs:35:14:35:24 | call to method Out | ConditionalAccess.cs:35:14:35:24 | call to method Out | | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | enter Conditions | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | enter IncrOrDecr | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | @@ -10233,6 +10536,7 @@ blockDominance | Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | Conditions.cs:149:13:149:49 | ...; | | Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:13:147:49 | ...; | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:13:149:49 | ...; | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | enter ExitMethods | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | enter M1 | | ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:14:10:14:11 | enter M2 | | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:20:10:20:11 | enter M3 | @@ -10314,6 +10618,7 @@ blockDominance | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | enter ToBool | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | enter CallToInt32 | | Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | enter Main | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | enter Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | enter M1 | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | exit M1 | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | @@ -10907,6 +11212,9 @@ blockDominance | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:165:13:168:13 | catch {...} | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | enter ExceptionA | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | enter ExceptionB | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | enter ExceptionC | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | enter M9 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | exit M9 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | @@ -11236,6 +11544,7 @@ blockDominance | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | | Finally.cs:270:9:273:9 | {...} | Finally.cs:270:9:273:9 | {...} | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | enter Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | enter M1 | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | exit M1 (normal) | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | @@ -11299,6 +11608,7 @@ blockDominance | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:26:38:26 | String x | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:26:38:26 | String x | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | enter Initializers | | 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 | @@ -11307,7 +11617,10 @@ blockDominance | 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 | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | enter Sub | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | enter IndexInitializers | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | enter Compound | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | enter Test | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | enter M1 | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:10:13:10:19 | return ...; | @@ -11416,6 +11729,15 @@ blockDominance | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:22:97:22 | String x | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | @@ -11525,8 +11847,26 @@ blockDominance | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:50:23:53 | null | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | @@ -11537,6 +11877,15 @@ blockDominance | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | exit M1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | enter M2 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | @@ -11646,8 +11995,26 @@ blockDominance | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:56:21:59 | null | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | @@ -11657,6 +12024,7 @@ blockDominance | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | exit M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | enter M1 | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:28 | ... ?? ... | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:28:3:28 | 0 | @@ -11743,6 +12111,7 @@ blockDominance | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | enter Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | enter Partial | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | enter Patterns | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:5:10:5:11 | enter M1 | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:8:13:8:23 | [false] ... is ... | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:8:13:8:23 | [true] ... is ... | @@ -12050,6 +12419,7 @@ blockDominance | Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:29:95:38 | [no-match] ... or ... | | Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:36:95:38 | access to constant B | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:96:9:98:9 | {...} | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | enter PostDominance | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | enter M1 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:10:10:10:11 | enter M2 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:10:10:10:11 | exit M2 (normal) | @@ -12077,9 +12447,11 @@ blockDominance | PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:20:45:20:53 | nameof(...) | | PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:20:45:20:53 | nameof(...) | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:29 | ...; | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | enter Qualifiers | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | enter Method | | Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | enter StaticMethod | | Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | enter M | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | enter Switch | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | enter M1 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | enter M2 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | exit M2 | @@ -12396,6 +12768,7 @@ blockDominance | Switch.cs:156:50:156:52 | "b" | Switch.cs:156:50:156:52 | "b" | | Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:49 | ...; | | Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:49 | ...; | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | enter M | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | @@ -12406,6 +12779,7 @@ blockDominance | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:7:25:7:25 | ; | | TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:7:25:7:25 | ; | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:9:8:28 | ... ...; | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | enter VarDecls | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | enter M1 | | VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | enter M2 | | VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:19:7:19:8 | enter M3 | @@ -12415,6 +12789,7 @@ blockDominance | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:20:25:28 | ... ? ... : ... | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | enter C | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | enter Dispose | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | enter Main | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | exit Main (normal) | @@ -13160,6 +13535,7 @@ blockDominance | cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | enter ControlFlowSub | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | enter ControlFlowSub | | cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | enter ControlFlowSub | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | enter DelegateCall | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | enter M | | cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | enter NegationInConstructor | | cflow.cs:298:10:298:10 | enter M | cflow.cs:298:10:298:10 | enter M | @@ -13172,9 +13548,11 @@ blockDominance | cflow.cs:300:44:300:51 | [true] !... | cflow.cs:300:56:300:56 | access to parameter s | | cflow.cs:300:44:300:64 | ... && ... | cflow.cs:300:44:300:64 | ... && ... | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:56:300:56 | access to parameter s | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | enter LambdaGetter | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | enter (...) => ... | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | enter get__getter | postBlockDominance +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | enter get_Item | | AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | enter set_Item | | AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | enter add_Event | @@ -13188,10 +13566,12 @@ postBlockDominance | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | enter M7 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | enter M8 | | AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | enter M9 | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | enter M1 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | enter M2 | | ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | enter M3 | | ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | enter M4 | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | enter AssertTests | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | enter M1 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | exit M1 | | Assert.cs:9:20:9:32 | ... ? ... : ... | Assert.cs:7:10:7:11 | enter M1 | @@ -13985,9 +14365,11 @@ postBlockDominance | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:138:10:138:12 | enter M13 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:29:140:30 | access to parameter b2 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | enter Assignments | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | enter M | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | enter (...) => ... | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | enter + | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | enter BreakInTry | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | enter M1 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | enter M1 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | @@ -14072,11 +14454,14 @@ postBlockDominance | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:68:21:68:26 | [finally: return] break; | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | enter Default | | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | enter M | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | enter M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | enter M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | @@ -14145,6 +14530,7 @@ postBlockDominance | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:35:14:35:24 | call to method Out | | ConditionalAccess.cs:35:14:35:24 | call to method Out | ConditionalAccess.cs:35:14:35:24 | call to method Out | | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | enter Conditions | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | enter IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | enter IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | @@ -14400,6 +14786,7 @@ postBlockDominance | Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:13:147:49 | ...; | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:13:149:49 | ...; | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | enter ExitMethods | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | enter M1 | | ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:14:10:14:11 | enter M2 | | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:20:10:20:11 | enter M3 | @@ -14466,6 +14853,7 @@ postBlockDominance | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | enter ToBool | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | enter CallToInt32 | | Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | enter Main | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | enter Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | enter M1 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | exit M1 | | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | @@ -14708,6 +15096,9 @@ postBlockDominance | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:165:13:168:13 | catch {...} | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | enter ExceptionA | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | enter ExceptionB | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | enter ExceptionC | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | enter M9 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | exit M9 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 (abnormal) | @@ -14827,6 +15218,7 @@ postBlockDominance | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:270:9:273:9 | {...} | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | enter Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | enter M1 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | enter M1 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 (normal) | @@ -14893,6 +15285,7 @@ postBlockDominance | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:26:38:26 | String x | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:26:38:26 | String x | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | enter Initializers | | 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 | @@ -14901,7 +15294,10 @@ postBlockDominance | 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 | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | enter Sub | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | enter IndexInitializers | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | enter Compound | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | enter Test | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | enter M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | enter M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | @@ -15001,6 +15397,15 @@ postBlockDominance | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:97:22:97:22 | String x | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:94:10:94:12 | enter M11 | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:22:97:22 | String x | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | @@ -15084,14 +15489,41 @@ postBlockDominance | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | enter implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:50:23:53 | null | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationB.cs:21:28:21:35 | enter implicit conversion | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | enter M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | exit M1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | enter M2 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | enter C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | @@ -15173,8 +15605,26 @@ postBlockDominance | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:56:21:59 | null | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | enter C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | enter C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | enter M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | exit M1 | @@ -15182,6 +15632,7 @@ postBlockDominance | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | enter M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | enter M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | enter M1 | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:9:3:10 | enter M1 | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:28 | ... ?? ... | @@ -15270,6 +15721,7 @@ postBlockDominance | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | enter Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | enter Partial | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | enter Patterns | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:5:10:5:11 | enter M1 | | Patterns.cs:8:13:8:23 | [false] ... is ... | Patterns.cs:8:13:8:23 | [false] ... is ... | | Patterns.cs:8:13:8:23 | [true] ... is ... | Patterns.cs:8:13:8:23 | [true] ... is ... | @@ -15517,6 +15969,7 @@ postBlockDominance | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:95:21:95:40 | [match] { ... } | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:95:29:95:38 | [match] ... or ... | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:96:9:98:9 | {...} | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | enter PostDominance | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | enter M1 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:10:10:10:11 | enter M2 | | PostDominance.cs:10:10:10:11 | exit M2 (normal) | PostDominance.cs:10:10:10:11 | enter M2 | @@ -15540,9 +15993,11 @@ postBlockDominance | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | enter M3 | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:19:13:19:21 | [false] ... is ... | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:29 | ...; | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | enter Qualifiers | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | enter Method | | Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | enter StaticMethod | | Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | enter M | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | enter Switch | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | enter M1 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | enter M2 | | Switch.cs:10:10:10:11 | exit M2 | Switch.cs:10:10:10:11 | exit M2 | @@ -15779,6 +16234,7 @@ postBlockDominance | Switch.cs:156:50:156:52 | "b" | Switch.cs:156:50:156:52 | "b" | | Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:49 | ...; | | Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:49 | ...; | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | enter M | | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | @@ -15789,6 +16245,7 @@ postBlockDominance | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:7:25:7:25 | ; | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:9:8:28 | ... ...; | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | enter VarDecls | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | enter M1 | | VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | enter M2 | | VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:19:7:19:8 | enter M3 | @@ -15798,6 +16255,7 @@ postBlockDominance | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:28:25:28 | access to local variable y | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | enter C | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | enter Dispose | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | enter Main | | cflow.cs:5:17:5:20 | exit Main (normal) | cflow.cs:5:17:5:20 | enter Main | @@ -16438,6 +16896,7 @@ postBlockDominance | cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | enter ControlFlowSub | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | enter ControlFlowSub | | cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | enter ControlFlowSub | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | enter DelegateCall | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | enter M | | cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | enter NegationInConstructor | | cflow.cs:298:10:298:10 | enter M | cflow.cs:298:10:298:10 | enter M | @@ -16450,5 +16909,6 @@ postBlockDominance | cflow.cs:300:44:300:64 | ... && ... | cflow.cs:300:56:300:56 | access to parameter s | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:44:300:51 | [true] !... | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:56:300:56 | access to parameter s | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | enter LambdaGetter | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | enter (...) => ... | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | enter get__getter | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected index c7a94483689..ca55c02506d 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected @@ -1,4 +1,9 @@ nodeEnclosing +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | exit AccessorCalls (normal) | AccessorCalls.cs:1:7:1:19 | AccessorCalls | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | AccessorCalls | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | | AccessorCalls.cs:5:23:5:25 | exit get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:23:5:25 | get_Item | @@ -313,6 +318,11 @@ nodeEnclosing | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:66:10:66:11 | M9 | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | exit ArrayCreation (normal) | ArrayCreation.cs:1:7:1:19 | ArrayCreation | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | ArrayCreation | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | M1 | | ArrayCreation.cs:3:11:3:12 | exit M1 | ArrayCreation.cs:3:11:3:12 | M1 | | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:11:3:12 | M1 | @@ -345,6 +355,11 @@ nodeEnclosing | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:12:9:13 | M4 | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:12:9:13 | M4 | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:12:9:13 | M4 | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | exit AssertTests | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | exit AssertTests (normal) | Assert.cs:5:7:5:17 | AssertTests | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | AssertTests | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | M1 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | M1 | | Assert.cs:7:10:7:11 | exit M1 (abnormal) | Assert.cs:7:10:7:11 | M1 | @@ -924,6 +939,11 @@ nodeEnclosing | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | M13 | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | exit Assignments | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | exit Assignments (normal) | Assignments.cs:1:7:1:17 | Assignments | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | Assignments | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | M | | Assignments.cs:3:10:3:10 | exit M | Assignments.cs:3:10:3:10 | M | | Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:3:10:3:10 | M | @@ -968,6 +988,11 @@ nodeEnclosing | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:17:40:17:40 | + | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:17:40:17:40 | + | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:17:40:17:40 | + | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | exit BreakInTry (normal) | BreakInTry.cs:1:7:1:16 | BreakInTry | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | BreakInTry | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | M1 | | BreakInTry.cs:3:10:3:11 | exit M1 | BreakInTry.cs:3:10:3:11 | M1 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | M1 | @@ -1080,6 +1105,11 @@ nodeEnclosing | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:56:10:56:11 | M4 | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:56:10:56:11 | M4 | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:56:10:56:11 | M4 | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators (normal) | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | Default | | CompileTimeOperators.cs:5:9:5:15 | exit Default | CompileTimeOperators.cs:5:9:5:15 | Default | | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:5:9:5:15 | Default | @@ -1104,6 +1134,11 @@ nodeEnclosing | CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:20:12:20:17 | Nameof | | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:20:12:20:17 | Nameof | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally (normal) | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:28:10:28:10 | exit M | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | CompileTimeOperators.cs:28:10:28:10 | M | @@ -1119,6 +1154,11 @@ nodeEnclosing | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:28:10:28:10 | M | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess (normal) | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 | ConditionalAccess.cs:3:12:3:13 | M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | M1 | @@ -1208,6 +1248,11 @@ nodeEnclosing | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | exit Conditions | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | exit Conditions (normal) | Conditions.cs:1:7:1:16 | Conditions | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | Conditions | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | IncrOrDecr | @@ -1603,6 +1648,11 @@ nodeEnclosing | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:143:10:143:12 | M11 | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:143:10:143:12 | M11 | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:143:10:143:12 | M11 | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | exit ExitMethods (normal) | ExitMethods.cs:6:7:6:17 | ExitMethods | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | ExitMethods | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | M1 | | ExitMethods.cs:8:10:8:11 | exit M1 | ExitMethods.cs:8:10:8:11 | M1 | | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:8:10:8:11 | M1 | @@ -1832,6 +1882,11 @@ nodeEnclosing | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:20:17:20:20 | Main | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:20:17:20:20 | Main | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:20:17:20:20 | Main | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | exit Finally | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | Finally | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:7:10:7:11 | M1 | @@ -2309,6 +2364,21 @@ nodeEnclosing | Finally.cs:167:35:167:36 | "" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | exit ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | exit ExceptionB | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | exit ExceptionB (normal) | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | exit ExceptionC | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | exit ExceptionC (normal) | Finally.cs:174:11:174:20 | ExceptionC | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | ExceptionC | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | M9 | @@ -2596,6 +2666,11 @@ nodeEnclosing | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:18:272:18 | 3 | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:263:10:263:12 | M13 | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | exit Foreach | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | Foreach | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | M1 | | Foreach.cs:6:10:6:11 | exit M1 | Foreach.cs:6:10:6:11 | M1 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | M1 | @@ -2653,6 +2728,10 @@ nodeEnclosing | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:36:10:36:11 | M6 | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | Initializers | +| Initializers.cs:3:7:3:18 | exit Initializers | Initializers.cs:3:7:3:18 | Initializers | +| Initializers.cs:3:7:3:18 | exit Initializers (normal) | Initializers.cs:3:7:3:18 | Initializers | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | Initializers | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:8:5:8:16 | Initializers | @@ -2707,9 +2786,11 @@ nodeEnclosing | Initializers.cs:15:39:15:39 | access to local variable i | Initializers.cs:12:10:12:10 | M | | Initializers.cs:15:42:15:61 | object creation of type Initializers | Initializers.cs:12:10:12:10 | M | | Initializers.cs:15:59:15:60 | "" | Initializers.cs:12:10:12:10 | M | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:20:11:20:23 | exit NoConstructor | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | NoConstructor | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:20:11:20:23 | NoConstructor | | Initializers.cs:22:27:22:27 | 0 | Initializers.cs:20:11:20:23 | NoConstructor | @@ -2751,6 +2832,16 @@ nodeEnclosing | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:9:35:11 | Sub | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:9:35:11 | Sub | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | exit IndexInitializers | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | exit IndexInitializers (normal) | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | exit Compound | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | exit Compound (normal) | Initializers.cs:41:11:41:18 | Compound | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | Compound | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:51:10:51:13 | exit Test | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:51:10:51:13 | Test | @@ -2856,6 +2947,11 @@ nodeEnclosing | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:51:10:51:13 | Test | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:51:10:51:13 | Test | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | exit LoopUnrolling (normal) | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 | LoopUnrolling.cs:7:10:7:11 | M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | M1 | @@ -3060,6 +3156,16 @@ nodeEnclosing | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:94:10:94:12 | M11 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationB.cs:1:7:1:8 | C1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -3224,6 +3330,16 @@ nodeEnclosing | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationB.cs:18:12:18:13 | C2 | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationB.cs:18:12:18:13 | C2 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationB.cs:25:7:25:8 | C3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | @@ -3234,6 +3350,16 @@ nodeEnclosing | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationB.cs:27:21:27:23 | get_P3 | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationB.cs:27:21:27:23 | get_P3 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationB.cs:30:15:30:16 | C4 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | @@ -3254,6 +3380,16 @@ nodeEnclosing | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:9:37:10 | M2 | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | M2 | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:9:37:10 | M2 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | C1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | get_P1 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -3415,12 +3551,32 @@ nodeEnclosing | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:18:12:18:13 | C2 | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationA.cs:20:12:20:13 | C2 | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:18:12:18:13 | C2 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | C3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationB.cs:27:21:27:23 | get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | C4 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | @@ -3431,6 +3587,11 @@ nodeEnclosing | MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | M1 | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | exit NullCoalescing (normal) | NullCoalescing.cs:1:7:1:20 | NullCoalescing | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | M1 | | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | M1 | | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:9:3:10 | M1 | @@ -3522,6 +3683,11 @@ nodeEnclosing | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:4:12:4:18 | Partial | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationA.cs:3:12:3:18 | Partial | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:4:12:4:18 | Partial | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | exit Patterns | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | exit Patterns (normal) | Patterns.cs:3:7:3:14 | Patterns | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | Patterns | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:5:10:5:11 | exit M1 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:5:10:5:11 | M1 | @@ -3731,6 +3897,11 @@ nodeEnclosing | Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:93:17:93:19 | M10 | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:93:17:93:19 | M10 | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:93:17:93:19 | M10 | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | exit PostDominance | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | exit PostDominance (normal) | PostDominance.cs:3:7:3:19 | PostDominance | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | PostDominance | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | M1 | | PostDominance.cs:5:10:5:11 | exit M1 | PostDominance.cs:5:10:5:11 | M1 | | PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:5:10:5:11 | M1 | @@ -3767,6 +3938,11 @@ nodeEnclosing | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:17:10:17:11 | M3 | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | M3 | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:17:10:17:11 | M3 | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | exit Qualifiers (normal) | Qualifiers.cs:1:7:1:16 | Qualifiers | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | Qualifiers | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | Method | | Qualifiers.cs:7:16:7:21 | exit Method | Qualifiers.cs:7:16:7:21 | Method | | Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:16:7:21 | Method | @@ -3833,6 +4009,11 @@ nodeEnclosing | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:10:10:10:10 | M | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:10:10:10:10 | M | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:10:10:10:10 | M | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | exit Switch | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | exit Switch (normal) | Switch.cs:3:7:3:12 | Switch | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | Switch | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | M1 | | Switch.cs:5:10:5:11 | exit M1 | Switch.cs:5:10:5:11 | M1 | | Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:5:10:5:11 | M1 | @@ -4108,6 +4289,11 @@ nodeEnclosing | Switch.cs:160:38:160:47 | $"..." | Switch.cs:154:10:154:12 | M15 | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:154:10:154:12 | M15 | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:154:10:154:12 | M15 | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | TypeAccesses | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:3:10:3:10 | exit M | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:3:10:3:10 | M | @@ -4129,6 +4315,11 @@ nodeEnclosing | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:3:10:3:10 | M | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | exit VarDecls | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | exit VarDecls (normal) | VarDecls.cs:3:7:3:14 | VarDecls | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | VarDecls | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | M1 | | VarDecls.cs:5:18:5:19 | exit M1 | VarDecls.cs:5:18:5:19 | M1 | | VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:5:18:5:19 | M1 | @@ -4178,6 +4369,11 @@ nodeEnclosing | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | exit C | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | exit C (normal) | VarDecls.cs:28:11:28:11 | C | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | C | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | Dispose | | VarDecls.cs:28:41:28:47 | exit Dispose | VarDecls.cs:28:41:28:47 | Dispose | | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:41:28:47 | Dispose | @@ -4846,6 +5042,11 @@ nodeEnclosing | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:5:286:18 | ControlFlowSub | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:5:286:18 | ControlFlowSub | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:5:286:18 | ControlFlowSub | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | exit DelegateCall | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | exit DelegateCall (normal) | cflow.cs:289:7:289:18 | DelegateCall | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | DelegateCall | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | M | | cflow.cs:291:12:291:12 | exit M | cflow.cs:291:12:291:12 | M | | cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:12:291:12 | M | @@ -4874,6 +5075,11 @@ nodeEnclosing | cflow.cs:300:56:300:64 | ... != ... | cflow.cs:298:10:298:10 | M | | cflow.cs:300:61:300:64 | null | cflow.cs:298:10:298:10 | M | | cflow.cs:300:70:300:71 | "" | cflow.cs:298:10:298:10 | M | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | exit LambdaGetter | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | exit LambdaGetter (normal) | cflow.cs:304:7:304:18 | LambdaGetter | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | LambdaGetter | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | get__getter | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | get__getter | @@ -4888,6 +5094,7 @@ nodeEnclosing | cflow.cs:309:9:309:17 | return ...; | cflow.cs:306:60:310:5 | (...) => ... | | cflow.cs:309:16:309:16 | access to local variable x | cflow.cs:306:60:310:5 | (...) => ... | blockEnclosing +| AccessorCalls.cs:1:7:1:19 | enter AccessorCalls | AccessorCalls.cs:1:7:1:19 | AccessorCalls | | AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | | AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | set_Item | | AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | add_Event | @@ -4901,10 +5108,12 @@ blockEnclosing | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | M7 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | M8 | | AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | M9 | +| ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | ArrayCreation | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | M1 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | M2 | | ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | M3 | | ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | M4 | +| Assert.cs:5:7:5:17 | enter AssertTests | Assert.cs:5:7:5:17 | AssertTests | | Assert.cs:7:10:7:11 | enter M1 | Assert.cs:7:10:7:11 | M1 | | Assert.cs:7:10:7:11 | exit M1 | Assert.cs:7:10:7:11 | M1 | | Assert.cs:9:20:9:32 | ... ? ... : ... | Assert.cs:7:10:7:11 | M1 | @@ -5078,9 +5287,11 @@ blockEnclosing | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:138:10:138:12 | M13 | +| Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | Assignments | | Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | M | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | (...) => ... | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | + | +| BreakInTry.cs:1:7:1:16 | enter BreakInTry | BreakInTry.cs:1:7:1:16 | BreakInTry | | BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | M1 | | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | M1 | | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:3:10:3:11 | M1 | @@ -5117,11 +5328,14 @@ blockEnclosing | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:56:10:56:11 | M4 | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:56:10:56:11 | M4 | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:56:10:56:11 | M4 | +| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | | CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | Default | | CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | Sizeof | | CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | Typeof | | CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | | CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | M | +| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | | ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | M1 | | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | M1 | | ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:12:3:13 | M1 | @@ -5158,6 +5372,7 @@ blockEnclosing | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:32:10:32:11 | M8 | | ConditionalAccess.cs:35:14:35:24 | call to method Out | ConditionalAccess.cs:32:10:32:11 | M8 | | ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | +| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | Conditions | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | IncrOrDecr | | Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | Conditions.cs:3:10:3:19 | IncrOrDecr | @@ -5260,6 +5475,7 @@ blockEnclosing | Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | Conditions.cs:143:10:143:12 | M11 | | Conditions.cs:147:13:147:49 | ...; | Conditions.cs:143:10:143:12 | M11 | | Conditions.cs:149:13:149:49 | ...; | Conditions.cs:143:10:143:12 | M11 | +| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | ExitMethods | | ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:8:10:8:11 | M1 | | ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:14:10:14:11 | M2 | | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:20:10:20:11 | M3 | @@ -5312,6 +5528,7 @@ blockEnclosing | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | ToBool | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | CallToInt32 | | Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | Main | +| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:7:10:7:11 | M1 | @@ -5449,6 +5666,9 @@ blockEnclosing | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | +| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | ExceptionB | +| Finally.cs:174:11:174:20 | enter ExceptionC | Finally.cs:174:11:174:20 | ExceptionC | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | M9 | @@ -5537,6 +5757,7 @@ blockEnclosing | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | M13 | | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:263:10:263:12 | M13 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | M13 | +| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | M1 | | Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | M1 | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:6:10:6:11 | M1 | @@ -5564,6 +5785,7 @@ blockEnclosing | Foreach.cs:36:10:36:11 | exit M6 (normal) | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:36:10:36:11 | M6 | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:36:10:36:11 | M6 | +| Initializers.cs:3:7:3:18 | enter Initializers | Initializers.cs:3:7:3:18 | Initializers | | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | Initializers | | Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | Initializers | | Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | M | @@ -5571,7 +5793,10 @@ blockEnclosing | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | Sub | | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | Sub | | Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | Sub | +| Initializers.cs:39:7:39:23 | enter IndexInitializers | Initializers.cs:39:7:39:23 | IndexInitializers | +| Initializers.cs:41:11:41:18 | enter Compound | Initializers.cs:41:11:41:18 | Compound | | Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:51:10:51:13 | Test | +| LoopUnrolling.cs:5:7:5:19 | enter LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | | LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:7:10:7:11 | M1 | | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | M1 | | LoopUnrolling.cs:10:13:10:19 | return ...; | LoopUnrolling.cs:7:10:7:11 | M1 | @@ -5617,6 +5842,12 @@ blockEnclosing | LoopUnrolling.cs:94:10:94:12 | enter M11 | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | M11 | | LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:94:10:94:12 | M11 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | C1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | get_P1 | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -5690,8 +5921,20 @@ blockEnclosing | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | implicit conversion | | MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationB.cs:21:28:21:35 | implicit conversion | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | C3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationA.cs:34:15:34:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | C4 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationA.cs:36:9:36:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | @@ -5699,6 +5942,12 @@ blockEnclosing | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:9:37:10 | M2 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | enter C1 | MultiImplementationB.cs:1:7:1:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | C1 | +| MultiImplementationB.cs:1:7:1:8 | exit C1 (normal) | MultiImplementationB.cs:1:7:1:8 | C1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | get_P1 | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | get_P1 | | MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:22:6:31 | get_P1 | @@ -5772,14 +6021,27 @@ blockEnclosing | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | MultiImplementationB.cs:21:28:21:35 | implicit conversion | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationA.cs:23:28:23:35 | implicit conversion | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:28:21:35 | implicit conversion | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | enter C3 | MultiImplementationB.cs:25:7:25:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationA.cs:28:7:28:8 | C3 | +| MultiImplementationB.cs:25:7:25:8 | exit C3 (normal) | MultiImplementationB.cs:25:7:25:8 | C3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:21:30:23 | get_P3 | | MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationB.cs:27:21:27:23 | get_P3 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | enter C4 | MultiImplementationB.cs:30:15:30:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationA.cs:34:15:34:16 | C4 | +| MultiImplementationB.cs:30:15:30:16 | exit C4 (normal) | MultiImplementationB.cs:30:15:30:16 | C4 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:9:32:10 | exit M1 | MultiImplementationB.cs:32:9:32:10 | M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | M1 | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | M1 | +| NullCoalescing.cs:1:7:1:20 | enter NullCoalescing | NullCoalescing.cs:1:7:1:20 | NullCoalescing | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | M1 | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:9:3:10 | M1 | | NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:9:3:10 | M1 | @@ -5819,6 +6081,7 @@ blockEnclosing | NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | M6 | | PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | Partial | | PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | Partial | +| Patterns.cs:3:7:3:14 | enter Patterns | Patterns.cs:3:7:3:14 | Patterns | | Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:8:13:8:23 | [false] ... is ... | Patterns.cs:5:10:5:11 | M1 | | Patterns.cs:8:13:8:23 | [true] ... is ... | Patterns.cs:5:10:5:11 | M1 | @@ -5912,6 +6175,7 @@ blockEnclosing | Patterns.cs:95:29:95:38 | [no-match] ... or ... | Patterns.cs:93:17:93:19 | M10 | | Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:93:17:93:19 | M10 | | Patterns.cs:96:9:98:9 | {...} | Patterns.cs:93:17:93:19 | M10 | +| PostDominance.cs:3:7:3:19 | enter PostDominance | PostDominance.cs:3:7:3:19 | PostDominance | | PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:5:10:5:11 | M1 | | PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:10:10:10:11 | M2 | | PostDominance.cs:10:10:10:11 | exit M2 (normal) | PostDominance.cs:10:10:10:11 | M2 | @@ -5925,9 +6189,11 @@ blockEnclosing | PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:17:10:17:11 | M3 | | PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:17:10:17:11 | M3 | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:17:10:17:11 | M3 | +| Qualifiers.cs:1:7:1:16 | enter Qualifiers | Qualifiers.cs:1:7:1:16 | Qualifiers | | Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | Method | | Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | StaticMethod | | Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | M | +| Switch.cs:3:7:3:12 | enter Switch | Switch.cs:3:7:3:12 | Switch | | Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | M1 | | Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | M2 | | Switch.cs:10:10:10:11 | exit M2 | Switch.cs:10:10:10:11 | M2 | @@ -6038,17 +6304,20 @@ blockEnclosing | Switch.cs:156:50:156:52 | "b" | Switch.cs:154:10:154:12 | M15 | | Switch.cs:158:13:158:49 | ...; | Switch.cs:154:10:154:12 | M15 | | Switch.cs:160:13:160:49 | ...; | Switch.cs:154:10:154:12 | M15 | +| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses | | TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:3:10:3:10 | M | | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | M | +| VarDecls.cs:3:7:3:14 | enter VarDecls | VarDecls.cs:3:7:3:14 | VarDecls | | VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | M1 | | VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | M2 | | VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:19:7:19:8 | M3 | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:28:11:28:11 | enter C | VarDecls.cs:28:11:28:11 | C | | VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | Dispose | | cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | Main | | cflow.cs:5:17:5:20 | exit Main (normal) | cflow.cs:5:17:5:20 | Main | @@ -6220,6 +6489,7 @@ blockEnclosing | cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | ControlFlowSub | | cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | ControlFlowSub | | cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | ControlFlowSub | +| cflow.cs:289:7:289:18 | enter DelegateCall | cflow.cs:289:7:289:18 | DelegateCall | | cflow.cs:291:12:291:12 | enter M | cflow.cs:291:12:291:12 | M | | cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | NegationInConstructor | | cflow.cs:298:10:298:10 | enter M | cflow.cs:298:10:298:10 | M | @@ -6227,5 +6497,6 @@ blockEnclosing | cflow.cs:300:44:300:51 | [true] !... | cflow.cs:298:10:298:10 | M | | cflow.cs:300:44:300:64 | ... && ... | cflow.cs:298:10:298:10 | M | | cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:298:10:298:10 | M | +| cflow.cs:304:7:304:18 | enter LambdaGetter | cflow.cs:304:7:304:18 | LambdaGetter | | cflow.cs:306:60:310:5 | enter (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | | cflow.cs:306:60:310:5 | enter get__getter | cflow.cs:306:60:310:5 | get__getter | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected index 62edcbee351..34f82a9381f 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected @@ -1,3 +1,5 @@ +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | call to constructor Object | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | {...} | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:37:5:39 | {...} | AccessorCalls.cs:5:37:5:39 | {...} | | AccessorCalls.cs:7:36:7:38 | {...} | AccessorCalls.cs:7:36:7:38 | {...} | @@ -287,6 +289,8 @@ | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:78:73:78 | access to local variable d | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:78:73:78 | access to local variable d | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:80:73:80 | 1 | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | call to constructor Object | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | {...} | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:3:27:3:27 | 0 | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | ArrayCreation.cs:5:28:5:28 | 0 | @@ -307,6 +311,8 @@ | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:45:9:45 | 2 | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:45:9:45 | 2 | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:48:9:48 | 3 | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | call to constructor Object | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | {...} | | Assert.cs:8:5:12:5 | {...} | Assert.cs:8:5:12:5 | {...} | | Assert.cs:9:9:9:33 | ... ...; | Assert.cs:9:9:9:33 | ... ...; | | Assert.cs:9:16:9:32 | String s = ... | Assert.cs:9:20:9:20 | access to parameter b | @@ -668,6 +674,8 @@ | Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:29:140:30 | access to parameter b2 | | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:33:140:34 | access to parameter b3 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:141:9:141:15 | return ...; | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | call to constructor Object | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | {...} | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:4:5:15:5 | {...} | | Assignments.cs:5:9:5:18 | ... ...; | Assignments.cs:5:9:5:18 | ... ...; | | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:17:5:17 | 0 | @@ -706,6 +714,8 @@ | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:18:5:20:5 | {...} | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:16:19:16 | access to parameter x | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:16:19:16 | access to parameter x | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | call to constructor Object | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | {...} | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:4:5:18:5 | {...} | | BreakInTry.cs:5:9:17:9 | try {...} ... | BreakInTry.cs:5:9:17:9 | try {...} ... | | BreakInTry.cs:6:9:12:9 | {...} | BreakInTry.cs:6:9:12:9 | {...} | @@ -780,6 +790,8 @@ | BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:67:21:67:23 | access to local variable arg | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:28:67:31 | null | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | {...} | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:6:5:8:5 | {...} | | CompileTimeOperators.cs:7:9:7:28 | return ...; | CompileTimeOperators.cs:7:16:7:27 | default(...) | | CompileTimeOperators.cs:7:16:7:27 | default(...) | CompileTimeOperators.cs:7:16:7:27 | default(...) | @@ -793,6 +805,8 @@ | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | {...} | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:29:5:41:5 | {...} | | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | | CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:31:9:34:9 | {...} | @@ -811,6 +825,8 @@ | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:40:32:40:36 | "End" | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:14:40:38 | ...; | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:32:40:36 | "End" | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | {...} | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:3:40:3:49 | call to method ToLower | ConditionalAccess.cs:3:26:3:26 | access to parameter i | @@ -869,6 +885,8 @@ | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:75:41:78 | ", " | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | call to constructor Object | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | {...} | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:4:5:9:5 | {...} | | Conditions.cs:5:9:6:16 | if (...) ... | Conditions.cs:5:9:6:16 | if (...) ... | | Conditions.cs:5:13:5:15 | access to parameter inc | Conditions.cs:5:13:5:15 | access to parameter inc | @@ -1146,6 +1164,8 @@ | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:40:149:43 | "b = " | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:40:149:43 | "b = " | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:45:149:45 | access to local variable s | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | call to constructor Object | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | {...} | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:9:5:12:5 | {...} | | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | ExitMethods.cs:10:20:10:23 | true | | ExitMethods.cs:10:9:10:25 | ...; | ExitMethods.cs:10:9:10:25 | ...; | @@ -1313,6 +1333,8 @@ | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:25:9:25:34 | ...; | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | access to method Parse | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | access to method Parse | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | call to constructor Object | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | {...} | | Finally.cs:8:5:17:5 | {...} | Finally.cs:8:5:17:5 | {...} | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:9:9:16:9 | try {...} ... | | Finally.cs:10:9:12:9 | {...} | Finally.cs:10:9:12:9 | {...} | @@ -1522,6 +1544,12 @@ | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:35:167:36 | "" | | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:17:167:38 | ...; | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:35:167:36 | "" | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | {...} | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | {...} | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | {...} | | Finally.cs:177:5:193:5 | {...} | Finally.cs:177:5:193:5 | {...} | | Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:178:9:192:9 | try {...} ... | | Finally.cs:179:9:181:9 | {...} | Finally.cs:179:9:181:9 | {...} | @@ -1636,6 +1664,8 @@ | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:13 | access to parameter i | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:19 | ...; | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:18:272:18 | 3 | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to constructor Object | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | {...} | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:7:5:10:5 | {...} | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:29:8:32 | access to parameter args | | Foreach.cs:8:22:8:24 | String arg | Foreach.cs:8:22:8:24 | String arg | @@ -1675,6 +1705,7 @@ | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:33:38:33 | Int32 y | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:39:38:42 | access to parameter args | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:39:11:39:11 | ; | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | {...} | | Initializers.cs:5:9:5:9 | access to field F | Initializers.cs:5:9:5:9 | this access | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:9:5:9 | this access | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:5:9:5:9 | this access | @@ -1711,6 +1742,8 @@ | Initializers.cs:15:59:15:60 | "" | Initializers.cs:15:59:15:60 | "" | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:20:18:20 | 1 | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:20:18:20 | 1 | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | call to constructor Object | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | {...} | | Initializers.cs:22:23:22:23 | access to field F | Initializers.cs:22:23:22:23 | this access | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:23:22:23 | this access | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:22:23:22:23 | this access | @@ -1746,6 +1779,10 @@ | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:33:35:33 | access to parameter i | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:33:35:33 | access to parameter i | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:37:35:37 | access to parameter j | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | {...} | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | call to constructor Object | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | {...} | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:52:5:66:5 | {...} | | Initializers.cs:54:9:54:96 | ... ...; | Initializers.cs:54:9:54:96 | ... ...; | | Initializers.cs:54:13:54:95 | Dictionary dict = ... | Initializers.cs:54:20:54:95 | object creation of type Dictionary | @@ -1853,6 +1890,8 @@ | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:50:64:50 | access to parameter i | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:54:64:54 | 0 | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:59:64:61 | "1" | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | {...} | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:8:5:13:5 | {...} | | LoopUnrolling.cs:9:9:10:19 | if (...) ... | LoopUnrolling.cs:9:9:10:19 | if (...) ... | | LoopUnrolling.cs:9:13:9:16 | access to parameter args | LoopUnrolling.cs:9:13:9:16 | access to parameter args | @@ -2025,6 +2064,8 @@ | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:99:31:99:31 | access to local variable x | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:13:99:33 | ...; | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:31:99:31 | access to local variable x | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | {...} | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:7:25:7:39 | {...} | MultiImplementationA.cs:7:25:7:39 | {...} | @@ -2064,14 +2105,20 @@ | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:16:24:16 | this access | | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:16:24:16 | this access | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:34:24:34 | 0 | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | {...} | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:34:30:37 | null | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:34:30:37 | null | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | {...} | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:22:36:25 | null | | MultiImplementationA.cs:36:22:36:25 | null | MultiImplementationA.cs:36:22:36:25 | null | | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:14:37:28 | {...} | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:22:37:25 | null | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:22:37:25 | null | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | {...} | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:25:4:37 | {...} | | MultiImplementationB.cs:4:27:4:35 | return ...; | MultiImplementationB.cs:4:34:4:34 | 1 | @@ -2109,7 +2156,13 @@ | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:16:22:16 | this access | | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:16:22:16 | this access | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:34:22:34 | 1 | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | {...} | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | {...} | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | call to constructor Object | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | {...} | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:28:3:28 | 0 | @@ -2170,6 +2223,8 @@ | PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:16:5:16 | this access | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:34:5:34 | 0 | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | call to constructor Object | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | {...} | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:6:5:43:5 | {...} | | Patterns.cs:7:9:7:24 | ... ...; | Patterns.cs:7:9:7:24 | ... ...; | | Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:7:20:7:23 | null | @@ -2335,6 +2390,8 @@ | Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:97:31:97:37 | "not C" | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:13:97:39 | ...; | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:31:97:37 | "not C" | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | call to constructor Object | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | {...} | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:6:5:8:5 | {...} | | PostDominance.cs:7:9:7:28 | call to method WriteLine | PostDominance.cs:7:27:7:27 | access to parameter s | | PostDominance.cs:7:9:7:29 | ...; | PostDominance.cs:7:9:7:29 | ...; | @@ -2360,6 +2417,8 @@ | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:21:27:21:27 | access to parameter s | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:29 | ...; | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:27:21:27 | access to parameter s | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | call to constructor Object | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | {...} | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:8:41:8:44 | null | Qualifiers.cs:8:41:8:44 | null | | Qualifiers.cs:11:5:31:5 | {...} | Qualifiers.cs:11:5:31:5 | {...} | @@ -2417,6 +2476,8 @@ | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:30:9:30:47 | ...; | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | call to constructor Object | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | {...} | | Switch.cs:6:5:8:5 | {...} | Switch.cs:6:5:8:5 | {...} | | Switch.cs:7:9:7:22 | switch (...) {...} | Switch.cs:7:9:7:22 | switch (...) {...} | | Switch.cs:7:17:7:17 | access to parameter o | Switch.cs:7:17:7:17 | access to parameter o | @@ -2641,6 +2702,8 @@ | Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:40:160:43 | "b = " | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:40:160:43 | "b = " | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:45:160:45 | access to local variable s | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | call to constructor Object | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | {...} | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:4:5:9:5 | {...} | | TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:5:9:5:26 | ... ...; | | TypeAccesses.cs:5:13:5:25 | String s = ... | TypeAccesses.cs:5:25:5:25 | access to parameter o | @@ -2658,6 +2721,8 @@ | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:9:8:28 | ... ...; | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:17:8:27 | typeof(...) | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:17:8:27 | typeof(...) | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | call to constructor Object | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | {...} | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:6:5:11:5 | {...} | | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | | VarDecls.cs:7:22:7:36 | Char* c1 = ... | VarDecls.cs:7:27:7:33 | access to parameter strings | @@ -2698,6 +2763,8 @@ | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:20:25:20 | access to parameter b | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | call to constructor Object | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | {...} | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:51:28:53 | {...} | | cflow.cs:6:5:35:5 | {...} | cflow.cs:6:5:35:5 | {...} | | cflow.cs:7:9:7:28 | ... ...; | cflow.cs:7:9:7:28 | ... ...; | @@ -3282,6 +3349,8 @@ | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:34:286:34 | access to parameter i | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:34 | access to parameter i | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:48:286:50 | {...} | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | call to constructor Object | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | {...} | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:40:291:40 | 0 | @@ -3300,6 +3369,8 @@ | cflow.cs:300:56:300:64 | ... != ... | cflow.cs:300:56:300:56 | access to parameter s | | cflow.cs:300:61:300:64 | null | cflow.cs:300:61:300:64 | null | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:70:300:71 | "" | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | call to constructor Object | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | {...} | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | | cflow.cs:307:5:310:5 | {...} | cflow.cs:307:5:310:5 | {...} | | cflow.cs:308:9:308:21 | ... ...; | cflow.cs:308:9:308:21 | ... ...; | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected index 77a49dbfc47..573d08853b2 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected @@ -1,3 +1,5 @@ +| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | call to constructor Object | normal | +| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | {...} | normal | | AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:30:5:30 | access to parameter i | normal | | AccessorCalls.cs:5:37:5:39 | {...} | AccessorCalls.cs:5:37:5:39 | {...} | normal | | AccessorCalls.cs:7:36:7:38 | {...} | AccessorCalls.cs:7:36:7:38 | {...} | normal | @@ -287,6 +289,8 @@ | AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:78:73:78 | access to local variable d | normal | | AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:78:73:81 | dynamic access to element | normal | | AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:80:73:80 | 1 | normal | +| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | call to constructor Object | normal | +| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | {...} | normal | | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | normal | | ArrayCreation.cs:3:27:3:27 | 0 | ArrayCreation.cs:3:27:3:27 | 0 | normal | | ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | normal | @@ -307,6 +311,8 @@ | ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:43:9:50 | { ..., ... } | normal | | ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:45:9:45 | 2 | normal | | ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:48:9:48 | 3 | normal | +| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | call to constructor Object | normal | +| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | {...} | normal | | Assert.cs:8:5:12:5 | {...} | Assert.cs:10:9:10:31 | call to method Assert | exit | | Assert.cs:8:5:12:5 | {...} | Assert.cs:11:9:11:35 | call to method WriteLine | normal | | Assert.cs:9:9:9:33 | ... ...; | Assert.cs:9:16:9:32 | String s = ... | normal | @@ -801,6 +807,8 @@ | Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:29:140:30 | access to parameter b2 | true | | Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:33:140:34 | access to parameter b3 | normal | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:141:9:141:15 | return ...; | return | +| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | call to constructor Object | normal | +| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | {...} | normal | | Assignments.cs:4:5:15:5 | {...} | Assignments.cs:14:9:14:35 | ... += ... | normal | | Assignments.cs:5:9:5:18 | ... ...; | Assignments.cs:5:13:5:17 | Int32 x = ... | normal | | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:13:5:17 | Int32 x = ... | normal | @@ -839,6 +847,8 @@ | Assignments.cs:18:5:20:5 | {...} | Assignments.cs:19:9:19:17 | return ...; | return | | Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:9:19:17 | return ...; | return | | Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:16:19:16 | access to parameter x | normal | +| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | call to constructor Object | normal | +| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | {...} | normal | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:15:17:15:28 | ... == ... | false | | BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:16:17:16:17 | ; | normal | | BreakInTry.cs:5:9:17:9 | try {...} ... | BreakInTry.cs:15:17:15:28 | ... == ... | false | @@ -964,6 +974,8 @@ | BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:67:21:67:31 | ... == ... | true | | BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:28:67:31 | null | normal | | BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | break | +| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | normal | +| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | {...} | normal | | CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:7:9:7:28 | return ...; | return | | CompileTimeOperators.cs:7:9:7:28 | return ...; | CompileTimeOperators.cs:7:9:7:28 | return ...; | return | | CompileTimeOperators.cs:7:16:7:27 | default(...) | CompileTimeOperators.cs:7:16:7:27 | default(...) | normal | @@ -977,6 +989,8 @@ | CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:22:9:22:25 | return ...; | return | | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | normal | | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | normal | +| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | normal | +| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | {...} | normal | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | goto(End) [normal] (0) | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | throw(Exception) [normal] (0) | | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | @@ -1003,6 +1017,8 @@ | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:32:40:36 | "End" | normal | +| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | normal | +| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | {...} | normal | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | non-null | | ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | null | | ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:26:3:26 | access to parameter i | null | @@ -1087,6 +1103,8 @@ | ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:70:41:83 | ... + ... | normal | | ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:75:41:78 | ", " | normal | | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | normal | +| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | call to constructor Object | normal | +| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | {...} | normal | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:7:13:7:16 | !... | false | | Conditions.cs:4:5:9:5 | {...} | Conditions.cs:8:13:8:15 | ...-- | normal | | Conditions.cs:5:9:6:16 | if (...) ... | Conditions.cs:5:13:5:15 | access to parameter inc | false | @@ -1440,6 +1458,8 @@ | Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:38:149:47 | $"..." | normal | | Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:40:149:43 | "b = " | normal | | Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:45:149:45 | access to local variable s | normal | +| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | call to constructor Object | normal | +| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | {...} | normal | | ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:11:9:11:15 | return ...; | return | | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | normal | | ExitMethods.cs:10:9:10:25 | ...; | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | normal | @@ -1641,6 +1661,8 @@ | Extensions.cs:25:9:25:34 | ...; | Extensions.cs:25:9:25:33 | call to method ToBool | normal | | Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | access to method Parse | normal | | Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | delegate creation of type Func | normal | +| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | call to constructor Object | normal | +| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | {...} | normal | | Finally.cs:8:5:17:5 | {...} | Finally.cs:15:13:15:40 | call to method WriteLine | normal | | Finally.cs:8:5:17:5 | {...} | Finally.cs:15:13:15:40 | call to method WriteLine | throw(Exception) [normal] (0) | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:15:13:15:40 | call to method WriteLine | normal | @@ -2028,6 +2050,12 @@ | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:17:167:37 | call to method WriteLine | normal | | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:17:167:37 | call to method WriteLine | normal | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:35:167:36 | "" | normal | +| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | call to constructor Exception | normal | +| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | {...} | normal | +| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | call to constructor Exception | normal | +| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | {...} | normal | +| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | call to constructor Exception | normal | +| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | {...} | normal | | Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | false | | Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | throw(Exception) [false] (0) | | Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | throw(ExceptionA) [false] (0) | @@ -2271,6 +2299,8 @@ | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:18 | ... = ... | normal | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:18 | ... = ... | normal | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:18:272:18 | 3 | normal | +| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to constructor Object | normal | +| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | {...} | normal | | Foreach.cs:7:5:10:5 | {...} | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | empty | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | empty | | Foreach.cs:8:22:8:24 | String arg | Foreach.cs:8:22:8:24 | String arg | normal | @@ -2313,6 +2343,7 @@ | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:33:38:33 | Int32 y | normal | | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:39:38:42 | access to parameter args | normal | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:39:11:39:11 | ; | normal | +| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | {...} | normal | | Initializers.cs:5:9:5:9 | access to field F | Initializers.cs:5:9:5:9 | this access | normal | | Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:9:5:9 | this access | normal | | Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:5:9:5:17 | ... = ... | normal | @@ -2349,6 +2380,8 @@ | Initializers.cs:15:59:15:60 | "" | Initializers.cs:15:59:15:60 | "" | normal | | Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:16:18:20 | ... = ... | normal | | Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:20:18:20 | 1 | normal | +| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | call to constructor Object | normal | +| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | {...} | normal | | Initializers.cs:22:23:22:23 | access to field F | Initializers.cs:22:23:22:23 | this access | normal | | Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:23:22:23 | this access | normal | | Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:22:23:22:27 | ... = ... | normal | @@ -2384,6 +2417,10 @@ | Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:33:35:33 | access to parameter i | normal | | Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:33:35:37 | ... + ... | normal | | Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:37:35:37 | access to parameter j | normal | +| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | call to constructor Object | normal | +| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | {...} | normal | +| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | call to constructor Object | normal | +| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | {...} | normal | | Initializers.cs:52:5:66:5 | {...} | Initializers.cs:57:13:65:9 | Compound compound = ... | normal | | Initializers.cs:54:9:54:96 | ... ...; | Initializers.cs:54:13:54:95 | Dictionary dict = ... | normal | | Initializers.cs:54:13:54:95 | Dictionary dict = ... | Initializers.cs:54:13:54:95 | Dictionary dict = ... | normal | @@ -2491,6 +2528,8 @@ | Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:50:64:54 | ... + ... | normal | | Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:54:64:54 | 0 | normal | | Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:59:64:61 | "1" | normal | +| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | normal | +| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | {...} | normal | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:10:13:10:19 | return ...; | return | | LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | empty | | LoopUnrolling.cs:9:9:10:19 | if (...) ... | LoopUnrolling.cs:9:13:9:28 | ... == ... | false | @@ -2677,6 +2716,8 @@ | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | normal | | LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | normal | | LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:31:99:31 | access to local variable x | normal | +| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | normal | +| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | {...} | normal | | MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | throw ... | throw(NullReferenceException) | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:28:6:31 | null | normal | | MultiImplementationA.cs:7:25:7:39 | {...} | MultiImplementationA.cs:7:27:7:37 | throw ...; | throw(NullReferenceException) | @@ -2716,14 +2757,20 @@ | MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:16:24:16 | this access | normal | | MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:32:24:34 | ... = ... | normal | | MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:34:24:34 | 0 | normal | +| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | normal | +| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | {...} | normal | | MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:28:30:37 | throw ... | throw(NullReferenceException) | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:34:30:37 | null | normal | +| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | normal | +| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | {...} | normal | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:16:36:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:16:36:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:36:22:36:25 | null | MultiImplementationA.cs:36:22:36:25 | null | normal | | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:16:37:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:16:37:26 | throw ...; | throw(NullReferenceException) | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:22:37:25 | null | normal | +| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | normal | +| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | {...} | normal | | MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | normal | | MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:27:4:35 | return ...; | return | | MultiImplementationB.cs:4:27:4:35 | return ...; | MultiImplementationB.cs:4:27:4:35 | return ...; | return | @@ -2761,7 +2808,13 @@ | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:16:22:16 | this access | normal | | MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:32:22:34 | ... = ... | normal | | MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:34:22:34 | 1 | normal | +| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | normal | +| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | {...} | normal | +| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | normal | +| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | {...} | normal | | MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | normal | +| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | call to constructor Object | normal | +| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | {...} | normal | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | non-null | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | null | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:28 | ... ?? ... | normal | @@ -2838,6 +2891,8 @@ | PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:16:5:16 | this access | normal | | PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:32:5:34 | ... = ... | normal | | PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:34:5:34 | 0 | normal | +| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | call to constructor Object | normal | +| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | {...} | normal | | Patterns.cs:6:5:43:5 | {...} | Patterns.cs:40:17:40:17 | access to local variable o | normal | | Patterns.cs:7:9:7:24 | ... ...; | Patterns.cs:7:16:7:23 | Object o = ... | normal | | Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:7:16:7:23 | Object o = ... | normal | @@ -3063,6 +3118,8 @@ | Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | | Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | | Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:31:97:37 | "not C" | normal | +| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | call to constructor Object | normal | +| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | {...} | normal | | PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | | PostDominance.cs:7:9:7:28 | call to method WriteLine | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | | PostDominance.cs:7:9:7:29 | ...; | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | @@ -3096,6 +3153,8 @@ | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:21:9:21:28 | call to method WriteLine | normal | | PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:28 | call to method WriteLine | normal | | PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:27:21:27 | access to parameter s | normal | +| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | call to constructor Object | normal | +| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | {...} | normal | | Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:28:7:31 | null | normal | | Qualifiers.cs:8:41:8:44 | null | Qualifiers.cs:8:41:8:44 | null | normal | | Qualifiers.cs:11:5:31:5 | {...} | Qualifiers.cs:30:9:30:46 | ... = ... | normal | @@ -3153,6 +3212,8 @@ | Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:30:9:30:46 | ... = ... | normal | | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | normal | | Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:46 | call to method Method | normal | +| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | call to constructor Object | normal | +| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | {...} | normal | | Switch.cs:6:5:8:5 | {...} | Switch.cs:7:17:7:17 | access to parameter o | normal | | Switch.cs:7:9:7:22 | switch (...) {...} | Switch.cs:7:17:7:17 | access to parameter o | normal | | Switch.cs:7:17:7:17 | access to parameter o | Switch.cs:7:17:7:17 | access to parameter o | normal | @@ -3511,6 +3572,8 @@ | Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:38:160:47 | $"..." | normal | | Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:40:160:43 | "b = " | normal | | Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:45:160:45 | access to local variable s | normal | +| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | call to constructor Object | normal | +| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | {...} | normal | | TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | | TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:5:13:5:25 | String s = ... | normal | | TypeAccesses.cs:5:13:5:25 | String s = ... | TypeAccesses.cs:5:13:5:25 | String s = ... | normal | @@ -3531,6 +3594,8 @@ | TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | | TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | | TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:17:8:27 | typeof(...) | normal | +| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | call to constructor Object | normal | +| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | {...} | normal | | VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:9:13:9:29 | return ...; | return | | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | VarDecls.cs:9:13:9:29 | return ...; | return | | VarDecls.cs:7:22:7:36 | Char* c1 = ... | VarDecls.cs:7:22:7:36 | Char* c1 = ... | normal | @@ -3572,6 +3637,8 @@ | VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:20:25:28 | ... ? ... : ... | normal | | VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | normal | | VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | normal | +| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | call to constructor Object | normal | +| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | {...} | normal | | VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:51:28:53 | {...} | normal | | cflow.cs:6:5:35:5 | {...} | cflow.cs:24:25:24:31 | ... <= ... | false | | cflow.cs:7:9:7:28 | ... ...; | cflow.cs:7:13:7:27 | Int32 a = ... | normal | @@ -4287,6 +4354,8 @@ | cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:34:286:34 | access to parameter i | normal | | cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:45 | call to method ToString | normal | | cflow.cs:286:48:286:50 | {...} | cflow.cs:286:48:286:50 | {...} | normal | +| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | call to constructor Object | normal | +| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | {...} | normal | | cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:38:291:38 | access to parameter f | normal | | cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:38:291:41 | delegate call | normal | | cflow.cs:291:40:291:40 | 0 | cflow.cs:291:40:291:40 | 0 | normal | @@ -4307,6 +4376,8 @@ | cflow.cs:300:56:300:64 | ... != ... | cflow.cs:300:56:300:64 | ... != ... | normal | | cflow.cs:300:61:300:64 | null | cflow.cs:300:61:300:64 | null | normal | | cflow.cs:300:70:300:71 | "" | cflow.cs:300:70:300:71 | "" | normal | +| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | call to constructor Object | normal | +| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | {...} | normal | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | normal | | cflow.cs:307:5:310:5 | {...} | cflow.cs:309:9:309:17 | return ...; | return | | cflow.cs:308:9:308:21 | ... ...; | cflow.cs:308:16:308:20 | Object x = ... | normal | diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index d5c2e78587d..502acfb87b7 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -1,4 +1,18 @@ AccessorCalls.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter AccessorCalls +#-----| -> call to constructor Object + +# 1| exit AccessorCalls + +# 1| exit AccessorCalls (normal) +#-----| -> exit AccessorCalls + +# 1| {...} +#-----| -> exit AccessorCalls (normal) + # 5| enter get_Item #-----| -> access to parameter i @@ -929,6 +943,20 @@ AccessorCalls.cs: #-----| -> dynamic access to element ArrayCreation.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter ArrayCreation +#-----| -> call to constructor Object + +# 1| exit ArrayCreation + +# 1| exit ArrayCreation (normal) +#-----| -> exit ArrayCreation + +# 1| {...} +#-----| -> exit ArrayCreation (normal) + # 3| enter M1 #-----| -> 0 @@ -1022,6 +1050,20 @@ ArrayCreation.cs: #-----| -> { ..., ... } Assert.cs: +# 5| call to constructor Object +#-----| -> {...} + +# 5| enter AssertTests +#-----| -> call to constructor Object + +# 5| exit AssertTests + +# 5| exit AssertTests (normal) +#-----| -> exit AssertTests + +# 5| {...} +#-----| -> exit AssertTests (normal) + # 7| enter M1 #-----| -> {...} @@ -2794,6 +2836,20 @@ Assert.cs: #-----| return -> exit M13 (normal) Assignments.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter Assignments +#-----| -> call to constructor Object + +# 1| exit Assignments + +# 1| exit Assignments (normal) +#-----| -> exit Assignments + +# 1| {...} +#-----| -> exit Assignments (normal) + # 3| enter M #-----| -> {...} @@ -2924,6 +2980,20 @@ Assignments.cs: #-----| -> return ...; BreakInTry.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter BreakInTry +#-----| -> call to constructor Object + +# 1| exit BreakInTry + +# 1| exit BreakInTry (normal) +#-----| -> exit BreakInTry + +# 1| {...} +#-----| -> exit BreakInTry (normal) + # 3| enter M1 #-----| -> {...} @@ -3274,6 +3344,20 @@ BreakInTry.cs: #-----| break -> exit M4 (normal) CompileTimeOperators.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter CompileTimeOperators +#-----| -> call to constructor Object + +# 3| exit CompileTimeOperators + +# 3| exit CompileTimeOperators (normal) +#-----| -> exit CompileTimeOperators + +# 3| {...} +#-----| -> exit CompileTimeOperators (normal) + # 5| enter Default #-----| -> {...} @@ -3342,6 +3426,20 @@ CompileTimeOperators.cs: # 22| nameof(...) #-----| -> return ...; +# 26| call to constructor Object +#-----| -> {...} + +# 26| enter GotoInTryFinally +#-----| -> call to constructor Object + +# 26| exit GotoInTryFinally + +# 26| exit GotoInTryFinally (normal) +#-----| -> exit GotoInTryFinally + +# 26| {...} +#-----| -> exit GotoInTryFinally (normal) + # 28| enter M #-----| -> {...} @@ -3387,6 +3485,20 @@ CompileTimeOperators.cs: #-----| -> call to method WriteLine ConditionalAccess.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter ConditionalAccess +#-----| -> call to constructor Object + +# 1| exit ConditionalAccess + +# 1| exit ConditionalAccess (normal) +#-----| -> exit ConditionalAccess + +# 1| {...} +#-----| -> exit ConditionalAccess (normal) + # 3| enter M1 #-----| -> access to parameter i @@ -3657,6 +3769,20 @@ ConditionalAccess.cs: #-----| -> ... + ... Conditions.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter Conditions +#-----| -> call to constructor Object + +# 1| exit Conditions + +# 1| exit Conditions (normal) +#-----| -> exit Conditions + +# 1| {...} +#-----| -> exit Conditions (normal) + # 3| enter IncrOrDecr #-----| -> {...} @@ -4866,6 +4992,20 @@ Conditions.cs: #-----| -> $"..." ExitMethods.cs: +# 6| call to constructor Object +#-----| -> {...} + +# 6| enter ExitMethods +#-----| -> call to constructor Object + +# 6| exit ExitMethods + +# 6| exit ExitMethods (normal) +#-----| -> exit ExitMethods + +# 6| {...} +#-----| -> exit ExitMethods (normal) + # 8| enter M1 #-----| -> {...} @@ -5537,6 +5677,20 @@ Extensions.cs: #-----| -> call to method ToBool Finally.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter Finally +#-----| -> call to constructor Object + +# 3| exit Finally + +# 3| exit Finally (normal) +#-----| -> exit Finally + +# 3| {...} +#-----| -> exit Finally (normal) + # 7| enter M1 #-----| -> {...} @@ -7019,6 +7173,48 @@ Finally.cs: # 167| [finally: exception(Exception)] "" #-----| -> [finally: exception(Exception)] call to method WriteLine +# 172| call to constructor Exception +#-----| -> {...} + +# 172| enter ExceptionA +#-----| -> call to constructor Exception + +# 172| exit ExceptionA + +# 172| exit ExceptionA (normal) +#-----| -> exit ExceptionA + +# 172| {...} +#-----| -> exit ExceptionA (normal) + +# 173| call to constructor Exception +#-----| -> {...} + +# 173| enter ExceptionB +#-----| -> call to constructor Exception + +# 173| exit ExceptionB + +# 173| exit ExceptionB (normal) +#-----| -> exit ExceptionB + +# 173| {...} +#-----| -> exit ExceptionB (normal) + +# 174| call to constructor Exception +#-----| -> {...} + +# 174| enter ExceptionC +#-----| -> call to constructor Exception + +# 174| exit ExceptionC + +# 174| exit ExceptionC (normal) +#-----| -> exit ExceptionC + +# 174| {...} +#-----| -> exit ExceptionC (normal) + # 176| enter M9 #-----| -> {...} @@ -7915,6 +8111,20 @@ Finally.cs: #-----| -> [finally: exception(Exception)] ... + ... Foreach.cs: +# 4| call to constructor Object +#-----| -> {...} + +# 4| enter Foreach +#-----| -> call to constructor Object + +# 4| exit Foreach + +# 4| exit Foreach (normal) +#-----| -> exit Foreach + +# 4| {...} +#-----| -> exit Foreach (normal) + # 6| enter M1 #-----| -> {...} @@ -8089,6 +8299,17 @@ Foreach.cs: #-----| -> foreach (... ... in ...) ... Initializers.cs: +# 3| enter Initializers +#-----| -> {...} + +# 3| exit Initializers + +# 3| exit Initializers (normal) +#-----| -> exit Initializers + +# 3| {...} +#-----| -> exit Initializers (normal) + # 5| this access #-----| -> access to field H @@ -8262,14 +8483,20 @@ Initializers.cs: # 18| 1 #-----| -> ... = ... -# 20| enter NoConstructor +# 20| call to constructor Object #-----| -> this access +# 20| enter NoConstructor +#-----| -> call to constructor Object + # 20| exit NoConstructor # 20| exit NoConstructor (normal) #-----| -> exit NoConstructor +# 20| {...} +#-----| -> exit NoConstructor (normal) + # 22| this access #-----| -> 0 @@ -8283,7 +8510,7 @@ Initializers.cs: #-----| -> 1 # 23| ... = ... -#-----| -> exit NoConstructor (normal) +#-----| -> {...} # 23| 1 #-----| -> ... = ... @@ -8390,6 +8617,34 @@ Initializers.cs: # 35| access to parameter j #-----| -> ... + ... +# 39| call to constructor Object +#-----| -> {...} + +# 39| enter IndexInitializers +#-----| -> call to constructor Object + +# 39| exit IndexInitializers + +# 39| exit IndexInitializers (normal) +#-----| -> exit IndexInitializers + +# 39| {...} +#-----| -> exit IndexInitializers (normal) + +# 41| call to constructor Object +#-----| -> {...} + +# 41| enter Compound +#-----| -> call to constructor Object + +# 41| exit Compound + +# 41| exit Compound (normal) +#-----| -> exit Compound + +# 41| {...} +#-----| -> exit Compound (normal) + # 51| enter Test #-----| -> {...} @@ -8705,6 +8960,20 @@ Initializers.cs: #-----| -> ... = ... LoopUnrolling.cs: +# 5| call to constructor Object +#-----| -> {...} + +# 5| enter LoopUnrolling +#-----| -> call to constructor Object + +# 5| exit LoopUnrolling + +# 5| exit LoopUnrolling (normal) +#-----| -> exit LoopUnrolling + +# 5| {...} +#-----| -> exit LoopUnrolling (normal) + # 7| enter M1 #-----| -> {...} @@ -9320,6 +9589,13 @@ LoopUnrolling.cs: #-----| -> call to method WriteLine MultiImplementationA.cs: +# 4| call to constructor Object +#-----| -> {...} + +# 4| {...} +#-----| -> exit C1 (normal) +#-----| -> exit C1 (normal) + # 6| throw ... #-----| exception(NullReferenceException) -> exit get_P1 (abnormal) #-----| exception(NullReferenceException) -> exit get_P1 (abnormal) @@ -9381,6 +9657,12 @@ MultiImplementationA.cs: #-----| -> exit set_Item (normal) #-----| -> exit set_Item (normal) +# 16| exit M1 + +MultiImplementationB.cs: +# 14| exit M1 + +MultiImplementationA.cs: # 17| {...} #-----| -> M2(...) @@ -9448,6 +9730,13 @@ MultiImplementationA.cs: # 24| 0 #-----| -> access to property P +# 28| call to constructor Object +#-----| -> {...} + +# 28| {...} +#-----| -> exit C3 (normal) +#-----| -> exit C3 (normal) + # 30| throw ... #-----| exception(NullReferenceException) -> exit get_P3 (abnormal) #-----| exception(NullReferenceException) -> exit get_P3 (abnormal) @@ -9455,6 +9744,13 @@ MultiImplementationA.cs: # 30| null #-----| -> throw ... +# 34| call to constructor Object +#-----| -> {...} + +# 34| {...} +#-----| -> exit C4 (normal) +#-----| -> exit C4 (normal) + # 36| {...} #-----| -> null @@ -9483,6 +9779,39 @@ MultiImplementationA.cs: #-----| -> throw ...; MultiImplementationB.cs: +# 1| call to constructor Object +#-----| -> {...} + +MultiImplementationA.cs: +# 4| enter C1 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationB.cs: +# 1| enter C1 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationA.cs: +# 4| exit C1 + +MultiImplementationB.cs: +# 1| exit C1 + +MultiImplementationA.cs: +# 4| exit C1 (normal) +#-----| -> exit C1 +#-----| -> exit C1 + +MultiImplementationB.cs: +# 1| exit C1 (normal) +#-----| -> exit C1 +#-----| -> exit C1 + +# 1| {...} +#-----| -> exit C1 (normal) +#-----| -> exit C1 (normal) + # 3| 0 #-----| -> exit get_P1 (normal) #-----| -> exit get_P1 (normal) @@ -9787,12 +10116,6 @@ MultiImplementationB.cs: #-----| -> {...} #-----| -> {...} -MultiImplementationA.cs: -# 16| exit M1 - -MultiImplementationB.cs: -# 14| exit M1 - MultiImplementationA.cs: # 16| exit M1 (normal) #-----| -> exit M1 @@ -10010,6 +10333,39 @@ MultiImplementationB.cs: # 22| 1 #-----| -> access to property P +# 25| call to constructor Object +#-----| -> {...} + +MultiImplementationA.cs: +# 28| enter C3 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationB.cs: +# 25| enter C3 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationA.cs: +# 28| exit C3 + +MultiImplementationB.cs: +# 25| exit C3 + +MultiImplementationA.cs: +# 28| exit C3 (normal) +#-----| -> exit C3 +#-----| -> exit C3 + +MultiImplementationB.cs: +# 25| exit C3 (normal) +#-----| -> exit C3 +#-----| -> exit C3 + +# 25| {...} +#-----| -> exit C3 (normal) +#-----| -> exit C3 (normal) + MultiImplementationA.cs: # 30| enter get_P3 #-----| -> null @@ -10034,6 +10390,39 @@ MultiImplementationB.cs: #-----| -> exit get_P3 #-----| -> exit get_P3 +# 30| call to constructor Object +#-----| -> {...} + +MultiImplementationA.cs: +# 34| enter C4 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationB.cs: +# 30| enter C4 +#-----| -> call to constructor Object +#-----| -> call to constructor Object + +MultiImplementationA.cs: +# 34| exit C4 + +MultiImplementationB.cs: +# 30| exit C4 + +MultiImplementationA.cs: +# 34| exit C4 (normal) +#-----| -> exit C4 +#-----| -> exit C4 + +MultiImplementationB.cs: +# 30| exit C4 (normal) +#-----| -> exit C4 +#-----| -> exit C4 + +# 30| {...} +#-----| -> exit C4 (normal) +#-----| -> exit C4 (normal) + MultiImplementationA.cs: # 36| enter M1 #-----| -> {...} @@ -10075,6 +10464,20 @@ MultiImplementationB.cs: #-----| -> exit M1 (normal) NullCoalescing.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter NullCoalescing +#-----| -> call to constructor Object + +# 1| exit NullCoalescing + +# 1| exit NullCoalescing (normal) +#-----| -> exit NullCoalescing + +# 1| {...} +#-----| -> exit NullCoalescing (normal) + # 3| enter M1 #-----| -> access to parameter i @@ -10355,6 +10758,20 @@ PartialImplementationB.cs: #-----| -> access to property P Patterns.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter Patterns +#-----| -> call to constructor Object + +# 3| exit Patterns + +# 3| exit Patterns (normal) +#-----| -> exit Patterns + +# 3| {...} +#-----| -> exit Patterns (normal) + # 5| enter M1 #-----| -> {...} @@ -10995,6 +11412,20 @@ Patterns.cs: #-----| -> call to method WriteLine PostDominance.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter PostDominance +#-----| -> call to constructor Object + +# 3| exit PostDominance + +# 3| exit PostDominance (normal) +#-----| -> exit PostDominance + +# 3| {...} +#-----| -> exit PostDominance (normal) + # 5| enter M1 #-----| -> {...} @@ -11103,6 +11534,20 @@ PostDominance.cs: #-----| -> call to method WriteLine Qualifiers.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter Qualifiers +#-----| -> call to constructor Object + +# 1| exit Qualifiers + +# 1| exit Qualifiers (normal) +#-----| -> exit Qualifiers + +# 1| {...} +#-----| -> exit Qualifiers (normal) + # 7| enter Method #-----| -> null @@ -11299,6 +11744,20 @@ Qualifiers.cs: #-----| -> ... = ... Switch.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter Switch +#-----| -> call to constructor Object + +# 3| exit Switch + +# 3| exit Switch (normal) +#-----| -> exit Switch + +# 3| {...} +#-----| -> exit Switch (normal) + # 5| enter M1 #-----| -> {...} @@ -12144,6 +12603,20 @@ Switch.cs: #-----| -> $"..." TypeAccesses.cs: +# 1| call to constructor Object +#-----| -> {...} + +# 1| enter TypeAccesses +#-----| -> call to constructor Object + +# 1| exit TypeAccesses + +# 1| exit TypeAccesses (normal) +#-----| -> exit TypeAccesses + +# 1| {...} +#-----| -> exit TypeAccesses (normal) + # 3| enter M #-----| -> {...} @@ -12208,6 +12681,20 @@ TypeAccesses.cs: #-----| -> Type t = ... VarDecls.cs: +# 3| call to constructor Object +#-----| -> {...} + +# 3| enter VarDecls +#-----| -> call to constructor Object + +# 3| exit VarDecls + +# 3| exit VarDecls (normal) +#-----| -> exit VarDecls + +# 3| {...} +#-----| -> exit VarDecls (normal) + # 5| enter M1 #-----| -> {...} @@ -12353,6 +12840,20 @@ VarDecls.cs: # 25| access to local variable y #-----| -> ... ? ... : ... +# 28| call to constructor Object +#-----| -> {...} + +# 28| enter C +#-----| -> call to constructor Object + +# 28| exit C + +# 28| exit C (normal) +#-----| -> exit C + +# 28| {...} +#-----| -> exit C (normal) + # 28| enter Dispose #-----| -> {...} @@ -14376,6 +14877,20 @@ cflow.cs: # 286| {...} #-----| -> exit ControlFlowSub (normal) +# 289| call to constructor Object +#-----| -> {...} + +# 289| enter DelegateCall +#-----| -> call to constructor Object + +# 289| exit DelegateCall + +# 289| exit DelegateCall (normal) +#-----| -> exit DelegateCall + +# 289| {...} +#-----| -> exit DelegateCall (normal) + # 291| enter M #-----| -> access to parameter f @@ -14458,6 +14973,20 @@ cflow.cs: # 300| "" #-----| -> object creation of type NegationInConstructor +# 304| call to constructor Object +#-----| -> {...} + +# 304| enter LambdaGetter +#-----| -> call to constructor Object + +# 304| exit LambdaGetter + +# 304| exit LambdaGetter (normal) +#-----| -> exit LambdaGetter + +# 304| {...} +#-----| -> exit LambdaGetter (normal) + # 306| (...) => ... #-----| -> exit get__getter (normal) diff --git a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected index c5ffb215b4b..0dc443fa623 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -1027,6 +1027,7 @@ finallyNode | cflow.cs:275:13:275:42 | [finally: return] ...; | cflow.cs:268:9:276:9 | try {...} ... | | cflow.cs:275:31:275:40 | [finally: return] "not dead" | cflow.cs:268:9:276:9 | try {...} ... | entryPoint +| AccessorCalls.cs:1:7:1:19 | AccessorCalls | AccessorCalls.cs:1:7:1:19 | call to constructor Object | | AccessorCalls.cs:5:23:5:25 | get_Item | AccessorCalls.cs:5:30:5:30 | access to parameter i | | AccessorCalls.cs:5:33:5:35 | set_Item | AccessorCalls.cs:5:37:5:39 | {...} | | AccessorCalls.cs:7:32:7:34 | add_Event | AccessorCalls.cs:7:36:7:38 | {...} | @@ -1040,10 +1041,12 @@ entryPoint | AccessorCalls.cs:56:10:56:11 | M7 | AccessorCalls.cs:57:5:59:5 | {...} | | AccessorCalls.cs:61:10:61:11 | M8 | AccessorCalls.cs:62:5:64:5 | {...} | | AccessorCalls.cs:66:10:66:11 | M9 | AccessorCalls.cs:67:5:74:5 | {...} | +| ArrayCreation.cs:1:7:1:19 | ArrayCreation | ArrayCreation.cs:1:7:1:19 | call to constructor Object | | ArrayCreation.cs:3:11:3:12 | M1 | ArrayCreation.cs:3:27:3:27 | 0 | | ArrayCreation.cs:5:12:5:13 | M2 | ArrayCreation.cs:5:28:5:28 | 0 | | ArrayCreation.cs:7:11:7:12 | M3 | ArrayCreation.cs:7:19:7:36 | 2 | | ArrayCreation.cs:9:12:9:13 | M4 | ArrayCreation.cs:9:20:9:52 | 2 | +| Assert.cs:5:7:5:17 | AssertTests | Assert.cs:5:7:5:17 | call to constructor Object | | Assert.cs:7:10:7:11 | M1 | Assert.cs:8:5:12:5 | {...} | | Assert.cs:14:10:14:11 | M2 | Assert.cs:15:5:19:5 | {...} | | Assert.cs:21:10:21:11 | M3 | Assert.cs:22:5:26:5 | {...} | @@ -1058,18 +1061,23 @@ entryPoint | Assert.cs:84:10:84:12 | M12 | Assert.cs:85:5:129:5 | {...} | | Assert.cs:131:18:131:32 | AssertTrueFalse | Assert.cs:135:5:136:5 | {...} | | Assert.cs:138:10:138:12 | M13 | Assert.cs:139:5:142:5 | {...} | +| Assignments.cs:1:7:1:17 | Assignments | Assignments.cs:1:7:1:17 | call to constructor Object | | Assignments.cs:3:10:3:10 | M | Assignments.cs:4:5:15:5 | {...} | | Assignments.cs:14:18:14:35 | (...) => ... | Assignments.cs:14:33:14:35 | {...} | | Assignments.cs:17:40:17:40 | + | Assignments.cs:18:5:20:5 | {...} | +| BreakInTry.cs:1:7:1:16 | BreakInTry | BreakInTry.cs:1:7:1:16 | call to constructor Object | | BreakInTry.cs:3:10:3:11 | M1 | BreakInTry.cs:4:5:18:5 | {...} | | BreakInTry.cs:20:10:20:11 | M2 | BreakInTry.cs:21:5:36:5 | {...} | | BreakInTry.cs:38:10:38:11 | M3 | BreakInTry.cs:39:5:54:5 | {...} | | BreakInTry.cs:56:10:56:11 | M4 | BreakInTry.cs:57:5:71:5 | {...} | +| CompileTimeOperators.cs:3:7:3:26 | CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | | CompileTimeOperators.cs:5:9:5:15 | Default | CompileTimeOperators.cs:6:5:8:5 | {...} | | CompileTimeOperators.cs:10:9:10:14 | Sizeof | CompileTimeOperators.cs:11:5:13:5 | {...} | | CompileTimeOperators.cs:15:10:15:15 | Typeof | CompileTimeOperators.cs:16:5:18:5 | {...} | | CompileTimeOperators.cs:20:12:20:17 | Nameof | CompileTimeOperators.cs:21:5:23:5 | {...} | +| CompileTimeOperators.cs:26:7:26:22 | GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | | CompileTimeOperators.cs:28:10:28:10 | M | CompileTimeOperators.cs:29:5:41:5 | {...} | +| ConditionalAccess.cs:1:7:1:23 | ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | | ConditionalAccess.cs:3:12:3:13 | M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | | ConditionalAccess.cs:5:10:5:11 | M2 | ConditionalAccess.cs:5:26:5:26 | access to parameter s | | ConditionalAccess.cs:7:10:7:11 | M3 | ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | @@ -1080,6 +1088,7 @@ entryPoint | ConditionalAccess.cs:30:10:30:12 | Out | ConditionalAccess.cs:30:32:30:32 | 0 | | ConditionalAccess.cs:32:10:32:11 | M8 | ConditionalAccess.cs:33:5:36:5 | {...} | | ConditionalAccess.cs:41:26:41:38 | CommaJoinWith | ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | +| Conditions.cs:1:7:1:16 | Conditions | Conditions.cs:1:7:1:16 | call to constructor Object | | Conditions.cs:3:10:3:19 | IncrOrDecr | Conditions.cs:4:5:9:5 | {...} | | Conditions.cs:11:9:11:10 | M1 | Conditions.cs:12:5:20:5 | {...} | | Conditions.cs:22:9:22:10 | M2 | Conditions.cs:23:5:31:5 | {...} | @@ -1092,6 +1101,7 @@ entryPoint | Conditions.cs:113:10:113:11 | M9 | Conditions.cs:114:5:124:5 | {...} | | Conditions.cs:129:10:129:12 | M10 | Conditions.cs:130:5:141:5 | {...} | | Conditions.cs:143:10:143:12 | M11 | Conditions.cs:144:5:150:5 | {...} | +| ExitMethods.cs:6:7:6:17 | ExitMethods | ExitMethods.cs:6:7:6:17 | call to constructor Object | | ExitMethods.cs:8:10:8:11 | M1 | ExitMethods.cs:9:5:12:5 | {...} | | ExitMethods.cs:14:10:14:11 | M2 | ExitMethods.cs:15:5:18:5 | {...} | | ExitMethods.cs:20:10:20:11 | M3 | ExitMethods.cs:21:5:24:5 | {...} | @@ -1118,6 +1128,7 @@ entryPoint | Extensions.cs:10:24:10:29 | ToBool | Extensions.cs:11:5:13:5 | {...} | | Extensions.cs:15:23:15:33 | CallToInt32 | Extensions.cs:15:48:15:50 | "0" | | Extensions.cs:20:17:20:20 | Main | Extensions.cs:21:5:26:5 | {...} | +| Finally.cs:3:14:3:20 | Finally | Finally.cs:3:14:3:20 | call to constructor Object | | Finally.cs:7:10:7:11 | M1 | Finally.cs:8:5:17:5 | {...} | | Finally.cs:19:10:19:11 | M2 | Finally.cs:20:5:52:5 | {...} | | Finally.cs:54:10:54:11 | M3 | Finally.cs:55:5:72:5 | {...} | @@ -1126,25 +1137,33 @@ entryPoint | Finally.cs:121:10:121:11 | M6 | Finally.cs:122:5:131:5 | {...} | | Finally.cs:133:10:133:11 | M7 | Finally.cs:134:5:145:5 | {...} | | Finally.cs:147:10:147:11 | M8 | Finally.cs:148:5:170:5 | {...} | +| Finally.cs:172:11:172:20 | ExceptionA | Finally.cs:172:11:172:20 | call to constructor Exception | +| Finally.cs:173:11:173:20 | ExceptionB | Finally.cs:173:11:173:20 | call to constructor Exception | +| Finally.cs:174:11:174:20 | ExceptionC | Finally.cs:174:11:174:20 | call to constructor Exception | | Finally.cs:176:10:176:11 | M9 | Finally.cs:177:5:193:5 | {...} | | Finally.cs:195:10:195:12 | M10 | Finally.cs:196:5:214:5 | {...} | | Finally.cs:216:10:216:12 | M11 | Finally.cs:217:5:231:5 | {...} | | Finally.cs:233:10:233:12 | M12 | Finally.cs:234:5:261:5 | {...} | | Finally.cs:263:10:263:12 | M13 | Finally.cs:264:5:274:5 | {...} | +| Foreach.cs:4:7:4:13 | Foreach | Foreach.cs:4:7:4:13 | call to constructor Object | | Foreach.cs:6:10:6:11 | M1 | Foreach.cs:7:5:10:5 | {...} | | Foreach.cs:12:10:12:11 | M2 | Foreach.cs:13:5:16:5 | {...} | | Foreach.cs:18:10:18:11 | M3 | Foreach.cs:19:5:22:5 | {...} | | Foreach.cs:24:10:24:11 | M4 | Foreach.cs:25:5:28:5 | {...} | | Foreach.cs:30:10:30:11 | M5 | Foreach.cs:31:5:34:5 | {...} | | Foreach.cs:36:10:36:11 | M6 | Foreach.cs:37:5:40:5 | {...} | +| Initializers.cs:3:7:3:18 | Initializers | Initializers.cs:3:7:3:18 | {...} | | Initializers.cs:8:5:8:16 | Initializers | Initializers.cs:8:5:8:16 | call to constructor Object | | Initializers.cs:10:5:10:16 | Initializers | Initializers.cs:10:5:10:16 | call to constructor Object | | Initializers.cs:12:10:12:10 | M | Initializers.cs:13:5:16:5 | {...} | -| Initializers.cs:20:11:20:23 | NoConstructor | Initializers.cs:22:23:22:23 | this access | +| Initializers.cs:20:11:20:23 | NoConstructor | Initializers.cs:20:11:20:23 | call to constructor Object | | Initializers.cs:31:9:31:11 | Sub | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | | Initializers.cs:33:9:33:11 | Sub | Initializers.cs:33:22:33:25 | call to constructor Sub | | Initializers.cs:35:9:35:11 | Sub | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | +| Initializers.cs:39:7:39:23 | IndexInitializers | Initializers.cs:39:7:39:23 | call to constructor Object | +| Initializers.cs:41:11:41:18 | Compound | Initializers.cs:41:11:41:18 | call to constructor Object | | Initializers.cs:51:10:51:13 | Test | Initializers.cs:52:5:66:5 | {...} | +| LoopUnrolling.cs:5:7:5:19 | LoopUnrolling | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | | LoopUnrolling.cs:7:10:7:11 | M1 | LoopUnrolling.cs:8:5:13:5 | {...} | | LoopUnrolling.cs:15:10:15:11 | M2 | LoopUnrolling.cs:16:5:20:5 | {...} | | LoopUnrolling.cs:22:10:22:11 | M3 | LoopUnrolling.cs:23:5:27:5 | {...} | @@ -1156,6 +1175,8 @@ entryPoint | LoopUnrolling.cs:76:10:76:11 | M9 | LoopUnrolling.cs:77:5:83:5 | {...} | | LoopUnrolling.cs:85:10:85:12 | M10 | LoopUnrolling.cs:86:5:92:5 | {...} | | LoopUnrolling.cs:94:10:94:12 | M11 | LoopUnrolling.cs:95:5:101:5 | {...} | +| MultiImplementationA.cs:4:7:4:8 | C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationA.cs:4:7:4:8 | C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | | MultiImplementationA.cs:6:22:6:31 | get_P1 | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationA.cs:6:22:6:31 | get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationA.cs:7:21:7:23 | get_P2 | MultiImplementationA.cs:7:25:7:39 | {...} | @@ -1181,10 +1202,16 @@ entryPoint | MultiImplementationA.cs:22:6:22:7 | ~C2 | MultiImplementationB.cs:20:11:20:25 | {...} | | MultiImplementationA.cs:23:28:23:35 | implicit conversion | MultiImplementationA.cs:23:50:23:53 | null | | MultiImplementationA.cs:23:28:23:35 | implicit conversion | MultiImplementationB.cs:21:56:21:59 | null | +| MultiImplementationA.cs:28:7:28:8 | C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationA.cs:28:7:28:8 | C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | | MultiImplementationA.cs:30:21:30:23 | get_P3 | MultiImplementationA.cs:30:34:30:37 | null | +| MultiImplementationA.cs:34:15:34:16 | C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationA.cs:34:15:34:16 | C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | | MultiImplementationA.cs:36:9:36:10 | M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationA.cs:36:9:36:10 | M1 | MultiImplementationB.cs:32:17:32:17 | 0 | | MultiImplementationA.cs:37:9:37:10 | M2 | MultiImplementationA.cs:37:14:37:28 | {...} | +| MultiImplementationB.cs:1:7:1:8 | C1 | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | +| MultiImplementationB.cs:1:7:1:8 | C1 | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | | MultiImplementationB.cs:3:22:3:22 | get_P1 | MultiImplementationA.cs:6:28:6:31 | null | | MultiImplementationB.cs:3:22:3:22 | get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | MultiImplementationB.cs:4:21:4:23 | get_P2 | MultiImplementationA.cs:7:25:7:39 | {...} | @@ -1210,9 +1237,14 @@ entryPoint | MultiImplementationB.cs:20:6:20:7 | ~C2 | MultiImplementationB.cs:20:11:20:25 | {...} | | MultiImplementationB.cs:21:28:21:35 | implicit conversion | MultiImplementationA.cs:23:50:23:53 | null | | MultiImplementationB.cs:21:28:21:35 | implicit conversion | MultiImplementationB.cs:21:56:21:59 | null | +| MultiImplementationB.cs:25:7:25:8 | C3 | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | +| MultiImplementationB.cs:25:7:25:8 | C3 | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | | MultiImplementationB.cs:27:21:27:23 | get_P3 | MultiImplementationA.cs:30:34:30:37 | null | +| MultiImplementationB.cs:30:15:30:16 | C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | +| MultiImplementationB.cs:30:15:30:16 | C4 | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | | MultiImplementationB.cs:32:9:32:10 | M1 | MultiImplementationA.cs:36:14:36:28 | {...} | | MultiImplementationB.cs:32:9:32:10 | M1 | MultiImplementationB.cs:32:17:32:17 | 0 | +| NullCoalescing.cs:1:7:1:20 | NullCoalescing | NullCoalescing.cs:1:7:1:20 | call to constructor Object | | NullCoalescing.cs:3:9:3:10 | M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:5:9:5:10 | M2 | NullCoalescing.cs:5:25:5:25 | access to parameter b | | NullCoalescing.cs:7:12:7:13 | M3 | NullCoalescing.cs:7:40:7:41 | access to parameter s1 | @@ -1221,6 +1253,7 @@ entryPoint | NullCoalescing.cs:13:10:13:11 | M6 | NullCoalescing.cs:14:5:18:5 | {...} | | PartialImplementationA.cs:3:12:3:18 | Partial | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | | PartialImplementationB.cs:4:12:4:18 | Partial | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | +| Patterns.cs:3:7:3:14 | Patterns | Patterns.cs:3:7:3:14 | call to constructor Object | | Patterns.cs:5:10:5:11 | M1 | Patterns.cs:6:5:43:5 | {...} | | Patterns.cs:47:24:47:25 | M2 | Patterns.cs:48:9:48:9 | access to parameter c | | Patterns.cs:50:24:50:25 | M3 | Patterns.cs:51:9:51:9 | access to parameter c | @@ -1231,12 +1264,15 @@ entryPoint | Patterns.cs:85:26:85:27 | M8 | Patterns.cs:85:39:85:39 | access to parameter i | | Patterns.cs:87:26:87:27 | M9 | Patterns.cs:87:39:87:39 | access to parameter i | | Patterns.cs:93:17:93:19 | M10 | Patterns.cs:94:5:99:5 | {...} | +| PostDominance.cs:3:7:3:19 | PostDominance | PostDominance.cs:3:7:3:19 | call to constructor Object | | PostDominance.cs:5:10:5:11 | M1 | PostDominance.cs:6:5:8:5 | {...} | | PostDominance.cs:10:10:10:11 | M2 | PostDominance.cs:11:5:15:5 | {...} | | PostDominance.cs:17:10:17:11 | M3 | PostDominance.cs:18:5:22:5 | {...} | +| Qualifiers.cs:1:7:1:16 | Qualifiers | Qualifiers.cs:1:7:1:16 | call to constructor Object | | Qualifiers.cs:7:16:7:21 | Method | Qualifiers.cs:7:28:7:31 | null | | Qualifiers.cs:8:23:8:34 | StaticMethod | Qualifiers.cs:8:41:8:44 | null | | Qualifiers.cs:10:10:10:10 | M | Qualifiers.cs:11:5:31:5 | {...} | +| Switch.cs:3:7:3:12 | Switch | Switch.cs:3:7:3:12 | call to constructor Object | | Switch.cs:5:10:5:11 | M1 | Switch.cs:6:5:8:5 | {...} | | Switch.cs:10:10:10:11 | M2 | Switch.cs:11:5:33:5 | {...} | | Switch.cs:35:10:35:11 | M3 | Switch.cs:36:5:42:5 | {...} | @@ -1253,10 +1289,13 @@ entryPoint | Switch.cs:134:9:134:11 | M13 | Switch.cs:135:5:142:5 | {...} | | Switch.cs:144:9:144:11 | M14 | Switch.cs:145:5:152:5 | {...} | | Switch.cs:154:10:154:12 | M15 | Switch.cs:155:5:161:5 | {...} | +| TypeAccesses.cs:1:7:1:18 | TypeAccesses | TypeAccesses.cs:1:7:1:18 | call to constructor Object | | TypeAccesses.cs:3:10:3:10 | M | TypeAccesses.cs:4:5:9:5 | {...} | +| VarDecls.cs:3:7:3:14 | VarDecls | VarDecls.cs:3:7:3:14 | call to constructor Object | | VarDecls.cs:5:18:5:19 | M1 | VarDecls.cs:6:5:11:5 | {...} | | VarDecls.cs:13:12:13:13 | M2 | VarDecls.cs:14:5:17:5 | {...} | | VarDecls.cs:19:7:19:8 | M3 | VarDecls.cs:20:5:26:5 | {...} | +| VarDecls.cs:28:11:28:11 | C | VarDecls.cs:28:11:28:11 | call to constructor Object | | VarDecls.cs:28:41:28:47 | Dispose | VarDecls.cs:28:51:28:53 | {...} | | cflow.cs:5:17:5:20 | Main | cflow.cs:6:5:35:5 | {...} | | cflow.cs:37:17:37:22 | Switch | cflow.cs:38:5:68:5 | {...} | @@ -1286,8 +1325,10 @@ entryPoint | cflow.cs:282:5:282:18 | ControlFlowSub | cflow.cs:282:24:282:27 | call to constructor ControlFlow | | cflow.cs:284:5:284:18 | ControlFlowSub | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | | cflow.cs:286:5:286:18 | ControlFlowSub | cflow.cs:286:34:286:34 | access to parameter i | +| cflow.cs:289:7:289:18 | DelegateCall | cflow.cs:289:7:289:18 | call to constructor Object | | cflow.cs:291:12:291:12 | M | cflow.cs:291:38:291:38 | access to parameter f | | cflow.cs:296:5:296:25 | NegationInConstructor | cflow.cs:296:5:296:25 | call to constructor Object | | cflow.cs:298:10:298:10 | M | cflow.cs:299:5:301:5 | {...} | +| cflow.cs:304:7:304:18 | LambdaGetter | cflow.cs:304:7:304:18 | call to constructor Object | | cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:307:5:310:5 | {...} | | cflow.cs:306:60:310:5 | get__getter | cflow.cs:306:60:310:5 | (...) => ... | From a24a57c586be440744ea2bd86e8c46e6af0f4670 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 10:37:58 +0100 Subject: [PATCH 110/207] C#: Update most other test cases to reflect the synthesized constructor calls and bodies. --- .../splits/SplittingStressTest.expected | 2 ++ .../csharp8/NullableRefTypes.expected | 10 +++++++++ .../library-tests/csharp9/nativeInt.expected | 1 + .../dataflow/global/GetAnOutNode.expected | 7 +++++++ .../ConstructorInitializers.expected | 21 +++++++++++++++++++ .../exprorstmtparent/Callable.expected | 12 +++++++++++ .../ql/test/library-tests/goto/Goto1.expected | 4 ++++ .../nullable/NullableExpressions.expected | 1 + .../standalone/controlflow/cfg.expected | 4 ++++ .../DiagnosticsAndErrors.expected | 1 + .../errorrecovery/ErrorCalls.expected | 4 ++++ .../structuralComparison.expected | 6 ++++++ 12 files changed, 73 insertions(+) diff --git a/csharp/ql/test/library-tests/controlflow/splits/SplittingStressTest.expected b/csharp/ql/test/library-tests/controlflow/splits/SplittingStressTest.expected index 84f6cd7966b..8ba5f8687b4 100644 --- a/csharp/ql/test/library-tests/controlflow/splits/SplittingStressTest.expected +++ b/csharp/ql/test/library-tests/controlflow/splits/SplittingStressTest.expected @@ -1,4 +1,6 @@ countSplits +| SplittingStressTest.cs:1:7:1:25 | call to constructor Object | 1 | +| SplittingStressTest.cs:1:7:1:25 | {...} | 1 | | SplittingStressTest.cs:4:5:168:5 | {...} | 1 | | SplittingStressTest.cs:5:9:6:13 | if (...) ... | 1 | | SplittingStressTest.cs:5:13:5:14 | access to parameter b1 | 1 | diff --git a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected index 484ab5d1788..5250e77b5b6 100644 --- a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected +++ b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected @@ -239,6 +239,7 @@ annotatedTypeConstraints | NullableRefTypes.cs:58:24:58:25 | T2 | NullableRefTypes.cs:54:11:54:33 | Generic!, MyClass!>! | typeNotAnnotated expressionTypes +| NullableRefTypes.cs:6:7:6:13 | call to constructor Object | object | | NullableRefTypes.cs:13:19:13:22 | null | null | | NullableRefTypes.cs:14:18:14:21 | this access | MyClass! | | NullableRefTypes.cs:17:29:17:32 | null | null | @@ -265,6 +266,8 @@ expressionTypes | NullableRefTypes.cs:40:26:40:30 | ref ... | MyClass | | NullableRefTypes.cs:40:30:40:30 | access to local variable b | MyClass? | | NullableRefTypes.cs:51:44:51:47 | null | null | +| NullableRefTypes.cs:54:11:54:33 | call to constructor Object | object | +| NullableRefTypes.cs:58:11:58:26 | call to constructor Object | object | | NullableRefTypes.cs:73:18:73:18 | access to local variable x | MyClass! | | NullableRefTypes.cs:73:18:73:25 | MyClass x = ... | MyClass! | | NullableRefTypes.cs:73:22:73:25 | null | null | @@ -276,6 +279,7 @@ expressionTypes | NullableRefTypes.cs:75:11:75:11 | access to local variable x | MyClass? | | NullableRefTypes.cs:76:16:76:32 | default(...) | MyStruct! | | NullableRefTypes.cs:76:24:76:31 | access to type MyStruct | MyStruct | +| NullableRefTypes.cs:80:7:80:22 | call to constructor Object | object | | NullableRefTypes.cs:84:17:84:17 | access to local variable x | string! | | NullableRefTypes.cs:84:17:84:28 | String x = ... | string! | | NullableRefTypes.cs:84:21:84:28 | "source" | string! | @@ -308,6 +312,7 @@ expressionTypes | NullableRefTypes.cs:96:9:96:15 | access to type Console | Console! | | NullableRefTypes.cs:96:9:96:28 | call to method WriteLine | Void! | | NullableRefTypes.cs:96:27:96:27 | access to local variable x | string? | +| NullableRefTypes.cs:100:7:100:14 | call to constructor Object | object | | NullableRefTypes.cs:103:48:103:52 | ref ... | MyClass | | NullableRefTypes.cs:103:52:103:52 | access to parameter r | MyClass! | | NullableRefTypes.cs:104:48:104:52 | ref ... | MyClass | @@ -326,11 +331,16 @@ expressionTypes | NullableRefTypes.cs:113:36:113:43 | access to field Property | MyClass? | | NullableRefTypes.cs:113:36:113:43 | this access | RefTypes | | NullableRefTypes.cs:113:36:113:44 | ...! | MyClass? | +| NullableRefTypes.cs:116:7:116:23 | call to constructor Object | object | +| NullableRefTypes.cs:136:7:136:24 | call to constructor Object | object | +| NullableRefTypes.cs:154:7:154:25 | call to constructor Object | object | | NullableRefTypes.cs:157:18:157:30 | object creation of type MyClass | MyClass | | NullableRefTypes.cs:160:17:160:17 | access to local variable a | MyClass | | NullableRefTypes.cs:160:17:160:21 | MyClass a = ... | MyClass | | NullableRefTypes.cs:160:21:160:21 | access to parameter p | MyClass | | NullableRefTypes.cs:161:16:161:16 | access to local variable a | MyClass | +| NullableRefTypes.cs:165:8:165:15 | call to constructor ValueType | ValueType | +| NullableRefTypes.cs:171:16:171:37 | call to constructor Object | object | | NullableRefTypes.cs:181:17:181:17 | access to local variable x | string! | | NullableRefTypes.cs:181:17:181:31 | String x = ... | string! | | NullableRefTypes.cs:181:21:181:31 | call to method MaybeNull | string? | diff --git a/csharp/ql/test/library-tests/csharp9/nativeInt.expected b/csharp/ql/test/library-tests/csharp9/nativeInt.expected index f9498eb046b..2c63241e1fe 100644 --- a/csharp/ql/test/library-tests/csharp9/nativeInt.expected +++ b/csharp/ql/test/library-tests/csharp9/nativeInt.expected @@ -1,3 +1,4 @@ +| NativeInt.cs:3:14:3:22 | call to constructor Object | Object | | NativeInt.cs:7:14:7:14 | access to local variable x | IntPtr | | NativeInt.cs:7:14:7:18 | IntPtr x = ... | IntPtr | | NativeInt.cs:7:18:7:18 | (...) ... | IntPtr | diff --git a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected index bfe1895663c..dd247495c13 100644 --- a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected +++ b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected @@ -1,3 +1,4 @@ +| Capture.cs:5:7:5:13 | call to constructor Object | normal | Capture.cs:5:7:5:13 | call to constructor Object | | Capture.cs:33:9:33:40 | call to method Select | normal | Capture.cs:33:9:33:40 | call to method Select | | Capture.cs:33:9:33:50 | call to method ToArray | normal | Capture.cs:33:9:33:50 | call to method ToArray | | Capture.cs:71:9:71:21 | call to local function CaptureOut1 | captured sink30 | Capture.cs:71:9:71:21 | SSA call def(sink30) | @@ -17,6 +18,7 @@ | Capture.cs:191:20:191:22 | call to local function M | normal | Capture.cs:191:20:191:22 | call to local function M | | Capture.cs:194:22:194:32 | call to local function Id | normal | Capture.cs:194:22:194:32 | call to local function Id | | Capture.cs:196:20:196:25 | call to local function Id | normal | Capture.cs:196:20:196:25 | call to local function Id | +| GlobalDataFlow.cs:13:14:13:21 | call to constructor Object | normal | GlobalDataFlow.cs:13:14:13:21 | call to constructor Object | | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | | GlobalDataFlow.cs:30:9:30:29 | access to property NonSinkProperty0 | normal | GlobalDataFlow.cs:30:9:30:29 | access to property NonSinkProperty0 | @@ -147,17 +149,20 @@ | GlobalDataFlow.cs:249:24:249:34 | access to property Result | normal | GlobalDataFlow.cs:249:24:249:34 | access to property Result | | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc | normal | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc | | GlobalDataFlow.cs:389:16:389:19 | delegate call | normal | GlobalDataFlow.cs:389:16:389:19 | delegate call | +| GlobalDataFlow.cs:415:11:415:14 | call to constructor Object | normal | GlobalDataFlow.cs:415:11:415:14 | call to constructor Object | | GlobalDataFlow.cs:448:22:448:65 | call to method Join | normal | GlobalDataFlow.cs:448:22:448:65 | call to method Join | | GlobalDataFlow.cs:451:23:451:65 | call to method Join | normal | GlobalDataFlow.cs:451:23:451:65 | call to method Join | | GlobalDataFlow.cs:457:20:457:49 | call to method Run | normal | GlobalDataFlow.cs:457:20:457:49 | call to method Run | | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait | normal | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait | | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter | normal | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter | | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult | normal | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult | +| GlobalDataFlow.cs:476:18:476:28 | call to constructor Object | normal | GlobalDataFlow.cs:476:18:476:28 | call to constructor Object | | GlobalDataFlow.cs:488:18:488:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:488:18:488:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:489:18:489:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:489:18:489:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:494:18:494:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:494:18:494:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:495:18:495:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:495:18:495:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:496:18:496:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:496:18:496:34 | object creation of type SimpleClass | +| GlobalDataFlow.cs:503:19:503:32 | call to constructor SimpleClass | normal | GlobalDataFlow.cs:503:19:503:32 | call to constructor SimpleClass | | GlobalDataFlow.cs:507:17:507:36 | object creation of type SubSimpleClass | normal | GlobalDataFlow.cs:507:17:507:36 | object creation of type SubSimpleClass | | GlobalDataFlow.cs:514:17:514:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:514:17:514:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:522:17:522:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:522:17:522:33 | object creation of type SimpleClass | @@ -165,6 +170,7 @@ | GlobalDataFlow.cs:524:17:524:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:524:17:524:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:545:17:545:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:545:17:545:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:558:44:558:47 | delegate call | normal | GlobalDataFlow.cs:558:44:558:47 | delegate call | +| GlobalDataFlowStringBuilder.cs:13:14:13:34 | call to constructor Object | normal | GlobalDataFlowStringBuilder.cs:13:14:13:34 | call to constructor Object | | GlobalDataFlowStringBuilder.cs:19:9:19:20 | call to method Append | normal | GlobalDataFlowStringBuilder.cs:19:9:19:20 | call to method Append | | GlobalDataFlowStringBuilder.cs:24:9:24:27 | call to method Append | normal | GlobalDataFlowStringBuilder.cs:24:9:24:27 | call to method Append | | GlobalDataFlowStringBuilder.cs:29:18:29:36 | object creation of type StringBuilder | normal | GlobalDataFlowStringBuilder.cs:29:18:29:36 | object creation of type StringBuilder | @@ -178,6 +184,7 @@ | GlobalDataFlowStringBuilder.cs:44:9:44:18 | call to method Clear | normal | GlobalDataFlowStringBuilder.cs:44:9:44:18 | call to method Clear | | GlobalDataFlowStringBuilder.cs:45:23:45:35 | call to method ToString | normal | GlobalDataFlowStringBuilder.cs:45:23:45:35 | call to method ToString | | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString | normal | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString | +| Splitting.cs:1:7:1:15 | call to constructor Object | normal | Splitting.cs:1:7:1:15 | call to constructor Object | | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return | normal | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return | | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return | normal | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return | | Splitting.cs:20:22:20:30 | call to method Return | normal | Splitting.cs:20:22:20:30 | call to method Return | diff --git a/csharp/ql/test/library-tests/expressions/ConstructorInitializers.expected b/csharp/ql/test/library-tests/expressions/ConstructorInitializers.expected index d6224193f87..4e3c34780fe 100644 --- a/csharp/ql/test/library-tests/expressions/ConstructorInitializers.expected +++ b/csharp/ql/test/library-tests/expressions/ConstructorInitializers.expected @@ -8,3 +8,24 @@ | expressions.cs:481:20:481:22 | Num | expressions.cs:481:20:481:22 | call to constructor Object | file://:0:0:0:0 | Object | | expressions.cs:518:11:518:17 | ClassC1 | expressions.cs:518:11:518:17 | call to constructor Object | file://:0:0:0:0 | Object | | expressions.cs:520:11:520:17 | ClassC2 | expressions.cs:520:33:520:44 | call to constructor ClassC1 | expressions.cs:518:11:518:17 | ClassC1 | +| file://:0:0:0:0 | Button | expressions.cs:227:18:227:23 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | C | expressions.cs:207:11:207:11 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Contact | expressions.cs:372:18:372:24 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Digit | expressions.cs:306:19:306:23 | call to constructor ValueType | file://:0:0:0:0 | ValueType | +| file://:0:0:0:0 | ExpressionDepth | expressions.cs:495:11:495:25 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | FoldedLiterals | FoldedLiterals.cs:1:7:1:20 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | MethodAccess | MethodAccess.cs:3:7:3:18 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | MyInlineArray | expressions.cs:513:12:513:24 | call to constructor ValueType | file://:0:0:0:0 | ValueType | +| file://:0:0:0:0 | OperatorCalls | expressions.cs:463:11:463:23 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Point | expressions.cs:341:18:341:22 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Qualifiers | Qualifiers.cs:3:7:3:16 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Rectangle | expressions.cs:351:18:351:26 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Rectangle2 | expressions.cs:361:18:361:27 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | ReducedClass | ReducedExpression.cs:2:7:2:18 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | TestConversionOperator | expressions.cs:330:11:330:32 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | TestCreations | expressions.cs:383:18:383:30 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | TestUnaryOperator | expressions.cs:292:11:292:27 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | TupleExprs | expressions.cs:501:11:501:20 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | X | expressions.cs:108:15:108:18 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | X | expressions.cs:216:18:216:18 | call to constructor Object | file://:0:0:0:0 | Object | +| file://:0:0:0:0 | Y | expressions.cs:104:15:104:21 | call to constructor Object | file://:0:0:0:0 | Object | diff --git a/csharp/ql/test/library-tests/exprorstmtparent/Callable.expected b/csharp/ql/test/library-tests/exprorstmtparent/Callable.expected index 62380abf312..191dd35f976 100644 --- a/csharp/ql/test/library-tests/exprorstmtparent/Callable.expected +++ b/csharp/ql/test/library-tests/exprorstmtparent/Callable.expected @@ -1,3 +1,5 @@ +| A.cs:4:7:4:8 | C1 | A.cs:4:7:4:8 | {...} | +| A.cs:4:7:4:8 | C1 | B.cs:1:7:1:8 | {...} | | A.cs:6:22:6:31 | get_P1 | A.cs:6:22:6:31 | throw ... | | A.cs:6:22:6:31 | get_P1 | B.cs:3:22:3:22 | 0 | | A.cs:7:21:7:23 | get_P2 | A.cs:7:25:7:39 | {...} | @@ -23,11 +25,17 @@ | A.cs:22:6:22:7 | ~C2 | B.cs:20:11:20:25 | {...} | | A.cs:23:28:23:35 | implicit conversion | A.cs:23:50:23:53 | null | | A.cs:23:28:23:35 | implicit conversion | B.cs:21:50:21:59 | throw ... | +| A.cs:28:7:28:8 | C3 | A.cs:28:7:28:8 | {...} | +| A.cs:28:7:28:8 | C3 | B.cs:25:7:25:8 | {...} | | A.cs:30:21:30:23 | get_P3 | A.cs:30:28:30:37 | throw ... | +| A.cs:34:15:34:16 | C4 | A.cs:34:15:34:16 | {...} | +| A.cs:34:15:34:16 | C4 | C.cs:1:15:1:16 | {...} | | A.cs:36:9:36:10 | M1 | A.cs:36:14:36:28 | {...} | | A.cs:36:9:36:10 | M1 | B.cs:32:17:32:17 | 0 | | A.cs:37:9:37:10 | M2 | A.cs:37:14:37:28 | {...} | | A.cs:37:9:37:10 | M2 | C.cs:3:17:3:17 | 0 | +| B.cs:1:7:1:8 | C1 | A.cs:4:7:4:8 | {...} | +| B.cs:1:7:1:8 | C1 | B.cs:1:7:1:8 | {...} | | B.cs:3:22:3:22 | get_P1 | A.cs:6:22:6:31 | throw ... | | B.cs:3:22:3:22 | get_P1 | B.cs:3:22:3:22 | 0 | | B.cs:4:21:4:23 | get_P2 | A.cs:7:25:7:39 | {...} | @@ -53,8 +61,12 @@ | B.cs:20:6:20:7 | ~C2 | B.cs:20:11:20:25 | {...} | | B.cs:21:28:21:35 | implicit conversion | A.cs:23:50:23:53 | null | | B.cs:21:28:21:35 | implicit conversion | B.cs:21:50:21:59 | throw ... | +| B.cs:25:7:25:8 | C3 | A.cs:28:7:28:8 | {...} | +| B.cs:25:7:25:8 | C3 | B.cs:25:7:25:8 | {...} | | B.cs:27:21:27:23 | get_P3 | A.cs:30:28:30:37 | throw ... | | B.cs:32:9:32:10 | M1 | A.cs:36:14:36:28 | {...} | | B.cs:32:9:32:10 | M1 | B.cs:32:17:32:17 | 0 | +| C.cs:1:15:1:16 | C4 | A.cs:34:15:34:16 | {...} | +| C.cs:1:15:1:16 | C4 | C.cs:1:15:1:16 | {...} | | C.cs:3:9:3:10 | M2 | A.cs:37:14:37:28 | {...} | | C.cs:3:9:3:10 | M2 | C.cs:3:17:3:17 | 0 | diff --git a/csharp/ql/test/library-tests/goto/Goto1.expected b/csharp/ql/test/library-tests/goto/Goto1.expected index 94901f29063..e6c124726a3 100644 --- a/csharp/ql/test/library-tests/goto/Goto1.expected +++ b/csharp/ql/test/library-tests/goto/Goto1.expected @@ -1,3 +1,7 @@ +| goto.cs:2:7:2:10 | call to constructor Object | goto.cs:2:7:2:10 | {...} | semmle.label | successor | +| goto.cs:2:7:2:10 | enter Goto | goto.cs:2:7:2:10 | call to constructor Object | semmle.label | successor | +| goto.cs:2:7:2:10 | exit Goto (normal) | goto.cs:2:7:2:10 | exit Goto | semmle.label | successor | +| goto.cs:2:7:2:10 | {...} | goto.cs:2:7:2:10 | exit Goto (normal) | semmle.label | successor | | goto.cs:4:17:4:20 | enter Main | goto.cs:5:5:20:5 | {...} | semmle.label | successor | | goto.cs:4:17:4:20 | exit Main (normal) | goto.cs:4:17:4:20 | exit Main | semmle.label | successor | | goto.cs:5:5:20:5 | {...} | goto.cs:6:9:8:9 | {...} | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/nullable/NullableExpressions.expected b/csharp/ql/test/library-tests/nullable/NullableExpressions.expected index 039bd71087e..675450ab2ee 100644 --- a/csharp/ql/test/library-tests/nullable/NullableExpressions.expected +++ b/csharp/ql/test/library-tests/nullable/NullableExpressions.expected @@ -1,3 +1,4 @@ +| 1 | 14 | nullable.cs:1:14:1:21 | Nullable | nullable.cs:1:14:1:21 | call to constructor Object | Object | | 5 | 13 | nullable.cs:5:9:6:24 | if (...) ... | nullable.cs:5:13:5:21 | ... == ... | Boolean | | 5 | 13 | nullable.cs:5:13:5:21 | ... == ... | nullable.cs:5:13:5:13 | access to parameter x | Nullable | | 5 | 18 | nullable.cs:5:13:5:21 | ... == ... | nullable.cs:5:18:5:21 | null | null | diff --git a/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected b/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected index 4402dbc1d34..fab1dec1100 100644 --- a/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected +++ b/csharp/ql/test/library-tests/standalone/controlflow/cfg.expected @@ -1,3 +1,7 @@ +| ControlFlow.cs:3:7:3:9 | call to constructor Object | ControlFlow.cs:3:7:3:9 | {...} | +| ControlFlow.cs:3:7:3:9 | enter Cfg | ControlFlow.cs:3:7:3:9 | call to constructor Object | +| ControlFlow.cs:3:7:3:9 | exit Cfg (normal) | ControlFlow.cs:3:7:3:9 | exit Cfg | +| ControlFlow.cs:3:7:3:9 | {...} | ControlFlow.cs:3:7:3:9 | exit Cfg (normal) | | ControlFlow.cs:5:10:5:10 | enter F | ControlFlow.cs:6:5:11:5 | {...} | | ControlFlow.cs:5:10:5:10 | exit F (normal) | ControlFlow.cs:5:10:5:10 | exit F | | ControlFlow.cs:6:5:11:5 | {...} | ControlFlow.cs:7:9:7:34 | ... ...; | diff --git a/csharp/ql/test/library-tests/standalone/errorrecovery/DiagnosticsAndErrors.expected b/csharp/ql/test/library-tests/standalone/errorrecovery/DiagnosticsAndErrors.expected index efc5b7b081d..a87b151ad5d 100644 --- a/csharp/ql/test/library-tests/standalone/errorrecovery/DiagnosticsAndErrors.expected +++ b/csharp/ql/test/library-tests/standalone/errorrecovery/DiagnosticsAndErrors.expected @@ -37,6 +37,7 @@ extractorMessages | errors.cs:22:31:22:40 | Unable to resolve target for call. (Compilation error?) | | errors.cs:22:38:22:39 | Failed to determine type | | errors.cs:55:20:55:20 | Failed to determine type | +| errors.cs:79:11:79:12 | Unable to resolve implicit constructor initializer call | | errors.cs:91:45:91:45 | Failed to determine type | | errors.cs:91:45:91:45 | Failed to resolve name | | errors.cs:92:45:92:45 | Failed to determine type | diff --git a/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected b/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected index ee30381b24d..a4a2aa6e7a8 100644 --- a/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected +++ b/csharp/ql/test/library-tests/standalone/errorrecovery/ErrorCalls.expected @@ -1,6 +1,10 @@ +| errors.cs:13:11:13:12 | errors.cs:13:11:13:12 | call to constructor Object | Object | | errors.cs:22:31:22:40 | errors.cs:22:31:22:40 | call to method | none | | errors.cs:41:21:41:28 | errors.cs:41:21:41:28 | object creation of type C1 | C1 | | errors.cs:42:13:42:19 | errors.cs:42:13:42:19 | call to method m1 | m1 | | errors.cs:43:13:43:19 | errors.cs:43:13:43:19 | call to method m2 | m2 | | errors.cs:44:13:44:38 | errors.cs:44:13:44:38 | call to method WriteLine | WriteLine | +| errors.cs:48:11:48:12 | errors.cs:48:11:48:12 | call to constructor Object | Object | | errors.cs:51:17:51:25 | errors.cs:51:17:51:25 | object creation of type C2 | none | +| errors.cs:65:11:65:12 | errors.cs:65:11:65:12 | call to constructor Object | Object | +| errors.cs:70:11:70:12 | errors.cs:70:11:70:12 | call to constructor Object | Object | diff --git a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected index cdabf17445b..9d3c935266a 100644 --- a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected +++ b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected @@ -51,6 +51,8 @@ same | StructuralComparison.cs:49:18:49:26 | access to property Prop | StructuralComparison.cs:51:18:51:26 | access to property Prop | | StructuralComparison.cs:50:18:50:21 | access to property Prop | StructuralComparison.cs:51:18:51:26 | access to property Prop | gvn +| StructuralComparison.cs:3:14:3:18 | call to constructor Object | (kind:Expr(79)) | +| StructuralComparison.cs:3:14:3:18 | {...} | (kind:Stmt(1)) | | StructuralComparison.cs:5:26:5:26 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:5:26:5:26 | this access | (kind:Expr(12)) | | StructuralComparison.cs:5:26:5:30 | ... = ... | ((kind:Expr(16),true,x) :: (0 :: (kind:Expr(63)))) | @@ -145,6 +147,10 @@ gvn | StructuralComparison.cs:28:12:28:12 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:28:15:28:15 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:28:15:28:15 | this access | (kind:Expr(12),false,Class) | +| StructuralComparison.cs:32:14:32:22 | call to constructor Object | (kind:Expr(79)) | +| StructuralComparison.cs:32:14:32:22 | {...} | (kind:Stmt(1)) | +| StructuralComparison.cs:38:14:38:25 | call to constructor BaseClass | (kind:Expr(79)) | +| StructuralComparison.cs:38:14:38:25 | {...} | (kind:Stmt(1)) | | StructuralComparison.cs:41:5:45:5 | {...} | ((((kind:Expr(14),false,x3) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,x2) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1))))) | | StructuralComparison.cs:42:9:42:28 | ... ...; | (((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:42:13:42:14 | access to local variable x1 | (kind:Expr(14),false,x1) | From aca3970c33e8a4ff4744505e295821463f12c30d Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 22 Feb 2024 13:25:13 +0000 Subject: [PATCH 111/207] C++: Fix QLoc on 'isPartialWrite'. --- .../lib/semmle/code/cpp/models/interfaces/PartialFlow.qll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll index 9a3ecad2123..a6eaf93c0a7 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll @@ -20,9 +20,9 @@ import semmle.code.cpp.models.Models */ abstract class PartialFlowFunction extends Function { /** - * Holds if the write to `output` either is: - * - Only partially updating the `output` - * - Is not unconditional + * Holds if the write to output does not overwrite the entire value that was + * there before, or does not do so reliably. For example the destination + * argument of `strcat` is modified but not overwritten. */ predicate isPartialWrite(FunctionOutput output) { none() } } From 671904d58c5c9578497ab2bbd235173484543c7e Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 22 Feb 2024 13:27:10 +0000 Subject: [PATCH 112/207] C++: Fix QLoc on 'PartialFlowFunction'. --- cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll index a6eaf93c0a7..0afa8943d67 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PartialFlow.qll @@ -16,7 +16,10 @@ import FunctionInputsAndOutputs import semmle.code.cpp.models.Models /** - * A function that may (but not always) updates (part of) a `FunctionOutput`. + * A function that may update part of a `FunctionOutput`. + * + * For example, the destination argument of `strcat` only updates part of the + * argument. */ abstract class PartialFlowFunction extends Function { /** From 8e64880e86d16d915451fceab5eb1aea860a78a2 Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Thu, 22 Feb 2024 14:27:28 +0100 Subject: [PATCH 113/207] Fix and add unit tests --- .../BuildScripts.cs | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs index 95fcb51072e..5e9437a0256 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs @@ -558,6 +558,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestLinuxBuildlessExtractionSuccess() { + actions.RunProcess["dotnet --info"] = 0; + actions.RunProcessOut["dotnet --info"] = ""; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -567,12 +569,14 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; var autobuilder = CreateAutoBuilder(false, buildless: "true"); - TestAutobuilderScript(autobuilder, 0, 1); + TestAutobuilderScript(autobuilder, 0, 2); } [Fact] public void TestLinuxBuildlessExtractionFailed() { + actions.RunProcess["dotnet --info"] = 0; + actions.RunProcessOut["dotnet --info"] = ""; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 10; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -582,12 +586,14 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; var autobuilder = CreateAutoBuilder(false, buildless: "true"); - TestAutobuilderScript(autobuilder, 10, 1); + TestAutobuilderScript(autobuilder, 10, 2); } [Fact] public void TestLinuxBuildlessExtractionSolution() { + actions.RunProcess["dotnet --info"] = 0; + actions.RunProcessOut["dotnet --info"] = ""; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -597,7 +603,30 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; var autobuilder = CreateAutoBuilder(false, buildless: "true"); - TestAutobuilderScript(autobuilder, 0, 1); + TestAutobuilderScript(autobuilder, 0, 2); + } + + [Fact] + public void TestLinuxBuildlessExtractionNoDotnet() + { + actions.RunProcess["dotnet --info"] = 1; + actions.RunProcessOut["dotnet --info"] = ""; + actions.RunProcess["dotnet --list-sdks"] = 1; + actions.RunProcessOut["dotnet --list-sdks"] = ""; + actions.RunProcess[@"chmod u+x scratch/.dotnet/dotnet-install.sh"] = 0; + actions.RunProcess[@"scratch/.dotnet/dotnet-install.sh --channel release --version 8.0.101 --install-dir scratch/.dotnet"] = 0; + actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone --dotnet scratch/.dotnet"] = 0; + actions.FileExists["csharp.log"] = true; + actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; + actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; + actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SCRATCH_DIR"] = "scratch"; + actions.EnumerateFiles[@"C:\Project"] = "foo.cs\ntest.sln"; + actions.EnumerateDirectories[@"C:\Project"] = ""; + actions.DownloadFiles.Add(("https://dot.net/v1/dotnet-install.sh", "scratch/.dotnet/dotnet-install.sh")); + actions.CreateDirectories.Add(@"scratch/.dotnet"); + + var autobuilder = CreateAutoBuilder(false, buildless: "true"); + TestAutobuilderScript(autobuilder, 0, 5); } private void SkipVsWhere() @@ -888,6 +917,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestSkipNugetBuildless() { + actions.RunProcess["dotnet --info"] = 0; + actions.RunProcessOut["dotnet --info"] = ""; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -897,7 +928,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.EnumerateDirectories[@"C:\Project"] = ""; var autobuilder = CreateAutoBuilder(false, buildless: "true"); - TestAutobuilderScript(autobuilder, 0, 1); + TestAutobuilderScript(autobuilder, 0, 2); } From 350d5bf0cec744ad2f806d9214032cc760e744f0 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 22 Feb 2024 13:30:39 +0000 Subject: [PATCH 114/207] C++: Update QLDoc on 'modeledFlowBarrier'. --- .../code/cpp/ir/dataflow/internal/SsaInternals.qll | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll index 6a943ed6915..69ace9f890e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll @@ -812,8 +812,14 @@ private predicate inOut(FIO::FunctionInput input, FIO::FunctionOutput output) { } /** - * Holds if there should not be use-use flow out of `n` (or a conversion that - * flows to `n`). + * Holds if there should not be use-use flow out of `n`. That is, `n` is + * an out-barrier to use-use flow. This includes: + * + * - an input to a call that would be assumed to have use-use flow to the same + * argument as an output, but this flow should be blocked because the + * function is modeled with another flow to that output (for example the + * first argument of `strcpy`). + * - a conversion that flows to such an input. */ private predicate modeledFlowBarrier(Node n) { exists( From c0d82cb73e404871c930e106f9fbc3827d18ddf7 Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Thu, 22 Feb 2024 14:58:00 +0100 Subject: [PATCH 115/207] Minor improvement to not start dotnet process when it is known to fail --- .../Semmle.Autobuild.CSharp.Tests/BuildScripts.cs | 4 +--- .../Semmle.Autobuild.CSharp/DotNetRule.cs | 14 ++++++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs index 5e9437a0256..2bfe9a6854e 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs @@ -611,8 +611,6 @@ namespace Semmle.Autobuild.CSharp.Tests { actions.RunProcess["dotnet --info"] = 1; actions.RunProcessOut["dotnet --info"] = ""; - actions.RunProcess["dotnet --list-sdks"] = 1; - actions.RunProcessOut["dotnet --list-sdks"] = ""; actions.RunProcess[@"chmod u+x scratch/.dotnet/dotnet-install.sh"] = 0; actions.RunProcess[@"scratch/.dotnet/dotnet-install.sh --channel release --version 8.0.101 --install-dir scratch/.dotnet"] = 0; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone --dotnet scratch/.dotnet"] = 0; @@ -626,7 +624,7 @@ namespace Semmle.Autobuild.CSharp.Tests actions.CreateDirectories.Add(@"scratch/.dotnet"); var autobuilder = CreateAutoBuilder(false, buildless: "true"); - TestAutobuilderScript(autobuilder, 0, 5); + TestAutobuilderScript(autobuilder, 0, 4); } private void SkipVsWhere() diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs index 2ea4ae29b3a..35c62fd197a 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs @@ -172,7 +172,7 @@ namespace Semmle.Autobuild.CSharp const string latestDotNetSdkVersion = "8.0.101"; builder.Log(Severity.Info, $"No .NET Core SDK found. Attempting to install version {latestDotNetSdkVersion}."); - return DownloadDotNetVersion(builder, installDir, latestDotNetSdkVersion); + return DownloadDotNetVersion(builder, installDir, latestDotNetSdkVersion, checkInstalledSdkVersion: false); }); } @@ -186,14 +186,20 @@ namespace Semmle.Autobuild.CSharp /// /// See https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script. /// - private static BuildScript DownloadDotNetVersion(IAutobuilder builder, string path, string version) + private static BuildScript DownloadDotNetVersion(IAutobuilder builder, string path, string version, bool checkInstalledSdkVersion = true) { - return BuildScript.Bind(GetInstalledSdksScript(builder.Actions), (sdks, sdksRet) => + var firstScript = checkInstalledSdkVersion + ? GetInstalledSdksScript(builder.Actions) + : BuildScript.Success; + + return BuildScript.Bind(firstScript, (sdks, sdksRet) => { - if (sdksRet == 0 && sdks.Count == 1 && sdks[0].StartsWith(version + " ", StringComparison.Ordinal)) + if (checkInstalledSdkVersion && sdksRet == 0 && sdks.Count == 1 && sdks[0].StartsWith(version + " ", StringComparison.Ordinal)) + { // The requested SDK is already installed (and no other SDKs are installed), so // no need to reinstall return BuildScript.Failure; + } builder.Log(Severity.Info, "Attempting to download .NET Core {0}", version); From b7df26e6c94e8dbb4771e32406213146dadd58c1 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 22 Feb 2024 15:50:02 +0100 Subject: [PATCH 116/207] Bazel: make `codeql` compatible with workspace setup --- misc/bazel/workspace.bzl | 45 +++++++++++++++++++++++++++++++++++ misc/bazel/workspace_deps.bzl | 11 +++++++++ swift/third_party/load.bzl | 45 +++++++++++++++++++++++++++-------- 3 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 misc/bazel/workspace.bzl create mode 100644 misc/bazel/workspace_deps.bzl diff --git a/misc/bazel/workspace.bzl b/misc/bazel/workspace.bzl new file mode 100644 index 00000000000..84c311e1b17 --- /dev/null +++ b/misc/bazel/workspace.bzl @@ -0,0 +1,45 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") +load("//swift/third_party:load.bzl", load_swift_dependencies = "load_dependencies") + +def codeql_workspace(repository_name = "codeql"): + load_swift_dependencies(repository_name = repository_name) + maybe( + repo_rule = http_archive, + name = "rules_pkg", + sha256 = "8f9ee2dc10c1ae514ee599a8b42ed99fa262b757058f65ad3c384289ff70c4b8", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz", + "https://github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz", + ], + ) + + maybe( + repo_rule = http_archive, + name = "platforms", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", + "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", + ], + sha256 = "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74", + ) + + maybe( + repo_rule = http_archive, + name = "rules_python", + sha256 = "cdf6b84084aad8f10bf20b46b77cb48d83c319ebe6458a18e9d2cebf57807cdd", + strip_prefix = "rules_python-0.8.1", + urls = [ + "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.8.1.tar.gz", + ], + ) + + maybe( + repo_rule = http_archive, + name = "bazel_skylib", + sha256 = "b8a1527901774180afc798aeb28c4634bdccf19c4d98e7bdd1ce79d1fe9aaad7", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz", + ], + ) diff --git a/misc/bazel/workspace_deps.bzl b/misc/bazel/workspace_deps.bzl new file mode 100644 index 00000000000..7301066951f --- /dev/null +++ b/misc/bazel/workspace_deps.bzl @@ -0,0 +1,11 @@ +load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") +load("@rules_python//python:pip.bzl", "pip_install") +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") + +def codeql_workspace_deps(repository_name = "codeql"): + pip_install( + name = "codegen_deps", + requirements = "@%s//misc/codegen:requirements_lock.txt" % repository_name, + ) + bazel_skylib_workspace() + rules_pkg_dependencies() diff --git a/swift/third_party/load.bzl b/swift/third_party/load.bzl index b503f1be1ef..6f876f333f2 100644 --- a/swift/third_party/load.bzl +++ b/swift/third_party/load.bzl @@ -40,7 +40,7 @@ def _get_toolchain_url(info): info.extension, ) -def _toolchains(): +def _toolchains(repository_name): rules = { "tar.gz": http_archive, "pkg": _pkg_archive, @@ -51,7 +51,7 @@ def _toolchains(): name = "swift_toolchain_%s" % arch, url = _get_toolchain_url(info), sha256 = info.sha, - build_file = _build % ("swift-toolchain-%s" % arch), + build_file = _build(repository_name, "swift-toolchain-%s" % arch), strip_prefix = "%s-%s" % (_swift_version, info.suffix), ) @@ -109,9 +109,10 @@ def _github_archive(*, name, repository, commit, build_file = None, sha256 = Non sha256 = sha256, ) -_build = "@codeql//swift/third_party:BUILD.%s.bazel" +def _build(repository_name, package): + return "@%s//swift/third_party:BUILD.%s.bazel" % (repository_name, package) -def _load_dependencies(_): +def load_dependencies(module_ctx = None, repository_name = "codeql"): for repo_arch, arch in _swift_arch_map.items(): sha256 = _swift_sha_map[repo_arch] @@ -121,11 +122,11 @@ def _load_dependencies(_): _swift_prebuilt_version, repo_arch, ), - build_file = _build % "swift-llvm-support", + build_file = _build(repository_name, "swift-llvm-support"), sha256 = sha256, patch_args = ["-p1"], patches = [ - "@codeql//swift/third_party/swift-llvm-support:patches/%s.patch" % patch_name + "@%s//swift/third_party/swift-llvm-support:patches/%s.patch" % (repository_name, patch_name) for patch_name in ( "remove-redundant-operators", "add-constructor-to-Compilation", @@ -133,11 +134,11 @@ def _load_dependencies(_): ], ) - _toolchains() + _toolchains(repository_name) _github_archive( name = "picosha2", - build_file = _build % "picosha2", + build_file = _build(repository_name, "picosha2"), repository = "okdshin/PicoSHA2", commit = "27fcf6979298949e8a462e16d09a0351c18fcaf2", sha256 = "d6647ca45a8b7bdaf027ecb68d041b22a899a0218b7206dee755c558a2725abb", @@ -145,10 +146,34 @@ def _load_dependencies(_): _github_archive( name = "binlog", - build_file = _build % "binlog", + build_file = _build(repository_name, "binlog"), repository = "morganstanley/binlog", commit = "3fef8846f5ef98e64211e7982c2ead67e0b185a6", sha256 = "f5c61d90a6eff341bf91771f2f465be391fd85397023e1b391c17214f9cbd045", ) -swift_deps = module_extension(_load_dependencies) + if module_ctx == None: + # legacy workspace loading, remove when transition is complete + _github_archive( + name = "absl", + repository = "abseil/abseil-cpp", + commit = "d2c5297a3c3948de765100cb7e5cccca1210d23c", + sha256 = "735a9efc673f30b3212bfd57f38d5deb152b543e35cd58b412d1363b15242049", + ) + + _github_archive( + name = "json", + repository = "nlohmann/json", + commit = "6af826d0bdb55e4b69e3ad817576745335f243ca", + sha256 = "702bb0231a5e21c0374230fed86c8ae3d07ee50f34ffd420e7f8249854b7d85b", + ) + + _github_archive( + name = "fmt", + repository = "fmtlib/fmt", + build_file = _build(repository_name, "fmt"), + commit = "a0b8a92e3d1532361c2f7feb63babc5c18d00ef2", + sha256 = "ccf872fd4aa9ab3d030d62cffcb258ca27f021b2023a0244b2cf476f984be955", + ) + +swift_deps = module_extension(load_dependencies) From 648c06ce272cd1c394c60db921325b51d4e3d11b Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Thu, 22 Feb 2024 16:44:46 +0100 Subject: [PATCH 117/207] Simplify dotnet SDK check in autobuilder --- .../BuildScripts.cs | 20 ++++----- .../Semmle.Autobuild.CSharp/DotNetRule.cs | 41 +++++++------------ 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs index 2bfe9a6854e..9f5a4b74c2e 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs @@ -558,8 +558,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestLinuxBuildlessExtractionSuccess() { - actions.RunProcess["dotnet --info"] = 0; - actions.RunProcessOut["dotnet --info"] = ""; + actions.RunProcess["dotnet --list-sdks"] = 0; + actions.RunProcessOut["dotnet --list-sdks"] = "any version"; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -575,8 +575,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestLinuxBuildlessExtractionFailed() { - actions.RunProcess["dotnet --info"] = 0; - actions.RunProcessOut["dotnet --info"] = ""; + actions.RunProcess["dotnet --list-sdks"] = 0; + actions.RunProcessOut["dotnet --list-sdks"] = "any version"; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 10; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -592,8 +592,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestLinuxBuildlessExtractionSolution() { - actions.RunProcess["dotnet --info"] = 0; - actions.RunProcessOut["dotnet --info"] = ""; + actions.RunProcess["dotnet --list-sdks"] = 0; + actions.RunProcessOut["dotnet --list-sdks"] = "any version"; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; @@ -609,8 +609,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestLinuxBuildlessExtractionNoDotnet() { - actions.RunProcess["dotnet --info"] = 1; - actions.RunProcessOut["dotnet --info"] = ""; + actions.RunProcess["dotnet --list-sdks"] = 1; + actions.RunProcessOut["dotnet --list-sdks"] = ""; actions.RunProcess[@"chmod u+x scratch/.dotnet/dotnet-install.sh"] = 0; actions.RunProcess[@"scratch/.dotnet/dotnet-install.sh --channel release --version 8.0.101 --install-dir scratch/.dotnet"] = 0; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone --dotnet scratch/.dotnet"] = 0; @@ -915,8 +915,8 @@ namespace Semmle.Autobuild.CSharp.Tests [Fact] public void TestSkipNugetBuildless() { - actions.RunProcess["dotnet --info"] = 0; - actions.RunProcessOut["dotnet --info"] = ""; + actions.RunProcess["dotnet --list-sdks"] = 0; + actions.RunProcessOut["dotnet --list-sdks"] = "any version"; actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs index 35c62fd197a..af00e8dba70 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs @@ -163,18 +163,8 @@ namespace Semmle.Autobuild.CSharp if (ensureDotNetAvailable) { - return BuildScript.Bind(GetInfoScript(builder.Actions), (infoLines, infoRet) => - { - if (infoRet == 0) - { - return BuildScript.Failure; - } - - const string latestDotNetSdkVersion = "8.0.101"; - builder.Log(Severity.Info, $"No .NET Core SDK found. Attempting to install version {latestDotNetSdkVersion}."); - return DownloadDotNetVersion(builder, installDir, latestDotNetSdkVersion, checkInstalledSdkVersion: false); - }); - + const string latestDotNetSdkVersion = "8.0.101"; + return DownloadDotNetVersion(builder, installDir, latestDotNetSdkVersion, needExactVersion: false); } return BuildScript.Failure; @@ -186,20 +176,25 @@ namespace Semmle.Autobuild.CSharp /// /// See https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script. /// - private static BuildScript DownloadDotNetVersion(IAutobuilder builder, string path, string version, bool checkInstalledSdkVersion = true) + private static BuildScript DownloadDotNetVersion(IAutobuilder builder, string path, string version, bool needExactVersion = true) { - var firstScript = checkInstalledSdkVersion - ? GetInstalledSdksScript(builder.Actions) - : BuildScript.Success; - - return BuildScript.Bind(firstScript, (sdks, sdksRet) => + return BuildScript.Bind(GetInstalledSdksScript(builder.Actions), (sdks, sdksRet) => { - if (checkInstalledSdkVersion && sdksRet == 0 && sdks.Count == 1 && sdks[0].StartsWith(version + " ", StringComparison.Ordinal)) + if (needExactVersion && sdksRet == 0 && sdks.Count == 1 && sdks[0].StartsWith(version + " ", StringComparison.Ordinal)) { // The requested SDK is already installed (and no other SDKs are installed), so // no need to reinstall return BuildScript.Failure; } + else if (!needExactVersion && sdksRet == 0 && sdks.Count > 0) + { + // there's at least one SDK installed, so no need to reinstall + return BuildScript.Failure; + } + else if (!needExactVersion && sdksRet != 0) + { + builder.Log(Severity.Info, "No .NET Core SDK found."); + } builder.Log(Severity.Info, "Attempting to download .NET Core {0}", version); @@ -269,14 +264,6 @@ namespace Semmle.Autobuild.CSharp return listSdks.Script; } - private static BuildScript GetInfoScript(IBuildActions actions) - { - var info = new CommandBuilder(actions, silent: true). - RunCommand("dotnet"). - Argument("--info"); - return info.Script; - } - private static string DotNetCommand(IBuildActions actions, string? dotNetPath) => dotNetPath is not null ? actions.PathCombine(dotNetPath, "dotnet") : "dotnet"; From e176b32a834cde7f1d57dcb0789d9fcdc023807f Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Thu, 22 Feb 2024 17:12:38 +0100 Subject: [PATCH 118/207] Remove environment dictionary passing --- .../Semmle.Autobuild.CSharp/CSharpAutobuilder.cs | 2 +- .../Semmle.Autobuild.CSharp/StandaloneBuildRule.cs | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs index 6f6faac802b..859029eee32 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs @@ -53,7 +53,7 @@ namespace Semmle.Autobuild.CSharp attempt = DotNetRule.WithDotNet(this, ensureDotNetAvailable: true, (dotNetPath, env) => { // No need to check that the extractor has been executed in buildless mode - return new StandaloneBuildRule(dotNetPath, env).Analyse(this, false); + return new StandaloneBuildRule(dotNetPath).Analyse(this, false); }); break; case CSharpBuildStrategy.MSBuild: diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs index 02c98c4b3c5..6bfddb6cdaa 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs @@ -9,12 +9,10 @@ namespace Semmle.Autobuild.CSharp internal class StandaloneBuildRule : IBuildRule { private readonly string? dotNetPath; - private readonly IDictionary? env; - internal StandaloneBuildRule(string? dotNetPath, IDictionary? env) + internal StandaloneBuildRule(string? dotNetPath) { this.dotNetPath = dotNetPath; - this.env = env; } public BuildScript Analyse(IAutobuilder builder, bool auto) @@ -27,7 +25,7 @@ namespace Semmle.Autobuild.CSharp } var standalone = builder.Actions.PathCombine(builder.CodeQLExtractorLangRoot, "tools", builder.CodeQlPlatform, "Semmle.Extraction.CSharp.Standalone"); - var cmd = new CommandBuilder(builder.Actions, environment: this.env); + var cmd = new CommandBuilder(builder.Actions); cmd.RunCommand(standalone); if (!string.IsNullOrEmpty(this.dotNetPath)) From 50f9354ca82d6cabf5a1afacbd2fd123d9deadde Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Thu, 22 Feb 2024 17:13:59 +0100 Subject: [PATCH 119/207] Remove redundant `using` --- .../autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs index 6bfddb6cdaa..b58b0fb2fce 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Semmle.Autobuild.Shared; +using Semmle.Autobuild.Shared; namespace Semmle.Autobuild.CSharp { From ebe6ee5257ae5d8dc565b2d1522c2aea498437b1 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Thu, 22 Feb 2024 16:44:19 +0000 Subject: [PATCH 120/207] C++: accept test changes from extractor fixes --- .../library-tests/ir/ir/PrintAST.expected | 580 +++++++++++++- .../library-tests/ir/ir/aliased_ir.expected | 722 ++++++++++-------- .../ir/ir/aliased_ssa_consistency.expected | 4 - .../aliased_ssa_consistency_unsound.expected | 4 - .../ir/ir/operand_locations.expected | 714 +++++++++-------- .../ir/ir/raw_consistency.expected | 4 - .../test/library-tests/ir/ir/raw_ir.expected | 671 +++++++++------- .../ir/ir/unaliased_ssa_consistency.expected | 4 - ...unaliased_ssa_consistency_unsound.expected | 4 - .../aliased_ssa_consistency.expected | 1 - .../syntax-zoo/raw_consistency.expected | 2 - .../unaliased_ssa_consistency.expected | 1 - 12 files changed, 1767 insertions(+), 944 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index d1b889ff69c..11e6b8cd65b 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -9478,8 +9478,12 @@ ir.cpp: # 1068| : # 1068| getParameter(0): [Parameter] (unnamed parameter 0) # 1068| Type = [IntType] int +# 1069| [Destructor] void vector::~vector() +# 1069| : # 1069| [Destructor] void vector::~vector() # 1069| : +# 1069| [Destructor] void vector::~vector() +# 1069| : # 1070| [ConstMemberFunction] vector::iterator vector::begin() const # 1070| : # 1070| [ConstMemberFunction] vector::iterator vector::begin() const @@ -9515,7 +9519,43 @@ ir.cpp: # 1079| getEntryPoint(): [BlockStmt] { ... } # 1080| getStmt(0): [RangeBasedForStmt] for(...:...) ... # 1080| getChild(1): [DeclStmt] declaration +# 1080| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range) +# 1080| Type = [LValueReferenceType] const vector & +#-----| getVariable().getInitializer(): [Initializer] initializer for (__range) +# 1080| getExpr(): [VariableAccess] v +# 1080| Type = [LValueReferenceType] const vector & +# 1080| ValueCategory = prvalue(load) +# 1080| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1080| Type = [LValueReferenceType] const vector & +# 1080| ValueCategory = prvalue +# 1080| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1080| Type = [SpecifiedType] const vector +# 1080| ValueCategory = lvalue # 1080| getBeginEndDeclaration(): [DeclStmt] declaration +# 1080| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) +# 1080| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) +# 1080| getExpr(): [FunctionCall] call to begin +# 1080| Type = [NestedStruct] iterator +# 1080| ValueCategory = prvalue +# 1080| getQualifier(): [VariableAccess] (__range) +# 1080| Type = [LValueReferenceType] const vector & +# 1080| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +# 1080| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) +# 1080| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__end) +# 1080| getExpr(): [FunctionCall] call to end +# 1080| Type = [NestedStruct] iterator +# 1080| ValueCategory = prvalue +# 1080| getQualifier(): [VariableAccess] (__range) +# 1080| Type = [LValueReferenceType] const vector & +# 1080| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue # 1080| getCondition(): [FunctionCall] call to operator!= # 1080| Type = [BoolType] bool # 1080| ValueCategory = prvalue @@ -9536,6 +9576,22 @@ ir.cpp: # 1080| Type = [NestedStruct] iterator # 1080| ValueCategory = lvalue # 1080| getChild(5): [DeclStmt] declaration +# 1080| getDeclarationEntry(0): [VariableDeclarationEntry] definition of e +# 1080| Type = [IntType] int +# 1080| getVariable().getInitializer(): [Initializer] initializer for e +# 1080| getExpr(): [OverloadedPointerDereferenceExpr] call to operator* +# 1080| Type = [LValueReferenceType] int & +# 1080| ValueCategory = prvalue +# 1080| getQualifier(): [VariableAccess] (__begin) +# 1080| Type = [NestedStruct] iterator +# 1080| ValueCategory = lvalue +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 1080| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1080| Type = [IntType] int +# 1080| ValueCategory = prvalue(load) # 1080| getStmt(): [BlockStmt] { ... } # 1081| getStmt(0): [IfStmt] if (...) ... # 1081| getCondition(): [GTExpr] ... > ... @@ -9556,7 +9612,43 @@ ir.cpp: # 1080| ValueCategory = lvalue # 1086| getStmt(1): [RangeBasedForStmt] for(...:...) ... # 1086| getChild(1): [DeclStmt] declaration +# 1086| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range) +# 1086| Type = [LValueReferenceType] const vector & +#-----| getVariable().getInitializer(): [Initializer] initializer for (__range) +# 1086| getExpr(): [VariableAccess] v +# 1086| Type = [LValueReferenceType] const vector & +# 1086| ValueCategory = prvalue(load) +# 1086| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1086| Type = [LValueReferenceType] const vector & +# 1086| ValueCategory = prvalue +# 1086| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1086| Type = [SpecifiedType] const vector +# 1086| ValueCategory = lvalue # 1086| getBeginEndDeclaration(): [DeclStmt] declaration +# 1086| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) +# 1086| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) +# 1086| getExpr(): [FunctionCall] call to begin +# 1086| Type = [NestedStruct] iterator +# 1086| ValueCategory = prvalue +# 1086| getQualifier(): [VariableAccess] (__range) +# 1086| Type = [LValueReferenceType] const vector & +# 1086| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +# 1086| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) +# 1086| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__end) +# 1086| getExpr(): [FunctionCall] call to end +# 1086| Type = [NestedStruct] iterator +# 1086| ValueCategory = prvalue +# 1086| getQualifier(): [VariableAccess] (__range) +# 1086| Type = [LValueReferenceType] const vector & +# 1086| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue # 1086| getCondition(): [FunctionCall] call to operator!= # 1086| Type = [BoolType] bool # 1086| ValueCategory = prvalue @@ -9577,6 +9669,29 @@ ir.cpp: # 1086| Type = [NestedStruct] iterator # 1086| ValueCategory = lvalue # 1086| getChild(5): [DeclStmt] declaration +# 1086| getDeclarationEntry(0): [VariableDeclarationEntry] definition of e +# 1086| Type = [LValueReferenceType] const int & +# 1086| getVariable().getInitializer(): [Initializer] initializer for e +# 1086| getExpr(): [OverloadedPointerDereferenceExpr] call to operator* +# 1086| Type = [LValueReferenceType] int & +# 1086| ValueCategory = prvalue +# 1086| getQualifier(): [VariableAccess] (__begin) +# 1086| Type = [NestedStruct] iterator +# 1086| ValueCategory = lvalue +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 1086| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1086| Type = [LValueReferenceType] const int & +# 1086| ValueCategory = prvalue +# 1086| getExpr(): [CStyleCast] (const int)... +# 1086| Conversion = [GlvalueConversion] glvalue conversion +# 1086| Type = [SpecifiedType] const int +# 1086| ValueCategory = lvalue +# 1086| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1086| Type = [IntType] int +# 1086| ValueCategory = lvalue # 1086| getStmt(): [BlockStmt] { ... } # 1087| getStmt(0): [IfStmt] if (...) ... # 1087| getCondition(): [LTExpr] ... < ... @@ -10325,24 +10440,6 @@ ir.cpp: # 1245| Type = [PointerType] const char * # 1245| ValueCategory = prvalue(load) # 1246| getStmt(3): [ReturnStmt] return ... -# 1246| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 1246| Type = [VoidType] void -# 1246| ValueCategory = prvalue -# 1246| getQualifier(): [VariableAccess] c -# 1246| Type = [Struct] String -# 1246| ValueCategory = lvalue -# 1246| getImplicitDestructorCall(1): [DestructorCall] call to ~String -# 1246| Type = [VoidType] void -# 1246| ValueCategory = prvalue -# 1246| getQualifier(): [VariableAccess] b -# 1246| Type = [Struct] String -# 1246| ValueCategory = lvalue -# 1246| getImplicitDestructorCall(2): [DestructorCall] call to ~String -# 1246| Type = [VoidType] void -# 1246| ValueCategory = prvalue -# 1246| getQualifier(): [VariableAccess] a -# 1246| Type = [Struct] String -# 1246| ValueCategory = lvalue # 1250| [TopLevelFunction] char* strcpy(char*, char const*) # 1250| : # 1250| getParameter(0): [Parameter] destination @@ -16386,6 +16483,12 @@ ir.cpp: # 2142| Type = [PlainCharType] char # 2142| Value = [CharLiteral] 97 # 2142| ValueCategory = prvalue +# 2142| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2142| Type = [VoidType] void +# 2142| ValueCategory = prvalue +# 2142| getQualifier(): [VariableAccess] x +# 2142| Type = [Class] ClassWithDestructor +# 2142| ValueCategory = lvalue # 2144| getStmt(2): [SwitchStmt] switch (...) ... # 2144| getInitialization(): [DeclStmt] declaration # 2144| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x @@ -16452,8 +16555,62 @@ ir.cpp: # 2153| Type = [VoidType] void # 2153| ValueCategory = prvalue # 2154| getStmt(5): [RangeBasedForStmt] for(...:...) ... +# 2154| getInitialization(): [DeclStmt] declaration +# 2154| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys +# 2154| Type = [ClassTemplateInstantiation,Struct] vector +# 2154| getVariable().getInitializer(): [Initializer] initializer for ys +# 2154| getExpr(): [ConstructorCall] call to vector +# 2154| Type = [VoidType] void +# 2154| ValueCategory = prvalue +# 2154| getArgument(0): [VariableAccess] x +# 2154| Type = [Class] ClassWithDestructor +# 2154| ValueCategory = prvalue(load) +# 2154| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 2154| Type = [Class] ClassWithDestructor +# 2154| ValueCategory = lvalue # 2154| getChild(1): [DeclStmt] declaration +# 2154| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range) +# 2154| Type = [LValueReferenceType] vector & +#-----| getVariable().getInitializer(): [Initializer] initializer for (__range) +# 2154| getExpr(): [VariableAccess] ys +# 2154| Type = [ClassTemplateInstantiation,Struct] vector +# 2154| ValueCategory = lvalue +# 2154| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2154| Type = [LValueReferenceType] vector & +# 2154| ValueCategory = prvalue # 2154| getBeginEndDeclaration(): [DeclStmt] declaration +# 2154| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) +# 2154| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) +# 2154| getExpr(): [FunctionCall] call to begin +# 2154| Type = [NestedStruct] iterator +# 2154| ValueCategory = prvalue +# 2154| getQualifier(): [VariableAccess] (__range) +# 2154| Type = [LValueReferenceType] vector & +# 2154| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue +# 2154| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) +# 2154| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__end) +# 2154| getExpr(): [FunctionCall] call to end +# 2154| Type = [NestedStruct] iterator +# 2154| ValueCategory = prvalue +# 2154| getQualifier(): [VariableAccess] (__range) +# 2154| Type = [LValueReferenceType] vector & +# 2154| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue # 2154| getCondition(): [FunctionCall] call to operator!= # 2154| Type = [BoolType] bool # 2154| ValueCategory = prvalue @@ -16474,6 +16631,22 @@ ir.cpp: # 2154| Type = [NestedStruct] iterator # 2154| ValueCategory = lvalue # 2154| getChild(5): [DeclStmt] declaration +# 2154| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2154| Type = [Class] ClassWithDestructor +# 2154| getVariable().getInitializer(): [Initializer] initializer for y +# 2154| getExpr(): [OverloadedPointerDereferenceExpr] call to operator* +# 2154| Type = [LValueReferenceType] ClassWithDestructor & +# 2154| ValueCategory = prvalue +# 2154| getQualifier(): [VariableAccess] (__begin) +# 2154| Type = [NestedStruct] iterator +# 2154| ValueCategory = lvalue +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2154| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2154| Type = [Class] ClassWithDestructor +# 2154| ValueCategory = prvalue(load) # 2155| getStmt(): [ExprStmt] ExprStmt # 2155| getExpr(): [FunctionCall] call to set_x # 2155| Type = [VoidType] void @@ -16485,12 +16658,78 @@ ir.cpp: # 2155| Type = [PlainCharType] char # 2155| Value = [CharLiteral] 97 # 2155| ValueCategory = prvalue +# 2154| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2154| Type = [VoidType] void +# 2154| ValueCategory = prvalue +# 2154| getQualifier(): [VariableAccess] y +# 2154| Type = [Class] ClassWithDestructor +# 2154| ValueCategory = lvalue +# 2154| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2154| Type = [VoidType] void +# 2154| ValueCategory = prvalue +# 2154| getQualifier(): [VariableAccess] ys +# 2154| Type = [ClassTemplateInstantiation,Struct] vector +# 2154| ValueCategory = lvalue # 2154| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2154| Type = [NestedStruct] iterator # 2154| ValueCategory = lvalue # 2157| getStmt(6): [RangeBasedForStmt] for(...:...) ... +# 2157| getInitialization(): [DeclStmt] declaration +# 2157| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys +# 2157| Type = [ClassTemplateInstantiation,Struct] vector +# 2157| getVariable().getInitializer(): [Initializer] initializer for ys +# 2157| getExpr(): [ConstructorCall] call to vector +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getArgument(0): [VariableAccess] x +# 2157| Type = [Class] ClassWithDestructor +# 2157| ValueCategory = prvalue(load) +# 2157| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 2157| Type = [Class] ClassWithDestructor +# 2157| ValueCategory = lvalue # 2157| getChild(1): [DeclStmt] declaration +# 2157| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range) +# 2157| Type = [LValueReferenceType] vector & +#-----| getVariable().getInitializer(): [Initializer] initializer for (__range) +# 2157| getExpr(): [VariableAccess] ys +# 2157| Type = [ClassTemplateInstantiation,Struct] vector +# 2157| ValueCategory = lvalue +# 2157| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2157| Type = [LValueReferenceType] vector & +# 2157| ValueCategory = prvalue # 2157| getBeginEndDeclaration(): [DeclStmt] declaration +# 2157| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) +# 2157| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) +# 2157| getExpr(): [FunctionCall] call to begin +# 2157| Type = [NestedStruct] iterator +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] (__range) +# 2157| Type = [LValueReferenceType] vector & +# 2157| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue +# 2157| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) +# 2157| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__end) +# 2157| getExpr(): [FunctionCall] call to end +# 2157| Type = [NestedStruct] iterator +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] (__range) +# 2157| Type = [LValueReferenceType] vector & +# 2157| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue # 2157| getCondition(): [FunctionCall] call to operator!= # 2157| Type = [BoolType] bool # 2157| ValueCategory = prvalue @@ -16511,6 +16750,22 @@ ir.cpp: # 2157| Type = [NestedStruct] iterator # 2157| ValueCategory = lvalue # 2157| getChild(5): [DeclStmt] declaration +# 2157| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2157| Type = [Class] ClassWithDestructor +# 2157| getVariable().getInitializer(): [Initializer] initializer for y +# 2157| getExpr(): [OverloadedPointerDereferenceExpr] call to operator* +# 2157| Type = [LValueReferenceType] ClassWithDestructor & +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] (__begin) +# 2157| Type = [NestedStruct] iterator +# 2157| ValueCategory = lvalue +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2157| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2157| Type = [Class] ClassWithDestructor +# 2157| ValueCategory = prvalue(load) # 2157| getStmt(): [BlockStmt] { ... } # 2158| getStmt(0): [ExprStmt] ExprStmt # 2158| getExpr(): [FunctionCall] call to set_x @@ -16547,18 +16802,94 @@ ir.cpp: # 2159| Value = [CStyleCast] 98 # 2159| ValueCategory = prvalue # 2160| getThen(): [ReturnStmt] return ... -# 2172| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2157| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] y +# 2157| Type = [Class] ClassWithDestructor +# 2157| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(1): [DestructorCall] call to ~vector +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] ys +# 2157| Type = [ClassTemplateInstantiation,Struct] vector +# 2157| ValueCategory = lvalue +# 2172| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor # 2172| Type = [VoidType] void # 2172| ValueCategory = prvalue # 2172| getQualifier(): [VariableAccess] x # 2172| Type = [Class] ClassWithDestructor # 2172| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] y +# 2157| Type = [Class] ClassWithDestructor +# 2157| ValueCategory = lvalue +# 2157| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2157| Type = [VoidType] void +# 2157| ValueCategory = prvalue +# 2157| getQualifier(): [VariableAccess] ys +# 2157| Type = [ClassTemplateInstantiation,Struct] vector +# 2157| ValueCategory = lvalue # 2157| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2157| Type = [NestedStruct] iterator # 2157| ValueCategory = lvalue # 2163| getStmt(7): [RangeBasedForStmt] for(...:...) ... +# 2163| getInitialization(): [DeclStmt] declaration +# 2163| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys +# 2163| Type = [ClassTemplateInstantiation,Struct] vector +# 2163| getVariable().getInitializer(): [Initializer] initializer for ys +# 2163| getExpr(): [ConstructorCall] call to vector +# 2163| Type = [VoidType] void +# 2163| ValueCategory = prvalue +# 2163| getArgument(0): [Literal] 1 +# 2163| Type = [IntType] int +# 2163| Value = [Literal] 1 +# 2163| ValueCategory = prvalue # 2163| getChild(1): [DeclStmt] declaration +# 2163| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range) +# 2163| Type = [LValueReferenceType] vector & +#-----| getVariable().getInitializer(): [Initializer] initializer for (__range) +# 2163| getExpr(): [VariableAccess] ys +# 2163| Type = [ClassTemplateInstantiation,Struct] vector +# 2163| ValueCategory = lvalue +# 2163| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2163| Type = [LValueReferenceType] vector & +# 2163| ValueCategory = prvalue # 2163| getBeginEndDeclaration(): [DeclStmt] declaration +# 2163| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) +# 2163| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) +# 2163| getExpr(): [FunctionCall] call to begin +# 2163| Type = [NestedStruct] iterator +# 2163| ValueCategory = prvalue +# 2163| getQualifier(): [VariableAccess] (__range) +# 2163| Type = [LValueReferenceType] vector & +# 2163| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue +# 2163| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) +# 2163| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__end) +# 2163| getExpr(): [FunctionCall] call to end +# 2163| Type = [NestedStruct] iterator +# 2163| ValueCategory = prvalue +# 2163| getQualifier(): [VariableAccess] (__range) +# 2163| Type = [LValueReferenceType] vector & +# 2163| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue # 2163| getCondition(): [FunctionCall] call to operator!= # 2163| Type = [BoolType] bool # 2163| ValueCategory = prvalue @@ -16579,6 +16910,22 @@ ir.cpp: # 2163| Type = [NestedStruct] iterator # 2163| ValueCategory = lvalue # 2163| getChild(5): [DeclStmt] declaration +# 2163| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2163| Type = [IntType] int +# 2163| getVariable().getInitializer(): [Initializer] initializer for y +# 2163| getExpr(): [OverloadedPointerDereferenceExpr] call to operator* +# 2163| Type = [LValueReferenceType] int & +# 2163| ValueCategory = prvalue +# 2163| getQualifier(): [VariableAccess] (__begin) +# 2163| Type = [NestedStruct] iterator +# 2163| ValueCategory = lvalue +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2163| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2163| Type = [IntType] int +# 2163| ValueCategory = prvalue(load) # 2163| getStmt(): [BlockStmt] { ... } # 2164| getStmt(0): [IfStmt] if (...) ... # 2164| getCondition(): [EQExpr] ... == ... @@ -16592,18 +16939,84 @@ ir.cpp: # 2164| Value = [Literal] 1 # 2164| ValueCategory = prvalue # 2165| getThen(): [ReturnStmt] return ... -# 2172| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2163| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2163| Type = [VoidType] void +# 2163| ValueCategory = prvalue +# 2163| getQualifier(): [VariableAccess] ys +# 2163| Type = [ClassTemplateInstantiation,Struct] vector +# 2163| ValueCategory = lvalue +# 2172| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor # 2172| Type = [VoidType] void # 2172| ValueCategory = prvalue # 2172| getQualifier(): [VariableAccess] x # 2172| Type = [Class] ClassWithDestructor # 2172| ValueCategory = lvalue +# 2163| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2163| Type = [VoidType] void +# 2163| ValueCategory = prvalue +# 2163| getQualifier(): [VariableAccess] ys +# 2163| Type = [ClassTemplateInstantiation,Struct] vector +# 2163| ValueCategory = lvalue # 2163| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2163| Type = [NestedStruct] iterator # 2163| ValueCategory = lvalue # 2168| getStmt(8): [RangeBasedForStmt] for(...:...) ... +# 2168| getInitialization(): [DeclStmt] declaration +# 2168| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys +# 2168| Type = [ClassTemplateInstantiation,Struct] vector +# 2168| getVariable().getInitializer(): [Initializer] initializer for ys +# 2168| getExpr(): [ConstructorCall] call to vector +# 2168| Type = [VoidType] void +# 2168| ValueCategory = prvalue +# 2168| getArgument(0): [VariableAccess] x +# 2168| Type = [Class] ClassWithDestructor +# 2168| ValueCategory = prvalue(load) +# 2168| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 2168| Type = [Class] ClassWithDestructor +# 2168| ValueCategory = lvalue # 2168| getChild(1): [DeclStmt] declaration +# 2168| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range) +# 2168| Type = [LValueReferenceType] vector & +#-----| getVariable().getInitializer(): [Initializer] initializer for (__range) +# 2168| getExpr(): [VariableAccess] ys +# 2168| Type = [ClassTemplateInstantiation,Struct] vector +# 2168| ValueCategory = lvalue +# 2168| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2168| Type = [LValueReferenceType] vector & +# 2168| ValueCategory = prvalue # 2168| getBeginEndDeclaration(): [DeclStmt] declaration +# 2168| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) +# 2168| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) +# 2168| getExpr(): [FunctionCall] call to begin +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] (__range) +# 2168| Type = [LValueReferenceType] vector & +# 2168| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue +# 2168| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) +# 2168| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__end) +# 2168| getExpr(): [FunctionCall] call to end +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] (__range) +# 2168| Type = [LValueReferenceType] vector & +# 2168| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue # 2168| getCondition(): [FunctionCall] call to operator!= # 2168| Type = [BoolType] bool # 2168| ValueCategory = prvalue @@ -16624,6 +17037,22 @@ ir.cpp: # 2168| Type = [NestedStruct] iterator # 2168| ValueCategory = lvalue # 2168| getChild(5): [DeclStmt] declaration +# 2168| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2168| Type = [Class] ClassWithDestructor +# 2168| getVariable().getInitializer(): [Initializer] initializer for y +# 2168| getExpr(): [OverloadedPointerDereferenceExpr] call to operator* +# 2168| Type = [LValueReferenceType] ClassWithDestructor & +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] (__begin) +# 2168| Type = [NestedStruct] iterator +# 2168| ValueCategory = lvalue +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2168| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2168| Type = [Class] ClassWithDestructor +# 2168| ValueCategory = prvalue(load) # 2168| getStmt(): [BlockStmt] { ... } # 2169| getStmt(0): [DeclStmt] declaration # 2169| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z1 @@ -16651,6 +17080,18 @@ ir.cpp: # 2171| getQualifier(): [VariableAccess] z1 # 2171| Type = [Class] ClassWithDestructor # 2171| ValueCategory = lvalue +# 2168| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor +# 2168| Type = [VoidType] void +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] y +# 2168| Type = [Class] ClassWithDestructor +# 2168| ValueCategory = lvalue +# 2168| getImplicitDestructorCall(0): [DestructorCall] call to ~vector +# 2168| Type = [VoidType] void +# 2168| ValueCategory = prvalue +# 2168| getQualifier(): [VariableAccess] ys +# 2168| Type = [ClassTemplateInstantiation,Struct] vector +# 2168| ValueCategory = lvalue # 2168| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2168| Type = [NestedStruct] iterator # 2168| ValueCategory = lvalue @@ -16682,7 +17123,7 @@ ir.cpp: # 2177| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor # 2177| Type = [VoidType] void # 2177| ValueCategory = prvalue -# 2177| getQualifier(): [VariableAccess] b +# 2177| getQualifier(): [VariableAccess] a # 2177| Type = [Class] ClassWithDestructor # 2177| ValueCategory = lvalue # 2179| [TopLevelFunction] void static_variable_with_destructor_2() @@ -16737,7 +17178,13 @@ ir.cpp: # 2188| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor # 2188| Type = [VoidType] void # 2188| ValueCategory = prvalue -# 2188| getQualifier(): [VariableAccess] c +# 2188| getQualifier(): [VariableAccess] b +# 2188| Type = [Class] ClassWithDestructor +# 2188| ValueCategory = lvalue +# 2188| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor +# 2188| Type = [VoidType] void +# 2188| ValueCategory = prvalue +# 2188| getQualifier(): [VariableAccess] a # 2188| Type = [Class] ClassWithDestructor # 2188| ValueCategory = lvalue # 2190| [GlobalVariable] ClassWithDestructor global_class_with_destructor @@ -16959,7 +17406,64 @@ ir.cpp: # 2222| ValueCategory = lvalue # 2226| getStmt(2): [RangeBasedForStmt] for(...:...) ... # 2226| getChild(1): [DeclStmt] declaration +# 2226| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__range) +# 2226| Type = [RValueReferenceType] vector && +#-----| getVariable().getInitializer(): [Initializer] initializer for (__range) +# 2226| getExpr(): [ConstructorCall] call to vector +# 2226| Type = [VoidType] void +# 2226| ValueCategory = prvalue +# 2226| getArgument(0): [ConstructorCall] call to String +# 2226| Type = [VoidType] void +# 2226| ValueCategory = prvalue +# 2226| getArgument(0): hello +# 2226| Type = [ArrayType] const char[6] +# 2226| Value = [StringLiteral] "hello" +# 2226| ValueCategory = lvalue +# 2226| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2226| Type = [PointerType] const char * +# 2226| ValueCategory = prvalue +# 2226| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 2226| Type = [Struct] String +# 2226| ValueCategory = lvalue +# 2226| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2226| Type = [LValueReferenceType] vector & +# 2226| ValueCategory = prvalue +# 2226| getExpr(): [TemporaryObjectExpr] temporary object +# 2226| Type = [ClassTemplateInstantiation,Struct] vector +# 2226| ValueCategory = xvalue # 2226| getBeginEndDeclaration(): [DeclStmt] declaration +# 2226| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) +# 2226| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__begin) +# 2226| getExpr(): [FunctionCall] call to begin +# 2226| Type = [NestedStruct] iterator +# 2226| ValueCategory = prvalue +# 2226| getQualifier(): [VariableAccess] (__range) +# 2226| Type = [RValueReferenceType] vector && +# 2226| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue +# 2226| getDeclarationEntry(1): [VariableDeclarationEntry] declaration of (__end) +# 2226| Type = [NestedStruct] iterator +#-----| getVariable().getInitializer(): [Initializer] initializer for (__end) +# 2226| getExpr(): [FunctionCall] call to end +# 2226| Type = [NestedStruct] iterator +# 2226| ValueCategory = prvalue +# 2226| getQualifier(): [VariableAccess] (__range) +# 2226| Type = [RValueReferenceType] vector && +# 2226| ValueCategory = prvalue(load) +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const vector)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const vector +#-----| ValueCategory = lvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ClassTemplateInstantiation,Struct] vector +#-----| ValueCategory = lvalue # 2226| getCondition(): [FunctionCall] call to operator!= # 2226| Type = [BoolType] bool # 2226| ValueCategory = prvalue @@ -16980,6 +17484,32 @@ ir.cpp: # 2226| Type = [NestedStruct] iterator # 2226| ValueCategory = lvalue # 2226| getChild(5): [DeclStmt] declaration +# 2226| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2226| Type = [Struct] String +# 2226| getVariable().getInitializer(): [Initializer] initializer for s +# 2226| getExpr(): [ConstructorCall] call to String +# 2226| Type = [VoidType] void +# 2226| ValueCategory = prvalue +# 2226| getArgument(0): [OverloadedPointerDereferenceExpr] call to operator* +# 2226| Type = [LValueReferenceType] String & +# 2226| ValueCategory = prvalue +# 2226| getQualifier(): [VariableAccess] (__begin) +# 2226| Type = [NestedStruct] iterator +# 2226| ValueCategory = lvalue +#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)... +#-----| Conversion = [GlvalueConversion] glvalue conversion +#-----| Type = [SpecifiedType] const iterator +#-----| ValueCategory = lvalue +# 2226| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2226| Type = [LValueReferenceType] const String & +# 2226| ValueCategory = prvalue +# 2226| getExpr(): [CStyleCast] (const String)... +# 2226| Conversion = [GlvalueConversion] glvalue conversion +# 2226| Type = [SpecifiedType] const String +# 2226| ValueCategory = lvalue +# 2226| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2226| Type = [Struct] String +# 2226| ValueCategory = lvalue # 2226| getStmt(): [BlockStmt] { ... } # 2227| getStmt(0): [DeclStmt] declaration # 2227| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s2 @@ -16994,6 +17524,12 @@ ir.cpp: # 2228| getQualifier(): [VariableAccess] s2 # 2228| Type = [Struct] String # 2228| ValueCategory = lvalue +# 2226| getImplicitDestructorCall(1): [DestructorCall] call to ~String +# 2226| Type = [VoidType] void +# 2226| ValueCategory = prvalue +# 2226| getQualifier(): [VariableAccess] s +# 2226| Type = [Struct] String +# 2226| ValueCategory = lvalue # 2226| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2226| Type = [NestedStruct] iterator # 2226| ValueCategory = lvalue diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 48889997167..b1a82467e47 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -7605,36 +7605,12 @@ ir.cpp: #-----| Goto -> Block 6 # 1246| Block 6 -# 1246| m1246_1(unknown) = Phi : from 4:~m1245_1, from 5:~m1245_17 -# 1246| v1246_2(void) = NoOp : -# 1246| r1246_3(glval) = VariableAddress[c] : -# 1246| r1246_4(glval) = FunctionAddress[~String] : -# 1246| v1246_5(void) = Call[~String] : func:r1246_4, this:r1246_3 -# 1246| m1246_6(unknown) = ^CallSideEffect : ~m1246_1 -# 1246| m1246_7(unknown) = Chi : total:m1246_1, partial:m1246_6 -# 1246| v1246_8(void) = ^IndirectReadSideEffect[-1] : &:r1246_3, ~m1246_7 -# 1246| m1246_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1246_3 -# 1246| m1246_10(unknown) = Chi : total:m1246_7, partial:m1246_9 -# 1246| r1246_11(glval) = VariableAddress[b] : -# 1246| r1246_12(glval) = FunctionAddress[~String] : -# 1246| v1246_13(void) = Call[~String] : func:r1246_12, this:r1246_11 -# 1246| m1246_14(unknown) = ^CallSideEffect : ~m1246_10 -# 1246| m1246_15(unknown) = Chi : total:m1246_10, partial:m1246_14 -# 1246| v1246_16(void) = ^IndirectReadSideEffect[-1] : &:r1246_11, ~m1246_15 -# 1246| m1246_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r1246_11 -# 1246| m1246_18(unknown) = Chi : total:m1246_15, partial:m1246_17 -# 1246| r1246_19(glval) = VariableAddress[a] : -# 1246| r1246_20(glval) = FunctionAddress[~String] : -# 1246| v1246_21(void) = Call[~String] : func:r1246_20, this:r1246_19 -# 1246| m1246_22(unknown) = ^CallSideEffect : ~m1246_18 -# 1246| m1246_23(unknown) = Chi : total:m1246_18, partial:m1246_22 -# 1246| v1246_24(void) = ^IndirectReadSideEffect[-1] : &:r1246_19, ~m1246_23 -# 1246| m1246_25(String) = ^IndirectMayWriteSideEffect[-1] : &:r1246_19 -# 1246| m1246_26(unknown) = Chi : total:m1246_23, partial:m1246_25 -# 1242| v1242_9(void) = ReturnIndirection[dynamic] : &:r1242_7, m1242_8 -# 1242| v1242_10(void) = ReturnVoid : -# 1242| v1242_11(void) = AliasedUse : ~m1246_26 -# 1242| v1242_12(void) = ExitFunction : +# 1246| m1246_1(unknown) = Phi : from 4:~m1245_1, from 5:~m1245_17 +# 1246| v1246_2(void) = NoOp : +# 1242| v1242_9(void) = ReturnIndirection[dynamic] : &:r1242_7, m1242_8 +# 1242| v1242_10(void) = ReturnVoid : +# 1242| v1242_11(void) = AliasedUse : ~m1246_1 +# 1242| v1242_12(void) = ExitFunction : # 1253| void test_strings(char*, char*) # 1253| Block 0 @@ -12801,7 +12777,7 @@ ir.cpp: #-----| True -> Block 2 # 2137| Block 1 -# 2137| m2137_9(unknown) = Phi : from 14:~m2172_5, from 19:~m2172_13, from 23:~m2172_22 +# 2137| m2137_9(unknown) = Phi : from 13:~m2172_5, from 19:~m2172_13, from 23:~m2172_22 # 2137| v2137_10(void) = ReturnVoid : # 2137| v2137_11(void) = AliasedUse : ~m2137_9 # 2137| v2137_12(void) = ExitFunction : @@ -12905,158 +12881,180 @@ ir.cpp: # 2153| m2153_6(unknown) = Chi : total:m2151_1, partial:m2153_5 # 2153| m2153_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2153_1 # 2153| m2153_8(ClassWithDestructor) = Chi : total:m2153_2, partial:m2153_7 -# 2154| r2154_1(glval &>) = VariableAddress[(__range)] : -# 2154| r2154_2(glval>) = VariableAddress : -# 2154| r2154_3(vector &) = CopyValue : r2154_2 -# 2154| m2154_4(vector &) = Store[(__range)] : &:r2154_1, r2154_3 -# 2154| r2154_5(glval) = VariableAddress[(__begin)] : -# 2154| r2154_6(glval &>) = VariableAddress[(__range)] : -# 2154| r2154_7(vector &) = Load[(__range)] : &:r2154_6, m2154_4 -#-----| r0_1(glval>) = CopyValue : r2154_7 -#-----| r0_2(glval>) = Convert : r0_1 -# 2154| r2154_8(glval) = FunctionAddress[begin] : -# 2154| r2154_9(iterator) = Call[begin] : func:r2154_8, this:r0_2 +# 2154| r2154_1(glval>) = VariableAddress[ys] : +# 2154| m2154_2(vector) = Uninitialized[ys] : &:r2154_1 +# 2154| r2154_3(glval) = FunctionAddress[vector] : +# 2154| r2154_4(glval) = VariableAddress[#temp2154:40] : +# 2154| r2154_5(glval) = VariableAddress[x] : +# 2154| r2154_6(ClassWithDestructor) = Load[x] : &:r2154_5, m2153_8 +# 2154| m2154_7(ClassWithDestructor) = Store[#temp2154:40] : &:r2154_4, r2154_6 +# 2154| r2154_8(ClassWithDestructor) = Load[#temp2154:40] : &:r2154_4, m2154_7 +# 2154| v2154_9(void) = Call[vector] : func:r2154_3, this:r2154_1, 0:r2154_8 # 2154| m2154_10(unknown) = ^CallSideEffect : ~m2153_6 # 2154| m2154_11(unknown) = Chi : total:m2153_6, partial:m2154_10 -#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m2154_11 -# 2154| m2154_12(iterator) = Store[(__begin)] : &:r2154_5, r2154_9 -# 2154| r2154_13(glval) = VariableAddress[(__end)] : +# 2154| m2154_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2154_1 +# 2154| m2154_13(vector) = Chi : total:m2154_2, partial:m2154_12 # 2154| r2154_14(glval &>) = VariableAddress[(__range)] : -# 2154| r2154_15(vector &) = Load[(__range)] : &:r2154_14, m2154_4 -#-----| r0_4(glval>) = CopyValue : r2154_15 +# 2154| r2154_15(glval>) = VariableAddress[ys] : +# 2154| r2154_16(vector &) = CopyValue : r2154_15 +# 2154| m2154_17(vector &) = Store[(__range)] : &:r2154_14, r2154_16 +# 2154| r2154_18(glval) = VariableAddress[(__begin)] : +# 2154| r2154_19(glval &>) = VariableAddress[(__range)] : +# 2154| r2154_20(vector &) = Load[(__range)] : &:r2154_19, m2154_17 +#-----| r0_1(glval>) = CopyValue : r2154_20 +#-----| r0_2(glval>) = Convert : r0_1 +# 2154| r2154_21(glval) = FunctionAddress[begin] : +# 2154| r2154_22(iterator) = Call[begin] : func:r2154_21, this:r0_2 +# 2154| m2154_23(unknown) = ^CallSideEffect : ~m2154_11 +# 2154| m2154_24(unknown) = Chi : total:m2154_11, partial:m2154_23 +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, m2154_13 +# 2154| m2154_25(iterator) = Store[(__begin)] : &:r2154_18, r2154_22 +# 2154| r2154_26(glval) = VariableAddress[(__end)] : +# 2154| r2154_27(glval &>) = VariableAddress[(__range)] : +# 2154| r2154_28(vector &) = Load[(__range)] : &:r2154_27, m2154_17 +#-----| r0_4(glval>) = CopyValue : r2154_28 #-----| r0_5(glval>) = Convert : r0_4 -# 2154| r2154_16(glval) = FunctionAddress[end] : -# 2154| r2154_17(iterator) = Call[end] : func:r2154_16, this:r0_5 -# 2154| m2154_18(unknown) = ^CallSideEffect : ~m2154_11 -# 2154| m2154_19(unknown) = Chi : total:m2154_11, partial:m2154_18 -#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m2154_19 -# 2154| m2154_20(iterator) = Store[(__end)] : &:r2154_13, r2154_17 +# 2154| r2154_29(glval) = FunctionAddress[end] : +# 2154| r2154_30(iterator) = Call[end] : func:r2154_29, this:r0_5 +# 2154| m2154_31(unknown) = ^CallSideEffect : ~m2154_24 +# 2154| m2154_32(unknown) = Chi : total:m2154_24, partial:m2154_31 +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, m2154_13 +# 2154| m2154_33(iterator) = Store[(__end)] : &:r2154_26, r2154_30 #-----| Goto -> Block 8 # 2154| Block 8 -# 2154| m2154_21(iterator) = Phi : from 7:m2154_12, from 9:m2154_46 -# 2154| m2154_22(unknown) = Phi : from 7:~m2154_19, from 9:~m2154_43 -# 2154| r2154_23(glval) = VariableAddress[(__begin)] : -#-----| r0_7(glval) = Convert : r2154_23 -# 2154| r2154_24(glval) = FunctionAddress[operator!=] : -# 2154| r2154_25(glval) = VariableAddress[(__end)] : -# 2154| r2154_26(iterator) = Load[(__end)] : &:r2154_25, m2154_20 -# 2154| r2154_27(bool) = Call[operator!=] : func:r2154_24, this:r0_7, 0:r2154_26 -# 2154| m2154_28(unknown) = ^CallSideEffect : ~m2154_22 -# 2154| m2154_29(unknown) = Chi : total:m2154_22, partial:m2154_28 -#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2154_21 -# 2154| v2154_30(void) = ConditionalBranch : r2154_27 +# 2154| m2154_34(iterator) = Phi : from 7:m2154_25, from 9:m2154_67 +# 2154| m2154_35(unknown) = Phi : from 7:~m2154_32, from 9:~m2154_64 +# 2154| r2154_36(glval) = VariableAddress[(__begin)] : +#-----| r0_7(glval) = Convert : r2154_36 +# 2154| r2154_37(glval) = FunctionAddress[operator!=] : +# 2154| r2154_38(glval) = VariableAddress[(__end)] : +# 2154| r2154_39(iterator) = Load[(__end)] : &:r2154_38, m2154_33 +# 2154| r2154_40(bool) = Call[operator!=] : func:r2154_37, this:r0_7, 0:r2154_39 +# 2154| m2154_41(unknown) = ^CallSideEffect : ~m2154_35 +# 2154| m2154_42(unknown) = Chi : total:m2154_35, partial:m2154_41 +#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2154_34 +# 2154| v2154_43(void) = ConditionalBranch : r2154_40 #-----| False -> Block 10 #-----| True -> Block 9 # 2154| Block 9 -# 2154| r2154_31(glval) = VariableAddress[y] : -# 2154| r2154_32(glval) = VariableAddress[(__begin)] : -#-----| r0_9(glval) = Convert : r2154_32 -# 2154| r2154_33(glval) = FunctionAddress[operator*] : -# 2154| r2154_34(ClassWithDestructor &) = Call[operator*] : func:r2154_33, this:r0_9 -# 2154| m2154_35(unknown) = ^CallSideEffect : ~m2154_29 -# 2154| m2154_36(unknown) = Chi : total:m2154_29, partial:m2154_35 -#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, m2154_21 -# 2154| r2154_37(ClassWithDestructor) = Load[?] : &:r2154_34, ~m2154_36 -# 2154| m2154_38(ClassWithDestructor) = Store[y] : &:r2154_31, r2154_37 -# 2155| r2155_1(glval) = VariableAddress[y] : -# 2155| r2155_2(glval) = FunctionAddress[set_x] : -# 2155| r2155_3(char) = Constant[97] : -# 2155| v2155_4(void) = Call[set_x] : func:r2155_2, this:r2155_1, 0:r2155_3 -# 2155| m2155_5(unknown) = ^CallSideEffect : ~m2154_36 -# 2155| m2155_6(unknown) = Chi : total:m2154_36, partial:m2155_5 -# 2155| v2155_7(void) = ^IndirectReadSideEffect[-1] : &:r2155_1, m2154_38 -# 2155| m2155_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 -# 2155| m2155_9(ClassWithDestructor) = Chi : total:m2154_38, partial:m2155_8 -# 2154| r2154_39(glval) = VariableAddress[(__begin)] : -# 2154| r2154_40(glval) = FunctionAddress[operator++] : -# 2154| r2154_41(iterator &) = Call[operator++] : func:r2154_40, this:r2154_39 -# 2154| m2154_42(unknown) = ^CallSideEffect : ~m2155_6 -# 2154| m2154_43(unknown) = Chi : total:m2155_6, partial:m2154_42 -# 2154| v2154_44(void) = ^IndirectReadSideEffect[-1] : &:r2154_39, m2154_21 -# 2154| m2154_45(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2154_39 -# 2154| m2154_46(iterator) = Chi : total:m2154_21, partial:m2154_45 -# 2154| r2154_47(glval) = CopyValue : r2154_41 +# 2154| r2154_44(glval) = VariableAddress[y] : +# 2154| r2154_45(glval) = VariableAddress[(__begin)] : +#-----| r0_9(glval) = Convert : r2154_45 +# 2154| r2154_46(glval) = FunctionAddress[operator*] : +# 2154| r2154_47(ClassWithDestructor &) = Call[operator*] : func:r2154_46, this:r0_9 +# 2154| m2154_48(unknown) = ^CallSideEffect : ~m2154_42 +# 2154| m2154_49(unknown) = Chi : total:m2154_42, partial:m2154_48 +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, m2154_34 +# 2154| r2154_50(ClassWithDestructor) = Load[?] : &:r2154_47, ~m2154_49 +# 2154| m2154_51(ClassWithDestructor) = Store[y] : &:r2154_44, r2154_50 +# 2155| r2155_1(glval) = VariableAddress[y] : +# 2155| r2155_2(glval) = FunctionAddress[set_x] : +# 2155| r2155_3(char) = Constant[97] : +# 2155| v2155_4(void) = Call[set_x] : func:r2155_2, this:r2155_1, 0:r2155_3 +# 2155| m2155_5(unknown) = ^CallSideEffect : ~m2154_49 +# 2155| m2155_6(unknown) = Chi : total:m2154_49, partial:m2155_5 +# 2155| v2155_7(void) = ^IndirectReadSideEffect[-1] : &:r2155_1, m2154_51 +# 2155| m2155_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 +# 2155| m2155_9(ClassWithDestructor) = Chi : total:m2154_51, partial:m2155_8 +# 2154| r2154_52(glval) = VariableAddress[y] : +# 2154| r2154_53(glval) = FunctionAddress[~ClassWithDestructor] : +# 2154| v2154_54(void) = Call[~ClassWithDestructor] : func:r2154_53, this:r2154_52 +# 2154| m2154_55(unknown) = ^CallSideEffect : ~m2155_6 +# 2154| m2154_56(unknown) = Chi : total:m2155_6, partial:m2154_55 +# 2154| v2154_57(void) = ^IndirectReadSideEffect[-1] : &:r2154_52, m2155_9 +# 2154| m2154_58(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2154_52 +# 2154| m2154_59(ClassWithDestructor) = Chi : total:m2155_9, partial:m2154_58 +# 2154| r2154_60(glval) = VariableAddress[(__begin)] : +# 2154| r2154_61(glval) = FunctionAddress[operator++] : +# 2154| r2154_62(iterator &) = Call[operator++] : func:r2154_61, this:r2154_60 +# 2154| m2154_63(unknown) = ^CallSideEffect : ~m2154_56 +# 2154| m2154_64(unknown) = Chi : total:m2154_56, partial:m2154_63 +# 2154| v2154_65(void) = ^IndirectReadSideEffect[-1] : &:r2154_60, m2154_34 +# 2154| m2154_66(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2154_60 +# 2154| m2154_67(iterator) = Chi : total:m2154_34, partial:m2154_66 +# 2154| r2154_68(glval) = CopyValue : r2154_62 #-----| Goto (back edge) -> Block 8 # 2157| Block 10 -# 2157| r2157_1(glval &>) = VariableAddress[(__range)] : -# 2157| r2157_2(glval>) = VariableAddress : -# 2157| r2157_3(vector &) = CopyValue : r2157_2 -# 2157| m2157_4(vector &) = Store[(__range)] : &:r2157_1, r2157_3 -# 2157| r2157_5(glval) = VariableAddress[(__begin)] : -# 2157| r2157_6(glval &>) = VariableAddress[(__range)] : -# 2157| r2157_7(vector &) = Load[(__range)] : &:r2157_6, m2157_4 -#-----| r0_11(glval>) = CopyValue : r2157_7 -#-----| r0_12(glval>) = Convert : r0_11 -# 2157| r2157_8(glval) = FunctionAddress[begin] : -# 2157| r2157_9(iterator) = Call[begin] : func:r2157_8, this:r0_12 -# 2157| m2157_10(unknown) = ^CallSideEffect : ~m2154_29 -# 2157| m2157_11(unknown) = Chi : total:m2154_29, partial:m2157_10 -#-----| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_12, ~m2157_11 -# 2157| m2157_12(iterator) = Store[(__begin)] : &:r2157_5, r2157_9 -# 2157| r2157_13(glval) = VariableAddress[(__end)] : -# 2157| r2157_14(glval &>) = VariableAddress[(__range)] : -# 2157| r2157_15(vector &) = Load[(__range)] : &:r2157_14, m2157_4 -#-----| r0_14(glval>) = CopyValue : r2157_15 -#-----| r0_15(glval>) = Convert : r0_14 -# 2157| r2157_16(glval) = FunctionAddress[end] : -# 2157| r2157_17(iterator) = Call[end] : func:r2157_16, this:r0_15 -# 2157| m2157_18(unknown) = ^CallSideEffect : ~m2157_11 -# 2157| m2157_19(unknown) = Chi : total:m2157_11, partial:m2157_18 -#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, ~m2157_19 -# 2157| m2157_20(iterator) = Store[(__end)] : &:r2157_13, r2157_17 +# 2157| r2157_1(glval>) = VariableAddress[ys] : +# 2157| m2157_2(vector) = Uninitialized[ys] : &:r2157_1 +# 2157| r2157_3(glval) = FunctionAddress[vector] : +# 2157| r2157_4(glval) = VariableAddress[#temp2157:40] : +# 2157| r2157_5(glval) = VariableAddress[x] : +# 2157| r2157_6(ClassWithDestructor) = Load[x] : &:r2157_5, m2153_8 +# 2157| m2157_7(ClassWithDestructor) = Store[#temp2157:40] : &:r2157_4, r2157_6 +# 2157| r2157_8(ClassWithDestructor) = Load[#temp2157:40] : &:r2157_4, m2157_7 +# 2157| v2157_9(void) = Call[vector] : func:r2157_3, this:r2157_1, 0:r2157_8 +# 2157| m2157_10(unknown) = ^CallSideEffect : ~m2154_42 +# 2157| m2157_11(unknown) = Chi : total:m2154_42, partial:m2157_10 +# 2157| m2157_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2157_1 +# 2157| m2157_13(vector) = Chi : total:m2157_2, partial:m2157_12 +# 2157| r2157_14(glval &>) = VariableAddress[(__range)] : +# 2157| r2157_15(glval>) = VariableAddress[ys] : +# 2157| r2157_16(vector &) = CopyValue : r2157_15 +# 2157| m2157_17(vector &) = Store[(__range)] : &:r2157_14, r2157_16 +# 2157| r2157_18(glval) = VariableAddress[(__begin)] : +# 2157| r2157_19(glval &>) = VariableAddress[(__range)] : +# 2157| r2157_20(vector &) = Load[(__range)] : &:r2157_19, m2157_17 +#-----| r0_11(glval>) = CopyValue : r2157_20 +#-----| r0_12(glval>) = Convert : r0_11 +# 2157| r2157_21(glval) = FunctionAddress[begin] : +# 2157| r2157_22(iterator) = Call[begin] : func:r2157_21, this:r0_12 +# 2157| m2157_23(unknown) = ^CallSideEffect : ~m2157_11 +# 2157| m2157_24(unknown) = Chi : total:m2157_11, partial:m2157_23 +#-----| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_12, m2157_13 +# 2157| m2157_25(iterator) = Store[(__begin)] : &:r2157_18, r2157_22 +# 2157| r2157_26(glval) = VariableAddress[(__end)] : +# 2157| r2157_27(glval &>) = VariableAddress[(__range)] : +# 2157| r2157_28(vector &) = Load[(__range)] : &:r2157_27, m2157_17 +#-----| r0_14(glval>) = CopyValue : r2157_28 +#-----| r0_15(glval>) = Convert : r0_14 +# 2157| r2157_29(glval) = FunctionAddress[end] : +# 2157| r2157_30(iterator) = Call[end] : func:r2157_29, this:r0_15 +# 2157| m2157_31(unknown) = ^CallSideEffect : ~m2157_24 +# 2157| m2157_32(unknown) = Chi : total:m2157_24, partial:m2157_31 +#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, m2157_13 +# 2157| m2157_33(iterator) = Store[(__end)] : &:r2157_26, r2157_30 #-----| Goto -> Block 11 # 2157| Block 11 -# 2157| m2157_21(iterator) = Phi : from 10:m2157_12, from 12:m2157_38 -# 2157| m2157_22(unknown) = Phi : from 10:~m2157_19, from 12:~m2157_35 -# 2157| r2157_23(glval) = VariableAddress[(__begin)] : -#-----| r0_17(glval) = Convert : r2157_23 -# 2157| r2157_24(glval) = FunctionAddress[operator!=] : -# 2157| r2157_25(glval) = VariableAddress[(__end)] : -# 2157| r2157_26(iterator) = Load[(__end)] : &:r2157_25, m2157_20 -# 2157| r2157_27(bool) = Call[operator!=] : func:r2157_24, this:r0_17, 0:r2157_26 -# 2157| m2157_28(unknown) = ^CallSideEffect : ~m2157_22 -# 2157| m2157_29(unknown) = Chi : total:m2157_22, partial:m2157_28 -#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, m2157_21 -# 2157| v2157_30(void) = ConditionalBranch : r2157_27 +# 2157| m2157_34(iterator) = Phi : from 10:m2157_25, from 14:m2157_83 +# 2157| m2157_35(unknown) = Phi : from 10:~m2157_32, from 14:~m2157_80 +# 2157| r2157_36(glval) = VariableAddress[(__begin)] : +#-----| r0_17(glval) = Convert : r2157_36 +# 2157| r2157_37(glval) = FunctionAddress[operator!=] : +# 2157| r2157_38(glval) = VariableAddress[(__end)] : +# 2157| r2157_39(iterator) = Load[(__end)] : &:r2157_38, m2157_33 +# 2157| r2157_40(bool) = Call[operator!=] : func:r2157_37, this:r0_17, 0:r2157_39 +# 2157| m2157_41(unknown) = ^CallSideEffect : ~m2157_35 +# 2157| m2157_42(unknown) = Chi : total:m2157_35, partial:m2157_41 +#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, m2157_34 +# 2157| v2157_43(void) = ConditionalBranch : r2157_40 #-----| False -> Block 15 -#-----| True -> Block 13 +#-----| True -> Block 12 # 2157| Block 12 -# 2157| r2157_31(glval) = VariableAddress[(__begin)] : -# 2157| r2157_32(glval) = FunctionAddress[operator++] : -# 2157| r2157_33(iterator &) = Call[operator++] : func:r2157_32, this:r2157_31 -# 2157| m2157_34(unknown) = ^CallSideEffect : ~m2159_5 -# 2157| m2157_35(unknown) = Chi : total:m2159_5, partial:m2157_34 -# 2157| v2157_36(void) = ^IndirectReadSideEffect[-1] : &:r2157_31, m2157_21 -# 2157| m2157_37(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2157_31 -# 2157| m2157_38(iterator) = Chi : total:m2157_21, partial:m2157_37 -# 2157| r2157_39(glval) = CopyValue : r2157_33 -#-----| Goto (back edge) -> Block 11 - -# 2157| Block 13 -# 2157| r2157_40(glval) = VariableAddress[y] : -# 2157| r2157_41(glval) = VariableAddress[(__begin)] : -#-----| r0_19(glval) = Convert : r2157_41 -# 2157| r2157_42(glval) = FunctionAddress[operator*] : -# 2157| r2157_43(ClassWithDestructor &) = Call[operator*] : func:r2157_42, this:r0_19 -# 2157| m2157_44(unknown) = ^CallSideEffect : ~m2157_29 -# 2157| m2157_45(unknown) = Chi : total:m2157_29, partial:m2157_44 -#-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_19, m2157_21 -# 2157| r2157_46(ClassWithDestructor) = Load[?] : &:r2157_43, ~m2157_45 -# 2157| m2157_47(ClassWithDestructor) = Store[y] : &:r2157_40, r2157_46 +# 2157| r2157_44(glval) = VariableAddress[y] : +# 2157| r2157_45(glval) = VariableAddress[(__begin)] : +#-----| r0_19(glval) = Convert : r2157_45 +# 2157| r2157_46(glval) = FunctionAddress[operator*] : +# 2157| r2157_47(ClassWithDestructor &) = Call[operator*] : func:r2157_46, this:r0_19 +# 2157| m2157_48(unknown) = ^CallSideEffect : ~m2157_42 +# 2157| m2157_49(unknown) = Chi : total:m2157_42, partial:m2157_48 +#-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_19, m2157_34 +# 2157| r2157_50(ClassWithDestructor) = Load[?] : &:r2157_47, ~m2157_49 +# 2157| m2157_51(ClassWithDestructor) = Store[y] : &:r2157_44, r2157_50 # 2158| r2158_1(glval) = VariableAddress[y] : # 2158| r2158_2(glval) = FunctionAddress[set_x] : # 2158| r2158_3(char) = Constant[97] : # 2158| v2158_4(void) = Call[set_x] : func:r2158_2, this:r2158_1, 0:r2158_3 -# 2158| m2158_5(unknown) = ^CallSideEffect : ~m2157_45 -# 2158| m2158_6(unknown) = Chi : total:m2157_45, partial:m2158_5 -# 2158| v2158_7(void) = ^IndirectReadSideEffect[-1] : &:r2158_1, m2157_47 +# 2158| m2158_5(unknown) = ^CallSideEffect : ~m2157_49 +# 2158| m2158_6(unknown) = Chi : total:m2157_49, partial:m2158_5 +# 2158| v2158_7(void) = ^IndirectReadSideEffect[-1] : &:r2158_1, m2157_51 # 2158| m2158_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2158_1 -# 2158| m2158_9(ClassWithDestructor) = Chi : total:m2157_47, partial:m2158_8 +# 2158| m2158_9(ClassWithDestructor) = Chi : total:m2157_51, partial:m2158_8 # 2159| r2159_1(glval) = VariableAddress[y] : # 2159| r2159_2(glval) = FunctionAddress[get_x] : # 2159| r2159_3(char) = Call[get_x] : func:r2159_2, this:r2159_1 @@ -13069,91 +13067,136 @@ ir.cpp: # 2159| r2159_10(int) = Constant[98] : # 2159| r2159_11(bool) = CompareEQ : r2159_9, r2159_10 # 2159| v2159_12(void) = ConditionalBranch : r2159_11 -#-----| False -> Block 12 -#-----| True -> Block 14 +#-----| False -> Block 14 +#-----| True -> Block 13 -# 2160| Block 14 -# 2160| v2160_1(void) = NoOp : -# 2172| r2172_1(glval) = VariableAddress[x] : -# 2172| r2172_2(glval) = FunctionAddress[~ClassWithDestructor] : -# 2172| v2172_3(void) = Call[~ClassWithDestructor] : func:r2172_2, this:r2172_1 -# 2172| m2172_4(unknown) = ^CallSideEffect : ~m2159_5 -# 2172| m2172_5(unknown) = Chi : total:m2159_5, partial:m2172_4 -# 2172| v2172_6(void) = ^IndirectReadSideEffect[-1] : &:r2172_1, m2153_8 -# 2172| m2172_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_1 -# 2172| m2172_8(ClassWithDestructor) = Chi : total:m2153_8, partial:m2172_7 +# 2160| Block 13 +# 2160| v2160_1(void) = NoOp : +# 2157| r2157_52(glval) = VariableAddress[y] : +# 2157| r2157_53(glval) = FunctionAddress[~ClassWithDestructor] : +# 2157| v2157_54(void) = Call[~ClassWithDestructor] : func:r2157_53, this:r2157_52 +# 2157| m2157_55(unknown) = ^CallSideEffect : ~m2159_5 +# 2157| m2157_56(unknown) = Chi : total:m2159_5, partial:m2157_55 +# 2157| v2157_57(void) = ^IndirectReadSideEffect[-1] : &:r2157_52, m2159_8 +# 2157| m2157_58(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2157_52 +# 2157| m2157_59(ClassWithDestructor) = Chi : total:m2159_8, partial:m2157_58 +# 2157| r2157_60(glval>) = VariableAddress[ys] : +# 2157| r2157_61(glval) = FunctionAddress[~vector] : +# 2157| v2157_62(void) = Call[~vector] : func:r2157_61, this:r2157_60 +# 2157| m2157_63(unknown) = ^CallSideEffect : ~m2157_56 +# 2157| m2157_64(unknown) = Chi : total:m2157_56, partial:m2157_63 +# 2157| v2157_65(void) = ^IndirectReadSideEffect[-1] : &:r2157_60, m2157_13 +# 2157| m2157_66(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2157_60 +# 2157| m2157_67(vector) = Chi : total:m2157_13, partial:m2157_66 +# 2172| r2172_1(glval) = VariableAddress[x] : +# 2172| r2172_2(glval) = FunctionAddress[~ClassWithDestructor] : +# 2172| v2172_3(void) = Call[~ClassWithDestructor] : func:r2172_2, this:r2172_1 +# 2172| m2172_4(unknown) = ^CallSideEffect : ~m2157_64 +# 2172| m2172_5(unknown) = Chi : total:m2157_64, partial:m2172_4 +# 2172| v2172_6(void) = ^IndirectReadSideEffect[-1] : &:r2172_1, m2153_8 +# 2172| m2172_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_1 +# 2172| m2172_8(ClassWithDestructor) = Chi : total:m2153_8, partial:m2172_7 #-----| Goto -> Block 1 +# 2157| Block 14 +# 2157| r2157_68(glval) = VariableAddress[y] : +# 2157| r2157_69(glval) = FunctionAddress[~ClassWithDestructor] : +# 2157| v2157_70(void) = Call[~ClassWithDestructor] : func:r2157_69, this:r2157_68 +# 2157| m2157_71(unknown) = ^CallSideEffect : ~m2159_5 +# 2157| m2157_72(unknown) = Chi : total:m2159_5, partial:m2157_71 +# 2157| v2157_73(void) = ^IndirectReadSideEffect[-1] : &:r2157_68, m2159_8 +# 2157| m2157_74(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2157_68 +# 2157| m2157_75(ClassWithDestructor) = Chi : total:m2159_8, partial:m2157_74 +# 2157| r2157_76(glval) = VariableAddress[(__begin)] : +# 2157| r2157_77(glval) = FunctionAddress[operator++] : +# 2157| r2157_78(iterator &) = Call[operator++] : func:r2157_77, this:r2157_76 +# 2157| m2157_79(unknown) = ^CallSideEffect : ~m2157_72 +# 2157| m2157_80(unknown) = Chi : total:m2157_72, partial:m2157_79 +# 2157| v2157_81(void) = ^IndirectReadSideEffect[-1] : &:r2157_76, m2157_34 +# 2157| m2157_82(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2157_76 +# 2157| m2157_83(iterator) = Chi : total:m2157_34, partial:m2157_82 +# 2157| r2157_84(glval) = CopyValue : r2157_78 +#-----| Goto (back edge) -> Block 11 + # 2163| Block 15 -# 2163| r2163_1(glval &>) = VariableAddress[(__range)] : -# 2163| r2163_2(glval>) = VariableAddress : -# 2163| r2163_3(vector &) = CopyValue : r2163_2 -# 2163| m2163_4(vector &) = Store[(__range)] : &:r2163_1, r2163_3 -# 2163| r2163_5(glval) = VariableAddress[(__begin)] : -# 2163| r2163_6(glval &>) = VariableAddress[(__range)] : -# 2163| r2163_7(vector &) = Load[(__range)] : &:r2163_6, m2163_4 -#-----| r0_21(glval>) = CopyValue : r2163_7 -#-----| r0_22(glval>) = Convert : r0_21 -# 2163| r2163_8(glval) = FunctionAddress[begin] : -# 2163| r2163_9(iterator) = Call[begin] : func:r2163_8, this:r0_22 -# 2163| m2163_10(unknown) = ^CallSideEffect : ~m2157_29 -# 2163| m2163_11(unknown) = Chi : total:m2157_29, partial:m2163_10 -#-----| v0_23(void) = ^IndirectReadSideEffect[-1] : &:r0_22, ~m2163_11 -# 2163| m2163_12(iterator) = Store[(__begin)] : &:r2163_5, r2163_9 -# 2163| r2163_13(glval) = VariableAddress[(__end)] : -# 2163| r2163_14(glval &>) = VariableAddress[(__range)] : -# 2163| r2163_15(vector &) = Load[(__range)] : &:r2163_14, m2163_4 -#-----| r0_24(glval>) = CopyValue : r2163_15 -#-----| r0_25(glval>) = Convert : r0_24 -# 2163| r2163_16(glval) = FunctionAddress[end] : -# 2163| r2163_17(iterator) = Call[end] : func:r2163_16, this:r0_25 -# 2163| m2163_18(unknown) = ^CallSideEffect : ~m2163_11 -# 2163| m2163_19(unknown) = Chi : total:m2163_11, partial:m2163_18 -#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_25, ~m2163_19 -# 2163| m2163_20(iterator) = Store[(__end)] : &:r2163_13, r2163_17 +# 2163| r2163_1(glval>) = VariableAddress[ys] : +# 2163| m2163_2(vector) = Uninitialized[ys] : &:r2163_1 +# 2163| r2163_3(glval) = FunctionAddress[vector] : +# 2163| r2163_4(int) = Constant[1] : +# 2163| v2163_5(void) = Call[vector] : func:r2163_3, this:r2163_1, 0:r2163_4 +# 2163| m2163_6(unknown) = ^CallSideEffect : ~m2157_42 +# 2163| m2163_7(unknown) = Chi : total:m2157_42, partial:m2163_6 +# 2163| m2163_8(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2163_1 +# 2163| m2163_9(vector) = Chi : total:m2163_2, partial:m2163_8 +# 2163| r2163_10(glval &>) = VariableAddress[(__range)] : +# 2163| r2163_11(glval>) = VariableAddress[ys] : +# 2163| r2163_12(vector &) = CopyValue : r2163_11 +# 2163| m2163_13(vector &) = Store[(__range)] : &:r2163_10, r2163_12 +# 2163| r2163_14(glval) = VariableAddress[(__begin)] : +# 2163| r2163_15(glval &>) = VariableAddress[(__range)] : +# 2163| r2163_16(vector &) = Load[(__range)] : &:r2163_15, m2163_13 +#-----| r0_21(glval>) = CopyValue : r2163_16 +#-----| r0_22(glval>) = Convert : r0_21 +# 2163| r2163_17(glval) = FunctionAddress[begin] : +# 2163| r2163_18(iterator) = Call[begin] : func:r2163_17, this:r0_22 +# 2163| m2163_19(unknown) = ^CallSideEffect : ~m2163_7 +# 2163| m2163_20(unknown) = Chi : total:m2163_7, partial:m2163_19 +#-----| v0_23(void) = ^IndirectReadSideEffect[-1] : &:r0_22, m2163_9 +# 2163| m2163_21(iterator) = Store[(__begin)] : &:r2163_14, r2163_18 +# 2163| r2163_22(glval) = VariableAddress[(__end)] : +# 2163| r2163_23(glval &>) = VariableAddress[(__range)] : +# 2163| r2163_24(vector &) = Load[(__range)] : &:r2163_23, m2163_13 +#-----| r0_24(glval>) = CopyValue : r2163_24 +#-----| r0_25(glval>) = Convert : r0_24 +# 2163| r2163_25(glval) = FunctionAddress[end] : +# 2163| r2163_26(iterator) = Call[end] : func:r2163_25, this:r0_25 +# 2163| m2163_27(unknown) = ^CallSideEffect : ~m2163_20 +# 2163| m2163_28(unknown) = Chi : total:m2163_20, partial:m2163_27 +#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_25, m2163_9 +# 2163| m2163_29(iterator) = Store[(__end)] : &:r2163_22, r2163_26 #-----| Goto -> Block 16 # 2163| Block 16 -# 2163| m2163_21(iterator) = Phi : from 15:m2163_12, from 17:m2163_38 -# 2163| m2163_22(unknown) = Phi : from 15:~m2163_19, from 17:~m2163_35 -# 2163| r2163_23(glval) = VariableAddress[(__begin)] : -#-----| r0_27(glval) = Convert : r2163_23 -# 2163| r2163_24(glval) = FunctionAddress[operator!=] : -# 2163| r2163_25(glval) = VariableAddress[(__end)] : -# 2163| r2163_26(iterator) = Load[(__end)] : &:r2163_25, m2163_20 -# 2163| r2163_27(bool) = Call[operator!=] : func:r2163_24, this:r0_27, 0:r2163_26 -# 2163| m2163_28(unknown) = ^CallSideEffect : ~m2163_22 -# 2163| m2163_29(unknown) = Chi : total:m2163_22, partial:m2163_28 -#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, m2163_21 -# 2163| v2163_30(void) = ConditionalBranch : r2163_27 +# 2163| m2163_30(iterator) = Phi : from 15:m2163_21, from 17:m2163_47 +# 2163| m2163_31(unknown) = Phi : from 15:~m2163_28, from 17:~m2163_44 +# 2163| r2163_32(glval) = VariableAddress[(__begin)] : +#-----| r0_27(glval) = Convert : r2163_32 +# 2163| r2163_33(glval) = FunctionAddress[operator!=] : +# 2163| r2163_34(glval) = VariableAddress[(__end)] : +# 2163| r2163_35(iterator) = Load[(__end)] : &:r2163_34, m2163_29 +# 2163| r2163_36(bool) = Call[operator!=] : func:r2163_33, this:r0_27, 0:r2163_35 +# 2163| m2163_37(unknown) = ^CallSideEffect : ~m2163_31 +# 2163| m2163_38(unknown) = Chi : total:m2163_31, partial:m2163_37 +#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, m2163_30 +# 2163| v2163_39(void) = ConditionalBranch : r2163_36 #-----| False -> Block 20 #-----| True -> Block 18 # 2163| Block 17 -# 2163| r2163_31(glval) = VariableAddress[(__begin)] : -# 2163| r2163_32(glval) = FunctionAddress[operator++] : -# 2163| r2163_33(iterator &) = Call[operator++] : func:r2163_32, this:r2163_31 -# 2163| m2163_34(unknown) = ^CallSideEffect : ~m2163_45 -# 2163| m2163_35(unknown) = Chi : total:m2163_45, partial:m2163_34 -# 2163| v2163_36(void) = ^IndirectReadSideEffect[-1] : &:r2163_31, m2163_21 -# 2163| m2163_37(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2163_31 -# 2163| m2163_38(iterator) = Chi : total:m2163_21, partial:m2163_37 -# 2163| r2163_39(glval) = CopyValue : r2163_33 +# 2163| r2163_40(glval) = VariableAddress[(__begin)] : +# 2163| r2163_41(glval) = FunctionAddress[operator++] : +# 2163| r2163_42(iterator &) = Call[operator++] : func:r2163_41, this:r2163_40 +# 2163| m2163_43(unknown) = ^CallSideEffect : ~m2163_54 +# 2163| m2163_44(unknown) = Chi : total:m2163_54, partial:m2163_43 +# 2163| v2163_45(void) = ^IndirectReadSideEffect[-1] : &:r2163_40, m2163_30 +# 2163| m2163_46(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2163_40 +# 2163| m2163_47(iterator) = Chi : total:m2163_30, partial:m2163_46 +# 2163| r2163_48(glval) = CopyValue : r2163_42 #-----| Goto (back edge) -> Block 16 # 2163| Block 18 -# 2163| r2163_40(glval) = VariableAddress[y] : -# 2163| r2163_41(glval) = VariableAddress[(__begin)] : -#-----| r0_29(glval) = Convert : r2163_41 -# 2163| r2163_42(glval) = FunctionAddress[operator*] : -# 2163| r2163_43(int &) = Call[operator*] : func:r2163_42, this:r0_29 -# 2163| m2163_44(unknown) = ^CallSideEffect : ~m2163_29 -# 2163| m2163_45(unknown) = Chi : total:m2163_29, partial:m2163_44 -#-----| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_29, m2163_21 -# 2163| r2163_46(int) = Load[?] : &:r2163_43, ~m2163_45 -# 2163| m2163_47(int) = Store[y] : &:r2163_40, r2163_46 +# 2163| r2163_49(glval) = VariableAddress[y] : +# 2163| r2163_50(glval) = VariableAddress[(__begin)] : +#-----| r0_29(glval) = Convert : r2163_50 +# 2163| r2163_51(glval) = FunctionAddress[operator*] : +# 2163| r2163_52(int &) = Call[operator*] : func:r2163_51, this:r0_29 +# 2163| m2163_53(unknown) = ^CallSideEffect : ~m2163_38 +# 2163| m2163_54(unknown) = Chi : total:m2163_38, partial:m2163_53 +#-----| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_29, m2163_30 +# 2163| r2163_55(int) = Load[?] : &:r2163_52, ~m2163_54 +# 2163| m2163_56(int) = Store[y] : &:r2163_49, r2163_55 # 2164| r2164_1(glval) = VariableAddress[y] : -# 2164| r2164_2(int) = Load[y] : &:r2164_1, m2163_47 +# 2164| r2164_2(int) = Load[y] : &:r2164_1, m2163_56 # 2164| r2164_3(int) = Constant[1] : # 2164| r2164_4(bool) = CompareEQ : r2164_2, r2164_3 # 2164| v2164_5(void) = ConditionalBranch : r2164_4 @@ -13162,78 +13205,99 @@ ir.cpp: # 2165| Block 19 # 2165| v2165_1(void) = NoOp : +# 2163| r2163_57(glval>) = VariableAddress[ys] : +# 2163| r2163_58(glval) = FunctionAddress[~vector] : +# 2163| v2163_59(void) = Call[~vector] : func:r2163_58, this:r2163_57 +# 2163| m2163_60(unknown) = ^CallSideEffect : ~m2163_54 +# 2163| m2163_61(unknown) = Chi : total:m2163_54, partial:m2163_60 +# 2163| v2163_62(void) = ^IndirectReadSideEffect[-1] : &:r2163_57, m2163_9 +# 2163| m2163_63(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2163_57 +# 2163| m2163_64(vector) = Chi : total:m2163_9, partial:m2163_63 # 2172| r2172_9(glval) = VariableAddress[x] : # 2172| r2172_10(glval) = FunctionAddress[~ClassWithDestructor] : # 2172| v2172_11(void) = Call[~ClassWithDestructor] : func:r2172_10, this:r2172_9 -# 2172| m2172_12(unknown) = ^CallSideEffect : ~m2163_45 -# 2172| m2172_13(unknown) = Chi : total:m2163_45, partial:m2172_12 +# 2172| m2172_12(unknown) = ^CallSideEffect : ~m2163_61 +# 2172| m2172_13(unknown) = Chi : total:m2163_61, partial:m2172_12 # 2172| v2172_14(void) = ^IndirectReadSideEffect[-1] : &:r2172_9, m2153_8 # 2172| m2172_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_9 # 2172| m2172_16(ClassWithDestructor) = Chi : total:m2153_8, partial:m2172_15 #-----| Goto -> Block 1 # 2168| Block 20 -# 2168| r2168_1(glval &>) = VariableAddress[(__range)] : -# 2168| r2168_2(glval>) = VariableAddress : -# 2168| r2168_3(vector &) = CopyValue : r2168_2 -# 2168| m2168_4(vector &) = Store[(__range)] : &:r2168_1, r2168_3 -# 2168| r2168_5(glval) = VariableAddress[(__begin)] : -# 2168| r2168_6(glval &>) = VariableAddress[(__range)] : -# 2168| r2168_7(vector &) = Load[(__range)] : &:r2168_6, m2168_4 -#-----| r0_31(glval>) = CopyValue : r2168_7 -#-----| r0_32(glval>) = Convert : r0_31 -# 2168| r2168_8(glval) = FunctionAddress[begin] : -# 2168| r2168_9(iterator) = Call[begin] : func:r2168_8, this:r0_32 -# 2168| m2168_10(unknown) = ^CallSideEffect : ~m2163_29 -# 2168| m2168_11(unknown) = Chi : total:m2163_29, partial:m2168_10 -#-----| v0_33(void) = ^IndirectReadSideEffect[-1] : &:r0_32, ~m2168_11 -# 2168| m2168_12(iterator) = Store[(__begin)] : &:r2168_5, r2168_9 -# 2168| r2168_13(glval) = VariableAddress[(__end)] : -# 2168| r2168_14(glval &>) = VariableAddress[(__range)] : -# 2168| r2168_15(vector &) = Load[(__range)] : &:r2168_14, m2168_4 -#-----| r0_34(glval>) = CopyValue : r2168_15 -#-----| r0_35(glval>) = Convert : r0_34 -# 2168| r2168_16(glval) = FunctionAddress[end] : -# 2168| r2168_17(iterator) = Call[end] : func:r2168_16, this:r0_35 -# 2168| m2168_18(unknown) = ^CallSideEffect : ~m2168_11 -# 2168| m2168_19(unknown) = Chi : total:m2168_11, partial:m2168_18 -#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, ~m2168_19 -# 2168| m2168_20(iterator) = Store[(__end)] : &:r2168_13, r2168_17 +# 2168| r2168_1(glval>) = VariableAddress[ys] : +# 2168| m2168_2(vector) = Uninitialized[ys] : &:r2168_1 +# 2168| r2168_3(glval) = FunctionAddress[vector] : +# 2168| r2168_4(glval) = VariableAddress[#temp2168:40] : +# 2168| r2168_5(glval) = VariableAddress[x] : +# 2168| r2168_6(ClassWithDestructor) = Load[x] : &:r2168_5, m2153_8 +# 2168| m2168_7(ClassWithDestructor) = Store[#temp2168:40] : &:r2168_4, r2168_6 +# 2168| r2168_8(ClassWithDestructor) = Load[#temp2168:40] : &:r2168_4, m2168_7 +# 2168| v2168_9(void) = Call[vector] : func:r2168_3, this:r2168_1, 0:r2168_8 +# 2168| m2168_10(unknown) = ^CallSideEffect : ~m2163_38 +# 2168| m2168_11(unknown) = Chi : total:m2163_38, partial:m2168_10 +# 2168| m2168_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2168_1 +# 2168| m2168_13(vector) = Chi : total:m2168_2, partial:m2168_12 +# 2168| r2168_14(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_15(glval>) = VariableAddress[ys] : +# 2168| r2168_16(vector &) = CopyValue : r2168_15 +# 2168| m2168_17(vector &) = Store[(__range)] : &:r2168_14, r2168_16 +# 2168| r2168_18(glval) = VariableAddress[(__begin)] : +# 2168| r2168_19(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_20(vector &) = Load[(__range)] : &:r2168_19, m2168_17 +#-----| r0_31(glval>) = CopyValue : r2168_20 +#-----| r0_32(glval>) = Convert : r0_31 +# 2168| r2168_21(glval) = FunctionAddress[begin] : +# 2168| r2168_22(iterator) = Call[begin] : func:r2168_21, this:r0_32 +# 2168| m2168_23(unknown) = ^CallSideEffect : ~m2168_11 +# 2168| m2168_24(unknown) = Chi : total:m2168_11, partial:m2168_23 +#-----| v0_33(void) = ^IndirectReadSideEffect[-1] : &:r0_32, m2168_13 +# 2168| m2168_25(iterator) = Store[(__begin)] : &:r2168_18, r2168_22 +# 2168| r2168_26(glval) = VariableAddress[(__end)] : +# 2168| r2168_27(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_28(vector &) = Load[(__range)] : &:r2168_27, m2168_17 +#-----| r0_34(glval>) = CopyValue : r2168_28 +#-----| r0_35(glval>) = Convert : r0_34 +# 2168| r2168_29(glval) = FunctionAddress[end] : +# 2168| r2168_30(iterator) = Call[end] : func:r2168_29, this:r0_35 +# 2168| m2168_31(unknown) = ^CallSideEffect : ~m2168_24 +# 2168| m2168_32(unknown) = Chi : total:m2168_24, partial:m2168_31 +#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, m2168_13 +# 2168| m2168_33(iterator) = Store[(__end)] : &:r2168_26, r2168_30 #-----| Goto -> Block 21 # 2168| Block 21 -# 2168| m2168_21(iterator) = Phi : from 20:m2168_12, from 22:m2168_46 -# 2168| m2168_22(unknown) = Phi : from 20:~m2168_19, from 22:~m2168_43 -# 2168| r2168_23(glval) = VariableAddress[(__begin)] : -#-----| r0_37(glval) = Convert : r2168_23 -# 2168| r2168_24(glval) = FunctionAddress[operator!=] : -# 2168| r2168_25(glval) = VariableAddress[(__end)] : -# 2168| r2168_26(iterator) = Load[(__end)] : &:r2168_25, m2168_20 -# 2168| r2168_27(bool) = Call[operator!=] : func:r2168_24, this:r0_37, 0:r2168_26 -# 2168| m2168_28(unknown) = ^CallSideEffect : ~m2168_22 -# 2168| m2168_29(unknown) = Chi : total:m2168_22, partial:m2168_28 -#-----| v0_38(void) = ^IndirectReadSideEffect[-1] : &:r0_37, m2168_21 -# 2168| v2168_30(void) = ConditionalBranch : r2168_27 +# 2168| m2168_34(iterator) = Phi : from 20:m2168_25, from 22:m2168_67 +# 2168| m2168_35(unknown) = Phi : from 20:~m2168_32, from 22:~m2168_64 +# 2168| r2168_36(glval) = VariableAddress[(__begin)] : +#-----| r0_37(glval) = Convert : r2168_36 +# 2168| r2168_37(glval) = FunctionAddress[operator!=] : +# 2168| r2168_38(glval) = VariableAddress[(__end)] : +# 2168| r2168_39(iterator) = Load[(__end)] : &:r2168_38, m2168_33 +# 2168| r2168_40(bool) = Call[operator!=] : func:r2168_37, this:r0_37, 0:r2168_39 +# 2168| m2168_41(unknown) = ^CallSideEffect : ~m2168_35 +# 2168| m2168_42(unknown) = Chi : total:m2168_35, partial:m2168_41 +#-----| v0_38(void) = ^IndirectReadSideEffect[-1] : &:r0_37, m2168_34 +# 2168| v2168_43(void) = ConditionalBranch : r2168_40 #-----| False -> Block 23 #-----| True -> Block 22 # 2168| Block 22 -# 2168| r2168_31(glval) = VariableAddress[y] : -# 2168| r2168_32(glval) = VariableAddress[(__begin)] : -#-----| r0_39(glval) = Convert : r2168_32 -# 2168| r2168_33(glval) = FunctionAddress[operator*] : -# 2168| r2168_34(ClassWithDestructor &) = Call[operator*] : func:r2168_33, this:r0_39 -# 2168| m2168_35(unknown) = ^CallSideEffect : ~m2168_29 -# 2168| m2168_36(unknown) = Chi : total:m2168_29, partial:m2168_35 -#-----| v0_40(void) = ^IndirectReadSideEffect[-1] : &:r0_39, m2168_21 -# 2168| r2168_37(ClassWithDestructor) = Load[?] : &:r2168_34, ~m2168_36 -# 2168| m2168_38(ClassWithDestructor) = Store[y] : &:r2168_31, r2168_37 +# 2168| r2168_44(glval) = VariableAddress[y] : +# 2168| r2168_45(glval) = VariableAddress[(__begin)] : +#-----| r0_39(glval) = Convert : r2168_45 +# 2168| r2168_46(glval) = FunctionAddress[operator*] : +# 2168| r2168_47(ClassWithDestructor &) = Call[operator*] : func:r2168_46, this:r0_39 +# 2168| m2168_48(unknown) = ^CallSideEffect : ~m2168_42 +# 2168| m2168_49(unknown) = Chi : total:m2168_42, partial:m2168_48 +#-----| v0_40(void) = ^IndirectReadSideEffect[-1] : &:r0_39, m2168_34 +# 2168| r2168_50(ClassWithDestructor) = Load[?] : &:r2168_47, ~m2168_49 +# 2168| m2168_51(ClassWithDestructor) = Store[y] : &:r2168_44, r2168_50 # 2169| r2169_1(glval) = VariableAddress[z1] : # 2169| m2169_2(ClassWithDestructor) = Uninitialized[z1] : &:r2169_1 # 2169| r2169_3(glval) = FunctionAddress[ClassWithDestructor] : # 2169| v2169_4(void) = Call[ClassWithDestructor] : func:r2169_3, this:r2169_1 -# 2169| m2169_5(unknown) = ^CallSideEffect : ~m2168_36 -# 2169| m2169_6(unknown) = Chi : total:m2168_36, partial:m2169_5 +# 2169| m2169_5(unknown) = ^CallSideEffect : ~m2168_49 +# 2169| m2169_6(unknown) = Chi : total:m2168_49, partial:m2169_5 # 2169| m2169_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2169_1 # 2169| m2169_8(ClassWithDestructor) = Chi : total:m2169_2, partial:m2169_7 # 2170| r2170_1(glval) = VariableAddress[z2] : @@ -13260,15 +13324,23 @@ ir.cpp: # 2171| v2171_14(void) = ^IndirectReadSideEffect[-1] : &:r2171_9, m2169_8 # 2171| m2171_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2171_9 # 2171| m2171_16(ClassWithDestructor) = Chi : total:m2169_8, partial:m2171_15 -# 2168| r2168_39(glval) = VariableAddress[(__begin)] : -# 2168| r2168_40(glval) = FunctionAddress[operator++] : -# 2168| r2168_41(iterator &) = Call[operator++] : func:r2168_40, this:r2168_39 -# 2168| m2168_42(unknown) = ^CallSideEffect : ~m2171_13 -# 2168| m2168_43(unknown) = Chi : total:m2171_13, partial:m2168_42 -# 2168| v2168_44(void) = ^IndirectReadSideEffect[-1] : &:r2168_39, m2168_21 -# 2168| m2168_45(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2168_39 -# 2168| m2168_46(iterator) = Chi : total:m2168_21, partial:m2168_45 -# 2168| r2168_47(glval) = CopyValue : r2168_41 +# 2168| r2168_52(glval) = VariableAddress[y] : +# 2168| r2168_53(glval) = FunctionAddress[~ClassWithDestructor] : +# 2168| v2168_54(void) = Call[~ClassWithDestructor] : func:r2168_53, this:r2168_52 +# 2168| m2168_55(unknown) = ^CallSideEffect : ~m2171_13 +# 2168| m2168_56(unknown) = Chi : total:m2171_13, partial:m2168_55 +# 2168| v2168_57(void) = ^IndirectReadSideEffect[-1] : &:r2168_52, m2168_51 +# 2168| m2168_58(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2168_52 +# 2168| m2168_59(ClassWithDestructor) = Chi : total:m2168_51, partial:m2168_58 +# 2168| r2168_60(glval) = VariableAddress[(__begin)] : +# 2168| r2168_61(glval) = FunctionAddress[operator++] : +# 2168| r2168_62(iterator &) = Call[operator++] : func:r2168_61, this:r2168_60 +# 2168| m2168_63(unknown) = ^CallSideEffect : ~m2168_56 +# 2168| m2168_64(unknown) = Chi : total:m2168_56, partial:m2168_63 +# 2168| v2168_65(void) = ^IndirectReadSideEffect[-1] : &:r2168_60, m2168_34 +# 2168| m2168_66(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2168_60 +# 2168| m2168_67(iterator) = Chi : total:m2168_34, partial:m2168_66 +# 2168| r2168_68(glval) = CopyValue : r2168_62 #-----| Goto (back edge) -> Block 21 # 2172| Block 23 @@ -13276,8 +13348,8 @@ ir.cpp: # 2172| r2172_18(glval) = VariableAddress[x] : # 2172| r2172_19(glval) = FunctionAddress[~ClassWithDestructor] : # 2172| v2172_20(void) = Call[~ClassWithDestructor] : func:r2172_19, this:r2172_18 -# 2172| m2172_21(unknown) = ^CallSideEffect : ~m2168_29 -# 2172| m2172_22(unknown) = Chi : total:m2168_29, partial:m2172_21 +# 2172| m2172_21(unknown) = ^CallSideEffect : ~m2168_42 +# 2172| m2172_22(unknown) = Chi : total:m2168_42, partial:m2172_21 # 2172| v2172_23(void) = ^IndirectReadSideEffect[-1] : &:r2172_18, m2153_8 # 2172| m2172_24(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_18 # 2172| m2172_25(ClassWithDestructor) = Chi : total:m2153_8, partial:m2172_24 @@ -13322,16 +13394,16 @@ ir.cpp: # 2177| Block 2 # 2177| m2177_1(unknown) = Phi : from 0:~m2175_6, from 1:~m2176_7 # 2177| v2177_2(void) = NoOp : -# 2177| r2177_3(glval) = VariableAddress[b] : +# 2177| r2177_3(glval) = VariableAddress[a] : # 2177| r2177_4(glval) = FunctionAddress[~ClassWithDestructor] : # 2177| v2177_5(void) = Call[~ClassWithDestructor] : func:r2177_4, this:r2177_3 # 2177| m2177_6(unknown) = ^CallSideEffect : ~m2177_1 # 2177| m2177_7(unknown) = Chi : total:m2177_1, partial:m2177_6 -# 2177| v2177_8(void) = ^IndirectReadSideEffect[-1] : &:r2177_3, ~m2177_7 +# 2177| v2177_8(void) = ^IndirectReadSideEffect[-1] : &:r2177_3, m2175_8 # 2177| m2177_9(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2177_3 -# 2177| m2177_10(unknown) = Chi : total:m2177_7, partial:m2177_9 +# 2177| m2177_10(ClassWithDestructor) = Chi : total:m2175_8, partial:m2177_9 # 2174| v2174_5(void) = ReturnVoid : -# 2174| v2174_6(void) = AliasedUse : ~m2177_10 +# 2174| v2174_6(void) = AliasedUse : ~m2177_7 # 2174| v2174_7(void) = ExitFunction : # 2179| void static_variable_with_destructor_2() @@ -13424,19 +13496,27 @@ ir.cpp: #-----| Goto -> Block 2 # 2188| Block 2 -# 2188| m2188_1(unknown) = Phi : from 0:~m2186_6, from 1:~m2187_7 -# 2188| v2188_2(void) = NoOp : -# 2188| r2188_3(glval) = VariableAddress[c] : -# 2188| r2188_4(glval) = FunctionAddress[~ClassWithDestructor] : -# 2188| v2188_5(void) = Call[~ClassWithDestructor] : func:r2188_4, this:r2188_3 -# 2188| m2188_6(unknown) = ^CallSideEffect : ~m2188_1 -# 2188| m2188_7(unknown) = Chi : total:m2188_1, partial:m2188_6 -# 2188| v2188_8(void) = ^IndirectReadSideEffect[-1] : &:r2188_3, ~m2188_7 -# 2188| m2188_9(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2188_3 -# 2188| m2188_10(unknown) = Chi : total:m2188_7, partial:m2188_9 -# 2184| v2184_5(void) = ReturnVoid : -# 2184| v2184_6(void) = AliasedUse : ~m2188_10 -# 2184| v2184_7(void) = ExitFunction : +# 2188| m2188_1(unknown) = Phi : from 0:~m2186_6, from 1:~m2187_7 +# 2188| v2188_2(void) = NoOp : +# 2188| r2188_3(glval) = VariableAddress[b] : +# 2188| r2188_4(glval) = FunctionAddress[~ClassWithDestructor] : +# 2188| v2188_5(void) = Call[~ClassWithDestructor] : func:r2188_4, this:r2188_3 +# 2188| m2188_6(unknown) = ^CallSideEffect : ~m2188_1 +# 2188| m2188_7(unknown) = Chi : total:m2188_1, partial:m2188_6 +# 2188| v2188_8(void) = ^IndirectReadSideEffect[-1] : &:r2188_3, m2186_8 +# 2188| m2188_9(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2188_3 +# 2188| m2188_10(ClassWithDestructor) = Chi : total:m2186_8, partial:m2188_9 +# 2188| r2188_11(glval) = VariableAddress[a] : +# 2188| r2188_12(glval) = FunctionAddress[~ClassWithDestructor] : +# 2188| v2188_13(void) = Call[~ClassWithDestructor] : func:r2188_12, this:r2188_11 +# 2188| m2188_14(unknown) = ^CallSideEffect : ~m2188_7 +# 2188| m2188_15(unknown) = Chi : total:m2188_7, partial:m2188_14 +# 2188| v2188_16(void) = ^IndirectReadSideEffect[-1] : &:r2188_11, m2185_8 +# 2188| m2188_17(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2188_11 +# 2188| m2188_18(ClassWithDestructor) = Chi : total:m2185_8, partial:m2188_17 +# 2184| v2184_5(void) = ReturnVoid : +# 2184| v2184_6(void) = AliasedUse : ~m2188_15 +# 2184| v2184_7(void) = ExitFunction : # 2190| ClassWithDestructor global_class_with_destructor # 2190| Block 0 @@ -13780,8 +13860,8 @@ ir.cpp: #-----| Goto -> Block 4 # 2226| Block 4 -# 2226| m2226_40(iterator) = Phi : from 3:m2226_31, from 5:m2226_74 -# 2226| m2226_41(unknown) = Phi : from 3:~m2226_38, from 5:~m2226_71 +# 2226| m2226_40(iterator) = Phi : from 3:m2226_31, from 5:m2226_82 +# 2226| m2226_41(unknown) = Phi : from 3:~m2226_38, from 5:~m2226_79 # 2226| r2226_42(glval) = VariableAddress[(__begin)] : #-----| r0_7(glval) = Convert : r2226_42 # 2226| r2226_43(glval) = FunctionAddress[operator!=] : @@ -13831,15 +13911,23 @@ ir.cpp: # 2228| v2228_6(void) = ^IndirectReadSideEffect[-1] : &:r2228_1, m2227_8 # 2228| m2228_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2228_1 # 2228| m2228_8(String) = Chi : total:m2227_8, partial:m2228_7 -# 2226| r2226_67(glval) = VariableAddress[(__begin)] : -# 2226| r2226_68(glval) = FunctionAddress[operator++] : -# 2226| r2226_69(iterator &) = Call[operator++] : func:r2226_68, this:r2226_67 +# 2226| r2226_67(glval) = VariableAddress[s] : +# 2226| r2226_68(glval) = FunctionAddress[~String] : +# 2226| v2226_69(void) = Call[~String] : func:r2226_68, this:r2226_67 # 2226| m2226_70(unknown) = ^CallSideEffect : ~m2228_5 # 2226| m2226_71(unknown) = Chi : total:m2228_5, partial:m2226_70 -# 2226| v2226_72(void) = ^IndirectReadSideEffect[-1] : &:r2226_67, m2226_40 -# 2226| m2226_73(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2226_67 -# 2226| m2226_74(iterator) = Chi : total:m2226_40, partial:m2226_73 -# 2226| r2226_75(glval) = CopyValue : r2226_69 +# 2226| v2226_72(void) = ^IndirectReadSideEffect[-1] : &:r2226_67, m2226_66 +# 2226| m2226_73(String) = ^IndirectMayWriteSideEffect[-1] : &:r2226_67 +# 2226| m2226_74(String) = Chi : total:m2226_66, partial:m2226_73 +# 2226| r2226_75(glval) = VariableAddress[(__begin)] : +# 2226| r2226_76(glval) = FunctionAddress[operator++] : +# 2226| r2226_77(iterator &) = Call[operator++] : func:r2226_76, this:r2226_75 +# 2226| m2226_78(unknown) = ^CallSideEffect : ~m2226_71 +# 2226| m2226_79(unknown) = Chi : total:m2226_71, partial:m2226_78 +# 2226| v2226_80(void) = ^IndirectReadSideEffect[-1] : &:r2226_75, m2226_40 +# 2226| m2226_81(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2226_75 +# 2226| m2226_82(iterator) = Chi : total:m2226_40, partial:m2226_81 +# 2226| r2226_83(glval) = CopyValue : r2226_77 #-----| Goto (back edge) -> Block 4 # 2230| Block 6 diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index e2e0b59609a..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -28,8 +28,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -| ir.cpp:2154:68:2154:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2157:68:2157:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2163:36:2163:37 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2168:68:2168:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index e2e0b59609a..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -28,8 +28,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -| ir.cpp:2154:68:2154:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2157:68:2157:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2163:36:2163:37 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2168:68:2168:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 86c483bcce9..e4cfcfe6ed1 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -905,14 +905,22 @@ | file://:0:0:0:0 | SideEffect | m1080_23 | | file://:0:0:0:0 | SideEffect | m1086_23 | | file://:0:0:0:0 | SideEffect | m1086_23 | -| file://:0:0:0:0 | SideEffect | m2154_21 | -| file://:0:0:0:0 | SideEffect | m2154_21 | -| file://:0:0:0:0 | SideEffect | m2157_21 | -| file://:0:0:0:0 | SideEffect | m2157_21 | -| file://:0:0:0:0 | SideEffect | m2163_21 | -| file://:0:0:0:0 | SideEffect | m2163_21 | -| file://:0:0:0:0 | SideEffect | m2168_21 | -| file://:0:0:0:0 | SideEffect | m2168_21 | +| file://:0:0:0:0 | SideEffect | m2154_13 | +| file://:0:0:0:0 | SideEffect | m2154_13 | +| file://:0:0:0:0 | SideEffect | m2154_34 | +| file://:0:0:0:0 | SideEffect | m2154_34 | +| file://:0:0:0:0 | SideEffect | m2157_13 | +| file://:0:0:0:0 | SideEffect | m2157_13 | +| file://:0:0:0:0 | SideEffect | m2157_34 | +| file://:0:0:0:0 | SideEffect | m2157_34 | +| file://:0:0:0:0 | SideEffect | m2163_9 | +| file://:0:0:0:0 | SideEffect | m2163_9 | +| file://:0:0:0:0 | SideEffect | m2163_30 | +| file://:0:0:0:0 | SideEffect | m2163_30 | +| file://:0:0:0:0 | SideEffect | m2168_13 | +| file://:0:0:0:0 | SideEffect | m2168_13 | +| file://:0:0:0:0 | SideEffect | m2168_34 | +| file://:0:0:0:0 | SideEffect | m2168_34 | | file://:0:0:0:0 | SideEffect | m2226_21 | | file://:0:0:0:0 | SideEffect | m2226_21 | | file://:0:0:0:0 | SideEffect | m2226_40 | @@ -933,14 +941,6 @@ | file://:0:0:0:0 | SideEffect | ~m1242_4 | | file://:0:0:0:0 | SideEffect | ~m1449_6 | | file://:0:0:0:0 | SideEffect | ~m1841_8 | -| file://:0:0:0:0 | SideEffect | ~m2154_11 | -| file://:0:0:0:0 | SideEffect | ~m2154_19 | -| file://:0:0:0:0 | SideEffect | ~m2157_11 | -| file://:0:0:0:0 | SideEffect | ~m2157_19 | -| file://:0:0:0:0 | SideEffect | ~m2163_11 | -| file://:0:0:0:0 | SideEffect | ~m2163_19 | -| file://:0:0:0:0 | SideEffect | ~m2168_11 | -| file://:0:0:0:0 | SideEffect | ~m2168_19 | | file://:0:0:0:0 | SideEffect | ~m2175_6 | | file://:0:0:0:0 | SideEffect | ~m2179_4 | | file://:0:0:0:0 | SideEffect | ~m2186_6 | @@ -5718,10 +5718,10 @@ | ir.cpp:1079:39:1079:39 | Address | &:r1079_7 | | ir.cpp:1079:39:1079:39 | Load | m1079_6 | | ir.cpp:1079:39:1079:39 | SideEffect | m1079_8 | -| ir.cpp:1080:5:1084:5 | Address | &:r1080_1 | -| ir.cpp:1080:5:1084:5 | Address | &:r1080_7 | -| ir.cpp:1080:5:1084:5 | Address | &:r1080_15 | -| ir.cpp:1080:5:1084:5 | Address | &:r1080_33 | +| ir.cpp:1080:5:1080:5 | Address | &:r1080_1 | +| ir.cpp:1080:5:1080:5 | Address | &:r1080_7 | +| ir.cpp:1080:5:1080:5 | Address | &:r1080_15 | +| ir.cpp:1080:14:1080:14 | Address | &:r1080_33 | | ir.cpp:1080:18:1080:18 | Address | &:r1080_2 | | ir.cpp:1080:18:1080:18 | Address | &:r1080_8 | | ir.cpp:1080:18:1080:18 | Address | &:r1080_16 | @@ -5784,10 +5784,10 @@ | ir.cpp:1081:13:1081:13 | Load | m1080_40 | | ir.cpp:1081:13:1081:17 | Condition | r1081_4 | | ir.cpp:1081:17:1081:17 | Right | r1081_3 | -| ir.cpp:1086:5:1090:5 | Address | &:r1086_1 | -| ir.cpp:1086:5:1090:5 | Address | &:r1086_7 | -| ir.cpp:1086:5:1090:5 | Address | &:r1086_15 | -| ir.cpp:1086:5:1090:5 | Address | &:r1086_42 | +| ir.cpp:1086:5:1086:5 | Address | &:r1086_1 | +| ir.cpp:1086:5:1086:5 | Address | &:r1086_7 | +| ir.cpp:1086:5:1086:5 | Address | &:r1086_15 | +| ir.cpp:1086:21:1086:21 | Address | &:r1086_42 | | ir.cpp:1086:25:1086:25 | Address | &:r1086_2 | | ir.cpp:1086:25:1086:25 | Address | &:r1086_8 | | ir.cpp:1086:25:1086:25 | Address | &:r1086_16 | @@ -6214,7 +6214,7 @@ | ir.cpp:1239:24:1239:24 | Right | r1239_13 | | ir.cpp:1242:6:1242:31 | ChiPartial | partial:m1242_3 | | ir.cpp:1242:6:1242:31 | ChiTotal | total:m1242_2 | -| ir.cpp:1242:6:1242:31 | SideEffect | ~m1246_26 | +| ir.cpp:1242:6:1242:31 | SideEffect | ~m1246_1 | | ir.cpp:1242:45:1242:51 | Address | &:r1242_5 | | ir.cpp:1242:45:1242:51 | Address | &:r1242_5 | | ir.cpp:1242:45:1242:51 | Address | &:r1242_7 | @@ -6273,38 +6273,8 @@ | ir.cpp:1245:21:1245:27 | Arg(0) | 0:r1245_8 | | ir.cpp:1245:21:1245:27 | Load | m1242_6 | | ir.cpp:1245:21:1245:27 | SideEffect | ~m1242_8 | -| ir.cpp:1246:1:1246:1 | Address | &:r1246_3 | -| ir.cpp:1246:1:1246:1 | Address | &:r1246_3 | -| ir.cpp:1246:1:1246:1 | Address | &:r1246_11 | -| ir.cpp:1246:1:1246:1 | Address | &:r1246_11 | -| ir.cpp:1246:1:1246:1 | Address | &:r1246_19 | -| ir.cpp:1246:1:1246:1 | Address | &:r1246_19 | -| ir.cpp:1246:1:1246:1 | Arg(this) | this:r1246_3 | -| ir.cpp:1246:1:1246:1 | Arg(this) | this:r1246_11 | -| ir.cpp:1246:1:1246:1 | Arg(this) | this:r1246_19 | -| ir.cpp:1246:1:1246:1 | CallTarget | func:r1246_4 | -| ir.cpp:1246:1:1246:1 | CallTarget | func:r1246_12 | -| ir.cpp:1246:1:1246:1 | CallTarget | func:r1246_20 | -| ir.cpp:1246:1:1246:1 | ChiPartial | partial:m1246_6 | -| ir.cpp:1246:1:1246:1 | ChiPartial | partial:m1246_9 | -| ir.cpp:1246:1:1246:1 | ChiPartial | partial:m1246_14 | -| ir.cpp:1246:1:1246:1 | ChiPartial | partial:m1246_17 | -| ir.cpp:1246:1:1246:1 | ChiPartial | partial:m1246_22 | -| ir.cpp:1246:1:1246:1 | ChiPartial | partial:m1246_25 | -| ir.cpp:1246:1:1246:1 | ChiTotal | total:m1246_1 | -| ir.cpp:1246:1:1246:1 | ChiTotal | total:m1246_7 | -| ir.cpp:1246:1:1246:1 | ChiTotal | total:m1246_10 | -| ir.cpp:1246:1:1246:1 | ChiTotal | total:m1246_15 | -| ir.cpp:1246:1:1246:1 | ChiTotal | total:m1246_18 | -| ir.cpp:1246:1:1246:1 | ChiTotal | total:m1246_23 | | ir.cpp:1246:1:1246:1 | Phi | from 4:~m1245_1 | | ir.cpp:1246:1:1246:1 | Phi | from 5:~m1245_17 | -| ir.cpp:1246:1:1246:1 | SideEffect | ~m1246_1 | -| ir.cpp:1246:1:1246:1 | SideEffect | ~m1246_7 | -| ir.cpp:1246:1:1246:1 | SideEffect | ~m1246_10 | -| ir.cpp:1246:1:1246:1 | SideEffect | ~m1246_15 | -| ir.cpp:1246:1:1246:1 | SideEffect | ~m1246_18 | -| ir.cpp:1246:1:1246:1 | SideEffect | ~m1246_23 | | ir.cpp:1253:6:1253:17 | ChiPartial | partial:m1253_3 | | ir.cpp:1253:6:1253:17 | ChiTotal | total:m1253_2 | | ir.cpp:1253:6:1253:17 | SideEffect | m1253_3 | @@ -10472,7 +10442,7 @@ | ir.cpp:2135:54:2135:57 | StoreValue | r2135_4 | | ir.cpp:2137:6:2137:35 | ChiPartial | partial:m2137_3 | | ir.cpp:2137:6:2137:35 | ChiTotal | total:m2137_2 | -| ir.cpp:2137:6:2137:35 | Phi | from 14:~m2172_5 | +| ir.cpp:2137:6:2137:35 | Phi | from 13:~m2172_5 | | ir.cpp:2137:6:2137:35 | Phi | from 19:~m2172_13 | | ir.cpp:2137:6:2137:35 | Phi | from 23:~m2172_22 | | ir.cpp:2137:6:2137:35 | SideEffect | ~m2137_9 | @@ -10580,143 +10550,215 @@ | ir.cpp:2153:25:2153:25 | ChiTotal | total:m2151_1 | | ir.cpp:2153:25:2153:25 | ChiTotal | total:m2153_2 | | ir.cpp:2153:25:2153:25 | SideEffect | ~m2151_1 | -| ir.cpp:2154:5:2155:19 | Address | &:r2154_1 | -| ir.cpp:2154:5:2155:19 | Address | &:r2154_5 | -| ir.cpp:2154:5:2155:19 | Address | &:r2154_13 | -| ir.cpp:2154:5:2155:19 | Address | &:r2154_31 | -| ir.cpp:2154:68:2154:68 | Address | &:r2154_6 | -| ir.cpp:2154:68:2154:68 | Address | &:r2154_14 | -| ir.cpp:2154:68:2154:68 | Address | &:r2154_25 | -| ir.cpp:2154:68:2154:68 | Address | &:r2154_34 | -| ir.cpp:2154:68:2154:68 | Address | &:r2154_39 | -| ir.cpp:2154:68:2154:68 | Address | &:r2154_39 | -| ir.cpp:2154:68:2154:68 | Arg(0) | 0:r2154_26 | +| ir.cpp:2154:5:2154:5 | Address | &:r2154_14 | +| ir.cpp:2154:5:2154:5 | Address | &:r2154_18 | +| ir.cpp:2154:5:2154:5 | Address | &:r2154_26 | +| ir.cpp:2154:37:2154:38 | Address | &:r2154_1 | +| ir.cpp:2154:37:2154:38 | Address | &:r2154_1 | +| ir.cpp:2154:37:2154:38 | Arg(this) | this:r2154_1 | +| ir.cpp:2154:40:2154:40 | Address | &:r2154_4 | +| ir.cpp:2154:40:2154:40 | Address | &:r2154_4 | +| ir.cpp:2154:40:2154:40 | Address | &:r2154_5 | +| ir.cpp:2154:40:2154:40 | Arg(0) | 0:r2154_8 | +| ir.cpp:2154:40:2154:40 | Load | m2153_8 | +| ir.cpp:2154:40:2154:40 | Load | m2154_7 | +| ir.cpp:2154:40:2154:40 | StoreValue | r2154_6 | +| ir.cpp:2154:40:2154:41 | CallTarget | func:r2154_3 | +| ir.cpp:2154:40:2154:41 | ChiPartial | partial:m2154_10 | +| ir.cpp:2154:40:2154:41 | ChiPartial | partial:m2154_12 | +| ir.cpp:2154:40:2154:41 | ChiTotal | total:m2153_6 | +| ir.cpp:2154:40:2154:41 | ChiTotal | total:m2154_2 | +| ir.cpp:2154:40:2154:41 | SideEffect | ~m2153_6 | +| ir.cpp:2154:64:2154:64 | Address | &:r2154_44 | +| ir.cpp:2154:64:2154:64 | Address | &:r2154_52 | +| ir.cpp:2154:64:2154:64 | Address | &:r2154_52 | +| ir.cpp:2154:64:2154:64 | Arg(this) | this:r2154_52 | +| ir.cpp:2154:64:2154:64 | CallTarget | func:r2154_53 | +| ir.cpp:2154:64:2154:64 | ChiPartial | partial:m2154_55 | +| ir.cpp:2154:64:2154:64 | ChiPartial | partial:m2154_58 | +| ir.cpp:2154:64:2154:64 | ChiTotal | total:m2155_6 | +| ir.cpp:2154:64:2154:64 | ChiTotal | total:m2155_9 | +| ir.cpp:2154:64:2154:64 | SideEffect | m2155_9 | +| ir.cpp:2154:64:2154:64 | SideEffect | ~m2155_6 | +| ir.cpp:2154:68:2154:68 | Address | &:r2154_19 | +| ir.cpp:2154:68:2154:68 | Address | &:r2154_27 | +| ir.cpp:2154:68:2154:68 | Address | &:r2154_38 | +| ir.cpp:2154:68:2154:68 | Address | &:r2154_47 | +| ir.cpp:2154:68:2154:68 | Address | &:r2154_60 | +| ir.cpp:2154:68:2154:68 | Address | &:r2154_60 | +| ir.cpp:2154:68:2154:68 | Arg(0) | 0:r2154_39 | | ir.cpp:2154:68:2154:68 | Arg(this) | this:r0_2 | | ir.cpp:2154:68:2154:68 | Arg(this) | this:r0_5 | | ir.cpp:2154:68:2154:68 | Arg(this) | this:r0_7 | | ir.cpp:2154:68:2154:68 | Arg(this) | this:r0_9 | -| ir.cpp:2154:68:2154:68 | Arg(this) | this:r2154_39 | -| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_8 | -| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_16 | -| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_24 | -| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_33 | -| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_40 | -| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_10 | -| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_18 | -| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_28 | -| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_35 | -| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_42 | -| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_45 | -| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2153_6 | +| ir.cpp:2154:68:2154:68 | Arg(this) | this:r2154_60 | +| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_21 | +| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_29 | +| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_37 | +| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_46 | +| ir.cpp:2154:68:2154:68 | CallTarget | func:r2154_61 | +| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_23 | +| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_31 | +| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_41 | +| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_48 | +| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_63 | +| ir.cpp:2154:68:2154:68 | ChiPartial | partial:m2154_66 | | ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_11 | -| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_21 | -| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_22 | -| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_29 | -| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2155_6 | -| ir.cpp:2154:68:2154:68 | Condition | r2154_27 | -| ir.cpp:2154:68:2154:68 | Load | m2154_4 | -| ir.cpp:2154:68:2154:68 | Load | m2154_4 | -| ir.cpp:2154:68:2154:68 | Load | m2154_20 | -| ir.cpp:2154:68:2154:68 | Phi | from 7:m2154_12 | -| ir.cpp:2154:68:2154:68 | Phi | from 7:~m2154_19 | -| ir.cpp:2154:68:2154:68 | Phi | from 9:m2154_46 | -| ir.cpp:2154:68:2154:68 | Phi | from 9:~m2154_43 | -| ir.cpp:2154:68:2154:68 | SideEffect | m2154_21 | -| ir.cpp:2154:68:2154:68 | SideEffect | ~m2153_6 | +| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_24 | +| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_34 | +| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_35 | +| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_42 | +| ir.cpp:2154:68:2154:68 | ChiTotal | total:m2154_56 | +| ir.cpp:2154:68:2154:68 | Condition | r2154_40 | +| ir.cpp:2154:68:2154:68 | Load | m2154_17 | +| ir.cpp:2154:68:2154:68 | Load | m2154_17 | +| ir.cpp:2154:68:2154:68 | Load | m2154_33 | +| ir.cpp:2154:68:2154:68 | Phi | from 7:m2154_25 | +| ir.cpp:2154:68:2154:68 | Phi | from 7:~m2154_32 | +| ir.cpp:2154:68:2154:68 | Phi | from 9:m2154_67 | +| ir.cpp:2154:68:2154:68 | Phi | from 9:~m2154_64 | +| ir.cpp:2154:68:2154:68 | SideEffect | m2154_34 | | ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_11 | -| ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_22 | -| ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_29 | -| ir.cpp:2154:68:2154:68 | SideEffect | ~m2155_6 | -| ir.cpp:2154:68:2154:68 | StoreValue | r2154_9 | -| ir.cpp:2154:68:2154:68 | StoreValue | r2154_17 | -| ir.cpp:2154:68:2154:68 | Unary | r2154_7 | -| ir.cpp:2154:68:2154:68 | Unary | r2154_15 | -| ir.cpp:2154:68:2154:68 | Unary | r2154_23 | -| ir.cpp:2154:68:2154:68 | Unary | r2154_32 | -| ir.cpp:2154:68:2154:68 | Unary | r2154_41 | -| ir.cpp:2154:68:2154:69 | StoreValue | r2154_3 | -| ir.cpp:2154:68:2154:69 | Unary | r2154_2 | -| ir.cpp:2154:68:2154:70 | Load | ~m2154_36 | -| ir.cpp:2154:68:2154:70 | StoreValue | r2154_37 | +| ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_24 | +| ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_35 | +| ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_42 | +| ir.cpp:2154:68:2154:68 | SideEffect | ~m2154_56 | +| ir.cpp:2154:68:2154:68 | StoreValue | r2154_22 | +| ir.cpp:2154:68:2154:68 | StoreValue | r2154_30 | +| ir.cpp:2154:68:2154:68 | Unary | r2154_20 | +| ir.cpp:2154:68:2154:68 | Unary | r2154_28 | +| ir.cpp:2154:68:2154:68 | Unary | r2154_36 | +| ir.cpp:2154:68:2154:68 | Unary | r2154_45 | +| ir.cpp:2154:68:2154:68 | Unary | r2154_62 | +| ir.cpp:2154:68:2154:69 | StoreValue | r2154_16 | +| ir.cpp:2154:68:2154:69 | Unary | r2154_15 | +| ir.cpp:2154:68:2154:70 | Load | ~m2154_49 | +| ir.cpp:2154:68:2154:70 | StoreValue | r2154_50 | | ir.cpp:2155:7:2155:7 | Address | &:r2155_1 | | ir.cpp:2155:7:2155:7 | Address | &:r2155_1 | | ir.cpp:2155:7:2155:7 | Arg(this) | this:r2155_1 | | ir.cpp:2155:7:2155:7 | ChiPartial | partial:m2155_8 | -| ir.cpp:2155:7:2155:7 | ChiTotal | total:m2154_38 | -| ir.cpp:2155:7:2155:7 | SideEffect | m2154_38 | +| ir.cpp:2155:7:2155:7 | ChiTotal | total:m2154_51 | +| ir.cpp:2155:7:2155:7 | SideEffect | m2154_51 | | ir.cpp:2155:9:2155:13 | CallTarget | func:r2155_2 | | ir.cpp:2155:9:2155:13 | ChiPartial | partial:m2155_5 | -| ir.cpp:2155:9:2155:13 | ChiTotal | total:m2154_36 | -| ir.cpp:2155:9:2155:13 | SideEffect | ~m2154_36 | +| ir.cpp:2155:9:2155:13 | ChiTotal | total:m2154_49 | +| ir.cpp:2155:9:2155:13 | SideEffect | ~m2154_49 | | ir.cpp:2155:15:2155:17 | Arg(0) | 0:r2155_3 | -| ir.cpp:2157:5:2161:5 | Address | &:r2157_1 | -| ir.cpp:2157:5:2161:5 | Address | &:r2157_5 | -| ir.cpp:2157:5:2161:5 | Address | &:r2157_13 | -| ir.cpp:2157:5:2161:5 | Address | &:r2157_40 | -| ir.cpp:2157:68:2157:68 | Address | &:r2157_6 | -| ir.cpp:2157:68:2157:68 | Address | &:r2157_14 | -| ir.cpp:2157:68:2157:68 | Address | &:r2157_25 | -| ir.cpp:2157:68:2157:68 | Address | &:r2157_31 | -| ir.cpp:2157:68:2157:68 | Address | &:r2157_31 | -| ir.cpp:2157:68:2157:68 | Address | &:r2157_43 | -| ir.cpp:2157:68:2157:68 | Arg(0) | 0:r2157_26 | +| ir.cpp:2157:5:2157:5 | Address | &:r2157_14 | +| ir.cpp:2157:5:2157:5 | Address | &:r2157_18 | +| ir.cpp:2157:5:2157:5 | Address | &:r2157_26 | +| ir.cpp:2157:37:2157:38 | Address | &:r2157_1 | +| ir.cpp:2157:37:2157:38 | Address | &:r2157_1 | +| ir.cpp:2157:37:2157:38 | Address | &:r2157_60 | +| ir.cpp:2157:37:2157:38 | Address | &:r2157_60 | +| ir.cpp:2157:37:2157:38 | Arg(this) | this:r2157_1 | +| ir.cpp:2157:37:2157:38 | Arg(this) | this:r2157_60 | +| ir.cpp:2157:37:2157:38 | CallTarget | func:r2157_61 | +| ir.cpp:2157:37:2157:38 | ChiPartial | partial:m2157_63 | +| ir.cpp:2157:37:2157:38 | ChiPartial | partial:m2157_66 | +| ir.cpp:2157:37:2157:38 | ChiTotal | total:m2157_13 | +| ir.cpp:2157:37:2157:38 | ChiTotal | total:m2157_56 | +| ir.cpp:2157:37:2157:38 | SideEffect | m2157_13 | +| ir.cpp:2157:37:2157:38 | SideEffect | ~m2157_56 | +| ir.cpp:2157:40:2157:40 | Address | &:r2157_4 | +| ir.cpp:2157:40:2157:40 | Address | &:r2157_4 | +| ir.cpp:2157:40:2157:40 | Address | &:r2157_5 | +| ir.cpp:2157:40:2157:40 | Arg(0) | 0:r2157_8 | +| ir.cpp:2157:40:2157:40 | Load | m2153_8 | +| ir.cpp:2157:40:2157:40 | Load | m2157_7 | +| ir.cpp:2157:40:2157:40 | StoreValue | r2157_6 | +| ir.cpp:2157:40:2157:41 | CallTarget | func:r2157_3 | +| ir.cpp:2157:40:2157:41 | ChiPartial | partial:m2157_10 | +| ir.cpp:2157:40:2157:41 | ChiPartial | partial:m2157_12 | +| ir.cpp:2157:40:2157:41 | ChiTotal | total:m2154_42 | +| ir.cpp:2157:40:2157:41 | ChiTotal | total:m2157_2 | +| ir.cpp:2157:40:2157:41 | SideEffect | ~m2154_42 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_44 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_52 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_52 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_68 | +| ir.cpp:2157:64:2157:64 | Address | &:r2157_68 | +| ir.cpp:2157:64:2157:64 | Arg(this) | this:r2157_52 | +| ir.cpp:2157:64:2157:64 | Arg(this) | this:r2157_68 | +| ir.cpp:2157:64:2157:64 | CallTarget | func:r2157_53 | +| ir.cpp:2157:64:2157:64 | CallTarget | func:r2157_69 | +| ir.cpp:2157:64:2157:64 | ChiPartial | partial:m2157_55 | +| ir.cpp:2157:64:2157:64 | ChiPartial | partial:m2157_58 | +| ir.cpp:2157:64:2157:64 | ChiPartial | partial:m2157_71 | +| ir.cpp:2157:64:2157:64 | ChiPartial | partial:m2157_74 | +| ir.cpp:2157:64:2157:64 | ChiTotal | total:m2159_5 | +| ir.cpp:2157:64:2157:64 | ChiTotal | total:m2159_5 | +| ir.cpp:2157:64:2157:64 | ChiTotal | total:m2159_8 | +| ir.cpp:2157:64:2157:64 | ChiTotal | total:m2159_8 | +| ir.cpp:2157:64:2157:64 | SideEffect | m2159_8 | +| ir.cpp:2157:64:2157:64 | SideEffect | m2159_8 | +| ir.cpp:2157:64:2157:64 | SideEffect | ~m2159_5 | +| ir.cpp:2157:64:2157:64 | SideEffect | ~m2159_5 | +| ir.cpp:2157:68:2157:68 | Address | &:r2157_19 | +| ir.cpp:2157:68:2157:68 | Address | &:r2157_27 | +| ir.cpp:2157:68:2157:68 | Address | &:r2157_38 | +| ir.cpp:2157:68:2157:68 | Address | &:r2157_47 | +| ir.cpp:2157:68:2157:68 | Address | &:r2157_76 | +| ir.cpp:2157:68:2157:68 | Address | &:r2157_76 | +| ir.cpp:2157:68:2157:68 | Arg(0) | 0:r2157_39 | | ir.cpp:2157:68:2157:68 | Arg(this) | this:r0_12 | | ir.cpp:2157:68:2157:68 | Arg(this) | this:r0_15 | | ir.cpp:2157:68:2157:68 | Arg(this) | this:r0_17 | | ir.cpp:2157:68:2157:68 | Arg(this) | this:r0_19 | -| ir.cpp:2157:68:2157:68 | Arg(this) | this:r2157_31 | -| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_8 | -| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_16 | -| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_24 | -| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_32 | -| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_42 | -| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_10 | -| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_18 | -| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_28 | -| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_34 | -| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_37 | -| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_44 | -| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2154_29 | +| ir.cpp:2157:68:2157:68 | Arg(this) | this:r2157_76 | +| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_21 | +| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_29 | +| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_37 | +| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_46 | +| ir.cpp:2157:68:2157:68 | CallTarget | func:r2157_77 | +| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_23 | +| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_31 | +| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_41 | +| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_48 | +| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_79 | +| ir.cpp:2157:68:2157:68 | ChiPartial | partial:m2157_82 | | ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_11 | -| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_21 | -| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_22 | -| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_29 | -| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2159_5 | -| ir.cpp:2157:68:2157:68 | Condition | r2157_27 | -| ir.cpp:2157:68:2157:68 | Load | m2157_4 | -| ir.cpp:2157:68:2157:68 | Load | m2157_4 | -| ir.cpp:2157:68:2157:68 | Load | m2157_20 | -| ir.cpp:2157:68:2157:68 | Phi | from 10:m2157_12 | -| ir.cpp:2157:68:2157:68 | Phi | from 10:~m2157_19 | -| ir.cpp:2157:68:2157:68 | Phi | from 12:m2157_38 | -| ir.cpp:2157:68:2157:68 | Phi | from 12:~m2157_35 | -| ir.cpp:2157:68:2157:68 | SideEffect | m2157_21 | -| ir.cpp:2157:68:2157:68 | SideEffect | ~m2154_29 | +| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_24 | +| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_34 | +| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_35 | +| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_42 | +| ir.cpp:2157:68:2157:68 | ChiTotal | total:m2157_72 | +| ir.cpp:2157:68:2157:68 | Condition | r2157_40 | +| ir.cpp:2157:68:2157:68 | Load | m2157_17 | +| ir.cpp:2157:68:2157:68 | Load | m2157_17 | +| ir.cpp:2157:68:2157:68 | Load | m2157_33 | +| ir.cpp:2157:68:2157:68 | Phi | from 10:m2157_25 | +| ir.cpp:2157:68:2157:68 | Phi | from 10:~m2157_32 | +| ir.cpp:2157:68:2157:68 | Phi | from 14:m2157_83 | +| ir.cpp:2157:68:2157:68 | Phi | from 14:~m2157_80 | +| ir.cpp:2157:68:2157:68 | SideEffect | m2157_34 | | ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_11 | -| ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_22 | -| ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_29 | -| ir.cpp:2157:68:2157:68 | SideEffect | ~m2159_5 | -| ir.cpp:2157:68:2157:68 | StoreValue | r2157_9 | -| ir.cpp:2157:68:2157:68 | StoreValue | r2157_17 | -| ir.cpp:2157:68:2157:68 | Unary | r2157_7 | -| ir.cpp:2157:68:2157:68 | Unary | r2157_15 | -| ir.cpp:2157:68:2157:68 | Unary | r2157_23 | -| ir.cpp:2157:68:2157:68 | Unary | r2157_33 | -| ir.cpp:2157:68:2157:68 | Unary | r2157_41 | -| ir.cpp:2157:68:2157:69 | StoreValue | r2157_3 | -| ir.cpp:2157:68:2157:69 | Unary | r2157_2 | -| ir.cpp:2157:68:2157:70 | Load | ~m2157_45 | -| ir.cpp:2157:68:2157:70 | StoreValue | r2157_46 | +| ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_24 | +| ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_35 | +| ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_42 | +| ir.cpp:2157:68:2157:68 | SideEffect | ~m2157_72 | +| ir.cpp:2157:68:2157:68 | StoreValue | r2157_22 | +| ir.cpp:2157:68:2157:68 | StoreValue | r2157_30 | +| ir.cpp:2157:68:2157:68 | Unary | r2157_20 | +| ir.cpp:2157:68:2157:68 | Unary | r2157_28 | +| ir.cpp:2157:68:2157:68 | Unary | r2157_36 | +| ir.cpp:2157:68:2157:68 | Unary | r2157_45 | +| ir.cpp:2157:68:2157:68 | Unary | r2157_78 | +| ir.cpp:2157:68:2157:69 | StoreValue | r2157_16 | +| ir.cpp:2157:68:2157:69 | Unary | r2157_15 | +| ir.cpp:2157:68:2157:70 | Load | ~m2157_49 | +| ir.cpp:2157:68:2157:70 | StoreValue | r2157_50 | | ir.cpp:2158:7:2158:7 | Address | &:r2158_1 | | ir.cpp:2158:7:2158:7 | Address | &:r2158_1 | | ir.cpp:2158:7:2158:7 | Arg(this) | this:r2158_1 | | ir.cpp:2158:7:2158:7 | ChiPartial | partial:m2158_8 | -| ir.cpp:2158:7:2158:7 | ChiTotal | total:m2157_47 | -| ir.cpp:2158:7:2158:7 | SideEffect | m2157_47 | +| ir.cpp:2158:7:2158:7 | ChiTotal | total:m2157_51 | +| ir.cpp:2158:7:2158:7 | SideEffect | m2157_51 | | ir.cpp:2158:9:2158:13 | CallTarget | func:r2158_2 | | ir.cpp:2158:9:2158:13 | ChiPartial | partial:m2158_5 | -| ir.cpp:2158:9:2158:13 | ChiTotal | total:m2157_45 | -| ir.cpp:2158:9:2158:13 | SideEffect | ~m2157_45 | +| ir.cpp:2158:9:2158:13 | ChiTotal | total:m2157_49 | +| ir.cpp:2158:9:2158:13 | SideEffect | ~m2157_49 | | ir.cpp:2158:15:2158:17 | Arg(0) | 0:r2158_3 | | ir.cpp:2159:11:2159:11 | Address | &:r2159_1 | | ir.cpp:2159:11:2159:11 | Address | &:r2159_1 | @@ -10732,136 +10774,182 @@ | ir.cpp:2159:13:2159:17 | SideEffect | ~m2158_6 | | ir.cpp:2159:13:2159:17 | Unary | r2159_3 | | ir.cpp:2159:24:2159:26 | Right | r2159_10 | -| ir.cpp:2163:5:2166:5 | Address | &:r2163_1 | -| ir.cpp:2163:5:2166:5 | Address | &:r2163_5 | -| ir.cpp:2163:5:2166:5 | Address | &:r2163_13 | -| ir.cpp:2163:5:2166:5 | Address | &:r2163_40 | -| ir.cpp:2163:36:2163:36 | Address | &:r2163_6 | -| ir.cpp:2163:36:2163:36 | Address | &:r2163_14 | -| ir.cpp:2163:36:2163:36 | Address | &:r2163_25 | -| ir.cpp:2163:36:2163:36 | Address | &:r2163_31 | -| ir.cpp:2163:36:2163:36 | Address | &:r2163_31 | -| ir.cpp:2163:36:2163:36 | Address | &:r2163_43 | -| ir.cpp:2163:36:2163:36 | Arg(0) | 0:r2163_26 | +| ir.cpp:2163:5:2163:5 | Address | &:r2163_10 | +| ir.cpp:2163:5:2163:5 | Address | &:r2163_14 | +| ir.cpp:2163:5:2163:5 | Address | &:r2163_22 | +| ir.cpp:2163:21:2163:22 | Address | &:r2163_1 | +| ir.cpp:2163:21:2163:22 | Address | &:r2163_1 | +| ir.cpp:2163:21:2163:22 | Address | &:r2163_57 | +| ir.cpp:2163:21:2163:22 | Address | &:r2163_57 | +| ir.cpp:2163:21:2163:22 | Arg(this) | this:r2163_1 | +| ir.cpp:2163:21:2163:22 | Arg(this) | this:r2163_57 | +| ir.cpp:2163:21:2163:22 | CallTarget | func:r2163_58 | +| ir.cpp:2163:21:2163:22 | ChiPartial | partial:m2163_60 | +| ir.cpp:2163:21:2163:22 | ChiPartial | partial:m2163_63 | +| ir.cpp:2163:21:2163:22 | ChiTotal | total:m2163_9 | +| ir.cpp:2163:21:2163:22 | ChiTotal | total:m2163_54 | +| ir.cpp:2163:21:2163:22 | SideEffect | m2163_9 | +| ir.cpp:2163:21:2163:22 | SideEffect | ~m2163_54 | +| ir.cpp:2163:24:2163:24 | Arg(0) | 0:r2163_4 | +| ir.cpp:2163:24:2163:25 | CallTarget | func:r2163_3 | +| ir.cpp:2163:24:2163:25 | ChiPartial | partial:m2163_6 | +| ir.cpp:2163:24:2163:25 | ChiPartial | partial:m2163_8 | +| ir.cpp:2163:24:2163:25 | ChiTotal | total:m2157_42 | +| ir.cpp:2163:24:2163:25 | ChiTotal | total:m2163_2 | +| ir.cpp:2163:24:2163:25 | SideEffect | ~m2157_42 | +| ir.cpp:2163:32:2163:32 | Address | &:r2163_49 | +| ir.cpp:2163:36:2163:36 | Address | &:r2163_15 | +| ir.cpp:2163:36:2163:36 | Address | &:r2163_23 | +| ir.cpp:2163:36:2163:36 | Address | &:r2163_34 | +| ir.cpp:2163:36:2163:36 | Address | &:r2163_40 | +| ir.cpp:2163:36:2163:36 | Address | &:r2163_40 | +| ir.cpp:2163:36:2163:36 | Address | &:r2163_52 | +| ir.cpp:2163:36:2163:36 | Arg(0) | 0:r2163_35 | | ir.cpp:2163:36:2163:36 | Arg(this) | this:r0_22 | | ir.cpp:2163:36:2163:36 | Arg(this) | this:r0_25 | | ir.cpp:2163:36:2163:36 | Arg(this) | this:r0_27 | | ir.cpp:2163:36:2163:36 | Arg(this) | this:r0_29 | -| ir.cpp:2163:36:2163:36 | Arg(this) | this:r2163_31 | -| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_8 | -| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_16 | -| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_24 | -| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_32 | -| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_42 | -| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_10 | -| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_18 | -| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_28 | -| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_34 | +| ir.cpp:2163:36:2163:36 | Arg(this) | this:r2163_40 | +| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_17 | +| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_25 | +| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_33 | +| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_41 | +| ir.cpp:2163:36:2163:36 | CallTarget | func:r2163_51 | +| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_19 | +| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_27 | | ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_37 | -| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_44 | -| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2157_29 | -| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_11 | -| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_21 | -| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_22 | -| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_29 | -| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_45 | -| ir.cpp:2163:36:2163:36 | Condition | r2163_27 | -| ir.cpp:2163:36:2163:36 | Load | m2163_4 | -| ir.cpp:2163:36:2163:36 | Load | m2163_4 | -| ir.cpp:2163:36:2163:36 | Load | m2163_20 | -| ir.cpp:2163:36:2163:36 | Phi | from 15:m2163_12 | -| ir.cpp:2163:36:2163:36 | Phi | from 15:~m2163_19 | -| ir.cpp:2163:36:2163:36 | Phi | from 17:m2163_38 | -| ir.cpp:2163:36:2163:36 | Phi | from 17:~m2163_35 | -| ir.cpp:2163:36:2163:36 | SideEffect | m2163_21 | -| ir.cpp:2163:36:2163:36 | SideEffect | ~m2157_29 | -| ir.cpp:2163:36:2163:36 | SideEffect | ~m2163_11 | -| ir.cpp:2163:36:2163:36 | SideEffect | ~m2163_22 | -| ir.cpp:2163:36:2163:36 | SideEffect | ~m2163_29 | -| ir.cpp:2163:36:2163:36 | SideEffect | ~m2163_45 | -| ir.cpp:2163:36:2163:36 | StoreValue | r2163_9 | -| ir.cpp:2163:36:2163:36 | StoreValue | r2163_17 | -| ir.cpp:2163:36:2163:36 | Unary | r2163_7 | -| ir.cpp:2163:36:2163:36 | Unary | r2163_15 | -| ir.cpp:2163:36:2163:36 | Unary | r2163_23 | -| ir.cpp:2163:36:2163:36 | Unary | r2163_33 | -| ir.cpp:2163:36:2163:36 | Unary | r2163_41 | -| ir.cpp:2163:36:2163:37 | StoreValue | r2163_3 | -| ir.cpp:2163:36:2163:37 | Unary | r2163_2 | -| ir.cpp:2163:36:2163:38 | Load | ~m2163_45 | -| ir.cpp:2163:36:2163:38 | StoreValue | r2163_46 | +| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_43 | +| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_46 | +| ir.cpp:2163:36:2163:36 | ChiPartial | partial:m2163_53 | +| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_7 | +| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_20 | +| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_30 | +| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_31 | +| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_38 | +| ir.cpp:2163:36:2163:36 | ChiTotal | total:m2163_54 | +| ir.cpp:2163:36:2163:36 | Condition | r2163_36 | +| ir.cpp:2163:36:2163:36 | Load | m2163_13 | +| ir.cpp:2163:36:2163:36 | Load | m2163_13 | +| ir.cpp:2163:36:2163:36 | Load | m2163_29 | +| ir.cpp:2163:36:2163:36 | Phi | from 15:m2163_21 | +| ir.cpp:2163:36:2163:36 | Phi | from 15:~m2163_28 | +| ir.cpp:2163:36:2163:36 | Phi | from 17:m2163_47 | +| ir.cpp:2163:36:2163:36 | Phi | from 17:~m2163_44 | +| ir.cpp:2163:36:2163:36 | SideEffect | m2163_30 | +| ir.cpp:2163:36:2163:36 | SideEffect | ~m2163_7 | +| ir.cpp:2163:36:2163:36 | SideEffect | ~m2163_20 | +| ir.cpp:2163:36:2163:36 | SideEffect | ~m2163_31 | +| ir.cpp:2163:36:2163:36 | SideEffect | ~m2163_38 | +| ir.cpp:2163:36:2163:36 | SideEffect | ~m2163_54 | +| ir.cpp:2163:36:2163:36 | StoreValue | r2163_18 | +| ir.cpp:2163:36:2163:36 | StoreValue | r2163_26 | +| ir.cpp:2163:36:2163:36 | Unary | r2163_16 | +| ir.cpp:2163:36:2163:36 | Unary | r2163_24 | +| ir.cpp:2163:36:2163:36 | Unary | r2163_32 | +| ir.cpp:2163:36:2163:36 | Unary | r2163_42 | +| ir.cpp:2163:36:2163:36 | Unary | r2163_50 | +| ir.cpp:2163:36:2163:37 | StoreValue | r2163_12 | +| ir.cpp:2163:36:2163:37 | Unary | r2163_11 | +| ir.cpp:2163:36:2163:38 | Load | ~m2163_54 | +| ir.cpp:2163:36:2163:38 | StoreValue | r2163_55 | | ir.cpp:2164:11:2164:11 | Address | &:r2164_1 | | ir.cpp:2164:11:2164:11 | Left | r2164_2 | -| ir.cpp:2164:11:2164:11 | Load | m2163_47 | +| ir.cpp:2164:11:2164:11 | Load | m2163_56 | | ir.cpp:2164:11:2164:16 | Condition | r2164_4 | | ir.cpp:2164:16:2164:16 | Right | r2164_3 | -| ir.cpp:2168:5:2171:5 | Address | &:r2168_1 | -| ir.cpp:2168:5:2171:5 | Address | &:r2168_5 | -| ir.cpp:2168:5:2171:5 | Address | &:r2168_13 | -| ir.cpp:2168:5:2171:5 | Address | &:r2168_31 | -| ir.cpp:2168:68:2168:68 | Address | &:r2168_6 | -| ir.cpp:2168:68:2168:68 | Address | &:r2168_14 | -| ir.cpp:2168:68:2168:68 | Address | &:r2168_25 | -| ir.cpp:2168:68:2168:68 | Address | &:r2168_34 | -| ir.cpp:2168:68:2168:68 | Address | &:r2168_39 | -| ir.cpp:2168:68:2168:68 | Address | &:r2168_39 | -| ir.cpp:2168:68:2168:68 | Arg(0) | 0:r2168_26 | +| ir.cpp:2168:5:2168:5 | Address | &:r2168_14 | +| ir.cpp:2168:5:2168:5 | Address | &:r2168_18 | +| ir.cpp:2168:5:2168:5 | Address | &:r2168_26 | +| ir.cpp:2168:37:2168:38 | Address | &:r2168_1 | +| ir.cpp:2168:37:2168:38 | Address | &:r2168_1 | +| ir.cpp:2168:37:2168:38 | Arg(this) | this:r2168_1 | +| ir.cpp:2168:40:2168:40 | Address | &:r2168_4 | +| ir.cpp:2168:40:2168:40 | Address | &:r2168_4 | +| ir.cpp:2168:40:2168:40 | Address | &:r2168_5 | +| ir.cpp:2168:40:2168:40 | Arg(0) | 0:r2168_8 | +| ir.cpp:2168:40:2168:40 | Load | m2153_8 | +| ir.cpp:2168:40:2168:40 | Load | m2168_7 | +| ir.cpp:2168:40:2168:40 | StoreValue | r2168_6 | +| ir.cpp:2168:40:2168:41 | CallTarget | func:r2168_3 | +| ir.cpp:2168:40:2168:41 | ChiPartial | partial:m2168_10 | +| ir.cpp:2168:40:2168:41 | ChiPartial | partial:m2168_12 | +| ir.cpp:2168:40:2168:41 | ChiTotal | total:m2163_38 | +| ir.cpp:2168:40:2168:41 | ChiTotal | total:m2168_2 | +| ir.cpp:2168:40:2168:41 | SideEffect | ~m2163_38 | +| ir.cpp:2168:64:2168:64 | Address | &:r2168_44 | +| ir.cpp:2168:64:2168:64 | Address | &:r2168_52 | +| ir.cpp:2168:64:2168:64 | Address | &:r2168_52 | +| ir.cpp:2168:64:2168:64 | Arg(this) | this:r2168_52 | +| ir.cpp:2168:64:2168:64 | CallTarget | func:r2168_53 | +| ir.cpp:2168:64:2168:64 | ChiPartial | partial:m2168_55 | +| ir.cpp:2168:64:2168:64 | ChiPartial | partial:m2168_58 | +| ir.cpp:2168:64:2168:64 | ChiTotal | total:m2168_51 | +| ir.cpp:2168:64:2168:64 | ChiTotal | total:m2171_13 | +| ir.cpp:2168:64:2168:64 | SideEffect | m2168_51 | +| ir.cpp:2168:64:2168:64 | SideEffect | ~m2171_13 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_19 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_27 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_38 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_47 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_60 | +| ir.cpp:2168:68:2168:68 | Address | &:r2168_60 | +| ir.cpp:2168:68:2168:68 | Arg(0) | 0:r2168_39 | | ir.cpp:2168:68:2168:68 | Arg(this) | this:r0_32 | | ir.cpp:2168:68:2168:68 | Arg(this) | this:r0_35 | | ir.cpp:2168:68:2168:68 | Arg(this) | this:r0_37 | | ir.cpp:2168:68:2168:68 | Arg(this) | this:r0_39 | -| ir.cpp:2168:68:2168:68 | Arg(this) | this:r2168_39 | -| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_8 | -| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_16 | -| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_24 | -| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_33 | -| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_40 | -| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_10 | -| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_18 | -| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_28 | -| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_35 | -| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_42 | -| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_45 | -| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2163_29 | +| ir.cpp:2168:68:2168:68 | Arg(this) | this:r2168_60 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_21 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_29 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_37 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_46 | +| ir.cpp:2168:68:2168:68 | CallTarget | func:r2168_61 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_23 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_31 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_41 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_48 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_63 | +| ir.cpp:2168:68:2168:68 | ChiPartial | partial:m2168_66 | | ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_11 | -| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_21 | -| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_22 | -| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_29 | -| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2171_13 | -| ir.cpp:2168:68:2168:68 | Condition | r2168_27 | -| ir.cpp:2168:68:2168:68 | Load | m2168_4 | -| ir.cpp:2168:68:2168:68 | Load | m2168_4 | -| ir.cpp:2168:68:2168:68 | Load | m2168_20 | -| ir.cpp:2168:68:2168:68 | Phi | from 20:m2168_12 | -| ir.cpp:2168:68:2168:68 | Phi | from 20:~m2168_19 | -| ir.cpp:2168:68:2168:68 | Phi | from 22:m2168_46 | -| ir.cpp:2168:68:2168:68 | Phi | from 22:~m2168_43 | -| ir.cpp:2168:68:2168:68 | SideEffect | m2168_21 | -| ir.cpp:2168:68:2168:68 | SideEffect | ~m2163_29 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_24 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_34 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_35 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_42 | +| ir.cpp:2168:68:2168:68 | ChiTotal | total:m2168_56 | +| ir.cpp:2168:68:2168:68 | Condition | r2168_40 | +| ir.cpp:2168:68:2168:68 | Load | m2168_17 | +| ir.cpp:2168:68:2168:68 | Load | m2168_17 | +| ir.cpp:2168:68:2168:68 | Load | m2168_33 | +| ir.cpp:2168:68:2168:68 | Phi | from 20:m2168_25 | +| ir.cpp:2168:68:2168:68 | Phi | from 20:~m2168_32 | +| ir.cpp:2168:68:2168:68 | Phi | from 22:m2168_67 | +| ir.cpp:2168:68:2168:68 | Phi | from 22:~m2168_64 | +| ir.cpp:2168:68:2168:68 | SideEffect | m2168_34 | | ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_11 | -| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_22 | -| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_29 | -| ir.cpp:2168:68:2168:68 | SideEffect | ~m2171_13 | -| ir.cpp:2168:68:2168:68 | StoreValue | r2168_9 | -| ir.cpp:2168:68:2168:68 | StoreValue | r2168_17 | -| ir.cpp:2168:68:2168:68 | Unary | r2168_7 | -| ir.cpp:2168:68:2168:68 | Unary | r2168_15 | -| ir.cpp:2168:68:2168:68 | Unary | r2168_23 | -| ir.cpp:2168:68:2168:68 | Unary | r2168_32 | -| ir.cpp:2168:68:2168:68 | Unary | r2168_41 | -| ir.cpp:2168:68:2168:69 | StoreValue | r2168_3 | -| ir.cpp:2168:68:2168:69 | Unary | r2168_2 | -| ir.cpp:2168:68:2168:70 | Load | ~m2168_36 | -| ir.cpp:2168:68:2168:70 | StoreValue | r2168_37 | +| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_24 | +| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_35 | +| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_42 | +| ir.cpp:2168:68:2168:68 | SideEffect | ~m2168_56 | +| ir.cpp:2168:68:2168:68 | StoreValue | r2168_22 | +| ir.cpp:2168:68:2168:68 | StoreValue | r2168_30 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_20 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_28 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_36 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_45 | +| ir.cpp:2168:68:2168:68 | Unary | r2168_62 | +| ir.cpp:2168:68:2168:69 | StoreValue | r2168_16 | +| ir.cpp:2168:68:2168:69 | Unary | r2168_15 | +| ir.cpp:2168:68:2168:70 | Load | ~m2168_49 | +| ir.cpp:2168:68:2168:70 | StoreValue | r2168_50 | | ir.cpp:2169:27:2169:28 | Address | &:r2169_1 | | ir.cpp:2169:27:2169:28 | Address | &:r2169_1 | | ir.cpp:2169:27:2169:28 | Arg(this) | this:r2169_1 | | ir.cpp:2169:27:2169:28 | CallTarget | func:r2169_3 | | ir.cpp:2169:27:2169:28 | ChiPartial | partial:m2169_5 | | ir.cpp:2169:27:2169:28 | ChiPartial | partial:m2169_7 | -| ir.cpp:2169:27:2169:28 | ChiTotal | total:m2168_36 | +| ir.cpp:2169:27:2169:28 | ChiTotal | total:m2168_49 | | ir.cpp:2169:27:2169:28 | ChiTotal | total:m2169_2 | -| ir.cpp:2169:27:2169:28 | SideEffect | ~m2168_36 | +| ir.cpp:2169:27:2169:28 | SideEffect | ~m2168_49 | | ir.cpp:2170:27:2170:28 | Address | &:r2170_1 | | ir.cpp:2170:27:2170:28 | Address | &:r2170_1 | | ir.cpp:2170:27:2170:28 | Arg(this) | this:r2170_1 | @@ -10912,18 +11000,18 @@ | ir.cpp:2172:1:2172:1 | ChiTotal | total:m2153_8 | | ir.cpp:2172:1:2172:1 | ChiTotal | total:m2153_8 | | ir.cpp:2172:1:2172:1 | ChiTotal | total:m2153_8 | -| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2159_5 | -| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2163_45 | -| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2168_29 | +| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2157_64 | +| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2163_61 | +| ir.cpp:2172:1:2172:1 | ChiTotal | total:m2168_42 | | ir.cpp:2172:1:2172:1 | SideEffect | m2153_8 | | ir.cpp:2172:1:2172:1 | SideEffect | m2153_8 | | ir.cpp:2172:1:2172:1 | SideEffect | m2153_8 | -| ir.cpp:2172:1:2172:1 | SideEffect | ~m2159_5 | -| ir.cpp:2172:1:2172:1 | SideEffect | ~m2163_45 | -| ir.cpp:2172:1:2172:1 | SideEffect | ~m2168_29 | +| ir.cpp:2172:1:2172:1 | SideEffect | ~m2157_64 | +| ir.cpp:2172:1:2172:1 | SideEffect | ~m2163_61 | +| ir.cpp:2172:1:2172:1 | SideEffect | ~m2168_42 | | ir.cpp:2174:6:2174:38 | ChiPartial | partial:m2174_3 | | ir.cpp:2174:6:2174:38 | ChiTotal | total:m2174_2 | -| ir.cpp:2174:6:2174:38 | SideEffect | ~m2177_10 | +| ir.cpp:2174:6:2174:38 | SideEffect | ~m2177_7 | | ir.cpp:2175:25:2175:25 | Address | &:r2175_1 | | ir.cpp:2175:25:2175:25 | Address | &:r2175_1 | | ir.cpp:2175:25:2175:25 | Arg(this) | this:r2175_1 | @@ -10948,12 +11036,12 @@ | ir.cpp:2177:1:2177:1 | CallTarget | func:r2177_4 | | ir.cpp:2177:1:2177:1 | ChiPartial | partial:m2177_6 | | ir.cpp:2177:1:2177:1 | ChiPartial | partial:m2177_9 | +| ir.cpp:2177:1:2177:1 | ChiTotal | total:m2175_8 | | ir.cpp:2177:1:2177:1 | ChiTotal | total:m2177_1 | -| ir.cpp:2177:1:2177:1 | ChiTotal | total:m2177_7 | | ir.cpp:2177:1:2177:1 | Phi | from 0:~m2175_6 | | ir.cpp:2177:1:2177:1 | Phi | from 1:~m2176_7 | +| ir.cpp:2177:1:2177:1 | SideEffect | m2175_8 | | ir.cpp:2177:1:2177:1 | SideEffect | ~m2177_1 | -| ir.cpp:2177:1:2177:1 | SideEffect | ~m2177_7 | | ir.cpp:2179:6:2179:38 | ChiPartial | partial:m2179_3 | | ir.cpp:2179:6:2179:38 | ChiTotal | total:m2179_2 | | ir.cpp:2179:6:2179:38 | SideEffect | ~m2182_6 | @@ -10989,7 +11077,7 @@ | ir.cpp:2182:1:2182:1 | SideEffect | ~m2181_7 | | ir.cpp:2184:6:2184:38 | ChiPartial | partial:m2184_3 | | ir.cpp:2184:6:2184:38 | ChiTotal | total:m2184_2 | -| ir.cpp:2184:6:2184:38 | SideEffect | ~m2188_10 | +| ir.cpp:2184:6:2184:38 | SideEffect | ~m2188_15 | | ir.cpp:2185:25:2185:25 | Address | &:r2185_1 | | ir.cpp:2185:25:2185:25 | Address | &:r2185_1 | | ir.cpp:2185:25:2185:25 | Arg(this) | this:r2185_1 | @@ -11019,14 +11107,24 @@ | ir.cpp:2187:32:2187:32 | StoreValue | r2187_5 | | ir.cpp:2188:1:2188:1 | Address | &:r2188_3 | | ir.cpp:2188:1:2188:1 | Address | &:r2188_3 | +| ir.cpp:2188:1:2188:1 | Address | &:r2188_11 | +| ir.cpp:2188:1:2188:1 | Address | &:r2188_11 | | ir.cpp:2188:1:2188:1 | Arg(this) | this:r2188_3 | +| ir.cpp:2188:1:2188:1 | Arg(this) | this:r2188_11 | | ir.cpp:2188:1:2188:1 | CallTarget | func:r2188_4 | +| ir.cpp:2188:1:2188:1 | CallTarget | func:r2188_12 | | ir.cpp:2188:1:2188:1 | ChiPartial | partial:m2188_6 | | ir.cpp:2188:1:2188:1 | ChiPartial | partial:m2188_9 | +| ir.cpp:2188:1:2188:1 | ChiPartial | partial:m2188_14 | +| ir.cpp:2188:1:2188:1 | ChiPartial | partial:m2188_17 | +| ir.cpp:2188:1:2188:1 | ChiTotal | total:m2185_8 | +| ir.cpp:2188:1:2188:1 | ChiTotal | total:m2186_8 | | ir.cpp:2188:1:2188:1 | ChiTotal | total:m2188_1 | | ir.cpp:2188:1:2188:1 | ChiTotal | total:m2188_7 | | ir.cpp:2188:1:2188:1 | Phi | from 0:~m2186_6 | | ir.cpp:2188:1:2188:1 | Phi | from 1:~m2187_7 | +| ir.cpp:2188:1:2188:1 | SideEffect | m2185_8 | +| ir.cpp:2188:1:2188:1 | SideEffect | m2186_8 | | ir.cpp:2188:1:2188:1 | SideEffect | ~m2188_1 | | ir.cpp:2188:1:2188:1 | SideEffect | ~m2188_7 | | ir.cpp:2190:28:2190:55 | Address | &:r2190_3 | @@ -11274,60 +11372,70 @@ | ir.cpp:2224:5:2224:5 | ChiTotal | total:m2223_8 | | ir.cpp:2224:5:2224:5 | SideEffect | m2223_8 | | ir.cpp:2224:5:2224:5 | SideEffect | ~m2223_6 | -| ir.cpp:2226:5:2228:5 | Address | &:r2226_1 | -| ir.cpp:2226:5:2228:5 | Address | &:r2226_24 | -| ir.cpp:2226:5:2228:5 | Address | &:r2226_32 | -| ir.cpp:2226:5:2228:5 | Address | &:r2226_50 | -| ir.cpp:2226:5:2228:5 | Address | &:r2226_50 | -| ir.cpp:2226:5:2228:5 | Arg(this) | this:r2226_50 | +| ir.cpp:2226:5:2226:5 | Address | &:r2226_1 | +| ir.cpp:2226:5:2226:5 | Address | &:r2226_24 | +| ir.cpp:2226:5:2226:5 | Address | &:r2226_32 | +| ir.cpp:2226:16:2226:16 | Address | &:r2226_50 | +| ir.cpp:2226:16:2226:16 | Address | &:r2226_50 | +| ir.cpp:2226:16:2226:16 | Address | &:r2226_67 | +| ir.cpp:2226:16:2226:16 | Address | &:r2226_67 | +| ir.cpp:2226:16:2226:16 | Arg(this) | this:r2226_50 | +| ir.cpp:2226:16:2226:16 | Arg(this) | this:r2226_67 | | ir.cpp:2226:16:2226:16 | CallTarget | func:r2226_52 | +| ir.cpp:2226:16:2226:16 | CallTarget | func:r2226_68 | | ir.cpp:2226:16:2226:16 | ChiPartial | partial:m2226_62 | | ir.cpp:2226:16:2226:16 | ChiPartial | partial:m2226_65 | +| ir.cpp:2226:16:2226:16 | ChiPartial | partial:m2226_70 | +| ir.cpp:2226:16:2226:16 | ChiPartial | partial:m2226_73 | | ir.cpp:2226:16:2226:16 | ChiTotal | total:m2226_51 | | ir.cpp:2226:16:2226:16 | ChiTotal | total:m2226_57 | +| ir.cpp:2226:16:2226:16 | ChiTotal | total:m2226_66 | +| ir.cpp:2226:16:2226:16 | ChiTotal | total:m2228_5 | +| ir.cpp:2226:16:2226:16 | SideEffect | m2226_66 | | ir.cpp:2226:16:2226:16 | SideEffect | ~m2226_57 | +| ir.cpp:2226:16:2226:16 | SideEffect | ~m2228_5 | | ir.cpp:2226:20:2226:20 | Address | &:r2226_25 | | ir.cpp:2226:20:2226:20 | Address | &:r2226_33 | | ir.cpp:2226:20:2226:20 | Address | &:r2226_44 | -| ir.cpp:2226:20:2226:20 | Address | &:r2226_67 | -| ir.cpp:2226:20:2226:20 | Address | &:r2226_67 | +| ir.cpp:2226:20:2226:20 | Address | &:r2226_75 | +| ir.cpp:2226:20:2226:20 | Address | &:r2226_75 | | ir.cpp:2226:20:2226:20 | Arg(0) | 0:r2226_45 | | ir.cpp:2226:20:2226:20 | Arg(this) | this:r0_2 | | ir.cpp:2226:20:2226:20 | Arg(this) | this:r0_5 | | ir.cpp:2226:20:2226:20 | Arg(this) | this:r0_7 | | ir.cpp:2226:20:2226:20 | Arg(this) | this:r0_9 | -| ir.cpp:2226:20:2226:20 | Arg(this) | this:r2226_67 | +| ir.cpp:2226:20:2226:20 | Arg(this) | this:r2226_75 | | ir.cpp:2226:20:2226:20 | CallTarget | func:r2226_27 | | ir.cpp:2226:20:2226:20 | CallTarget | func:r2226_35 | | ir.cpp:2226:20:2226:20 | CallTarget | func:r2226_43 | | ir.cpp:2226:20:2226:20 | CallTarget | func:r2226_54 | -| ir.cpp:2226:20:2226:20 | CallTarget | func:r2226_68 | +| ir.cpp:2226:20:2226:20 | CallTarget | func:r2226_76 | | ir.cpp:2226:20:2226:20 | ChiPartial | partial:m2226_29 | | ir.cpp:2226:20:2226:20 | ChiPartial | partial:m2226_37 | | ir.cpp:2226:20:2226:20 | ChiPartial | partial:m2226_47 | | ir.cpp:2226:20:2226:20 | ChiPartial | partial:m2226_56 | -| ir.cpp:2226:20:2226:20 | ChiPartial | partial:m2226_70 | -| ir.cpp:2226:20:2226:20 | ChiPartial | partial:m2226_73 | +| ir.cpp:2226:20:2226:20 | ChiPartial | partial:m2226_78 | +| ir.cpp:2226:20:2226:20 | ChiPartial | partial:m2226_81 | | ir.cpp:2226:20:2226:20 | ChiTotal | total:m2226_19 | | ir.cpp:2226:20:2226:20 | ChiTotal | total:m2226_30 | | ir.cpp:2226:20:2226:20 | ChiTotal | total:m2226_40 | | ir.cpp:2226:20:2226:20 | ChiTotal | total:m2226_41 | | ir.cpp:2226:20:2226:20 | ChiTotal | total:m2226_48 | -| ir.cpp:2226:20:2226:20 | ChiTotal | total:m2228_5 | +| ir.cpp:2226:20:2226:20 | ChiTotal | total:m2226_71 | | ir.cpp:2226:20:2226:20 | Condition | r2226_46 | | ir.cpp:2226:20:2226:20 | Load | m2226_23 | | ir.cpp:2226:20:2226:20 | Load | m2226_23 | | ir.cpp:2226:20:2226:20 | Load | m2226_39 | | ir.cpp:2226:20:2226:20 | Phi | from 3:m2226_31 | | ir.cpp:2226:20:2226:20 | Phi | from 3:~m2226_38 | -| ir.cpp:2226:20:2226:20 | Phi | from 5:m2226_74 | -| ir.cpp:2226:20:2226:20 | Phi | from 5:~m2226_71 | +| ir.cpp:2226:20:2226:20 | Phi | from 5:m2226_82 | +| ir.cpp:2226:20:2226:20 | Phi | from 5:~m2226_79 | | ir.cpp:2226:20:2226:20 | SideEffect | m2226_40 | | ir.cpp:2226:20:2226:20 | SideEffect | ~m2226_19 | | ir.cpp:2226:20:2226:20 | SideEffect | ~m2226_30 | | ir.cpp:2226:20:2226:20 | SideEffect | ~m2226_41 | | ir.cpp:2226:20:2226:20 | SideEffect | ~m2226_48 | -| ir.cpp:2226:20:2226:20 | SideEffect | ~m2228_5 | +| ir.cpp:2226:20:2226:20 | SideEffect | ~m2226_71 | | ir.cpp:2226:20:2226:20 | StoreValue | r2226_28 | | ir.cpp:2226:20:2226:20 | StoreValue | r2226_36 | | ir.cpp:2226:20:2226:20 | Unary | r2226_26 | @@ -11335,7 +11443,7 @@ | ir.cpp:2226:20:2226:20 | Unary | r2226_42 | | ir.cpp:2226:20:2226:20 | Unary | r2226_53 | | ir.cpp:2226:20:2226:20 | Unary | r2226_55 | -| ir.cpp:2226:20:2226:20 | Unary | r2226_69 | +| ir.cpp:2226:20:2226:20 | Unary | r2226_77 | | ir.cpp:2226:20:2226:50 | Address | &:r2226_2 | | ir.cpp:2226:20:2226:50 | Address | &:r2226_2 | | ir.cpp:2226:20:2226:50 | Arg(this) | this:r2226_2 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 509e948dc34..aefdbf9d134 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -37,8 +37,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -| ir.cpp:2154:68:2154:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2157:68:2157:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2163:36:2163:37 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2168:68:2168:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 7464e58d978..1a0f8e83651 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -7200,29 +7200,11 @@ ir.cpp: #-----| Goto -> Block 6 # 1246| Block 6 -# 1246| v1246_1(void) = NoOp : -# 1246| r1246_2(glval) = VariableAddress[c] : -# 1246| r1246_3(glval) = FunctionAddress[~String] : -# 1246| v1246_4(void) = Call[~String] : func:r1246_3, this:r1246_2 -# 1246| mu1246_5(unknown) = ^CallSideEffect : ~m? -# 1246| v1246_6(void) = ^IndirectReadSideEffect[-1] : &:r1246_2, ~m? -# 1246| mu1246_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1246_2 -# 1246| r1246_8(glval) = VariableAddress[b] : -# 1246| r1246_9(glval) = FunctionAddress[~String] : -# 1246| v1246_10(void) = Call[~String] : func:r1246_9, this:r1246_8 -# 1246| mu1246_11(unknown) = ^CallSideEffect : ~m? -# 1246| v1246_12(void) = ^IndirectReadSideEffect[-1] : &:r1246_8, ~m? -# 1246| mu1246_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1246_8 -# 1246| r1246_14(glval) = VariableAddress[a] : -# 1246| r1246_15(glval) = FunctionAddress[~String] : -# 1246| v1246_16(void) = Call[~String] : func:r1246_15, this:r1246_14 -# 1246| mu1246_17(unknown) = ^CallSideEffect : ~m? -# 1246| v1246_18(void) = ^IndirectReadSideEffect[-1] : &:r1246_14, ~m? -# 1246| mu1246_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r1246_14 -# 1242| v1242_8(void) = ReturnIndirection[dynamic] : &:r1242_6, ~m? -# 1242| v1242_9(void) = ReturnVoid : -# 1242| v1242_10(void) = AliasedUse : ~m? -# 1242| v1242_11(void) = ExitFunction : +# 1246| v1246_1(void) = NoOp : +# 1242| v1242_8(void) = ReturnIndirection[dynamic] : &:r1242_6, ~m? +# 1242| v1242_9(void) = ReturnVoid : +# 1242| v1242_10(void) = AliasedUse : ~m? +# 1242| v1242_11(void) = ExitFunction : # 1253| void test_strings(char*, char*) # 1253| Block 0 @@ -11979,7 +11961,7 @@ ir.cpp: # 2141| mu2141_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2141_1 # 2141| r2141_7(bool) = Constant[1] : # 2141| v2141_8(void) = ConditionalBranch : r2141_7 -#-----| False -> Block 5 +#-----| False -> Block 6 #-----| True -> Block 4 # 2142| Block 4 @@ -11990,9 +11972,18 @@ ir.cpp: # 2142| mu2142_5(unknown) = ^CallSideEffect : ~m? # 2142| v2142_6(void) = ^IndirectReadSideEffect[-1] : &:r2142_1, ~m? # 2142| mu2142_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2142_1 -#-----| Goto -> Block 5 +#-----| Goto -> Block 6 -# 2144| Block 5 +# 2142| Block 5 +# 2142| r2142_8(glval) = VariableAddress[x] : +# 2142| r2142_9(glval) = FunctionAddress[~ClassWithDestructor] : +# 2142| v2142_10(void) = Call[~ClassWithDestructor] : func:r2142_9, this:r2142_8 +# 2142| mu2142_11(unknown) = ^CallSideEffect : ~m? +# 2142| v2142_12(void) = ^IndirectReadSideEffect[-1] : &:r2142_8, ~m? +# 2142| mu2142_13(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2142_8 +#-----| Goto -> Block 6 + +# 2144| Block 6 # 2144| r2144_1(glval) = VariableAddress[x] : # 2144| mu2144_2(ClassWithDestructor) = Uninitialized[x] : &:r2144_1 # 2144| r2144_3(glval) = FunctionAddress[ClassWithDestructor] : @@ -12003,10 +11994,10 @@ ir.cpp: # 2144| r2144_8(char) = Load[c] : &:r2144_7, ~m? # 2144| r2144_9(int) = Convert : r2144_8 # 2144| v2144_10(void) = Switch : r2144_9 -#-----| Case[97] -> Block 6 -#-----| Default -> Block 7 +#-----| Case[97] -> Block 7 +#-----| Default -> Block 8 -# 2145| Block 6 +# 2145| Block 7 # 2145| v2145_1(void) = NoOp : # 2146| r2146_1(glval) = VariableAddress[x] : # 2146| r2146_2(glval) = FunctionAddress[set_x] : @@ -12016,9 +12007,9 @@ ir.cpp: # 2146| v2146_6(void) = ^IndirectReadSideEffect[-1] : &:r2146_1, ~m? # 2146| mu2146_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2146_1 # 2147| v2147_1(void) = NoOp : -#-----| Goto -> Block 9 +#-----| Goto -> Block 10 -# 2148| Block 7 +# 2148| Block 8 # 2148| v2148_1(void) = NoOp : # 2149| r2149_1(glval) = VariableAddress[x] : # 2149| r2149_2(glval) = FunctionAddress[set_x] : @@ -12028,18 +12019,18 @@ ir.cpp: # 2149| v2149_6(void) = ^IndirectReadSideEffect[-1] : &:r2149_1, ~m? # 2149| mu2149_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2149_1 # 2150| v2150_1(void) = NoOp : -#-----| Goto -> Block 9 +#-----| Goto -> Block 10 -# 2151| Block 8 +# 2151| Block 9 # 2151| r2151_1(glval) = VariableAddress[x] : # 2151| r2151_2(glval) = FunctionAddress[~ClassWithDestructor] : # 2151| v2151_3(void) = Call[~ClassWithDestructor] : func:r2151_2, this:r2151_1 # 2151| mu2151_4(unknown) = ^CallSideEffect : ~m? # 2151| v2151_5(void) = ^IndirectReadSideEffect[-1] : &:r2151_1, ~m? # 2151| mu2151_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2151_1 -#-----| Goto -> Block 9 +#-----| Goto -> Block 10 -# 2151| Block 9 +# 2151| Block 10 # 2151| v2151_7(void) = NoOp : # 2153| r2153_1(glval) = VariableAddress[x] : # 2153| mu2153_2(ClassWithDestructor) = Uninitialized[x] : &:r2153_1 @@ -12047,131 +12038,158 @@ ir.cpp: # 2153| v2153_4(void) = Call[ClassWithDestructor] : func:r2153_3, this:r2153_1 # 2153| mu2153_5(unknown) = ^CallSideEffect : ~m? # 2153| mu2153_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2153_1 -# 2154| r2154_1(glval &>) = VariableAddress[(__range)] : -# 2154| r2154_2(glval>) = VariableAddress : -# 2154| r2154_3(vector &) = CopyValue : r2154_2 -# 2154| mu2154_4(vector &) = Store[(__range)] : &:r2154_1, r2154_3 -# 2154| r2154_5(glval) = VariableAddress[(__begin)] : -# 2154| r2154_6(glval &>) = VariableAddress[(__range)] : -# 2154| r2154_7(vector &) = Load[(__range)] : &:r2154_6, ~m? -#-----| r0_1(glval>) = CopyValue : r2154_7 -#-----| r0_2(glval>) = Convert : r0_1 -# 2154| r2154_8(glval) = FunctionAddress[begin] : -# 2154| r2154_9(iterator) = Call[begin] : func:r2154_8, this:r0_2 +# 2154| r2154_1(glval>) = VariableAddress[ys] : +# 2154| mu2154_2(vector) = Uninitialized[ys] : &:r2154_1 +# 2154| r2154_3(glval) = FunctionAddress[vector] : +# 2154| r2154_4(glval) = VariableAddress[#temp2154:40] : +# 2154| r2154_5(glval) = VariableAddress[x] : +# 2154| r2154_6(ClassWithDestructor) = Load[x] : &:r2154_5, ~m? +# 2154| mu2154_7(ClassWithDestructor) = Store[#temp2154:40] : &:r2154_4, r2154_6 +# 2154| r2154_8(ClassWithDestructor) = Load[#temp2154:40] : &:r2154_4, ~m? +# 2154| v2154_9(void) = Call[vector] : func:r2154_3, this:r2154_1, 0:r2154_8 # 2154| mu2154_10(unknown) = ^CallSideEffect : ~m? +# 2154| mu2154_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2154_1 +# 2154| r2154_12(glval &>) = VariableAddress[(__range)] : +# 2154| r2154_13(glval>) = VariableAddress[ys] : +# 2154| r2154_14(vector &) = CopyValue : r2154_13 +# 2154| mu2154_15(vector &) = Store[(__range)] : &:r2154_12, r2154_14 +# 2154| r2154_16(glval) = VariableAddress[(__begin)] : +# 2154| r2154_17(glval &>) = VariableAddress[(__range)] : +# 2154| r2154_18(vector &) = Load[(__range)] : &:r2154_17, ~m? +#-----| r0_1(glval>) = CopyValue : r2154_18 +#-----| r0_2(glval>) = Convert : r0_1 +# 2154| r2154_19(glval) = FunctionAddress[begin] : +# 2154| r2154_20(iterator) = Call[begin] : func:r2154_19, this:r0_2 +# 2154| mu2154_21(unknown) = ^CallSideEffect : ~m? #-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m? -# 2154| mu2154_11(iterator) = Store[(__begin)] : &:r2154_5, r2154_9 -# 2154| r2154_12(glval) = VariableAddress[(__end)] : -# 2154| r2154_13(glval &>) = VariableAddress[(__range)] : -# 2154| r2154_14(vector &) = Load[(__range)] : &:r2154_13, ~m? -#-----| r0_4(glval>) = CopyValue : r2154_14 +# 2154| mu2154_22(iterator) = Store[(__begin)] : &:r2154_16, r2154_20 +# 2154| r2154_23(glval) = VariableAddress[(__end)] : +# 2154| r2154_24(glval &>) = VariableAddress[(__range)] : +# 2154| r2154_25(vector &) = Load[(__range)] : &:r2154_24, ~m? +#-----| r0_4(glval>) = CopyValue : r2154_25 #-----| r0_5(glval>) = Convert : r0_4 -# 2154| r2154_15(glval) = FunctionAddress[end] : -# 2154| r2154_16(iterator) = Call[end] : func:r2154_15, this:r0_5 -# 2154| mu2154_17(unknown) = ^CallSideEffect : ~m? +# 2154| r2154_26(glval) = FunctionAddress[end] : +# 2154| r2154_27(iterator) = Call[end] : func:r2154_26, this:r0_5 +# 2154| mu2154_28(unknown) = ^CallSideEffect : ~m? #-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? -# 2154| mu2154_18(iterator) = Store[(__end)] : &:r2154_12, r2154_16 -#-----| Goto -> Block 10 - -# 2154| Block 10 -# 2154| r2154_19(glval) = VariableAddress[(__begin)] : -#-----| r0_7(glval) = Convert : r2154_19 -# 2154| r2154_20(glval) = FunctionAddress[operator!=] : -# 2154| r2154_21(glval) = VariableAddress[(__end)] : -# 2154| r2154_22(iterator) = Load[(__end)] : &:r2154_21, ~m? -# 2154| r2154_23(bool) = Call[operator!=] : func:r2154_20, this:r0_7, 0:r2154_22 -# 2154| mu2154_24(unknown) = ^CallSideEffect : ~m? -#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m? -# 2154| v2154_25(void) = ConditionalBranch : r2154_23 -#-----| False -> Block 12 -#-----| True -> Block 11 +# 2154| mu2154_29(iterator) = Store[(__end)] : &:r2154_23, r2154_27 +#-----| Goto -> Block 11 # 2154| Block 11 -# 2154| r2154_26(glval) = VariableAddress[y] : -# 2154| r2154_27(glval) = VariableAddress[(__begin)] : -#-----| r0_9(glval) = Convert : r2154_27 -# 2154| r2154_28(glval) = FunctionAddress[operator*] : -# 2154| r2154_29(ClassWithDestructor &) = Call[operator*] : func:r2154_28, this:r0_9 -# 2154| mu2154_30(unknown) = ^CallSideEffect : ~m? -#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~m? -# 2154| r2154_31(ClassWithDestructor) = Load[?] : &:r2154_29, ~m? -# 2154| mu2154_32(ClassWithDestructor) = Store[y] : &:r2154_26, r2154_31 -# 2155| r2155_1(glval) = VariableAddress[y] : -# 2155| r2155_2(glval) = FunctionAddress[set_x] : -# 2155| r2155_3(char) = Constant[97] : -# 2155| v2155_4(void) = Call[set_x] : func:r2155_2, this:r2155_1, 0:r2155_3 -# 2155| mu2155_5(unknown) = ^CallSideEffect : ~m? -# 2155| v2155_6(void) = ^IndirectReadSideEffect[-1] : &:r2155_1, ~m? -# 2155| mu2155_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 -# 2154| r2154_33(glval) = VariableAddress[(__begin)] : -# 2154| r2154_34(glval) = FunctionAddress[operator++] : -# 2154| r2154_35(iterator &) = Call[operator++] : func:r2154_34, this:r2154_33 -# 2154| mu2154_36(unknown) = ^CallSideEffect : ~m? -# 2154| v2154_37(void) = ^IndirectReadSideEffect[-1] : &:r2154_33, ~m? -# 2154| mu2154_38(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2154_33 -# 2154| r2154_39(glval) = CopyValue : r2154_35 -#-----| Goto (back edge) -> Block 10 +# 2154| r2154_30(glval) = VariableAddress[(__begin)] : +#-----| r0_7(glval) = Convert : r2154_30 +# 2154| r2154_31(glval) = FunctionAddress[operator!=] : +# 2154| r2154_32(glval) = VariableAddress[(__end)] : +# 2154| r2154_33(iterator) = Load[(__end)] : &:r2154_32, ~m? +# 2154| r2154_34(bool) = Call[operator!=] : func:r2154_31, this:r0_7, 0:r2154_33 +# 2154| mu2154_35(unknown) = ^CallSideEffect : ~m? +#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m? +# 2154| v2154_36(void) = ConditionalBranch : r2154_34 +#-----| False -> Block 14 +#-----| True -> Block 12 -# 2157| Block 12 -# 2157| r2157_1(glval &>) = VariableAddress[(__range)] : -# 2157| r2157_2(glval>) = VariableAddress : -# 2157| r2157_3(vector &) = CopyValue : r2157_2 -# 2157| mu2157_4(vector &) = Store[(__range)] : &:r2157_1, r2157_3 -# 2157| r2157_5(glval) = VariableAddress[(__begin)] : -# 2157| r2157_6(glval &>) = VariableAddress[(__range)] : -# 2157| r2157_7(vector &) = Load[(__range)] : &:r2157_6, ~m? -#-----| r0_11(glval>) = CopyValue : r2157_7 -#-----| r0_12(glval>) = Convert : r0_11 -# 2157| r2157_8(glval) = FunctionAddress[begin] : -# 2157| r2157_9(iterator) = Call[begin] : func:r2157_8, this:r0_12 -# 2157| mu2157_10(unknown) = ^CallSideEffect : ~m? -#-----| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_12, ~m? -# 2157| mu2157_11(iterator) = Store[(__begin)] : &:r2157_5, r2157_9 -# 2157| r2157_12(glval) = VariableAddress[(__end)] : -# 2157| r2157_13(glval &>) = VariableAddress[(__range)] : -# 2157| r2157_14(vector &) = Load[(__range)] : &:r2157_13, ~m? -#-----| r0_14(glval>) = CopyValue : r2157_14 -#-----| r0_15(glval>) = Convert : r0_14 -# 2157| r2157_15(glval) = FunctionAddress[end] : -# 2157| r2157_16(iterator) = Call[end] : func:r2157_15, this:r0_15 -# 2157| mu2157_17(unknown) = ^CallSideEffect : ~m? -#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, ~m? -# 2157| mu2157_18(iterator) = Store[(__end)] : &:r2157_12, r2157_16 -#-----| Goto -> Block 13 +# 2154| Block 12 +# 2154| r2154_37(glval) = VariableAddress[y] : +# 2154| r2154_38(glval) = VariableAddress[(__begin)] : +#-----| r0_9(glval) = Convert : r2154_38 +# 2154| r2154_39(glval) = FunctionAddress[operator*] : +# 2154| r2154_40(ClassWithDestructor &) = Call[operator*] : func:r2154_39, this:r0_9 +# 2154| mu2154_41(unknown) = ^CallSideEffect : ~m? +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~m? +# 2154| r2154_42(ClassWithDestructor) = Load[?] : &:r2154_40, ~m? +# 2154| mu2154_43(ClassWithDestructor) = Store[y] : &:r2154_37, r2154_42 +# 2155| r2155_1(glval) = VariableAddress[y] : +# 2155| r2155_2(glval) = FunctionAddress[set_x] : +# 2155| r2155_3(char) = Constant[97] : +# 2155| v2155_4(void) = Call[set_x] : func:r2155_2, this:r2155_1, 0:r2155_3 +# 2155| mu2155_5(unknown) = ^CallSideEffect : ~m? +# 2155| v2155_6(void) = ^IndirectReadSideEffect[-1] : &:r2155_1, ~m? +# 2155| mu2155_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2155_1 +# 2154| r2154_44(glval) = VariableAddress[y] : +# 2154| r2154_45(glval) = FunctionAddress[~ClassWithDestructor] : +# 2154| v2154_46(void) = Call[~ClassWithDestructor] : func:r2154_45, this:r2154_44 +# 2154| mu2154_47(unknown) = ^CallSideEffect : ~m? +# 2154| v2154_48(void) = ^IndirectReadSideEffect[-1] : &:r2154_44, ~m? +# 2154| mu2154_49(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2154_44 +# 2154| r2154_50(glval) = VariableAddress[(__begin)] : +# 2154| r2154_51(glval) = FunctionAddress[operator++] : +# 2154| r2154_52(iterator &) = Call[operator++] : func:r2154_51, this:r2154_50 +# 2154| mu2154_53(unknown) = ^CallSideEffect : ~m? +# 2154| v2154_54(void) = ^IndirectReadSideEffect[-1] : &:r2154_50, ~m? +# 2154| mu2154_55(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2154_50 +# 2154| r2154_56(glval) = CopyValue : r2154_52 +#-----| Goto (back edge) -> Block 11 -# 2157| Block 13 -# 2157| r2157_19(glval) = VariableAddress[(__begin)] : -#-----| r0_17(glval) = Convert : r2157_19 -# 2157| r2157_20(glval) = FunctionAddress[operator!=] : -# 2157| r2157_21(glval) = VariableAddress[(__end)] : -# 2157| r2157_22(iterator) = Load[(__end)] : &:r2157_21, ~m? -# 2157| r2157_23(bool) = Call[operator!=] : func:r2157_20, this:r0_17, 0:r2157_22 -# 2157| mu2157_24(unknown) = ^CallSideEffect : ~m? -#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m? -# 2157| v2157_25(void) = ConditionalBranch : r2157_23 -#-----| False -> Block 17 -#-----| True -> Block 15 +# 2154| Block 13 +# 2154| r2154_57(glval>) = VariableAddress[ys] : +# 2154| r2154_58(glval) = FunctionAddress[~vector] : +# 2154| v2154_59(void) = Call[~vector] : func:r2154_58, this:r2154_57 +# 2154| mu2154_60(unknown) = ^CallSideEffect : ~m? +# 2154| v2154_61(void) = ^IndirectReadSideEffect[-1] : &:r2154_57, ~m? +# 2154| mu2154_62(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2154_57 +#-----| Goto -> Block 14 # 2157| Block 14 -# 2157| r2157_26(glval) = VariableAddress[(__begin)] : -# 2157| r2157_27(glval) = FunctionAddress[operator++] : -# 2157| r2157_28(iterator &) = Call[operator++] : func:r2157_27, this:r2157_26 -# 2157| mu2157_29(unknown) = ^CallSideEffect : ~m? -# 2157| v2157_30(void) = ^IndirectReadSideEffect[-1] : &:r2157_26, ~m? -# 2157| mu2157_31(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2157_26 -# 2157| r2157_32(glval) = CopyValue : r2157_28 -#-----| Goto (back edge) -> Block 13 +# 2157| r2157_1(glval>) = VariableAddress[ys] : +# 2157| mu2157_2(vector) = Uninitialized[ys] : &:r2157_1 +# 2157| r2157_3(glval) = FunctionAddress[vector] : +# 2157| r2157_4(glval) = VariableAddress[#temp2157:40] : +# 2157| r2157_5(glval) = VariableAddress[x] : +# 2157| r2157_6(ClassWithDestructor) = Load[x] : &:r2157_5, ~m? +# 2157| mu2157_7(ClassWithDestructor) = Store[#temp2157:40] : &:r2157_4, r2157_6 +# 2157| r2157_8(ClassWithDestructor) = Load[#temp2157:40] : &:r2157_4, ~m? +# 2157| v2157_9(void) = Call[vector] : func:r2157_3, this:r2157_1, 0:r2157_8 +# 2157| mu2157_10(unknown) = ^CallSideEffect : ~m? +# 2157| mu2157_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2157_1 +# 2157| r2157_12(glval &>) = VariableAddress[(__range)] : +# 2157| r2157_13(glval>) = VariableAddress[ys] : +# 2157| r2157_14(vector &) = CopyValue : r2157_13 +# 2157| mu2157_15(vector &) = Store[(__range)] : &:r2157_12, r2157_14 +# 2157| r2157_16(glval) = VariableAddress[(__begin)] : +# 2157| r2157_17(glval &>) = VariableAddress[(__range)] : +# 2157| r2157_18(vector &) = Load[(__range)] : &:r2157_17, ~m? +#-----| r0_11(glval>) = CopyValue : r2157_18 +#-----| r0_12(glval>) = Convert : r0_11 +# 2157| r2157_19(glval) = FunctionAddress[begin] : +# 2157| r2157_20(iterator) = Call[begin] : func:r2157_19, this:r0_12 +# 2157| mu2157_21(unknown) = ^CallSideEffect : ~m? +#-----| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_12, ~m? +# 2157| mu2157_22(iterator) = Store[(__begin)] : &:r2157_16, r2157_20 +# 2157| r2157_23(glval) = VariableAddress[(__end)] : +# 2157| r2157_24(glval &>) = VariableAddress[(__range)] : +# 2157| r2157_25(vector &) = Load[(__range)] : &:r2157_24, ~m? +#-----| r0_14(glval>) = CopyValue : r2157_25 +#-----| r0_15(glval>) = Convert : r0_14 +# 2157| r2157_26(glval) = FunctionAddress[end] : +# 2157| r2157_27(iterator) = Call[end] : func:r2157_26, this:r0_15 +# 2157| mu2157_28(unknown) = ^CallSideEffect : ~m? +#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, ~m? +# 2157| mu2157_29(iterator) = Store[(__end)] : &:r2157_23, r2157_27 +#-----| Goto -> Block 15 # 2157| Block 15 -# 2157| r2157_33(glval) = VariableAddress[y] : -# 2157| r2157_34(glval) = VariableAddress[(__begin)] : -#-----| r0_19(glval) = Convert : r2157_34 -# 2157| r2157_35(glval) = FunctionAddress[operator*] : -# 2157| r2157_36(ClassWithDestructor &) = Call[operator*] : func:r2157_35, this:r0_19 -# 2157| mu2157_37(unknown) = ^CallSideEffect : ~m? +# 2157| r2157_30(glval) = VariableAddress[(__begin)] : +#-----| r0_17(glval) = Convert : r2157_30 +# 2157| r2157_31(glval) = FunctionAddress[operator!=] : +# 2157| r2157_32(glval) = VariableAddress[(__end)] : +# 2157| r2157_33(iterator) = Load[(__end)] : &:r2157_32, ~m? +# 2157| r2157_34(bool) = Call[operator!=] : func:r2157_31, this:r0_17, 0:r2157_33 +# 2157| mu2157_35(unknown) = ^CallSideEffect : ~m? +#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m? +# 2157| v2157_36(void) = ConditionalBranch : r2157_34 +#-----| False -> Block 20 +#-----| True -> Block 16 + +# 2157| Block 16 +# 2157| r2157_37(glval) = VariableAddress[y] : +# 2157| r2157_38(glval) = VariableAddress[(__begin)] : +#-----| r0_19(glval) = Convert : r2157_38 +# 2157| r2157_39(glval) = FunctionAddress[operator*] : +# 2157| r2157_40(ClassWithDestructor &) = Call[operator*] : func:r2157_39, this:r0_19 +# 2157| mu2157_41(unknown) = ^CallSideEffect : ~m? #-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_19, ~m? -# 2157| r2157_38(ClassWithDestructor) = Load[?] : &:r2157_36, ~m? -# 2157| mu2157_39(ClassWithDestructor) = Store[y] : &:r2157_33, r2157_38 +# 2157| r2157_42(ClassWithDestructor) = Load[?] : &:r2157_40, ~m? +# 2157| mu2157_43(ClassWithDestructor) = Store[y] : &:r2157_37, r2157_42 # 2158| r2158_1(glval) = VariableAddress[y] : # 2158| r2158_2(glval) = FunctionAddress[set_x] : # 2158| r2158_3(char) = Constant[97] : @@ -12189,89 +12207,139 @@ ir.cpp: # 2159| r2159_8(int) = Constant[98] : # 2159| r2159_9(bool) = CompareEQ : r2159_7, r2159_8 # 2159| v2159_10(void) = ConditionalBranch : r2159_9 -#-----| False -> Block 14 -#-----| True -> Block 16 +#-----| False -> Block 18 +#-----| True -> Block 17 -# 2160| Block 16 -# 2160| v2160_1(void) = NoOp : -# 2172| r2172_1(glval) = VariableAddress[x] : -# 2172| r2172_2(glval) = FunctionAddress[~ClassWithDestructor] : -# 2172| v2172_3(void) = Call[~ClassWithDestructor] : func:r2172_2, this:r2172_1 -# 2172| mu2172_4(unknown) = ^CallSideEffect : ~m? -# 2172| v2172_5(void) = ^IndirectReadSideEffect[-1] : &:r2172_1, ~m? -# 2172| mu2172_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_1 +# 2160| Block 17 +# 2160| v2160_1(void) = NoOp : +# 2157| r2157_44(glval) = VariableAddress[y] : +# 2157| r2157_45(glval) = FunctionAddress[~ClassWithDestructor] : +# 2157| v2157_46(void) = Call[~ClassWithDestructor] : func:r2157_45, this:r2157_44 +# 2157| mu2157_47(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_48(void) = ^IndirectReadSideEffect[-1] : &:r2157_44, ~m? +# 2157| mu2157_49(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2157_44 +# 2157| r2157_50(glval>) = VariableAddress[ys] : +# 2157| r2157_51(glval) = FunctionAddress[~vector] : +# 2157| v2157_52(void) = Call[~vector] : func:r2157_51, this:r2157_50 +# 2157| mu2157_53(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_54(void) = ^IndirectReadSideEffect[-1] : &:r2157_50, ~m? +# 2157| mu2157_55(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2157_50 +# 2172| r2172_1(glval) = VariableAddress[x] : +# 2172| r2172_2(glval) = FunctionAddress[~ClassWithDestructor] : +# 2172| v2172_3(void) = Call[~ClassWithDestructor] : func:r2172_2, this:r2172_1 +# 2172| mu2172_4(unknown) = ^CallSideEffect : ~m? +# 2172| v2172_5(void) = ^IndirectReadSideEffect[-1] : &:r2172_1, ~m? +# 2172| mu2172_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_1 #-----| Goto -> Block 1 -# 2163| Block 17 -# 2163| r2163_1(glval &>) = VariableAddress[(__range)] : -# 2163| r2163_2(glval>) = VariableAddress : -# 2163| r2163_3(vector &) = CopyValue : r2163_2 -# 2163| mu2163_4(vector &) = Store[(__range)] : &:r2163_1, r2163_3 -# 2163| r2163_5(glval) = VariableAddress[(__begin)] : -# 2163| r2163_6(glval &>) = VariableAddress[(__range)] : -# 2163| r2163_7(vector &) = Load[(__range)] : &:r2163_6, ~m? -#-----| r0_21(glval>) = CopyValue : r2163_7 -#-----| r0_22(glval>) = Convert : r0_21 -# 2163| r2163_8(glval) = FunctionAddress[begin] : -# 2163| r2163_9(iterator) = Call[begin] : func:r2163_8, this:r0_22 -# 2163| mu2163_10(unknown) = ^CallSideEffect : ~m? -#-----| v0_23(void) = ^IndirectReadSideEffect[-1] : &:r0_22, ~m? -# 2163| mu2163_11(iterator) = Store[(__begin)] : &:r2163_5, r2163_9 -# 2163| r2163_12(glval) = VariableAddress[(__end)] : -# 2163| r2163_13(glval &>) = VariableAddress[(__range)] : -# 2163| r2163_14(vector &) = Load[(__range)] : &:r2163_13, ~m? -#-----| r0_24(glval>) = CopyValue : r2163_14 -#-----| r0_25(glval>) = Convert : r0_24 -# 2163| r2163_15(glval) = FunctionAddress[end] : -# 2163| r2163_16(iterator) = Call[end] : func:r2163_15, this:r0_25 -# 2163| mu2163_17(unknown) = ^CallSideEffect : ~m? -#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_25, ~m? -# 2163| mu2163_18(iterator) = Store[(__end)] : &:r2163_12, r2163_16 -#-----| Goto -> Block 18 +# 2157| Block 18 +# 2157| r2157_56(glval) = VariableAddress[y] : +# 2157| r2157_57(glval) = FunctionAddress[~ClassWithDestructor] : +# 2157| v2157_58(void) = Call[~ClassWithDestructor] : func:r2157_57, this:r2157_56 +# 2157| mu2157_59(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_60(void) = ^IndirectReadSideEffect[-1] : &:r2157_56, ~m? +# 2157| mu2157_61(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2157_56 +# 2157| r2157_62(glval) = VariableAddress[(__begin)] : +# 2157| r2157_63(glval) = FunctionAddress[operator++] : +# 2157| r2157_64(iterator &) = Call[operator++] : func:r2157_63, this:r2157_62 +# 2157| mu2157_65(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_66(void) = ^IndirectReadSideEffect[-1] : &:r2157_62, ~m? +# 2157| mu2157_67(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2157_62 +# 2157| r2157_68(glval) = CopyValue : r2157_64 +#-----| Goto (back edge) -> Block 15 -# 2163| Block 18 -# 2163| r2163_19(glval) = VariableAddress[(__begin)] : -#-----| r0_27(glval) = Convert : r2163_19 -# 2163| r2163_20(glval) = FunctionAddress[operator!=] : -# 2163| r2163_21(glval) = VariableAddress[(__end)] : -# 2163| r2163_22(iterator) = Load[(__end)] : &:r2163_21, ~m? -# 2163| r2163_23(bool) = Call[operator!=] : func:r2163_20, this:r0_27, 0:r2163_22 -# 2163| mu2163_24(unknown) = ^CallSideEffect : ~m? -#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m? -# 2163| v2163_25(void) = ConditionalBranch : r2163_23 -#-----| False -> Block 22 -#-----| True -> Block 20 - -# 2163| Block 19 -# 2163| r2163_26(glval) = VariableAddress[(__begin)] : -# 2163| r2163_27(glval) = FunctionAddress[operator++] : -# 2163| r2163_28(iterator &) = Call[operator++] : func:r2163_27, this:r2163_26 -# 2163| mu2163_29(unknown) = ^CallSideEffect : ~m? -# 2163| v2163_30(void) = ^IndirectReadSideEffect[-1] : &:r2163_26, ~m? -# 2163| mu2163_31(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2163_26 -# 2163| r2163_32(glval) = CopyValue : r2163_28 -#-----| Goto (back edge) -> Block 18 +# 2157| Block 19 +# 2157| r2157_69(glval>) = VariableAddress[ys] : +# 2157| r2157_70(glval) = FunctionAddress[~vector] : +# 2157| v2157_71(void) = Call[~vector] : func:r2157_70, this:r2157_69 +# 2157| mu2157_72(unknown) = ^CallSideEffect : ~m? +# 2157| v2157_73(void) = ^IndirectReadSideEffect[-1] : &:r2157_69, ~m? +# 2157| mu2157_74(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2157_69 +#-----| Goto -> Block 20 # 2163| Block 20 -# 2163| r2163_33(glval) = VariableAddress[y] : -# 2163| r2163_34(glval) = VariableAddress[(__begin)] : -#-----| r0_29(glval) = Convert : r2163_34 -# 2163| r2163_35(glval) = FunctionAddress[operator*] : -# 2163| r2163_36(int &) = Call[operator*] : func:r2163_35, this:r0_29 -# 2163| mu2163_37(unknown) = ^CallSideEffect : ~m? +# 2163| r2163_1(glval>) = VariableAddress[ys] : +# 2163| mu2163_2(vector) = Uninitialized[ys] : &:r2163_1 +# 2163| r2163_3(glval) = FunctionAddress[vector] : +# 2163| r2163_4(int) = Constant[1] : +# 2163| v2163_5(void) = Call[vector] : func:r2163_3, this:r2163_1, 0:r2163_4 +# 2163| mu2163_6(unknown) = ^CallSideEffect : ~m? +# 2163| mu2163_7(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2163_1 +# 2163| r2163_8(glval &>) = VariableAddress[(__range)] : +# 2163| r2163_9(glval>) = VariableAddress[ys] : +# 2163| r2163_10(vector &) = CopyValue : r2163_9 +# 2163| mu2163_11(vector &) = Store[(__range)] : &:r2163_8, r2163_10 +# 2163| r2163_12(glval) = VariableAddress[(__begin)] : +# 2163| r2163_13(glval &>) = VariableAddress[(__range)] : +# 2163| r2163_14(vector &) = Load[(__range)] : &:r2163_13, ~m? +#-----| r0_21(glval>) = CopyValue : r2163_14 +#-----| r0_22(glval>) = Convert : r0_21 +# 2163| r2163_15(glval) = FunctionAddress[begin] : +# 2163| r2163_16(iterator) = Call[begin] : func:r2163_15, this:r0_22 +# 2163| mu2163_17(unknown) = ^CallSideEffect : ~m? +#-----| v0_23(void) = ^IndirectReadSideEffect[-1] : &:r0_22, ~m? +# 2163| mu2163_18(iterator) = Store[(__begin)] : &:r2163_12, r2163_16 +# 2163| r2163_19(glval) = VariableAddress[(__end)] : +# 2163| r2163_20(glval &>) = VariableAddress[(__range)] : +# 2163| r2163_21(vector &) = Load[(__range)] : &:r2163_20, ~m? +#-----| r0_24(glval>) = CopyValue : r2163_21 +#-----| r0_25(glval>) = Convert : r0_24 +# 2163| r2163_22(glval) = FunctionAddress[end] : +# 2163| r2163_23(iterator) = Call[end] : func:r2163_22, this:r0_25 +# 2163| mu2163_24(unknown) = ^CallSideEffect : ~m? +#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_25, ~m? +# 2163| mu2163_25(iterator) = Store[(__end)] : &:r2163_19, r2163_23 +#-----| Goto -> Block 21 + +# 2163| Block 21 +# 2163| r2163_26(glval) = VariableAddress[(__begin)] : +#-----| r0_27(glval) = Convert : r2163_26 +# 2163| r2163_27(glval) = FunctionAddress[operator!=] : +# 2163| r2163_28(glval) = VariableAddress[(__end)] : +# 2163| r2163_29(iterator) = Load[(__end)] : &:r2163_28, ~m? +# 2163| r2163_30(bool) = Call[operator!=] : func:r2163_27, this:r0_27, 0:r2163_29 +# 2163| mu2163_31(unknown) = ^CallSideEffect : ~m? +#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m? +# 2163| v2163_32(void) = ConditionalBranch : r2163_30 +#-----| False -> Block 26 +#-----| True -> Block 23 + +# 2163| Block 22 +# 2163| r2163_33(glval) = VariableAddress[(__begin)] : +# 2163| r2163_34(glval) = FunctionAddress[operator++] : +# 2163| r2163_35(iterator &) = Call[operator++] : func:r2163_34, this:r2163_33 +# 2163| mu2163_36(unknown) = ^CallSideEffect : ~m? +# 2163| v2163_37(void) = ^IndirectReadSideEffect[-1] : &:r2163_33, ~m? +# 2163| mu2163_38(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2163_33 +# 2163| r2163_39(glval) = CopyValue : r2163_35 +#-----| Goto (back edge) -> Block 21 + +# 2163| Block 23 +# 2163| r2163_40(glval) = VariableAddress[y] : +# 2163| r2163_41(glval) = VariableAddress[(__begin)] : +#-----| r0_29(glval) = Convert : r2163_41 +# 2163| r2163_42(glval) = FunctionAddress[operator*] : +# 2163| r2163_43(int &) = Call[operator*] : func:r2163_42, this:r0_29 +# 2163| mu2163_44(unknown) = ^CallSideEffect : ~m? #-----| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_29, ~m? -# 2163| r2163_38(int) = Load[?] : &:r2163_36, ~m? -# 2163| mu2163_39(int) = Store[y] : &:r2163_33, r2163_38 +# 2163| r2163_45(int) = Load[?] : &:r2163_43, ~m? +# 2163| mu2163_46(int) = Store[y] : &:r2163_40, r2163_45 # 2164| r2164_1(glval) = VariableAddress[y] : # 2164| r2164_2(int) = Load[y] : &:r2164_1, ~m? # 2164| r2164_3(int) = Constant[1] : # 2164| r2164_4(bool) = CompareEQ : r2164_2, r2164_3 # 2164| v2164_5(void) = ConditionalBranch : r2164_4 -#-----| False -> Block 19 -#-----| True -> Block 21 +#-----| False -> Block 22 +#-----| True -> Block 24 -# 2165| Block 21 +# 2165| Block 24 # 2165| v2165_1(void) = NoOp : +# 2163| r2163_47(glval>) = VariableAddress[ys] : +# 2163| r2163_48(glval) = FunctionAddress[~vector] : +# 2163| v2163_49(void) = Call[~vector] : func:r2163_48, this:r2163_47 +# 2163| mu2163_50(unknown) = ^CallSideEffect : ~m? +# 2163| v2163_51(void) = ^IndirectReadSideEffect[-1] : &:r2163_47, ~m? +# 2163| mu2163_52(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2163_47 # 2172| r2172_7(glval) = VariableAddress[x] : # 2172| r2172_8(glval) = FunctionAddress[~ClassWithDestructor] : # 2172| v2172_9(void) = Call[~ClassWithDestructor] : func:r2172_8, this:r2172_7 @@ -12280,56 +12348,76 @@ ir.cpp: # 2172| mu2172_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2172_7 #-----| Goto -> Block 1 -# 2168| Block 22 -# 2168| r2168_1(glval &>) = VariableAddress[(__range)] : -# 2168| r2168_2(glval>) = VariableAddress : -# 2168| r2168_3(vector &) = CopyValue : r2168_2 -# 2168| mu2168_4(vector &) = Store[(__range)] : &:r2168_1, r2168_3 -# 2168| r2168_5(glval) = VariableAddress[(__begin)] : -# 2168| r2168_6(glval &>) = VariableAddress[(__range)] : -# 2168| r2168_7(vector &) = Load[(__range)] : &:r2168_6, ~m? -#-----| r0_31(glval>) = CopyValue : r2168_7 -#-----| r0_32(glval>) = Convert : r0_31 -# 2168| r2168_8(glval) = FunctionAddress[begin] : -# 2168| r2168_9(iterator) = Call[begin] : func:r2168_8, this:r0_32 -# 2168| mu2168_10(unknown) = ^CallSideEffect : ~m? -#-----| v0_33(void) = ^IndirectReadSideEffect[-1] : &:r0_32, ~m? -# 2168| mu2168_11(iterator) = Store[(__begin)] : &:r2168_5, r2168_9 -# 2168| r2168_12(glval) = VariableAddress[(__end)] : -# 2168| r2168_13(glval &>) = VariableAddress[(__range)] : -# 2168| r2168_14(vector &) = Load[(__range)] : &:r2168_13, ~m? -#-----| r0_34(glval>) = CopyValue : r2168_14 -#-----| r0_35(glval>) = Convert : r0_34 -# 2168| r2168_15(glval) = FunctionAddress[end] : -# 2168| r2168_16(iterator) = Call[end] : func:r2168_15, this:r0_35 -# 2168| mu2168_17(unknown) = ^CallSideEffect : ~m? -#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, ~m? -# 2168| mu2168_18(iterator) = Store[(__end)] : &:r2168_12, r2168_16 -#-----| Goto -> Block 23 +# 2163| Block 25 +# 2163| r2163_53(glval>) = VariableAddress[ys] : +# 2163| r2163_54(glval) = FunctionAddress[~vector] : +# 2163| v2163_55(void) = Call[~vector] : func:r2163_54, this:r2163_53 +# 2163| mu2163_56(unknown) = ^CallSideEffect : ~m? +# 2163| v2163_57(void) = ^IndirectReadSideEffect[-1] : &:r2163_53, ~m? +# 2163| mu2163_58(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2163_53 +#-----| Goto -> Block 26 -# 2168| Block 23 -# 2168| r2168_19(glval) = VariableAddress[(__begin)] : -#-----| r0_37(glval) = Convert : r2168_19 -# 2168| r2168_20(glval) = FunctionAddress[operator!=] : -# 2168| r2168_21(glval) = VariableAddress[(__end)] : -# 2168| r2168_22(iterator) = Load[(__end)] : &:r2168_21, ~m? -# 2168| r2168_23(bool) = Call[operator!=] : func:r2168_20, this:r0_37, 0:r2168_22 -# 2168| mu2168_24(unknown) = ^CallSideEffect : ~m? +# 2168| Block 26 +# 2168| r2168_1(glval>) = VariableAddress[ys] : +# 2168| mu2168_2(vector) = Uninitialized[ys] : &:r2168_1 +# 2168| r2168_3(glval) = FunctionAddress[vector] : +# 2168| r2168_4(glval) = VariableAddress[#temp2168:40] : +# 2168| r2168_5(glval) = VariableAddress[x] : +# 2168| r2168_6(ClassWithDestructor) = Load[x] : &:r2168_5, ~m? +# 2168| mu2168_7(ClassWithDestructor) = Store[#temp2168:40] : &:r2168_4, r2168_6 +# 2168| r2168_8(ClassWithDestructor) = Load[#temp2168:40] : &:r2168_4, ~m? +# 2168| v2168_9(void) = Call[vector] : func:r2168_3, this:r2168_1, 0:r2168_8 +# 2168| mu2168_10(unknown) = ^CallSideEffect : ~m? +# 2168| mu2168_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2168_1 +# 2168| r2168_12(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_13(glval>) = VariableAddress[ys] : +# 2168| r2168_14(vector &) = CopyValue : r2168_13 +# 2168| mu2168_15(vector &) = Store[(__range)] : &:r2168_12, r2168_14 +# 2168| r2168_16(glval) = VariableAddress[(__begin)] : +# 2168| r2168_17(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_18(vector &) = Load[(__range)] : &:r2168_17, ~m? +#-----| r0_31(glval>) = CopyValue : r2168_18 +#-----| r0_32(glval>) = Convert : r0_31 +# 2168| r2168_19(glval) = FunctionAddress[begin] : +# 2168| r2168_20(iterator) = Call[begin] : func:r2168_19, this:r0_32 +# 2168| mu2168_21(unknown) = ^CallSideEffect : ~m? +#-----| v0_33(void) = ^IndirectReadSideEffect[-1] : &:r0_32, ~m? +# 2168| mu2168_22(iterator) = Store[(__begin)] : &:r2168_16, r2168_20 +# 2168| r2168_23(glval) = VariableAddress[(__end)] : +# 2168| r2168_24(glval &>) = VariableAddress[(__range)] : +# 2168| r2168_25(vector &) = Load[(__range)] : &:r2168_24, ~m? +#-----| r0_34(glval>) = CopyValue : r2168_25 +#-----| r0_35(glval>) = Convert : r0_34 +# 2168| r2168_26(glval) = FunctionAddress[end] : +# 2168| r2168_27(iterator) = Call[end] : func:r2168_26, this:r0_35 +# 2168| mu2168_28(unknown) = ^CallSideEffect : ~m? +#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, ~m? +# 2168| mu2168_29(iterator) = Store[(__end)] : &:r2168_23, r2168_27 +#-----| Goto -> Block 27 + +# 2168| Block 27 +# 2168| r2168_30(glval) = VariableAddress[(__begin)] : +#-----| r0_37(glval) = Convert : r2168_30 +# 2168| r2168_31(glval) = FunctionAddress[operator!=] : +# 2168| r2168_32(glval) = VariableAddress[(__end)] : +# 2168| r2168_33(iterator) = Load[(__end)] : &:r2168_32, ~m? +# 2168| r2168_34(bool) = Call[operator!=] : func:r2168_31, this:r0_37, 0:r2168_33 +# 2168| mu2168_35(unknown) = ^CallSideEffect : ~m? #-----| v0_38(void) = ^IndirectReadSideEffect[-1] : &:r0_37, ~m? -# 2168| v2168_25(void) = ConditionalBranch : r2168_23 -#-----| False -> Block 25 -#-----| True -> Block 24 +# 2168| v2168_36(void) = ConditionalBranch : r2168_34 +#-----| False -> Block 30 +#-----| True -> Block 28 -# 2168| Block 24 -# 2168| r2168_26(glval) = VariableAddress[y] : -# 2168| r2168_27(glval) = VariableAddress[(__begin)] : -#-----| r0_39(glval) = Convert : r2168_27 -# 2168| r2168_28(glval) = FunctionAddress[operator*] : -# 2168| r2168_29(ClassWithDestructor &) = Call[operator*] : func:r2168_28, this:r0_39 -# 2168| mu2168_30(unknown) = ^CallSideEffect : ~m? +# 2168| Block 28 +# 2168| r2168_37(glval) = VariableAddress[y] : +# 2168| r2168_38(glval) = VariableAddress[(__begin)] : +#-----| r0_39(glval) = Convert : r2168_38 +# 2168| r2168_39(glval) = FunctionAddress[operator*] : +# 2168| r2168_40(ClassWithDestructor &) = Call[operator*] : func:r2168_39, this:r0_39 +# 2168| mu2168_41(unknown) = ^CallSideEffect : ~m? #-----| v0_40(void) = ^IndirectReadSideEffect[-1] : &:r0_39, ~m? -# 2168| r2168_31(ClassWithDestructor) = Load[?] : &:r2168_29, ~m? -# 2168| mu2168_32(ClassWithDestructor) = Store[y] : &:r2168_26, r2168_31 +# 2168| r2168_42(ClassWithDestructor) = Load[?] : &:r2168_40, ~m? +# 2168| mu2168_43(ClassWithDestructor) = Store[y] : &:r2168_37, r2168_42 # 2169| r2169_1(glval) = VariableAddress[z1] : # 2169| mu2169_2(ClassWithDestructor) = Uninitialized[z1] : &:r2169_1 # 2169| r2169_3(glval) = FunctionAddress[ClassWithDestructor] : @@ -12354,16 +12442,31 @@ ir.cpp: # 2171| mu2171_10(unknown) = ^CallSideEffect : ~m? # 2171| v2171_11(void) = ^IndirectReadSideEffect[-1] : &:r2171_7, ~m? # 2171| mu2171_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2171_7 -# 2168| r2168_33(glval) = VariableAddress[(__begin)] : -# 2168| r2168_34(glval) = FunctionAddress[operator++] : -# 2168| r2168_35(iterator &) = Call[operator++] : func:r2168_34, this:r2168_33 -# 2168| mu2168_36(unknown) = ^CallSideEffect : ~m? -# 2168| v2168_37(void) = ^IndirectReadSideEffect[-1] : &:r2168_33, ~m? -# 2168| mu2168_38(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2168_33 -# 2168| r2168_39(glval) = CopyValue : r2168_35 -#-----| Goto (back edge) -> Block 23 +# 2168| r2168_44(glval) = VariableAddress[y] : +# 2168| r2168_45(glval) = FunctionAddress[~ClassWithDestructor] : +# 2168| v2168_46(void) = Call[~ClassWithDestructor] : func:r2168_45, this:r2168_44 +# 2168| mu2168_47(unknown) = ^CallSideEffect : ~m? +# 2168| v2168_48(void) = ^IndirectReadSideEffect[-1] : &:r2168_44, ~m? +# 2168| mu2168_49(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2168_44 +# 2168| r2168_50(glval) = VariableAddress[(__begin)] : +# 2168| r2168_51(glval) = FunctionAddress[operator++] : +# 2168| r2168_52(iterator &) = Call[operator++] : func:r2168_51, this:r2168_50 +# 2168| mu2168_53(unknown) = ^CallSideEffect : ~m? +# 2168| v2168_54(void) = ^IndirectReadSideEffect[-1] : &:r2168_50, ~m? +# 2168| mu2168_55(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2168_50 +# 2168| r2168_56(glval) = CopyValue : r2168_52 +#-----| Goto (back edge) -> Block 27 -# 2172| Block 25 +# 2168| Block 29 +# 2168| r2168_57(glval>) = VariableAddress[ys] : +# 2168| r2168_58(glval) = FunctionAddress[~vector] : +# 2168| v2168_59(void) = Call[~vector] : func:r2168_58, this:r2168_57 +# 2168| mu2168_60(unknown) = ^CallSideEffect : ~m? +# 2168| v2168_61(void) = ^IndirectReadSideEffect[-1] : &:r2168_57, ~m? +# 2168| mu2168_62(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2168_57 +#-----| Goto -> Block 30 + +# 2172| Block 30 # 2172| v2172_13(void) = NoOp : # 2172| r2172_14(glval) = VariableAddress[x] : # 2172| r2172_15(glval) = FunctionAddress[~ClassWithDestructor] : @@ -12402,7 +12505,7 @@ ir.cpp: # 2177| Block 2 # 2177| v2177_1(void) = NoOp : -# 2177| r2177_2(glval) = VariableAddress[b] : +# 2177| r2177_2(glval) = VariableAddress[a] : # 2177| r2177_3(glval) = FunctionAddress[~ClassWithDestructor] : # 2177| v2177_4(void) = Call[~ClassWithDestructor] : func:r2177_3, this:r2177_2 # 2177| mu2177_5(unknown) = ^CallSideEffect : ~m? @@ -12486,12 +12589,18 @@ ir.cpp: # 2188| Block 2 # 2188| v2188_1(void) = NoOp : -# 2188| r2188_2(glval) = VariableAddress[c] : +# 2188| r2188_2(glval) = VariableAddress[b] : # 2188| r2188_3(glval) = FunctionAddress[~ClassWithDestructor] : # 2188| v2188_4(void) = Call[~ClassWithDestructor] : func:r2188_3, this:r2188_2 # 2188| mu2188_5(unknown) = ^CallSideEffect : ~m? # 2188| v2188_6(void) = ^IndirectReadSideEffect[-1] : &:r2188_2, ~m? # 2188| mu2188_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2188_2 +# 2188| r2188_8(glval) = VariableAddress[a] : +# 2188| r2188_9(glval) = FunctionAddress[~ClassWithDestructor] : +# 2188| v2188_10(void) = Call[~ClassWithDestructor] : func:r2188_9, this:r2188_8 +# 2188| mu2188_11(unknown) = ^CallSideEffect : ~m? +# 2188| v2188_12(void) = ^IndirectReadSideEffect[-1] : &:r2188_8, ~m? +# 2188| mu2188_13(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2188_8 # 2184| v2184_4(void) = ReturnVoid : # 2184| v2184_5(void) = AliasedUse : ~m? # 2184| v2184_6(void) = ExitFunction : @@ -12834,13 +12943,19 @@ ir.cpp: # 2228| mu2228_4(unknown) = ^CallSideEffect : ~m? # 2228| v2228_5(void) = ^IndirectReadSideEffect[-1] : &:r2228_1, ~m? # 2228| mu2228_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2228_1 -# 2226| r2226_55(glval) = VariableAddress[(__begin)] : -# 2226| r2226_56(glval) = FunctionAddress[operator++] : -# 2226| r2226_57(iterator &) = Call[operator++] : func:r2226_56, this:r2226_55 +# 2226| r2226_55(glval) = VariableAddress[s] : +# 2226| r2226_56(glval) = FunctionAddress[~String] : +# 2226| v2226_57(void) = Call[~String] : func:r2226_56, this:r2226_55 # 2226| mu2226_58(unknown) = ^CallSideEffect : ~m? # 2226| v2226_59(void) = ^IndirectReadSideEffect[-1] : &:r2226_55, ~m? -# 2226| mu2226_60(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2226_55 -# 2226| r2226_61(glval) = CopyValue : r2226_57 +# 2226| mu2226_60(String) = ^IndirectMayWriteSideEffect[-1] : &:r2226_55 +# 2226| r2226_61(glval) = VariableAddress[(__begin)] : +# 2226| r2226_62(glval) = FunctionAddress[operator++] : +# 2226| r2226_63(iterator &) = Call[operator++] : func:r2226_62, this:r2226_61 +# 2226| mu2226_64(unknown) = ^CallSideEffect : ~m? +# 2226| v2226_65(void) = ^IndirectReadSideEffect[-1] : &:r2226_61, ~m? +# 2226| mu2226_66(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2226_61 +# 2226| r2226_67(glval) = CopyValue : r2226_63 #-----| Goto (back edge) -> Block 4 # 2230| Block 6 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index e2e0b59609a..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -28,8 +28,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -| ir.cpp:2154:68:2154:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2157:68:2157:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2163:36:2163:37 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2168:68:2168:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index e2e0b59609a..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -28,8 +28,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -| ir.cpp:2154:68:2154:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2157:68:2157:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2163:36:2163:37 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2168:68:2168:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2137:6:2137:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | missingCppType diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index f90d037319f..9a59dc01236 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -8,7 +8,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | -| condition_decls.cpp:50:3:50:3 | Chi: bi | Instruction 'Chi: bi' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | statements.cpp:25:5:25:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index 649d13c69f1..7acc87481fa 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -11,8 +11,6 @@ instructionWithoutSuccessor | VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | VacuousDestructorCall.cpp:3:3:3:3 | VariableAddress: x | Instruction 'VariableAddress: x' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | VacuousDestructorCall.cpp:4:3:4:3 | Load: y | Instruction 'Load: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | -| condition_decls.cpp:48:27:48:31 | IndirectMayWriteSideEffect: init2 | Instruction 'IndirectMayWriteSideEffect: init2' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | -| condition_decls.cpp:50:3:50:3 | IndirectMayWriteSideEffect: bi | Instruction 'IndirectMayWriteSideEffect: bi' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | statements.cpp:25:5:25:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index 795ca3656b0..9a59dc01236 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -8,7 +8,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | -| condition_decls.cpp:50:3:50:3 | IndirectMayWriteSideEffect: bi | Instruction 'IndirectMayWriteSideEffect: bi' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | statements.cpp:25:5:25:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | statements.cpp:21:6:21:16 | void early_throw(int) | void early_throw(int) | From 942a4ed92530fdaec1a2a5b76c286df3a078a6c9 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Thu, 22 Feb 2024 16:46:19 +0000 Subject: [PATCH 121/207] C++: move handlesDestructorsExplicitly up to TranslatedReturnStmt --- .../ir/implementation/raw/internal/TranslatedStmt.qll | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 247518324cb..b825c563850 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -417,6 +417,8 @@ abstract class TranslatedReturnStmt extends TranslatedStmt { ) ) } + + final override predicate handlesDestructorsExplicitly() { any() } } /** @@ -450,8 +452,6 @@ class TranslatedReturnValueStmt extends TranslatedReturnStmt, TranslatedVariable final override IRVariable getIRVariable() { result = this.getEnclosingFunction().getReturnVariable() } - - override predicate handlesDestructorsExplicitly() { any() } } /** @@ -500,8 +500,6 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { } private TranslatedExpr getExpr() { result = getTranslatedExpr(stmt.getExpr()) } - - override predicate handlesDestructorsExplicitly() { any() } } /** @@ -550,8 +548,6 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { ) ) } - - override predicate handlesDestructorsExplicitly() { any() } } /** @@ -586,8 +582,6 @@ class TranslatedNoValueReturnStmt extends TranslatedReturnStmt, TranslatedVariab final override IRVariable getIRVariable() { result = this.getEnclosingFunction().getReturnVariable() } - - override predicate handlesDestructorsExplicitly() { any() } } /** From d2e6746e7fdafb0e78dc15577b03a02825a31a67 Mon Sep 17 00:00:00 2001 From: Cornelius Riemenschneider Date: Thu, 22 Feb 2024 17:51:17 +0100 Subject: [PATCH 122/207] Upgrade to bazel 7.0.2. --- .bazelversion | 2 +- swift/extractor/config/BUILD.bazel | 2 +- swift/third_party/BUILD.swift-llvm-support.bazel | 15 ++++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.bazelversion b/.bazelversion index f22d756da39..a8907c025d5 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -6.5.0 +7.0.2 diff --git a/swift/extractor/config/BUILD.bazel b/swift/extractor/config/BUILD.bazel index 492db13f666..a38bb8c5d24 100644 --- a/swift/extractor/config/BUILD.bazel +++ b/swift/extractor/config/BUILD.bazel @@ -2,7 +2,7 @@ load("//swift:rules.bzl", "swift_cc_library") swift_cc_library( name = "config", - srcs = glob(["*.cpp"]), + srcs = [], hdrs = glob(["*.h"]), visibility = ["//swift:__subpackages__"], ) diff --git a/swift/third_party/BUILD.swift-llvm-support.bazel b/swift/third_party/BUILD.swift-llvm-support.bazel index 91337d0aa41..af98184b673 100644 --- a/swift/third_party/BUILD.swift-llvm-support.bazel +++ b/swift/third_party/BUILD.swift-llvm-support.bazel @@ -1,12 +1,13 @@ -load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix") - cc_library( name = "swift-llvm-support", - srcs = glob([ - "*.a", - "*.so", - "*.dylib", - ]), + srcs = glob( + [ + "*.a", + "*.so", + "*.dylib", + ], + allow_empty = True, # Either *.so or *.dylib will be empty + ), hdrs = glob([ "include/**/*", "stdlib/**/*", From 515e93522febf7b0ab7b2a74ee490a8a716c5392 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 22 Feb 2024 17:35:08 +0000 Subject: [PATCH 123/207] Swift: Make ExtensionDecl.toString robust to when there's more than one extended thing. --- swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll index 5e59669adcb..625229fcb13 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/ExtensionDecl.qll @@ -2,9 +2,10 @@ private import codeql.swift.generated.decl.ExtensionDecl class ExtensionDecl extends Generated::ExtensionDecl { override string toString() { - result = "extension of " + this.getExtendedTypeDecl().toString() + result = + "extension of " + unique(NominalTypeDecl td | td = this.getExtendedTypeDecl()).toString() or - not exists(this.getExtendedTypeDecl()) and + count(this.getExtendedTypeDecl()) != 1 and result = "extension" } } From 47a9a8b82a43fb0da4aab6b1976485755507c847 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 22 Feb 2024 17:39:31 +0000 Subject: [PATCH 124/207] Swift: MAke TypeDecl.getFullName robust to when there's an ExtensionDecl extending more than one thing. --- swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll index e75e2ff9b40..9055f29d6ca 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll @@ -109,13 +109,13 @@ class TypeDecl extends Generated::TypeDecl { cached string getFullName() { not this.getEnclosingDecl() instanceof TypeDecl and - not this.getEnclosingDecl() instanceof ExtensionDecl and + not count(this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl()) = 1 and result = this.getName() or result = this.getEnclosingDecl().(TypeDecl).getFullName() + "." + this.getName() or result = - this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl().getFullName() + "." + - this.getName() + unique(NominalTypeDecl td | td = this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl()) + .getFullName() + "." + this.getName() } } From 797fee9c9e6cd1590020e3705e8b3e5e1511ae10 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 22 Feb 2024 17:54:26 +0000 Subject: [PATCH 125/207] Swift: Change note. --- swift/ql/lib/change-notes/2024-02-22-extension-patch.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 swift/ql/lib/change-notes/2024-02-22-extension-patch.md diff --git a/swift/ql/lib/change-notes/2024-02-22-extension-patch.md b/swift/ql/lib/change-notes/2024-02-22-extension-patch.md new file mode 100644 index 00000000000..7bd78f3b785 --- /dev/null +++ b/swift/ql/lib/change-notes/2024-02-22-extension-patch.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed an issue where `TypeDecl.getFullName` would get stuck in an loop and fail when minor database inconsistencies are present. From cf441d1a306d806c270706cb884eed1eaa70227b Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Thu, 22 Feb 2024 18:57:12 +0000 Subject: [PATCH 126/207] Kotlin: Accept changes in library-tests/multiple_files I think that this is a regression, but one that we're not likely to fix soon, so let's just accept the output for now. I've opened a ticket to remind us to return to this. --- .../library-tests/multiple_files/method_accesses.expected | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected b/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected index b5bba6fae86..b25e2669eb3 100644 --- a/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected +++ b/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected @@ -1,5 +1,5 @@ | file1.kt:4:9:4:23 | fun2(...) | file2.kt:3:5:3:18 | fun2 | Class2.fun2 | file2.kt:2:1:4:1 | Class2 | | file1.kt:5:9:5:14 | fun3(...) | file3.kt:5:1:6:1 | fun3 | MyJvmName.fun3 | file3.kt:0:0:0:0 | MyJvmName | | file1.kt:6:9:6:14 | fun4(...) | file4.kt:4:1:5:1 | fun4 | File4Kt.fun4 | file4.kt:0:0:0:0 | File4Kt | -| file1.kt:11:29:11:56 | toArray(...) | file:///CollectionToArray.class:0:0:0:0 | toArray | kotlin.jvm.internal.CollectionToArray.toArray | file:///CollectionToArray.class:0:0:0:0 | CollectionToArray | -| file1.kt:11:47:11:55 | listOf(...) | file:///CollectionsKt.class:0:0:0:0 | listOf | kotlin.collections.CollectionsKt.listOf | file:///CollectionsKt.class:0:0:0:0 | CollectionsKt | +| file1.kt:11:29:11:56 | toArray(...) | file:///CollectionToArray.class:0:0:0:0 | toArray | kotlin.jvm.internal.CollectionToArray.toArray | file://:0:0:0:0 | CollectionToArray | +| file1.kt:11:47:11:55 | listOf(...) | file:///CollectionsKt.class:0:0:0:0 | listOf | kotlin.collections.CollectionsKt.listOf | file://:0:0:0:0 | CollectionsKt | From 8d358a9f64718b91d7863e5335e166235a31bc5f Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Thu, 22 Feb 2024 18:59:43 +0000 Subject: [PATCH 127/207] Kotlin: Remove the Kotlin 2 ministdlib test Upstream doesn't plan to fix it before the K2 release: https://youtrack.jetbrains.com/issue/KT-62183/K2-no-stdlib-doesnt-behave-as-expected I've made a ticket to remind us to return to this later. --- .../library-tests/ministdlib/MiniStdLib.kt | 46 ------------------- .../library-tests/ministdlib/MyClass.kt | 1 - .../library-tests/ministdlib/classes.expected | 7 --- .../library-tests/ministdlib/classes.ql | 4 -- .../library-tests/ministdlib/options | 1 - 5 files changed, 59 deletions(-) delete mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt delete mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt delete mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/classes.expected delete mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/classes.ql delete mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/options diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt b/java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt deleted file mode 100644 index ba48bc63234..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt +++ /dev/null @@ -1,46 +0,0 @@ -package kotlin - -/* -This is a mini standard library replacement, to make it easy to write -very small tests that create very small databases. - -If you define a class, then you will need to also define any members that -compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt -expects (e.g. with findFunctions(...).first) to exist. -*/ - -public open class Any { - fun toString(): String { return this.toString() } - open operator fun equals(other: Any?): Boolean { return this.equals(other) } -} - -public class String { - operator fun plus(other: Any?): String { return this.plus(other) } -} - -public class Boolean { - operator fun not(): Boolean { return this.not() } -} - -public class Int { - operator fun plus(other: Int): Int { return this.plus(other) } - operator fun times(other: Int): Int { return this.times(other) } - infix fun xor(other: Int): Int { return this.xor(other) } -} - -public object Unit { -} - -// Diagnostic Matches: % Can't find java.lang.Boolean -// Diagnostic Matches: % Can't find java.lang.Byte -// Diagnostic Matches: % Can't find java.lang.Character -// Diagnostic Matches: % Can't find java.lang.Double -// Diagnostic Matches: % Can't find java.lang.Float -// Diagnostic Matches: % Can't find java.lang.Integer -// Diagnostic Matches: % Can't find java.lang.Long -// Diagnostic Matches: % Can't find java.lang.Short -// Diagnostic Matches: % Can't find java.lang.Void -// Diagnostic Matches: % Can't find kotlin.UByte -// Diagnostic Matches: % Can't find kotlin.UInt -// Diagnostic Matches: % Can't find kotlin.ULong -// Diagnostic Matches: % Can't find kotlin.UShort diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt b/java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt deleted file mode 100644 index eaa7e450bbb..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt +++ /dev/null @@ -1 +0,0 @@ -class MyClass {} diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/classes.expected b/java/ql/test-kotlin2/library-tests/ministdlib/classes.expected deleted file mode 100644 index 8d1bc538129..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/classes.expected +++ /dev/null @@ -1,7 +0,0 @@ -| MiniStdLib.kt:12:1:15:1 | Any | -| MiniStdLib.kt:17:1:19:1 | String | -| MiniStdLib.kt:21:1:23:1 | Boolean | -| MiniStdLib.kt:25:1:29:1 | Int | -| MiniStdLib.kt:31:1:32:1 | Unit | -| MyClass.kt:1:1:1:16 | MyClass | -| file://:0:0:0:0 | FakeKotlinClass | diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/classes.ql b/java/ql/test-kotlin2/library-tests/ministdlib/classes.ql deleted file mode 100644 index 86c654ea986..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/classes.ql +++ /dev/null @@ -1,4 +0,0 @@ -import java - -from Class c -select c diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/options b/java/ql/test-kotlin2/library-tests/ministdlib/options deleted file mode 100644 index 052bfdb9a30..00000000000 --- a/java/ql/test-kotlin2/library-tests/ministdlib/options +++ /dev/null @@ -1 +0,0 @@ -codeql-extractor-kotlin-options: -no-jdk -no-reflect -no-stdlib -Xallow-kotlin-package From ea7d9c97fd09de7e162d60fe0e4d4ce470f4706c Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 22 Feb 2024 13:28:46 +0100 Subject: [PATCH 128/207] C#: Use separate `newtype` branch for `AssignableDefinitionNode` --- .../DataFlowConsistency.ql | 14 ++- .../internal/DataFlowImplSpecific.qll | 4 + .../dataflow/internal/DataFlowPrivate.qll | 94 +++++++++++++------ .../dataflow/internal/DataFlowPublic.qll | 11 +-- 4 files changed, 81 insertions(+), 42 deletions(-) diff --git a/csharp/ql/consistency-queries/DataFlowConsistency.ql b/csharp/ql/consistency-queries/DataFlowConsistency.ql index 0f9dead6b77..0e442236ac5 100644 --- a/csharp/ql/consistency-queries/DataFlowConsistency.ql +++ b/csharp/ql/consistency-queries/DataFlowConsistency.ql @@ -1,5 +1,6 @@ import csharp import cil +private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl private import semmle.code.csharp.dataflow.internal.DataFlowImplSpecific private import semmle.code.csharp.dataflow.internal.TaintTrackingImplSpecific private import codeql.dataflow.internal.DataFlowImplConsistency @@ -7,13 +8,18 @@ private import codeql.dataflow.internal.DataFlowImplConsistency private module Input implements InputSig { private import CsharpDataFlow + private predicate isStaticAssignable(Assignable a) { a.(Modifiable).isStatic() } + + predicate uniqueEnclosingCallableExclude(Node node) { + // TODO: Remove once static initializers are folded into the + // static constructors + isStaticAssignable(ControlFlowGraphImpl::getNodeCfgScope(node.getControlFlowNode())) + } + predicate uniqueCallEnclosingCallableExclude(DataFlowCall call) { // TODO: Remove once static initializers are folded into the // static constructors - exists(ControlFlow::Node cfn | - cfn.getAstNode() = any(FieldOrProperty f | f.isStatic()).getAChild+() and - cfn = call.getControlFlowNode() - ) + isStaticAssignable(ControlFlowGraphImpl::getNodeCfgScope(call.getControlFlowNode())) } predicate uniqueNodeLocationExclude(Node n) { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll index b35042e51da..774dc6bd86a 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll @@ -24,4 +24,8 @@ module CsharpDataFlow implements InputSig { predicate mayBenefitFromCallContext = Private::mayBenefitFromCallContext/1; predicate viableImplInCallContext = Private::viableImplInCallContext/2; + + predicate neverSkipInPathGraph(Node n) { + exists(n.(AssignableDefinitionNode).getDefinition().getTargetAccess()) + } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 260e805ea62..09041d0c3d6 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -208,16 +208,10 @@ predicate hasNodePath(ControlFlowReachabilityConfiguration conf, ExprNode n1, No cfn2 = n2.(ExprNode).getControlFlowNode() ) or - exists( - ControlFlow::Node cfn, AssignableDefinition def, ControlFlow::Node cfnDef, - Ssa::ExplicitDefinition ssaDef - | - conf.hasDefPath(_, cfn, def, cfnDef) - | + exists(ControlFlow::Node cfn, AssignableDefinition def, ControlFlow::Node cfnDef | + conf.hasDefPath(_, cfn, def, cfnDef) and cfn = n1.getControlFlowNode() and - ssaDef.getADefinition() = def and - ssaDef.getControlFlowNode() = cfnDef and - n2.(SsaDefinitionExtNode).getDefinitionExt() = ssaDef + n2 = TAssignableDefinitionNode(def, cfnDef) ) } @@ -544,6 +538,13 @@ module LocalFlow { ThisFlow::adjacentThisRefs(nodeFrom.(PostUpdateNode).getPreUpdateNode(), nodeTo) or CilFlow::localFlowStepCil(nodeFrom, nodeTo) + or + exists(AssignableDefinition def, ControlFlow::Node cfn, Ssa::ExplicitDefinition ssaDef | + ssaDef.getADefinition() = def and + ssaDef.getControlFlowNode() = cfn and + nodeFrom = TAssignableDefinitionNode(def, cfn) and + nodeTo.(SsaDefinitionExtNode).getDefinitionExt() = ssaDef + ) } /** @@ -599,7 +600,7 @@ module LocalFlow { or hasNodePath(any(LocalExprStepConfiguration x), node1, node2) and ( - node2 instanceof SsaDefinitionExtNode or + node2 instanceof AssignableDefinitionNode or node2.asExpr() instanceof Cast or node2.asExpr() instanceof AssignExpr ) @@ -906,6 +907,11 @@ private module Cached { not def.(Ssa::ExplicitDefinition).getADefinition() instanceof AssignableDefinitions::ImplicitParameterDefinition } or + TAssignableDefinitionNode(AssignableDefinition def, ControlFlow::Node cfn) { + cfn = def.getAControlFlowNode() and + // Handled by `TExplicitParameterNode` below + not def instanceof AssignableDefinitions::ImplicitParameterDefinition + } or TExplicitParameterNode(DotNet::Parameter p) { p = any(DataFlowCallable dfc).asCallable().getAParameter() } or @@ -1044,15 +1050,7 @@ import Cached /** Holds if `n` should be hidden from path explanations. */ predicate nodeIsHidden(Node n) { - exists(SsaImpl::DefinitionExt def | def = n.(SsaDefinitionExtNode).getDefinitionExt() | - def instanceof Ssa::PhiNode - or - def instanceof SsaImpl::PhiReadNode - or - def instanceof Ssa::ImplicitEntryDefinition - or - def instanceof Ssa::ImplicitCallDefinition - ) + n instanceof SsaDefinitionExtNode or exists(Parameter p | p = n.(ParameterNode).getParameter() | not p.fromSource()) or @@ -1080,6 +1078,8 @@ predicate nodeIsHidden(Node n) { n instanceof InstanceParameterAccessNode or n instanceof PrimaryConstructorThisAccessNode + or + n = any(AssignableDefinitionNode def | not exists(def.getDefinition().getTargetAccess())) } /** A CIL SSA definition, viewed as a node in a data flow graph. */ @@ -1128,6 +1128,43 @@ class SsaDefinitionExtNode extends NodeImpl, TSsaDefinitionExtNode { override string toStringImpl() { result = def.toString() } } +/** A definition, viewed as a node in a data flow graph. */ +class AssignableDefinitionNodeImpl extends NodeImpl, TAssignableDefinitionNode { + private AssignableDefinition def; + private ControlFlow::Node cfn_; + + AssignableDefinitionNodeImpl() { this = TAssignableDefinitionNode(def, cfn_) } + + /** Gets the underlying definition. */ + AssignableDefinition getDefinition() { result = def } + + /** Gets the underlying definition, at control flow node `cfn`, if any. */ + AssignableDefinition getDefinitionAtNode(ControlFlow::Node cfn) { + result = def and + cfn = cfn_ + } + + override DataFlowCallable getEnclosingCallableImpl() { + result.asCallable() = cfn_.getEnclosingCallable() + } + + override Type getTypeImpl() { result = def.getTarget().getType() } + + override ControlFlow::Node getControlFlowNodeImpl() { result = cfn_ } + + override Location getLocationImpl() { + result = def.getTargetAccess().getLocation() + or + not exists(def.getTargetAccess()) and result = def.getLocation() + } + + override string toStringImpl() { + result = def.getTargetAccess().toString() + or + not exists(def.getTargetAccess()) and result = def.toString() + } +} + abstract class ParameterNodeImpl extends NodeImpl { abstract predicate isParameterOf(DataFlowCallable c, ParameterPosition pos); } @@ -2021,12 +2058,11 @@ private PropertyContent getResultContent() { } private predicate primaryConstructorParameterStore( - SsaDefinitionExtNode node1, PrimaryConstructorParameterContent c, Node node2 + AssignableDefinitionNode node1, PrimaryConstructorParameterContent c, Node node2 ) { - exists(Ssa::ExplicitDefinition def, ControlFlow::Node cfn, Parameter p | - def = node1.getDefinitionExt() and - p = def.getSourceVariable().getAssignable() and - cfn = def.getControlFlowNode() and + exists(AssignableDefinition def, ControlFlow::Node cfn, Parameter p | + node1 = TAssignableDefinitionNode(def, cfn) and + p = def.getTarget() and node2 = TInstanceParameterAccessNode(cfn, true) and c.getParameter() = p ) @@ -2193,18 +2229,16 @@ predicate readStep(Node node1, ContentSet c, Node node2) { hasNodePath(x, node1, node2) or // item = variable in node1 = (..., variable, ...) - exists(AssignableDefinitions::TupleAssignmentDefinition tad, Ssa::ExplicitDefinition def | - node2.(SsaDefinitionExtNode).getDefinitionExt() = def and - def.getADefinition() = tad and + exists(AssignableDefinitions::TupleAssignmentDefinition tad | + node2.(AssignableDefinitionNode).getDefinition() = tad and tad.getLeaf() = item and hasNodePath(x, node1, node2) ) or // item = variable in node1 = (..., variable, ...) in a case/is var (..., ...) te = any(PatternExpr pe).getAChildExpr*() and - exists(AssignableDefinitions::LocalVariableDefinition lvd, Ssa::ExplicitDefinition def | - node2.(SsaDefinitionExtNode).getDefinitionExt() = def and - def.getADefinition() = lvd and + exists(AssignableDefinitions::LocalVariableDefinition lvd | + node2.(AssignableDefinitionNode).getDefinition() = lvd and lvd.getDeclaration() = item and hasNodePath(x, node1, node2) ) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll index 1dc3f77a450..2147b2f7d41 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll @@ -109,18 +109,13 @@ class ParameterNode extends Node instanceof ParameterNodeImpl { } /** A definition, viewed as a node in a data flow graph. */ -class AssignableDefinitionNode extends Node, TSsaDefinitionExtNode { - private Ssa::ExplicitDefinition edef; - - AssignableDefinitionNode() { this = TSsaDefinitionExtNode(edef) } - +class AssignableDefinitionNode extends Node instanceof AssignableDefinitionNodeImpl { /** Gets the underlying definition. */ - AssignableDefinition getDefinition() { result = this.getDefinitionAtNode(_) } + AssignableDefinition getDefinition() { result = super.getDefinition() } /** Gets the underlying definition, at control flow node `cfn`, if any. */ AssignableDefinition getDefinitionAtNode(ControlFlow::Node cfn) { - result = edef.getADefinition() and - cfn = edef.getControlFlowNode() + result = super.getDefinitionAtNode(cfn) } } From 303a2bb63a171a3b8a157f7617099f3baa4695c2 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 22 Feb 2024 14:00:33 +0100 Subject: [PATCH 129/207] C#: Update expected test output --- .../CWE-759/HashWithoutSalt.expected | 12 +- .../backdoor/PotentialTimeBomb.expected | 4 +- .../cil/dataflow/DataFlow.expected | 8 +- .../library-tests/csharp7/GlobalFlow.expected | 32 +- .../csharp7/GlobalTaintTracking.expected | 34 +- .../csharp7/LocalTaintFlow.expected | 137 +++- .../csharp7/TaintReaches.expected | 8 + .../csharp8/NullableRefTypes.expected | 9 +- .../dataflow/async/Async.expected | 4 +- .../CallSensitivityFlow.expected | 64 +- .../collections/CollectionFlow.expected | 224 ++++-- .../constructors/ConstructorFlow.expected | 100 ++- .../external-models/ExternalFlow.expected | 74 +- .../dataflow/fields/FieldFlow.expected | 660 +++++++++++++----- .../dataflow/global/DataFlowPath.expected | 290 +++++--- .../dataflow/global/GetAnOutNode.expected | 60 +- .../global/TaintTrackingPath.expected | 346 +++++---- .../dataflow/local/DataFlowStep.expected | 460 ++++++++---- .../dataflow/local/TaintTrackingStep.expected | 460 ++++++++---- .../dataflow/operators/operatorFlow.expected | 96 ++- .../threat-models-flowtest1.expected | 4 +- .../threat-models-flowtest2.expected | 8 +- .../threat-models-flowtest3.expected | 16 +- .../threat-models-flowtest4.expected | 20 +- .../threat-models-flowtest5.expected | 12 +- .../threat-models-flowtest6.expected | 12 +- .../dataflow/tuples/DataFlowStep.expected | 95 ++- .../dataflow/tuples/Tuples.expected | 344 ++++----- .../TypeFlowDispatch.expected | 24 +- .../dataflow/types/Types.expected | 28 +- .../EntityFramework/Dataflow.expected | 90 ++- .../UnsafeYearConstruction.expected | 4 +- .../UntrustedDataToExternalAPI.expected | 6 +- .../CWE-022/TaintedPath/TaintedPath.expected | 26 +- .../CWE-022/ZipSlip/ZipSlip.expected | 38 +- .../CWE-078/CommandInjection.expected | 30 +- .../CWE-079/XSS/XSS.expected | 13 +- .../CWE-079/XSSAsp/XSS.expected | 37 +- .../CWE-089/SecondOrderSqlInjection.expected | 32 +- .../CWE-089/SqlInjection.expected | 72 +- .../CWE-090/LDAPInjection.expected | 21 +- .../XMLInjection/XMLInjection.expected | 6 +- .../CWE-094/CodeInjection.expected | 9 +- .../CWE-099/ResourceInjection.expected | 11 +- .../CWE-112/MissingXMLValidation.expected | 18 +- .../AssemblyPathInjection.expected | 6 +- .../CWE-117/LogForging.expected | 12 +- .../CWE-134/UncontrolledFormatString.expected | 19 +- .../ExposureInTransmittedData.expected | 10 +- .../HardcodedSymmetricEncryptionKey.expected | 16 +- .../DontInstallRootCert.expected | 12 +- .../InsecureSQLConnection.expected | 8 +- .../CWE-338/InsecureRandomness.expected | 10 +- .../CWE-601/UrlRedirect/UrlRedirect.expected | 18 +- .../CWE-643/StoredXPathInjection.expected | 12 +- .../CWE-643/XPathInjection.expected | 44 +- .../CWE-730/ReDoS/ReDoS.expected | 18 +- .../CWE-730/ReDoSGlobalTimeout/ReDoS.expected | 6 +- .../RegexInjection/RegexInjection.expected | 6 +- .../CWE-798/HardcodedCredentials.expected | 4 +- .../CWE-807/ConditionalBypass.expected | 26 +- .../CWE-838/InappropriateEncoding.expected | 22 +- 62 files changed, 2913 insertions(+), 1394 deletions(-) diff --git a/csharp/ql/test/experimental/Security Features/CWE-759/HashWithoutSalt.expected b/csharp/ql/test/experimental/Security Features/CWE-759/HashWithoutSalt.expected index f3c1a8ed6c5..2886fe7af7d 100644 --- a/csharp/ql/test/experimental/Security Features/CWE-759/HashWithoutSalt.expected +++ b/csharp/ql/test/experimental/Security Features/CWE-759/HashWithoutSalt.expected @@ -1,17 +1,23 @@ edges -| HashWithoutSalt.cs:18:28:18:105 | call to method ConvertStringToBinary : IBuffer | HashWithoutSalt.cs:20:49:20:56 | access to local variable passBuff | provenance | | +| HashWithoutSalt.cs:18:17:18:24 | access to local variable passBuff : IBuffer | HashWithoutSalt.cs:20:49:20:56 | access to local variable passBuff | provenance | | +| HashWithoutSalt.cs:18:28:18:105 | call to method ConvertStringToBinary : IBuffer | HashWithoutSalt.cs:18:17:18:24 | access to local variable passBuff : IBuffer | provenance | | | HashWithoutSalt.cs:18:70:18:77 | access to parameter password : String | HashWithoutSalt.cs:18:28:18:105 | call to method ConvertStringToBinary : IBuffer | provenance | | -| HashWithoutSalt.cs:38:28:38:72 | call to method GetBytes : Byte[] | HashWithoutSalt.cs:39:51:39:59 | access to local variable passBytes | provenance | | +| HashWithoutSalt.cs:38:16:38:24 | access to local variable passBytes : Byte[] | HashWithoutSalt.cs:39:51:39:59 | access to local variable passBytes | provenance | | +| HashWithoutSalt.cs:38:28:38:72 | call to method GetBytes : Byte[] | HashWithoutSalt.cs:38:16:38:24 | access to local variable passBytes : Byte[] | provenance | | | HashWithoutSalt.cs:38:64:38:71 | access to parameter password : String | HashWithoutSalt.cs:38:28:38:72 | call to method GetBytes : Byte[] | provenance | | -| HashWithoutSalt.cs:70:28:70:72 | call to method GetBytes : Byte[] | HashWithoutSalt.cs:71:48:71:56 | access to local variable passBytes | provenance | | +| HashWithoutSalt.cs:70:16:70:24 | access to local variable passBytes : Byte[] | HashWithoutSalt.cs:71:48:71:56 | access to local variable passBytes | provenance | | +| HashWithoutSalt.cs:70:28:70:72 | call to method GetBytes : Byte[] | HashWithoutSalt.cs:70:16:70:24 | access to local variable passBytes : Byte[] | provenance | | | HashWithoutSalt.cs:70:64:70:71 | access to parameter password : String | HashWithoutSalt.cs:70:28:70:72 | call to method GetBytes : Byte[] | provenance | | nodes +| HashWithoutSalt.cs:18:17:18:24 | access to local variable passBuff : IBuffer | semmle.label | access to local variable passBuff : IBuffer | | HashWithoutSalt.cs:18:28:18:105 | call to method ConvertStringToBinary : IBuffer | semmle.label | call to method ConvertStringToBinary : IBuffer | | HashWithoutSalt.cs:18:70:18:77 | access to parameter password : String | semmle.label | access to parameter password : String | | HashWithoutSalt.cs:20:49:20:56 | access to local variable passBuff | semmle.label | access to local variable passBuff | +| HashWithoutSalt.cs:38:16:38:24 | access to local variable passBytes : Byte[] | semmle.label | access to local variable passBytes : Byte[] | | HashWithoutSalt.cs:38:28:38:72 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] | | HashWithoutSalt.cs:38:64:38:71 | access to parameter password : String | semmle.label | access to parameter password : String | | HashWithoutSalt.cs:39:51:39:59 | access to local variable passBytes | semmle.label | access to local variable passBytes | +| HashWithoutSalt.cs:70:16:70:24 | access to local variable passBytes : Byte[] | semmle.label | access to local variable passBytes : Byte[] | | HashWithoutSalt.cs:70:28:70:72 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] | | HashWithoutSalt.cs:70:64:70:71 | access to parameter password : String | semmle.label | access to parameter password : String | | HashWithoutSalt.cs:71:48:71:56 | access to local variable passBytes | semmle.label | access to local variable passBytes | diff --git a/csharp/ql/test/experimental/Security Features/backdoor/PotentialTimeBomb.expected b/csharp/ql/test/experimental/Security Features/backdoor/PotentialTimeBomb.expected index 812e1751048..3a2f86910fe 100644 --- a/csharp/ql/test/experimental/Security Features/backdoor/PotentialTimeBomb.expected +++ b/csharp/ql/test/experimental/Security Features/backdoor/PotentialTimeBomb.expected @@ -1,4 +1,5 @@ nodes +| test.cs:69:18:69:30 | access to local variable lastWriteTime : DateTime | semmle.label | access to local variable lastWriteTime : DateTime | | test.cs:69:34:69:76 | call to method GetLastWriteTime : DateTime | semmle.label | call to method GetLastWriteTime : DateTime | | test.cs:71:13:71:71 | call to method CompareTo | semmle.label | call to method CompareTo | | test.cs:71:13:71:71 | call to method CompareTo : Int32 | semmle.label | call to method CompareTo : Int32 | @@ -7,7 +8,8 @@ nodes | test.cs:71:36:71:70 | call to method AddHours | semmle.label | call to method AddHours | subpaths edges -| test.cs:69:34:69:76 | call to method GetLastWriteTime : DateTime | test.cs:71:36:71:48 | access to local variable lastWriteTime | provenance | | +| test.cs:69:18:69:30 | access to local variable lastWriteTime : DateTime | test.cs:71:36:71:48 | access to local variable lastWriteTime | provenance | | +| test.cs:69:34:69:76 | call to method GetLastWriteTime : DateTime | test.cs:69:18:69:30 | access to local variable lastWriteTime : DateTime | provenance | | | test.cs:71:13:71:71 | call to method CompareTo : Int32 | test.cs:71:13:71:76 | ... >= ... | provenance | | | test.cs:71:36:71:48 | access to local variable lastWriteTime | test.cs:71:13:71:71 | call to method CompareTo | provenance | | | test.cs:71:36:71:48 | access to local variable lastWriteTime | test.cs:71:13:71:71 | call to method CompareTo : Int32 | provenance | | diff --git a/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected b/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected index e4c2f9af9ed..944815673cd 100644 --- a/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected +++ b/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected @@ -45,8 +45,10 @@ edges | dataflow.cs:100:30:100:33 | null : null | dataflow.cs:72:39:72:52 | call to method IndirectNull : null | provenance | | | dataflow.cs:100:30:100:33 | null : null | dataflow.cs:106:20:106:33 | call to method IndirectNull | provenance | | | dataflow.cs:100:30:100:33 | null : null | dataflow.cs:106:20:106:33 | call to method IndirectNull : null | provenance | | -| dataflow.cs:106:20:106:33 | call to method IndirectNull : null | dataflow.cs:108:16:108:16 | access to local variable x : null | provenance | | -| dataflow.cs:107:23:107:26 | null : null | dataflow.cs:108:16:108:16 | access to local variable x : null | provenance | | +| dataflow.cs:106:16:106:16 | access to local variable x : null | dataflow.cs:108:16:108:16 | access to local variable x : null | provenance | | +| dataflow.cs:106:20:106:33 | call to method IndirectNull : null | dataflow.cs:106:16:106:16 | access to local variable x : null | provenance | | +| dataflow.cs:107:19:107:19 | access to local variable x : null | dataflow.cs:108:16:108:16 | access to local variable x : null | provenance | | +| dataflow.cs:107:23:107:26 | null : null | dataflow.cs:107:19:107:19 | access to local variable x : null | provenance | | | dataflow.cs:108:16:108:16 | access to local variable x : null | dataflow.cs:72:21:72:34 | call to method NullFunction : null | provenance | | | dataflow.cs:108:16:108:16 | access to local variable x : null | dataflow.cs:87:31:87:44 | call to method NullFunction : null | provenance | | nodes @@ -104,8 +106,10 @@ nodes | dataflow.cs:87:24:87:51 | ... ? ... : ... | semmle.label | ... ? ... : ... | | dataflow.cs:87:31:87:44 | call to method NullFunction : null | semmle.label | call to method NullFunction : null | | dataflow.cs:100:30:100:33 | null : null | semmle.label | null : null | +| dataflow.cs:106:16:106:16 | access to local variable x : null | semmle.label | access to local variable x : null | | dataflow.cs:106:20:106:33 | call to method IndirectNull | semmle.label | call to method IndirectNull | | dataflow.cs:106:20:106:33 | call to method IndirectNull : null | semmle.label | call to method IndirectNull : null | +| dataflow.cs:107:19:107:19 | access to local variable x : null | semmle.label | access to local variable x : null | | dataflow.cs:107:23:107:26 | null : null | semmle.label | null : null | | dataflow.cs:108:16:108:16 | access to local variable x : null | semmle.label | access to local variable x : null | subpaths diff --git a/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected b/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected index 59e0fb54c32..3873d436892 100644 --- a/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/GlobalFlow.expected @@ -1,21 +1,23 @@ edges -| CSharp7.cs:39:9:39:21 | SSA def(x) : String | CSharp7.cs:49:22:49:23 | SSA def(t1) : String | provenance | | -| CSharp7.cs:39:13:39:21 | "tainted" : String | CSharp7.cs:39:9:39:21 | SSA def(x) : String | provenance | | -| CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:13 | SSA def(y) : String | provenance | | -| CSharp7.cs:49:22:49:23 | SSA def(t1) : String | CSharp7.cs:51:18:51:19 | access to local variable t1 | provenance | | +| CSharp7.cs:39:9:39:9 | access to parameter x : String | CSharp7.cs:49:22:49:23 | String t1 : String | provenance | | +| CSharp7.cs:39:13:39:21 | "tainted" : String | CSharp7.cs:39:9:39:9 | access to parameter x : String | provenance | | +| CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:9 | access to parameter y : String | provenance | | +| CSharp7.cs:49:22:49:23 | String t1 : String | CSharp7.cs:51:18:51:19 | access to local variable t1 | provenance | | | CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | provenance | | -| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | provenance | | -| CSharp7.cs:55:30:55:31 | SSA def(t4) : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | provenance | | +| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | String t4 : String | provenance | | +| CSharp7.cs:55:30:55:31 | String t4 : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | provenance | | | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:20:82:20 | access to parameter x : String | provenance | | | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | provenance | | | CSharp7.cs:82:20:82:20 | access to parameter x : String | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | provenance | | -| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | +| CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | +| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | | CSharp7.cs:87:19:87:27 | "tainted" : String | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | provenance | | | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:27 | access to field Item1 : String | provenance | | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | provenance | | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:181:23:181:25 | access to local variable src : String | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:182:23:182:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:181:23:181:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:182:23:182:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:175:16:175:18 | access to local variable src : String | provenance | | | CSharp7.cs:177:25:177:25 | s : String | CSharp7.cs:177:31:177:31 | access to parameter s : String | provenance | | | CSharp7.cs:178:25:178:25 | s : String | CSharp7.cs:178:37:178:37 | access to parameter s : String | provenance | | | CSharp7.cs:181:23:181:25 | access to local variable src : String | CSharp7.cs:177:25:177:25 | s : String | provenance | | @@ -23,24 +25,26 @@ edges | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:178:25:178:25 | s : String | provenance | | | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:182:21:182:26 | call to local function h | provenance | | nodes -| CSharp7.cs:39:9:39:21 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| CSharp7.cs:39:9:39:9 | access to parameter x : String | semmle.label | access to parameter x : String | | CSharp7.cs:39:13:39:21 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:42:19:42:19 | x : String | semmle.label | x : String | -| CSharp7.cs:44:9:44:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | -| CSharp7.cs:49:22:49:23 | SSA def(t1) : String | semmle.label | SSA def(t1) : String | +| CSharp7.cs:44:9:44:9 | access to parameter y : String | semmle.label | access to parameter y : String | +| CSharp7.cs:49:22:49:23 | String t1 : String | semmle.label | String t1 : String | | CSharp7.cs:51:18:51:19 | access to local variable t1 | semmle.label | access to local variable t1 | | CSharp7.cs:55:11:55:19 | "tainted" : String | semmle.label | "tainted" : String | -| CSharp7.cs:55:30:55:31 | SSA def(t4) : String | semmle.label | SSA def(t4) : String | +| CSharp7.cs:55:30:55:31 | String t4 : String | semmle.label | String t4 : String | | CSharp7.cs:56:18:56:19 | access to local variable t4 | semmle.label | access to local variable t4 | | CSharp7.cs:80:21:80:21 | x : String | semmle.label | x : String | | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:82:16:82:26 | access to field Item1 : String | semmle.label | access to field Item1 : String | | CSharp7.cs:82:20:82:20 | access to parameter x : String | semmle.label | access to parameter x : String | +| CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:87:19:87:27 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:90:18:90:28 | call to method I | semmle.label | call to method I | | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | semmle.label | access to field Item1 : String | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | semmle.label | access to local variable src : String | | CSharp7.cs:175:22:175:30 | "tainted" | semmle.label | "tainted" | | CSharp7.cs:175:22:175:30 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:177:25:177:25 | s : String | semmle.label | s : String | @@ -52,7 +56,7 @@ nodes | CSharp7.cs:182:21:182:26 | call to local function h | semmle.label | call to local function h | | CSharp7.cs:182:23:182:25 | access to local variable src : String | semmle.label | access to local variable src : String | subpaths -| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:13 | SSA def(y) : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | +| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:9 | access to parameter y : String | CSharp7.cs:55:30:55:31 | String t4 : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | | CSharp7.cs:181:23:181:25 | access to local variable src : String | CSharp7.cs:177:25:177:25 | s : String | CSharp7.cs:177:31:177:31 | access to parameter s : String | CSharp7.cs:181:21:181:26 | call to local function g | | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:178:25:178:25 | s : String | CSharp7.cs:178:37:178:37 | access to parameter s : String | CSharp7.cs:182:21:182:26 | call to local function h | diff --git a/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected b/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected index 2cc4eb58cf9..7b7a73b3c70 100644 --- a/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected +++ b/csharp/ql/test/library-tests/csharp7/GlobalTaintTracking.expected @@ -1,22 +1,24 @@ edges -| CSharp7.cs:39:9:39:21 | SSA def(x) : String | CSharp7.cs:49:22:49:23 | SSA def(t1) : String | provenance | | -| CSharp7.cs:39:13:39:21 | "tainted" : String | CSharp7.cs:39:9:39:21 | SSA def(x) : String | provenance | | -| CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:13 | SSA def(y) : String | provenance | | -| CSharp7.cs:49:22:49:23 | SSA def(t1) : String | CSharp7.cs:51:18:51:19 | access to local variable t1 | provenance | | +| CSharp7.cs:39:9:39:9 | access to parameter x : String | CSharp7.cs:49:22:49:23 | String t1 : String | provenance | | +| CSharp7.cs:39:13:39:21 | "tainted" : String | CSharp7.cs:39:9:39:9 | access to parameter x : String | provenance | | +| CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:9 | access to parameter y : String | provenance | | +| CSharp7.cs:49:22:49:23 | String t1 : String | CSharp7.cs:51:18:51:19 | access to local variable t1 | provenance | | | CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | provenance | | -| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | provenance | | -| CSharp7.cs:55:30:55:31 | SSA def(t4) : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | provenance | | +| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:55:30:55:31 | String t4 : String | provenance | | +| CSharp7.cs:55:30:55:31 | String t4 : String | CSharp7.cs:56:18:56:19 | access to local variable t4 | provenance | | | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:20:82:20 | access to parameter x : String | provenance | | | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | provenance | | | CSharp7.cs:82:20:82:20 | access to parameter x : String | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | provenance | | -| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | +| CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | +| CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | provenance | | | CSharp7.cs:87:19:87:27 | "tainted" : String | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | provenance | | | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | CSharp7.cs:90:20:90:27 | access to field Item1 : String | provenance | | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | provenance | | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:180:23:180:25 | access to local variable src : String | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:181:23:181:25 | access to local variable src : String | provenance | | -| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:182:23:182:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:180:23:180:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:181:23:181:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | CSharp7.cs:182:23:182:25 | access to local variable src : String | provenance | | +| CSharp7.cs:175:22:175:30 | "tainted" : String | CSharp7.cs:175:16:175:18 | access to local variable src : String | provenance | | | CSharp7.cs:176:25:176:25 | s : String | CSharp7.cs:176:33:176:33 | access to parameter s : String | provenance | | | CSharp7.cs:176:31:176:34 | call to local function g : String | CSharp7.cs:176:31:176:39 | ... + ... : String | provenance | | | CSharp7.cs:176:33:176:33 | access to parameter s : String | CSharp7.cs:176:31:176:34 | call to local function g : String | provenance | | @@ -30,24 +32,26 @@ edges | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:178:25:178:25 | s : String | provenance | | | CSharp7.cs:182:23:182:25 | access to local variable src : String | CSharp7.cs:182:21:182:26 | call to local function h | provenance | | nodes -| CSharp7.cs:39:9:39:21 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| CSharp7.cs:39:9:39:9 | access to parameter x : String | semmle.label | access to parameter x : String | | CSharp7.cs:39:13:39:21 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:42:19:42:19 | x : String | semmle.label | x : String | -| CSharp7.cs:44:9:44:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | -| CSharp7.cs:49:22:49:23 | SSA def(t1) : String | semmle.label | SSA def(t1) : String | +| CSharp7.cs:44:9:44:9 | access to parameter y : String | semmle.label | access to parameter y : String | +| CSharp7.cs:49:22:49:23 | String t1 : String | semmle.label | String t1 : String | | CSharp7.cs:51:18:51:19 | access to local variable t1 | semmle.label | access to local variable t1 | | CSharp7.cs:55:11:55:19 | "tainted" : String | semmle.label | "tainted" : String | -| CSharp7.cs:55:30:55:31 | SSA def(t4) : String | semmle.label | SSA def(t4) : String | +| CSharp7.cs:55:30:55:31 | String t4 : String | semmle.label | String t4 : String | | CSharp7.cs:56:18:56:19 | access to local variable t4 | semmle.label | access to local variable t4 | | CSharp7.cs:80:21:80:21 | x : String | semmle.label | x : String | | CSharp7.cs:82:16:82:24 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:82:16:82:26 | access to field Item1 : String | semmle.label | access to field Item1 : String | | CSharp7.cs:82:20:82:20 | access to parameter x : String | semmle.label | access to parameter x : String | +| CSharp7.cs:87:13:87:14 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:87:18:87:34 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | | CSharp7.cs:87:19:87:27 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:90:18:90:28 | call to method I | semmle.label | call to method I | | CSharp7.cs:90:20:90:21 | access to local variable t1 : ValueTuple [field Item1] : String | semmle.label | access to local variable t1 : ValueTuple [field Item1] : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | semmle.label | access to field Item1 : String | +| CSharp7.cs:175:16:175:18 | access to local variable src : String | semmle.label | access to local variable src : String | | CSharp7.cs:175:22:175:30 | "tainted" | semmle.label | "tainted" | | CSharp7.cs:175:22:175:30 | "tainted" : String | semmle.label | "tainted" : String | | CSharp7.cs:176:25:176:25 | s : String | semmle.label | s : String | @@ -65,7 +69,7 @@ nodes | CSharp7.cs:182:21:182:26 | call to local function h | semmle.label | call to local function h | | CSharp7.cs:182:23:182:25 | access to local variable src : String | semmle.label | access to local variable src : String | subpaths -| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:13 | SSA def(y) : String | CSharp7.cs:55:30:55:31 | SSA def(t4) : String | +| CSharp7.cs:55:11:55:19 | "tainted" : String | CSharp7.cs:42:19:42:19 | x : String | CSharp7.cs:44:9:44:9 | access to parameter y : String | CSharp7.cs:55:30:55:31 | String t4 : String | | CSharp7.cs:90:20:90:27 | access to field Item1 : String | CSharp7.cs:80:21:80:21 | x : String | CSharp7.cs:82:16:82:26 | access to field Item1 : String | CSharp7.cs:90:18:90:28 | call to method I | | CSharp7.cs:176:33:176:33 | access to parameter s : String | CSharp7.cs:177:25:177:25 | s : String | CSharp7.cs:177:31:177:31 | access to parameter s : String | CSharp7.cs:176:31:176:34 | call to local function g : String | | CSharp7.cs:180:23:180:25 | access to local variable src : String | CSharp7.cs:176:25:176:25 | s : String | CSharp7.cs:176:31:176:39 | ... + ... : String | CSharp7.cs:180:21:180:26 | call to local function f | diff --git a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected index af72c3e5e38..d0e636b1258 100644 --- a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected @@ -1,92 +1,146 @@ | CSharp7.cs:5:7:5:14 | this | CSharp7.cs:7:9:7:9 | this access | | CSharp7.cs:7:9:7:9 | [post] this access | CSharp7.cs:8:9:8:9 | this access | | CSharp7.cs:7:9:7:9 | this access | CSharp7.cs:8:9:8:9 | this access | +| CSharp7.cs:7:13:7:18 | 11 | CSharp7.cs:7:9:7:9 | access to field x | | CSharp7.cs:8:9:8:9 | [post] this access | CSharp7.cs:9:9:9:9 | this access | | CSharp7.cs:8:9:8:9 | this access | CSharp7.cs:9:9:9:9 | this access | +| CSharp7.cs:8:13:8:19 | 123456 | CSharp7.cs:8:9:8:9 | access to field y | +| CSharp7.cs:9:13:9:23 | 128 | CSharp7.cs:9:9:9:9 | access to field z | | CSharp7.cs:14:9:14:13 | [post] this access | CSharp7.cs:23:39:23:43 | this access | | CSharp7.cs:14:9:14:13 | this access | CSharp7.cs:23:39:23:43 | this access | +| CSharp7.cs:14:17:14:17 | 0 | CSharp7.cs:14:9:14:13 | access to field field | | CSharp7.cs:15:9:15:11 | SSA entry def(this.field) | CSharp7.cs:15:18:15:22 | access to field field | | CSharp7.cs:15:9:15:11 | this | CSharp7.cs:15:18:15:22 | this access | | CSharp7.cs:19:9:19:11 | this | CSharp7.cs:19:16:19:20 | this access | | CSharp7.cs:20:9:20:11 | this | CSharp7.cs:20:16:20:20 | this access | | CSharp7.cs:20:9:20:11 | value | CSharp7.cs:20:24:20:28 | access to parameter value | +| CSharp7.cs:20:24:20:28 | access to parameter value | CSharp7.cs:20:16:20:20 | access to field field | | CSharp7.cs:23:5:23:27 | this | CSharp7.cs:14:9:14:13 | this access | | CSharp7.cs:24:6:24:28 | this | CSharp7.cs:24:35:24:39 | this access | | CSharp7.cs:29:19:29:19 | i | CSharp7.cs:31:16:31:16 | access to parameter i | | CSharp7.cs:31:16:31:16 | access to parameter i | CSharp7.cs:31:16:31:20 | ... > ... | | CSharp7.cs:31:16:31:16 | access to parameter i | CSharp7.cs:31:24:31:24 | access to parameter i | | CSharp7.cs:31:24:31:24 | access to parameter i | CSharp7.cs:31:16:31:59 | ... ? ... : ... | -| CSharp7.cs:39:13:39:21 | "tainted" | CSharp7.cs:39:9:39:21 | SSA def(x) | +| CSharp7.cs:39:9:39:9 | access to parameter x | CSharp7.cs:39:9:39:21 | SSA def(x) | +| CSharp7.cs:39:13:39:21 | "tainted" | CSharp7.cs:39:9:39:9 | access to parameter x | | CSharp7.cs:42:19:42:19 | x | CSharp7.cs:44:13:44:13 | access to parameter x | -| CSharp7.cs:44:13:44:13 | access to parameter x | CSharp7.cs:44:9:44:13 | SSA def(y) | +| CSharp7.cs:44:9:44:9 | access to parameter y | CSharp7.cs:44:9:44:13 | SSA def(y) | +| CSharp7.cs:44:13:44:13 | access to parameter x | CSharp7.cs:44:9:44:9 | access to parameter y | | CSharp7.cs:47:10:47:10 | this | CSharp7.cs:49:9:49:24 | this access | | CSharp7.cs:49:9:49:24 | [post] this access | CSharp7.cs:50:9:50:21 | this access | | CSharp7.cs:49:9:49:24 | this access | CSharp7.cs:50:9:50:21 | this access | | CSharp7.cs:49:22:49:23 | SSA def(t1) | CSharp7.cs:51:18:51:19 | access to local variable t1 | +| CSharp7.cs:49:22:49:23 | String t1 | CSharp7.cs:49:22:49:23 | SSA def(t1) | | CSharp7.cs:50:9:50:21 | [post] this access | CSharp7.cs:52:9:52:17 | this access | | CSharp7.cs:50:9:50:21 | this access | CSharp7.cs:52:9:52:17 | this access | | CSharp7.cs:50:19:50:20 | SSA def(t2) | CSharp7.cs:54:14:54:15 | access to local variable t2 | +| CSharp7.cs:50:19:50:20 | String t2 | CSharp7.cs:50:19:50:20 | SSA def(t2) | +| CSharp7.cs:51:18:51:19 | access to local variable t1 | CSharp7.cs:51:13:51:14 | access to local variable t3 | | CSharp7.cs:52:9:52:17 | [post] this access | CSharp7.cs:55:9:55:32 | this access | | CSharp7.cs:52:9:52:17 | this access | CSharp7.cs:55:9:55:32 | this access | | CSharp7.cs:52:15:52:16 | SSA def(t1) | CSharp7.cs:53:14:53:15 | access to local variable t1 | +| CSharp7.cs:52:15:52:16 | access to local variable t1 | CSharp7.cs:52:15:52:16 | SSA def(t1) | +| CSharp7.cs:53:14:53:15 | access to local variable t1 | CSharp7.cs:53:9:53:10 | access to local variable t3 | +| CSharp7.cs:54:14:54:15 | access to local variable t2 | CSharp7.cs:54:9:54:10 | access to local variable t3 | | CSharp7.cs:55:30:55:31 | SSA def(t4) | CSharp7.cs:56:18:56:19 | access to local variable t4 | +| CSharp7.cs:55:30:55:31 | String t4 | CSharp7.cs:55:30:55:31 | SSA def(t4) | +| CSharp7.cs:56:18:56:19 | access to local variable t4 | CSharp7.cs:56:13:56:14 | access to local variable t5 | | CSharp7.cs:67:10:67:20 | this | CSharp7.cs:69:26:69:28 | this access | | CSharp7.cs:69:26:69:28 | [post] this access | CSharp7.cs:70:17:70:19 | this access | | CSharp7.cs:69:26:69:28 | call to method F | CSharp7.cs:69:9:69:22 | (..., ...) | | CSharp7.cs:69:26:69:28 | this access | CSharp7.cs:70:17:70:19 | this access | +| CSharp7.cs:70:13:70:13 | access to local variable z | CSharp7.cs:70:13:70:19 | SSA def(z) | | CSharp7.cs:70:13:70:19 | SSA def(z) | CSharp7.cs:73:16:73:16 | access to local variable z | | CSharp7.cs:70:17:70:19 | [post] this access | CSharp7.cs:71:18:71:20 | this access | -| CSharp7.cs:70:17:70:19 | call to method F | CSharp7.cs:70:13:70:19 | SSA def(z) | +| CSharp7.cs:70:17:70:19 | call to method F | CSharp7.cs:70:13:70:13 | access to local variable z | | CSharp7.cs:70:17:70:19 | this access | CSharp7.cs:71:18:71:20 | this access | | CSharp7.cs:71:18:71:20 | [post] this access | CSharp7.cs:72:13:72:15 | this access | | CSharp7.cs:71:18:71:20 | call to method F | CSharp7.cs:71:9:71:14 | (..., ...) | | CSharp7.cs:71:18:71:20 | this access | CSharp7.cs:72:13:72:15 | this access | +| CSharp7.cs:72:13:72:17 | access to field Item1 | CSharp7.cs:72:9:72:9 | access to local variable x | | CSharp7.cs:73:16:73:16 | [post] access to local variable z | CSharp7.cs:75:39:75:39 | access to local variable z | | CSharp7.cs:73:16:73:16 | access to local variable z | CSharp7.cs:75:39:75:39 | access to local variable z | | CSharp7.cs:73:27:73:35 | (..., ...) | CSharp7.cs:73:9:73:23 | (..., ...) | +| CSharp7.cs:73:28:73:28 | 1 | CSharp7.cs:73:10:73:10 | access to local variable x | +| CSharp7.cs:73:31:73:31 | 2 | CSharp7.cs:73:13:73:13 | access to local variable y | +| CSharp7.cs:73:34:73:34 | 3 | CSharp7.cs:73:16:73:22 | access to field Item1 | | CSharp7.cs:74:9:74:32 | SSA def(x) | CSharp7.cs:77:27:77:27 | access to local variable x | +| CSharp7.cs:74:10:74:10 | access to local variable x | CSharp7.cs:74:9:74:32 | SSA def(x) | | CSharp7.cs:74:18:74:32 | ... = ... | CSharp7.cs:74:9:74:14 | (..., ...) | | CSharp7.cs:74:27:74:32 | (..., ...) | CSharp7.cs:74:18:74:23 | (..., ...) | | CSharp7.cs:74:27:74:32 | (..., ...) | CSharp7.cs:74:18:74:32 | ... = ... | +| CSharp7.cs:74:28:74:28 | 1 | CSharp7.cs:74:19:74:19 | access to local variable x | +| CSharp7.cs:74:31:74:31 | 2 | CSharp7.cs:74:22:74:22 | access to local variable y | +| CSharp7.cs:75:9:75:40 | ... = ... | CSharp7.cs:75:9:75:40 | SSA def(a) | +| CSharp7.cs:75:9:75:40 | ... = ... | CSharp7.cs:75:9:75:40 | SSA def(b) | +| CSharp7.cs:75:9:75:40 | ... = ... | CSharp7.cs:75:9:75:40 | SSA def(c) | | CSharp7.cs:75:9:75:40 | SSA def(a) | CSharp7.cs:76:31:76:31 | access to local variable a | | CSharp7.cs:75:9:75:40 | SSA def(b) | CSharp7.cs:76:24:76:24 | access to local variable b | | CSharp7.cs:75:9:75:40 | SSA def(c) | CSharp7.cs:76:28:76:28 | access to local variable c | | CSharp7.cs:75:35:75:40 | (..., ...) | CSharp7.cs:75:9:75:31 | (..., ...) | -| CSharp7.cs:75:36:75:36 | 1 | CSharp7.cs:75:9:75:40 | SSA def(a) | +| CSharp7.cs:75:36:75:36 | 1 | CSharp7.cs:75:9:75:40 | ... = ... | | CSharp7.cs:76:23:76:33 | (..., ...) | CSharp7.cs:76:9:76:19 | (..., ...) | +| CSharp7.cs:76:24:76:24 | access to local variable b | CSharp7.cs:76:10:76:10 | access to local variable a | +| CSharp7.cs:76:28:76:28 | access to local variable c | CSharp7.cs:76:14:76:14 | access to local variable b | +| CSharp7.cs:76:31:76:31 | access to local variable a | CSharp7.cs:76:17:76:17 | access to local variable c | | CSharp7.cs:77:22:77:28 | (..., ...) | CSharp7.cs:77:9:77:18 | (..., ...) | +| CSharp7.cs:77:23:77:24 | "" | CSharp7.cs:77:9:77:28 | ... = ... | +| CSharp7.cs:77:27:77:27 | access to local variable x | CSharp7.cs:77:9:77:28 | ... = ... | | CSharp7.cs:80:21:80:21 | x | CSharp7.cs:82:20:82:20 | access to parameter x | | CSharp7.cs:85:10:85:18 | this | CSharp7.cs:90:18:90:28 | this access | +| CSharp7.cs:87:13:87:14 | access to local variable t1 | CSharp7.cs:87:13:87:34 | SSA def(t1) | | CSharp7.cs:87:13:87:34 | SSA def(t1) | CSharp7.cs:88:28:88:29 | access to local variable t1 | | CSharp7.cs:87:13:87:34 | SSA qualifier def(t1.Item1) | CSharp7.cs:90:20:90:27 | access to field Item1 | -| CSharp7.cs:87:18:87:34 | (..., ...) | CSharp7.cs:87:13:87:34 | SSA def(t1) | +| CSharp7.cs:87:18:87:34 | (..., ...) | CSharp7.cs:87:13:87:14 | access to local variable t1 | +| CSharp7.cs:88:9:88:29 | ... = ... | CSharp7.cs:88:9:88:29 | SSA def(t3) | | CSharp7.cs:88:9:88:29 | SSA def(t3) | CSharp7.cs:89:18:89:19 | access to local variable t3 | | CSharp7.cs:88:28:88:29 | access to local variable t1 | CSharp7.cs:88:9:88:24 | (..., ...) | | CSharp7.cs:88:28:88:29 | access to local variable t1 | CSharp7.cs:90:20:90:21 | access to local variable t1 | +| CSharp7.cs:89:18:89:19 | access to local variable t3 | CSharp7.cs:89:13:89:14 | access to local variable t4 | +| CSharp7.cs:90:18:90:28 | call to method I | CSharp7.cs:90:13:90:14 | access to local variable t5 | +| CSharp7.cs:95:18:95:38 | (..., ...) | CSharp7.cs:95:13:95:14 | access to local variable m1 | +| CSharp7.cs:96:18:96:43 | (..., ...) | CSharp7.cs:96:13:96:14 | access to local variable m2 | +| CSharp7.cs:101:18:101:48 | access to field Item1 | CSharp7.cs:101:13:101:14 | access to local variable m1 | +| CSharp7.cs:102:18:102:53 | access to field Item2 | CSharp7.cs:102:13:102:14 | access to local variable m2 | +| CSharp7.cs:107:9:107:46 | ... = ... | CSharp7.cs:107:9:107:46 | SSA def(m1) | +| CSharp7.cs:107:9:107:46 | ... = ... | CSharp7.cs:107:9:107:46 | SSA def(m2) | | CSharp7.cs:107:9:107:46 | SSA def(m1) | CSharp7.cs:110:27:110:28 | access to local variable m1 | | CSharp7.cs:107:9:107:46 | SSA def(m2) | CSharp7.cs:110:31:110:32 | access to local variable m2 | | CSharp7.cs:107:28:107:46 | (..., ...) | CSharp7.cs:107:9:107:24 | (..., ...) | -| CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:107:9:107:46 | SSA def(m1) | -| CSharp7.cs:107:40:107:45 | (..., ...) | CSharp7.cs:107:9:107:46 | SSA def(m2) | +| CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:107:9:107:46 | ... = ... | +| CSharp7.cs:107:40:107:45 | (..., ...) | CSharp7.cs:107:9:107:46 | ... = ... | | CSharp7.cs:110:9:110:33 | SSA def(m4) | CSharp7.cs:111:18:111:19 | access to local variable m4 | +| CSharp7.cs:110:15:110:16 | access to local variable m4 | CSharp7.cs:110:9:110:33 | SSA def(m4) | | CSharp7.cs:110:26:110:33 | (..., ...) | CSharp7.cs:110:9:110:22 | (..., ...) | +| CSharp7.cs:110:27:110:28 | access to local variable m1 | CSharp7.cs:110:10:110:11 | access to local variable m3 | +| CSharp7.cs:111:18:111:19 | access to local variable m4 | CSharp7.cs:111:13:111:14 | access to local variable m6 | +| CSharp7.cs:112:9:112:67 | ... = ... | CSharp7.cs:112:9:112:67 | SSA def(m9) | | CSharp7.cs:112:9:112:67 | SSA def(m9) | CSharp7.cs:113:19:113:20 | access to local variable m9 | | CSharp7.cs:112:38:112:67 | ... = ... | CSharp7.cs:112:9:112:34 | (..., ...) | | CSharp7.cs:112:38:112:67 | SSA def(m2) | CSharp7.cs:116:9:116:10 | access to local variable m2 | | CSharp7.cs:112:38:112:67 | SSA qualifier def(m2.Item1) | CSharp7.cs:117:19:117:26 | access to field Item1 | +| CSharp7.cs:112:43:112:44 | access to local variable m2 | CSharp7.cs:112:38:112:67 | SSA def(m2) | | CSharp7.cs:112:49:112:67 | (..., ...) | CSharp7.cs:112:38:112:45 | (..., ...) | | CSharp7.cs:112:49:112:67 | (..., ...) | CSharp7.cs:112:38:112:67 | ... = ... | -| CSharp7.cs:112:61:112:66 | (..., ...) | CSharp7.cs:112:38:112:67 | SSA def(m2) | +| CSharp7.cs:112:50:112:58 | "DefUse2" | CSharp7.cs:112:39:112:40 | access to local variable m1 | +| CSharp7.cs:112:61:112:66 | (..., ...) | CSharp7.cs:112:43:112:44 | access to local variable m2 | +| CSharp7.cs:113:19:113:20 | access to local variable m9 | CSharp7.cs:113:13:113:15 | access to local variable m10 | | CSharp7.cs:116:9:116:10 | [post] access to local variable m2 | CSharp7.cs:117:19:117:20 | access to local variable m2 | | CSharp7.cs:116:9:116:10 | access to local variable m2 | CSharp7.cs:117:19:117:20 | access to local variable m2 | +| CSharp7.cs:116:20:116:20 | 0 | CSharp7.cs:116:9:116:16 | access to field Item2 | +| CSharp7.cs:117:19:117:26 | access to field Item1 | CSharp7.cs:117:13:117:15 | access to local variable m11 | +| CSharp7.cs:121:22:121:36 | ... = ... | CSharp7.cs:121:16:121:18 | access to local variable m13 | +| CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:24 | access to local variable m12 | | CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:36 | ... = ... | | CSharp7.cs:127:9:127:12 | this | CSharp7.cs:133:24:133:25 | this access | | CSharp7.cs:129:20:129:20 | x | CSharp7.cs:129:32:129:32 | access to parameter x | | CSharp7.cs:129:32:129:32 | access to parameter x | CSharp7.cs:129:32:129:36 | ... + ... | | CSharp7.cs:129:36:129:36 | 1 | CSharp7.cs:129:32:129:36 | ... + ... | | CSharp7.cs:131:22:131:22 | t | CSharp7.cs:131:39:131:39 | access to parameter t | +| CSharp7.cs:133:24:133:25 | delegate creation of type Func | CSharp7.cs:133:19:133:20 | access to local variable f4 | | CSharp7.cs:133:24:133:25 | this access | CSharp7.cs:154:16:154:17 | this access | | CSharp7.cs:137:29:137:29 | x | CSharp7.cs:137:34:137:34 | access to parameter x | +| CSharp7.cs:137:29:137:38 | (...) => ... | CSharp7.cs:137:24:137:25 | access to local variable f5 | | CSharp7.cs:137:34:137:34 | access to parameter x | CSharp7.cs:137:34:137:38 | ... + ... | | CSharp7.cs:137:38:137:38 | 1 | CSharp7.cs:137:34:137:38 | ... + ... | | CSharp7.cs:139:9:139:51 | this | CSharp7.cs:139:38:139:39 | this access | @@ -102,6 +156,7 @@ | CSharp7.cs:143:9:147:9 | this | CSharp7.cs:146:20:146:21 | this access | | CSharp7.cs:145:13:145:35 | this | CSharp7.cs:145:30:145:31 | this access | | CSharp7.cs:145:24:145:24 | x | CSharp7.cs:145:33:145:33 | access to parameter x | +| CSharp7.cs:149:20:152:9 | (...) => ... | CSharp7.cs:149:16:149:16 | access to local variable a | | CSharp7.cs:157:10:157:17 | this | CSharp7.cs:169:9:169:9 | this access | | CSharp7.cs:160:18:160:18 | t | CSharp7.cs:160:24:160:24 | access to parameter t | | CSharp7.cs:162:9:167:9 | this | CSharp7.cs:165:13:165:16 | this access | @@ -110,8 +165,9 @@ | CSharp7.cs:165:13:165:16 | this access | CSharp7.cs:166:20:166:20 | this access | | CSharp7.cs:169:9:169:9 | this access | CSharp7.cs:170:9:170:9 | this access | | CSharp7.cs:173:10:173:19 | this | CSharp7.cs:180:21:180:21 | this access | +| CSharp7.cs:175:16:175:18 | access to local variable src | CSharp7.cs:175:16:175:30 | SSA def(src) | | CSharp7.cs:175:16:175:30 | SSA def(src) | CSharp7.cs:180:23:180:25 | access to local variable src | -| CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:175:16:175:30 | SSA def(src) | +| CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:175:16:175:18 | access to local variable src | | CSharp7.cs:176:9:176:40 | this | CSharp7.cs:176:31:176:31 | this access | | CSharp7.cs:176:25:176:25 | s | CSharp7.cs:176:33:176:33 | access to parameter s | | CSharp7.cs:176:31:176:34 | call to local function g | CSharp7.cs:176:31:176:39 | ... + ... | @@ -119,35 +175,50 @@ | CSharp7.cs:177:25:177:25 | s | CSharp7.cs:177:31:177:31 | access to parameter s | | CSharp7.cs:178:25:178:25 | s | CSharp7.cs:178:37:178:37 | access to parameter s | | CSharp7.cs:180:21:180:21 | this access | CSharp7.cs:181:21:181:21 | this access | +| CSharp7.cs:180:21:180:26 | call to local function f | CSharp7.cs:180:13:180:17 | access to local variable sink1 | | CSharp7.cs:180:23:180:25 | [post] access to local variable src | CSharp7.cs:181:23:181:25 | access to local variable src | | CSharp7.cs:180:23:180:25 | access to local variable src | CSharp7.cs:181:23:181:25 | access to local variable src | | CSharp7.cs:181:21:181:21 | this access | CSharp7.cs:182:21:182:21 | this access | +| CSharp7.cs:181:21:181:26 | call to local function g | CSharp7.cs:181:13:181:17 | access to local variable sink2 | | CSharp7.cs:181:23:181:25 | [post] access to local variable src | CSharp7.cs:182:23:182:25 | access to local variable src | | CSharp7.cs:181:23:181:25 | access to local variable src | CSharp7.cs:182:23:182:25 | access to local variable src | +| CSharp7.cs:182:21:182:26 | call to local function h | CSharp7.cs:182:13:182:17 | access to local variable sink3 | | CSharp7.cs:188:10:188:11 | this | CSharp7.cs:197:14:197:23 | this access | +| CSharp7.cs:190:13:190:14 | access to local variable v1 | CSharp7.cs:190:13:190:18 | SSA def(v1) | | CSharp7.cs:190:13:190:18 | SSA def(v1) | CSharp7.cs:191:26:191:27 | access to local variable v1 | -| CSharp7.cs:190:18:190:18 | 2 | CSharp7.cs:190:13:190:18 | SSA def(v1) | -| CSharp7.cs:191:22:191:27 | ref ... | CSharp7.cs:191:17:191:27 | SSA def(r1) | +| CSharp7.cs:190:18:190:18 | 2 | CSharp7.cs:190:13:190:14 | access to local variable v1 | +| CSharp7.cs:191:17:191:18 | access to local variable r1 | CSharp7.cs:191:17:191:27 | SSA def(r1) | +| CSharp7.cs:191:22:191:27 | ref ... | CSharp7.cs:191:17:191:18 | access to local variable r1 | | CSharp7.cs:191:26:191:27 | access to local variable v1 | CSharp7.cs:197:21:197:22 | access to local variable v1 | +| CSharp7.cs:192:13:192:17 | access to local variable array | CSharp7.cs:192:13:192:31 | SSA def(array) | | CSharp7.cs:192:13:192:31 | SSA def(array) | CSharp7.cs:194:14:194:18 | access to local variable array | -| CSharp7.cs:192:21:192:31 | array creation of type Int32[] | CSharp7.cs:192:13:192:31 | SSA def(array) | -| CSharp7.cs:193:14:193:14 | 3 | CSharp7.cs:193:9:193:14 | SSA def(r1) | +| CSharp7.cs:192:21:192:31 | array creation of type Int32[] | CSharp7.cs:192:13:192:17 | access to local variable array | +| CSharp7.cs:193:9:193:10 | access to local variable r1 | CSharp7.cs:193:9:193:14 | SSA def(r1) | +| CSharp7.cs:193:14:193:14 | 3 | CSharp7.cs:193:9:193:10 | access to local variable r1 | +| CSharp7.cs:194:9:194:10 | access to local variable r1 | CSharp7.cs:194:9:194:21 | SSA def(r1) | | CSharp7.cs:194:9:194:21 | SSA def(r1) | CSharp7.cs:196:26:196:27 | access to local variable r1 | | CSharp7.cs:194:14:194:18 | access to local variable array | CSharp7.cs:194:14:194:21 | access to array element | | CSharp7.cs:194:14:194:18 | access to local variable array | CSharp7.cs:195:26:195:30 | access to local variable array | -| CSharp7.cs:194:14:194:21 | access to array element | CSharp7.cs:194:9:194:21 | SSA def(r1) | +| CSharp7.cs:194:14:194:21 | access to array element | CSharp7.cs:194:9:194:10 | access to local variable r1 | +| CSharp7.cs:195:22:195:33 | ref ... | CSharp7.cs:195:17:195:18 | access to local variable r2 | | CSharp7.cs:195:26:195:30 | access to local variable array | CSharp7.cs:195:26:195:33 | access to array element | +| CSharp7.cs:196:22:196:27 | ref ... | CSharp7.cs:196:17:196:18 | access to local variable r3 | | CSharp7.cs:196:26:196:27 | access to local variable r1 | CSharp7.cs:198:33:198:34 | access to local variable r1 | | CSharp7.cs:197:14:197:23 | [post] this access | CSharp7.cs:198:26:198:35 | this access | +| CSharp7.cs:197:14:197:23 | call to method F2 | CSharp7.cs:197:9:197:10 | access to local variable v1 | | CSharp7.cs:197:14:197:23 | this access | CSharp7.cs:198:26:198:35 | this access | +| CSharp7.cs:198:22:198:35 | ref ... | CSharp7.cs:198:17:198:18 | access to local variable r4 | | CSharp7.cs:198:26:198:35 | [post] this access | CSharp7.cs:199:9:199:18 | this access | | CSharp7.cs:198:26:198:35 | this access | CSharp7.cs:199:9:199:18 | this access | | CSharp7.cs:198:33:198:34 | access to local variable r1 | CSharp7.cs:199:16:199:17 | access to local variable r1 | +| CSharp7.cs:199:22:199:22 | 3 | CSharp7.cs:199:9:199:22 | ... = ... | | CSharp7.cs:202:24:202:24 | p | CSharp7.cs:205:20:205:20 | access to parameter p | | CSharp7.cs:204:28:204:28 | q | CSharp7.cs:204:44:204:44 | access to parameter q | -| CSharp7.cs:215:13:215:17 | false | CSharp7.cs:215:9:215:17 | SSA def(x) | +| CSharp7.cs:215:9:215:9 | access to parameter x | CSharp7.cs:215:9:215:17 | SSA def(x) | +| CSharp7.cs:215:13:215:17 | false | CSharp7.cs:215:9:215:9 | access to parameter x | | CSharp7.cs:219:10:219:13 | this | CSharp7.cs:221:13:221:20 | this access | | CSharp7.cs:221:13:221:20 | [post] this access | CSharp7.cs:222:18:222:25 | this access | +| CSharp7.cs:221:13:221:20 | call to method f | CSharp7.cs:221:9:221:20 | ... = ... | | CSharp7.cs:221:13:221:20 | this access | CSharp7.cs:222:18:222:25 | this access | | CSharp7.cs:222:18:222:25 | [post] this access | CSharp7.cs:223:22:223:29 | this access | | CSharp7.cs:222:18:222:25 | call to method f | CSharp7.cs:222:9:222:14 | (..., ...) | @@ -156,14 +227,16 @@ | CSharp7.cs:223:22:223:29 | call to method f | CSharp7.cs:223:9:223:18 | (..., ...) | | CSharp7.cs:223:22:223:29 | this access | CSharp7.cs:224:22:224:33 | this access | | CSharp7.cs:224:22:224:33 | call to method f | CSharp7.cs:224:9:224:18 | (..., ...) | +| CSharp7.cs:232:16:232:16 | access to local variable o | CSharp7.cs:232:16:232:23 | SSA def(o) | | CSharp7.cs:232:16:232:23 | SSA def(o) | CSharp7.cs:233:13:233:13 | access to local variable o | -| CSharp7.cs:232:20:232:23 | null | CSharp7.cs:232:16:232:23 | SSA def(o) | -| CSharp7.cs:233:13:233:13 | access to local variable o | CSharp7.cs:233:18:233:23 | SSA def(i1) | +| CSharp7.cs:232:20:232:23 | null | CSharp7.cs:232:16:232:16 | access to local variable o | +| CSharp7.cs:233:13:233:13 | access to local variable o | CSharp7.cs:233:18:233:23 | Int32 i1 | | CSharp7.cs:233:13:233:13 | access to local variable o | CSharp7.cs:237:18:237:18 | access to local variable o | | CSharp7.cs:233:13:233:13 | access to local variable o | CSharp7.cs:248:9:274:9 | SSA phi read(o) | | CSharp7.cs:233:13:233:23 | [false] ... is ... | CSharp7.cs:233:13:233:33 | [false] ... && ... | | CSharp7.cs:233:13:233:23 | [true] ... is ... | CSharp7.cs:233:13:233:33 | [false] ... && ... | | CSharp7.cs:233:13:233:23 | [true] ... is ... | CSharp7.cs:233:13:233:33 | [true] ... && ... | +| CSharp7.cs:233:18:233:23 | Int32 i1 | CSharp7.cs:233:18:233:23 | SSA def(i1) | | CSharp7.cs:233:18:233:23 | SSA def(i1) | CSharp7.cs:233:28:233:29 | access to local variable i1 | | CSharp7.cs:233:28:233:29 | access to local variable i1 | CSharp7.cs:233:28:233:33 | ... > ... | | CSharp7.cs:233:28:233:29 | access to local variable i1 | CSharp7.cs:235:38:235:39 | access to local variable i1 | @@ -171,57 +244,69 @@ | CSharp7.cs:233:28:233:33 | ... > ... | CSharp7.cs:233:13:233:33 | [true] ... && ... | | CSharp7.cs:235:33:235:36 | "int " | CSharp7.cs:235:31:235:41 | $"..." | | CSharp7.cs:235:38:235:39 | access to local variable i1 | CSharp7.cs:235:31:235:41 | $"..." | -| CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:237:23:237:31 | SSA def(s1) | +| CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:237:23:237:31 | String s1 | | CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:241:18:241:18 | access to local variable o | | CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:248:9:274:9 | SSA phi read(o) | | CSharp7.cs:237:23:237:31 | SSA def(s1) | CSharp7.cs:239:41:239:42 | access to local variable s1 | +| CSharp7.cs:237:23:237:31 | String s1 | CSharp7.cs:237:23:237:31 | SSA def(s1) | | CSharp7.cs:239:33:239:39 | "string " | CSharp7.cs:239:31:239:44 | $"..." | | CSharp7.cs:239:41:239:42 | access to local variable s1 | CSharp7.cs:239:31:239:44 | $"..." | | CSharp7.cs:241:18:241:18 | access to local variable o | CSharp7.cs:244:18:244:18 | access to local variable o | | CSharp7.cs:241:18:241:18 | access to local variable o | CSharp7.cs:248:9:274:9 | SSA phi read(o) | +| CSharp7.cs:244:18:244:18 | access to local variable o | CSharp7.cs:244:23:244:28 | Object v1 | | CSharp7.cs:244:18:244:18 | access to local variable o | CSharp7.cs:248:9:274:9 | SSA phi read(o) | | CSharp7.cs:248:9:274:9 | SSA phi read(o) | CSharp7.cs:248:17:248:17 | access to local variable o | | CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:254:27:254:27 | access to local variable o | -| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:257:18:257:23 | SSA def(i2) | -| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:260:18:260:23 | SSA def(i3) | -| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:263:18:263:26 | SSA def(s2) | +| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:257:18:257:23 | Int32 i2 | +| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:260:18:260:23 | Int32 i3 | +| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:263:18:263:26 | String s2 | +| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:269:18:269:23 | Object v2 | | CSharp7.cs:252:26:252:26 | 1 | CSharp7.cs:252:26:252:30 | ... < ... | | CSharp7.cs:252:30:252:30 | 2 | CSharp7.cs:252:26:252:30 | ... < ... | -| CSharp7.cs:254:27:254:27 | access to local variable o | CSharp7.cs:254:32:254:40 | SSA def(s4) | +| CSharp7.cs:254:27:254:27 | access to local variable o | CSharp7.cs:254:32:254:40 | String s4 | | CSharp7.cs:254:32:254:40 | SSA def(s4) | CSharp7.cs:255:40:255:41 | access to local variable s4 | +| CSharp7.cs:254:32:254:40 | String s4 | CSharp7.cs:254:32:254:40 | SSA def(s4) | | CSharp7.cs:255:37:255:38 | "x " | CSharp7.cs:255:35:255:43 | $"..." | | CSharp7.cs:255:40:255:41 | access to local variable s4 | CSharp7.cs:255:35:255:43 | $"..." | +| CSharp7.cs:257:18:257:23 | Int32 i2 | CSharp7.cs:257:18:257:23 | SSA def(i2) | | CSharp7.cs:257:18:257:23 | SSA def(i2) | CSharp7.cs:257:30:257:31 | access to local variable i2 | | CSharp7.cs:257:30:257:31 | access to local variable i2 | CSharp7.cs:257:30:257:35 | ... > ... | | CSharp7.cs:257:30:257:31 | access to local variable i2 | CSharp7.cs:258:47:258:48 | access to local variable i2 | | CSharp7.cs:258:37:258:45 | "positive " | CSharp7.cs:258:35:258:50 | $"..." | | CSharp7.cs:258:47:258:48 | access to local variable i2 | CSharp7.cs:258:35:258:50 | $"..." | +| CSharp7.cs:260:18:260:23 | Int32 i3 | CSharp7.cs:260:18:260:23 | SSA def(i3) | | CSharp7.cs:260:18:260:23 | SSA def(i3) | CSharp7.cs:261:42:261:43 | access to local variable i3 | | CSharp7.cs:261:37:261:40 | "int " | CSharp7.cs:261:35:261:45 | $"..." | | CSharp7.cs:261:42:261:43 | access to local variable i3 | CSharp7.cs:261:35:261:45 | $"..." | | CSharp7.cs:263:18:263:26 | SSA def(s2) | CSharp7.cs:264:45:264:46 | access to local variable s2 | +| CSharp7.cs:263:18:263:26 | String s2 | CSharp7.cs:263:18:263:26 | SSA def(s2) | | CSharp7.cs:264:37:264:43 | "string " | CSharp7.cs:264:35:264:48 | $"..." | | CSharp7.cs:264:45:264:46 | access to local variable s2 | CSharp7.cs:264:35:264:48 | $"..." | +| CSharp7.cs:282:13:282:16 | access to local variable dict | CSharp7.cs:282:13:282:48 | SSA def(dict) | | CSharp7.cs:282:13:282:48 | SSA def(dict) | CSharp7.cs:283:20:283:23 | access to local variable dict | -| CSharp7.cs:282:20:282:48 | object creation of type Dictionary | CSharp7.cs:282:13:282:48 | SSA def(dict) | +| CSharp7.cs:282:20:282:48 | object creation of type Dictionary | CSharp7.cs:282:13:282:16 | access to local variable dict | +| CSharp7.cs:283:13:283:16 | access to local variable list | CSharp7.cs:283:13:283:62 | SSA def(list) | | CSharp7.cs:283:13:283:62 | SSA def(list) | CSharp7.cs:285:39:285:42 | access to local variable list | -| CSharp7.cs:283:20:283:62 | call to method Select,(Int32,String)> | CSharp7.cs:283:13:283:62 | SSA def(list) | +| CSharp7.cs:283:20:283:62 | call to method Select,(Int32,String)> | CSharp7.cs:283:13:283:16 | access to local variable list | | CSharp7.cs:283:32:283:35 | item | CSharp7.cs:283:41:283:44 | access to parameter item | | CSharp7.cs:283:41:283:44 | access to parameter item | CSharp7.cs:283:41:283:48 | access to property Key | | CSharp7.cs:283:41:283:44 | access to parameter item | CSharp7.cs:283:51:283:54 | access to parameter item | | CSharp7.cs:283:51:283:54 | access to parameter item | CSharp7.cs:283:51:283:60 | access to property Value | | CSharp7.cs:285:39:285:42 | access to local variable list | CSharp7.cs:287:36:287:39 | access to local variable list | | CSharp7.cs:287:36:287:39 | access to local variable list | CSharp7.cs:289:32:289:35 | access to local variable list | +| CSharp7.cs:297:18:297:18 | access to local variable x | CSharp7.cs:297:18:297:22 | SSA def(x) | | CSharp7.cs:297:18:297:22 | SSA def(x) | CSharp7.cs:297:25:297:25 | SSA phi(x) | -| CSharp7.cs:297:22:297:22 | 0 | CSharp7.cs:297:18:297:22 | SSA def(x) | +| CSharp7.cs:297:22:297:22 | 0 | CSharp7.cs:297:18:297:18 | access to local variable x | | CSharp7.cs:297:25:297:25 | SSA phi(x) | CSharp7.cs:297:25:297:25 | access to local variable x | | CSharp7.cs:297:25:297:25 | access to local variable x | CSharp7.cs:297:25:297:30 | ... < ... | | CSharp7.cs:297:25:297:25 | access to local variable x | CSharp7.cs:297:35:297:35 | access to local variable x | | CSharp7.cs:297:25:297:30 | ... < ... | CSharp7.cs:297:25:297:44 | [false] ... && ... | | CSharp7.cs:297:25:297:30 | ... < ... | CSharp7.cs:297:25:297:44 | [true] ... && ... | -| CSharp7.cs:297:35:297:35 | access to local variable x | CSharp7.cs:297:40:297:44 | SSA def(y) | +| CSharp7.cs:297:35:297:35 | access to local variable x | CSharp7.cs:297:40:297:44 | Int32 y | | CSharp7.cs:297:35:297:35 | access to local variable x | CSharp7.cs:297:49:297:49 | access to local variable x | | CSharp7.cs:297:35:297:44 | [false] ... is ... | CSharp7.cs:297:25:297:44 | [false] ... && ... | | CSharp7.cs:297:35:297:44 | [true] ... is ... | CSharp7.cs:297:25:297:44 | [true] ... && ... | +| CSharp7.cs:297:40:297:44 | Int32 y | CSharp7.cs:297:40:297:44 | SSA def(y) | | CSharp7.cs:297:40:297:44 | SSA def(y) | CSharp7.cs:299:31:299:31 | access to local variable y | | CSharp7.cs:297:47:297:49 | SSA def(x) | CSharp7.cs:297:25:297:25 | SSA phi(x) | +| CSharp7.cs:297:49:297:49 | access to local variable x | CSharp7.cs:297:47:297:49 | SSA def(x) | diff --git a/csharp/ql/test/library-tests/csharp7/TaintReaches.expected b/csharp/ql/test/library-tests/csharp7/TaintReaches.expected index 6e9a4c8dcfa..d3765576f50 100644 --- a/csharp/ql/test/library-tests/csharp7/TaintReaches.expected +++ b/csharp/ql/test/library-tests/csharp7/TaintReaches.expected @@ -1,7 +1,15 @@ +| CSharp7.cs:39:13:39:21 | "tainted" | CSharp7.cs:39:9:39:9 | access to parameter x | | CSharp7.cs:39:13:39:21 | "tainted" | CSharp7.cs:39:9:39:21 | SSA def(x) | +| CSharp7.cs:77:23:77:24 | "" | CSharp7.cs:77:9:77:28 | ... = ... | +| CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:107:9:107:46 | ... = ... | | CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:107:9:107:46 | SSA def(m1) | +| CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:110:10:110:11 | access to local variable m3 | | CSharp7.cs:107:29:107:37 | "DefUse1" | CSharp7.cs:110:27:110:28 | access to local variable m1 | +| CSharp7.cs:112:50:112:58 | "DefUse2" | CSharp7.cs:112:39:112:40 | access to local variable m1 | +| CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:16:121:18 | access to local variable m13 | +| CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:24 | access to local variable m12 | | CSharp7.cs:121:28:121:36 | "DefUse3" | CSharp7.cs:121:22:121:36 | ... = ... | +| CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:175:16:175:18 | access to local variable src | | CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:175:16:175:30 | SSA def(src) | | CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:180:23:180:25 | access to local variable src | | CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:181:23:181:25 | access to local variable src | diff --git a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected index 484ab5d1788..6c2746f51ea 100644 --- a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected +++ b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.expected @@ -5,14 +5,19 @@ suppressNullableWarnings | NullableRefTypes.cs:88:13:88:14 | ...! | NullableRefTypes.cs:88:13:88:13 | access to local variable x | | NullableRefTypes.cs:113:36:113:44 | ...! | NullableRefTypes.cs:113:36:113:43 | access to field Property | nullableDataFlow +| NullableRefTypes.cs:84:17:84:17 | access to local variable x | NullableRefTypes.cs:84:17:84:28 | SSA def(x) | | NullableRefTypes.cs:84:17:84:28 | SSA def(x) | NullableRefTypes.cs:85:20:85:20 | access to local variable x | -| NullableRefTypes.cs:84:21:84:28 | "source" | NullableRefTypes.cs:84:17:84:28 | SSA def(x) | +| NullableRefTypes.cs:84:21:84:28 | "source" | NullableRefTypes.cs:84:17:84:17 | access to local variable x | | NullableRefTypes.cs:85:20:85:20 | access to local variable x | NullableRefTypes.cs:85:20:85:21 | ...! | | NullableRefTypes.cs:85:20:85:20 | access to local variable x | NullableRefTypes.cs:86:13:86:13 | access to local variable x | +| NullableRefTypes.cs:85:20:85:21 | ...! | NullableRefTypes.cs:85:16:85:16 | access to local variable y | | NullableRefTypes.cs:86:13:86:13 | access to local variable x | NullableRefTypes.cs:86:13:86:14 | ...! | +| NullableRefTypes.cs:86:13:86:14 | ...! | NullableRefTypes.cs:86:9:86:9 | access to local variable y | +| NullableRefTypes.cs:87:9:87:9 | access to local variable x | NullableRefTypes.cs:87:9:87:16 | SSA def(x) | | NullableRefTypes.cs:87:9:87:16 | SSA def(x) | NullableRefTypes.cs:88:13:88:13 | access to local variable x | -| NullableRefTypes.cs:87:13:87:16 | null | NullableRefTypes.cs:87:9:87:16 | SSA def(x) | +| NullableRefTypes.cs:87:13:87:16 | null | NullableRefTypes.cs:87:9:87:9 | access to local variable x | | NullableRefTypes.cs:88:13:88:13 | access to local variable x | NullableRefTypes.cs:88:13:88:14 | ...! | +| NullableRefTypes.cs:88:13:88:14 | ...! | NullableRefTypes.cs:88:9:88:9 | access to local variable y | nullableControlFlow | NullableRefTypes.cs:82:10:82:40 | enter TestSuppressNullableWarningExpr | NullableRefTypes.cs:83:5:89:5 | {...} | successor | | NullableRefTypes.cs:82:10:82:40 | exit TestSuppressNullableWarningExpr (normal) | NullableRefTypes.cs:82:10:82:40 | exit TestSuppressNullableWarningExpr | successor | diff --git a/csharp/ql/test/library-tests/dataflow/async/Async.expected b/csharp/ql/test/library-tests/dataflow/async/Async.expected index ed0395fff0b..743f8d120b2 100644 --- a/csharp/ql/test/library-tests/dataflow/async/Async.expected +++ b/csharp/ql/test/library-tests/dataflow/async/Async.expected @@ -10,7 +10,8 @@ edges | Async.cs:21:32:21:36 | access to parameter input : String | Async.cs:21:20:21:37 | call to method ReturnAwait : Task [property Result] : String | provenance | | | Async.cs:21:32:21:36 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | provenance | | | Async.cs:24:41:24:45 | input : String | Async.cs:26:35:26:39 | access to parameter input : String | provenance | | -| Async.cs:26:17:26:40 | await ... : String | Async.cs:27:14:27:14 | access to local variable x | provenance | | +| Async.cs:26:13:26:13 | access to local variable x : String | Async.cs:27:14:27:14 | access to local variable x | provenance | | +| Async.cs:26:17:26:40 | await ... : String | Async.cs:26:13:26:13 | access to local variable x : String | provenance | | | Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | Async.cs:26:17:26:40 | await ... : String | provenance | | | Async.cs:26:35:26:39 | access to parameter input : String | Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | provenance | | | Async.cs:26:35:26:39 | access to parameter input : String | Async.cs:35:51:35:51 | x : String | provenance | | @@ -47,6 +48,7 @@ nodes | Async.cs:21:20:21:37 | call to method ReturnAwait : Task [property Result] : String | semmle.label | call to method ReturnAwait : Task [property Result] : String | | Async.cs:21:32:21:36 | access to parameter input : String | semmle.label | access to parameter input : String | | Async.cs:24:41:24:45 | input : String | semmle.label | input : String | +| Async.cs:26:13:26:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Async.cs:26:17:26:40 | await ... : String | semmle.label | await ... : String | | Async.cs:26:23:26:40 | call to method ReturnAwait : Task [property Result] : String | semmle.label | call to method ReturnAwait : Task [property Result] : String | | Async.cs:26:35:26:39 | access to parameter input : String | semmle.label | access to parameter input : String | 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 daf679b629a..6ebc0d47f02 100644 --- a/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected @@ -5,11 +5,31 @@ edges | CallSensitivityFlow.cs:27:40:27:40 | o : Object | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | provenance | | | CallSensitivityFlow.cs:27:40:27:40 | o : Object | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | provenance | | | CallSensitivityFlow.cs:35:41:35:41 | o : Object | CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | provenance | | -| CallSensitivityFlow.cs:43:45:43:45 | o : Object | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | provenance | | -| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | -| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | -| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | -| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:43:45:43:45 | o : Object | CallSensitivityFlow.cs:45:16:45:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:45:16:45:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:49:20:49:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:49:20:49:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:50:13:50:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:50:13:50:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:52:16:52:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:52:16:52:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:56:46:56:46 | o : Object | CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | provenance | | | CallSensitivityFlow.cs:78:24:78:35 | object creation of type Object : Object | CallSensitivityFlow.cs:19:39:19:39 | o : Object | provenance | | | CallSensitivityFlow.cs:79:25:79:36 | object creation of type Object : Object | CallSensitivityFlow.cs:27:40:27:40 | o : Object | provenance | | | CallSensitivityFlow.cs:80:26:80:37 | object creation of type Object : Object | CallSensitivityFlow.cs:35:41:35:41 | o : Object | provenance | | @@ -31,7 +51,11 @@ edges | CallSensitivityFlow.cs:119:32:119:43 | object creation of type Object : Object | CallSensitivityFlow.cs:140:49:140:49 | o : Object | provenance | | | CallSensitivityFlow.cs:124:43:124:43 | o : Object | CallSensitivityFlow.cs:128:22:128:22 | access to parameter o | provenance | | | CallSensitivityFlow.cs:132:44:132:44 | o : Object | CallSensitivityFlow.cs:136:22:136:22 | access to parameter o | provenance | | -| CallSensitivityFlow.cs:140:49:140:49 | o : Object | CallSensitivityFlow.cs:150:18:150:19 | access to local variable o3 | provenance | | +| CallSensitivityFlow.cs:140:49:140:49 | o : Object | CallSensitivityFlow.cs:142:20:142:21 | access to local variable o1 : Object | provenance | | +| CallSensitivityFlow.cs:142:20:142:21 | access to local variable o1 : Object | CallSensitivityFlow.cs:146:24:146:26 | access to local variable tmp : Object | provenance | | +| CallSensitivityFlow.cs:146:24:146:26 | access to local variable tmp : Object | CallSensitivityFlow.cs:147:17:147:18 | access to local variable o2 : Object | provenance | | +| CallSensitivityFlow.cs:147:17:147:18 | access to local variable o2 : Object | CallSensitivityFlow.cs:149:20:149:21 | access to local variable o3 : Object | provenance | | +| CallSensitivityFlow.cs:149:20:149:21 | access to local variable o3 : Object | CallSensitivityFlow.cs:150:18:150:19 | access to local variable o3 | provenance | | | CallSensitivityFlow.cs:162:34:162:34 | o : Object | CallSensitivityFlow.cs:164:14:164:14 | access to parameter o | provenance | | | CallSensitivityFlow.cs:167:44:167:44 | o : Object | CallSensitivityFlow.cs:169:14:169:14 | access to parameter o : Object | provenance | | | CallSensitivityFlow.cs:169:14:169:14 | access to parameter o : Object | CallSensitivityFlow.cs:162:34:162:34 | o : Object | provenance | | @@ -39,7 +63,8 @@ edges | CallSensitivityFlow.cs:174:45:174:53 | call to method MOut : Object | CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object | provenance | | | CallSensitivityFlow.cs:182:21:182:32 | object creation of type Object : Object | CallSensitivityFlow.cs:205:40:205:40 | o : Object | provenance | | | CallSensitivityFlow.cs:185:21:185:32 | object creation of type Object : Object | CallSensitivityFlow.cs:167:44:167:44 | o : Object | provenance | | -| CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object | CallSensitivityFlow.cs:188:14:188:14 | access to local variable o | provenance | | +| CallSensitivityFlow.cs:187:13:187:13 | access to local variable o : Object | CallSensitivityFlow.cs:188:14:188:14 | access to local variable o | provenance | | +| CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object | CallSensitivityFlow.cs:187:13:187:13 | access to local variable o : Object | provenance | | | CallSensitivityFlow.cs:205:40:205:40 | o : Object | CallSensitivityFlow.cs:208:18:208:18 | access to parameter o | provenance | | nodes | CallSensitivityFlow.cs:7:38:7:38 | o : Object | semmle.label | o : Object | @@ -54,11 +79,31 @@ nodes | CallSensitivityFlow.cs:35:41:35:41 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | semmle.label | [cond (line 35): true] access to parameter o | | CallSensitivityFlow.cs:43:45:43:45 | o : Object | semmle.label | o : Object | +| CallSensitivityFlow.cs:45:16:45:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:49:20:49:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:50:13:50:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:52:16:52:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | semmle.label | access to local variable o3 | | CallSensitivityFlow.cs:56:46:56:46 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:56:46:56:46 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:56:46:56:46 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:56:46:56:46 | o : Object | semmle.label | o : Object | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:58:16:58:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:62:20:62:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:63:13:63:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | +| CallSensitivityFlow.cs:65:16:65:17 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | semmle.label | access to local variable o3 | | CallSensitivityFlow.cs:78:24:78:35 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | CallSensitivityFlow.cs:79:25:79:36 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | @@ -84,6 +129,10 @@ nodes | CallSensitivityFlow.cs:132:44:132:44 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:136:22:136:22 | access to parameter o | semmle.label | access to parameter o | | CallSensitivityFlow.cs:140:49:140:49 | o : Object | semmle.label | o : Object | +| CallSensitivityFlow.cs:142:20:142:21 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| CallSensitivityFlow.cs:146:24:146:26 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object | +| CallSensitivityFlow.cs:147:17:147:18 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| CallSensitivityFlow.cs:149:20:149:21 | access to local variable o3 : Object | semmle.label | access to local variable o3 : Object | | CallSensitivityFlow.cs:150:18:150:19 | access to local variable o3 | semmle.label | access to local variable o3 | | CallSensitivityFlow.cs:162:34:162:34 | o : Object | semmle.label | o : Object | | CallSensitivityFlow.cs:164:14:164:14 | access to parameter o | semmle.label | access to parameter o | @@ -93,6 +142,7 @@ nodes | 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:13:187:13 | access to local variable o : Object | semmle.label | access to local variable o : 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 | diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected index 2aadd5b0bbf..4230fdcc5a1 100644 --- a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected @@ -46,19 +46,23 @@ edges | CollectionFlow.cs:36:49:36:52 | args : null [element] : A | CollectionFlow.cs:36:63:36:66 | access to parameter args : null [element] : A | provenance | | | CollectionFlow.cs:36:63:36:66 | access to parameter args : A[] [element] : A | CollectionFlow.cs:36:63:36:69 | access to array element | provenance | | | CollectionFlow.cs:36:63:36:66 | access to parameter args : null [element] : A | CollectionFlow.cs:36:63:36:69 | access to array element | provenance | | -| CollectionFlow.cs:40:17:40:23 | object creation of type A : A | CollectionFlow.cs:41:27:41:27 | access to local variable a : A | provenance | | -| CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:42:14:42:16 | access to local variable as : null [element] : A | provenance | | -| CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:43:18:43:20 | access to local variable as : null [element] : A | provenance | | -| CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:40:13:40:13 | access to local variable a : A | CollectionFlow.cs:41:27:41:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:40:17:40:23 | object creation of type A : A | CollectionFlow.cs:40:13:40:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | CollectionFlow.cs:42:14:42:16 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | CollectionFlow.cs:43:18:43:20 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | provenance | | | CollectionFlow.cs:41:27:41:27 | access to local variable a : A | CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | provenance | | | CollectionFlow.cs:42:14:42:16 | access to local variable as : null [element] : A | CollectionFlow.cs:42:14:42:19 | access to array element | provenance | | | CollectionFlow.cs:43:18:43:20 | access to local variable as : null [element] : A | CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | provenance | | | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | CollectionFlow.cs:22:34:22:35 | ts : null [element] : A | provenance | | | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | CollectionFlow.cs:44:14:44:23 | call to method First | provenance | | -| CollectionFlow.cs:58:17:58:23 | object creation of type A : A | CollectionFlow.cs:59:53:59:53 | access to local variable a : A | provenance | | -| CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:60:14:60:14 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | -| CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:61:18:61:18 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | -| CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:62:20:62:20 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:58:13:58:13 | access to local variable a : A | CollectionFlow.cs:59:53:59:53 | access to local variable a : A | provenance | | +| CollectionFlow.cs:58:17:58:23 | object creation of type A : A | CollectionFlow.cs:58:13:58:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:60:14:60:14 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:61:18:61:18 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:62:20:62:20 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | +| CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | provenance | | | CollectionFlow.cs:59:45:59:55 | { ..., ... } : A[] [element] : A | CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | provenance | | | CollectionFlow.cs:59:53:59:53 | access to local variable a : A | CollectionFlow.cs:59:45:59:55 | { ..., ... } : A[] [element] : A | provenance | | | CollectionFlow.cs:60:14:60:14 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:60:14:60:17 | access to field As : A[] [element] : A | provenance | | @@ -68,7 +72,8 @@ edges | CollectionFlow.cs:62:20:62:20 | access to local variable c : CollectionFlow [field As, element] : A | CollectionFlow.cs:62:20:62:23 | access to field As : A[] [element] : A | provenance | | | CollectionFlow.cs:62:20:62:23 | access to field As : A[] [element] : A | CollectionFlow.cs:22:34:22:35 | ts : A[] [element] : A | provenance | | | CollectionFlow.cs:62:20:62:23 | access to field As : A[] [element] : A | CollectionFlow.cs:62:14:62:24 | call to method First | provenance | | -| CollectionFlow.cs:76:17:76:23 | object creation of type A : A | CollectionFlow.cs:78:18:78:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:76:13:76:13 | access to local variable a : A | CollectionFlow.cs:78:18:78:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:76:17:76:23 | object creation of type A : A | CollectionFlow.cs:76:13:76:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:78:9:78:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:79:14:79:16 | access to local variable as : A[] [element] : A | provenance | | | CollectionFlow.cs:78:9:78:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:80:18:80:20 | access to local variable as : A[] [element] : A | provenance | | | CollectionFlow.cs:78:9:78:11 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:81:20:81:22 | access to local variable as : A[] [element] : A | provenance | | @@ -77,7 +82,8 @@ edges | CollectionFlow.cs:80:18:80:20 | access to local variable as : A[] [element] : A | CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | provenance | | | CollectionFlow.cs:81:20:81:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:22:34:22:35 | ts : A[] [element] : A | provenance | | | CollectionFlow.cs:81:20:81:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:81:14:81:23 | call to method First | provenance | | -| CollectionFlow.cs:96:17:96:23 | object creation of type A : A | CollectionFlow.cs:98:19:98:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:96:13:96:13 | access to local variable a : A | CollectionFlow.cs:98:19:98:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:96:17:96:23 | object creation of type A : A | CollectionFlow.cs:96:13:96:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:98:9:98:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:99:14:99:17 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:98:9:98:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:100:22:100:25 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:98:9:98:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:101:24:101:27 | access to local variable list : List [element] : A | provenance | | @@ -86,16 +92,19 @@ edges | CollectionFlow.cs:100:22:100:25 | access to local variable list : List [element] : A | CollectionFlow.cs:16:49:16:52 | list : List [element] : A | provenance | | | CollectionFlow.cs:101:24:101:27 | access to local variable list : List [element] : A | CollectionFlow.cs:24:43:24:46 | list : List [element] : A | provenance | | | CollectionFlow.cs:101:24:101:27 | access to local variable list : List [element] : A | CollectionFlow.cs:101:14:101:28 | call to method ListFirst | provenance | | -| CollectionFlow.cs:115:17:115:23 | object creation of type A : A | CollectionFlow.cs:116:36:116:36 | access to local variable a : A | provenance | | -| CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | CollectionFlow.cs:117:14:117:17 | access to local variable list : List [element] : A | provenance | | -| CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | CollectionFlow.cs:118:22:118:25 | access to local variable list : List [element] : A | provenance | | -| CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:115:13:115:13 | access to local variable a : A | CollectionFlow.cs:116:36:116:36 | access to local variable a : A | provenance | | +| CollectionFlow.cs:115:17:115:23 | object creation of type A : A | CollectionFlow.cs:115:13:115:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | CollectionFlow.cs:117:14:117:17 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | CollectionFlow.cs:118:22:118:25 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:116:36:116:36 | access to local variable a : A | CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | provenance | | | CollectionFlow.cs:117:14:117:17 | access to local variable list : List [element] : A | CollectionFlow.cs:117:14:117:20 | access to indexer | provenance | | | CollectionFlow.cs:118:22:118:25 | access to local variable list : List [element] : A | CollectionFlow.cs:16:49:16:52 | list : List [element] : A | provenance | | | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | CollectionFlow.cs:24:43:24:46 | list : List [element] : A | provenance | | | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | CollectionFlow.cs:119:14:119:28 | call to method ListFirst | provenance | | -| CollectionFlow.cs:132:17:132:23 | object creation of type A : A | CollectionFlow.cs:134:18:134:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:132:13:132:13 | access to local variable a : A | CollectionFlow.cs:134:18:134:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:132:17:132:23 | object creation of type A : A | CollectionFlow.cs:132:13:132:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:134:9:134:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:135:14:135:17 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:134:9:134:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:136:22:136:25 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:134:9:134:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:137:24:137:27 | access to local variable list : List [element] : A | provenance | | @@ -104,7 +113,8 @@ edges | CollectionFlow.cs:136:22:136:25 | access to local variable list : List [element] : A | CollectionFlow.cs:16:49:16:52 | list : List [element] : A | provenance | | | CollectionFlow.cs:137:24:137:27 | access to local variable list : List [element] : A | CollectionFlow.cs:24:43:24:46 | list : List [element] : A | provenance | | | CollectionFlow.cs:137:24:137:27 | access to local variable list : List [element] : A | CollectionFlow.cs:137:14:137:28 | call to method ListFirst | provenance | | -| CollectionFlow.cs:151:17:151:23 | object creation of type A : A | CollectionFlow.cs:153:19:153:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:151:13:151:13 | access to local variable a : A | CollectionFlow.cs:153:19:153:19 | access to local variable a : A | provenance | | +| CollectionFlow.cs:151:17:151:23 | object creation of type A : A | CollectionFlow.cs:151:13:151:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:153:9:153:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:154:14:154:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:153:9:153:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:155:23:155:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:153:9:153:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:156:28:156:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | @@ -119,12 +129,14 @@ edges | CollectionFlow.cs:157:29:157:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:157:14:157:33 | call to method DictFirstValue | provenance | | | CollectionFlow.cs:158:30:158:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:158:30:158:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:158:14:158:34 | call to method DictValuesFirst | provenance | | -| CollectionFlow.cs:174:17:174:23 | object creation of type A : A | CollectionFlow.cs:175:52:175:52 | access to local variable a : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:176:14:176:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:177:23:177:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:178:28:178:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:179:29:179:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:174:13:174:13 | access to local variable a : A | CollectionFlow.cs:175:52:175:52 | access to local variable a : A | provenance | | +| CollectionFlow.cs:174:17:174:23 | object creation of type A : A | CollectionFlow.cs:174:13:174:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:176:14:176:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:177:23:177:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:178:28:178:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:179:29:179:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:175:52:175:52 | access to local variable a : A | CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:176:14:176:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:176:14:176:20 | access to indexer | provenance | | | CollectionFlow.cs:177:23:177:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:18:61:18:64 | dict : Dictionary [element, property Value] : A | provenance | | @@ -134,12 +146,14 @@ edges | CollectionFlow.cs:179:29:179:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:179:14:179:33 | call to method DictFirstValue | provenance | | | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:180:14:180:34 | call to method DictValuesFirst | provenance | | -| CollectionFlow.cs:195:17:195:23 | object creation of type A : A | CollectionFlow.cs:196:53:196:53 | access to local variable a : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:197:14:197:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:198:23:198:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:199:28:199:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:200:29:200:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | -| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:195:13:195:13 | access to local variable a : A | CollectionFlow.cs:196:53:196:53 | access to local variable a : A | provenance | | +| CollectionFlow.cs:195:17:195:23 | object creation of type A : A | CollectionFlow.cs:195:13:195:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:197:14:197:17 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:198:23:198:26 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:199:28:199:31 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:200:29:200:32 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | +| CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:196:53:196:53 | access to local variable a : A | CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:197:14:197:17 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:197:14:197:20 | access to indexer | provenance | | | CollectionFlow.cs:198:23:198:26 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:18:61:18:64 | dict : Dictionary [element, property Value] : A | provenance | | @@ -149,11 +163,13 @@ edges | CollectionFlow.cs:200:29:200:32 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:200:14:200:33 | call to method DictFirstValue | provenance | | | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary [element, property Value] : A | provenance | | | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | CollectionFlow.cs:201:14:201:34 | call to method DictValuesFirst | provenance | | -| CollectionFlow.cs:217:17:217:23 | object creation of type A : A | CollectionFlow.cs:218:49:218:49 | access to local variable a : A | provenance | | -| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:219:14:219:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:220:21:220:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:217:13:217:13 | access to local variable a : A | CollectionFlow.cs:218:49:218:49 | access to local variable a : A | provenance | | +| CollectionFlow.cs:217:17:217:23 | object creation of type A : A | CollectionFlow.cs:217:13:217:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:219:14:219:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:220:21:220:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:218:49:218:49 | access to local variable a : A | CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:219:14:219:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:219:14:219:22 | access to property Keys : Dictionary.KeyCollection [element] : A | provenance | | | CollectionFlow.cs:219:14:219:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:219:14:219:30 | call to method First | provenance | | @@ -162,11 +178,13 @@ edges | CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:221:14:221:32 | call to method DictKeysFirst | provenance | | | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:34:57:34:60 | dict : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:222:14:222:31 | call to method DictFirstKey | provenance | | -| CollectionFlow.cs:236:17:236:23 | object creation of type A : A | CollectionFlow.cs:237:48:237:48 | access to local variable a : A | provenance | | -| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:238:14:238:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:239:21:239:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | -| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:236:13:236:13 | access to local variable a : A | CollectionFlow.cs:237:48:237:48 | access to local variable a : A | provenance | | +| CollectionFlow.cs:236:17:236:23 | object creation of type A : A | CollectionFlow.cs:236:13:236:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:238:14:238:17 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:239:21:239:24 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | +| CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:237:48:237:48 | access to local variable a : A | CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:238:14:238:17 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:238:14:238:22 | access to property Keys : Dictionary.KeyCollection [element] : A | provenance | | | CollectionFlow.cs:238:14:238:22 | access to property Keys : Dictionary.KeyCollection [element] : A | CollectionFlow.cs:238:14:238:30 | call to method First | provenance | | @@ -175,24 +193,31 @@ edges | CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:240:14:240:32 | call to method DictKeysFirst | provenance | | | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:34:57:34:60 | dict : Dictionary [element, property Key] : A | provenance | | | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | CollectionFlow.cs:241:14:241:31 | call to method DictFirstKey | provenance | | -| CollectionFlow.cs:255:17:255:23 | object creation of type A : A | CollectionFlow.cs:256:27:256:27 | access to local variable a : A | provenance | | -| CollectionFlow.cs:256:25:256:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:255:13:255:13 | access to local variable a : A | CollectionFlow.cs:256:27:256:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:255:17:255:23 | object creation of type A : A | CollectionFlow.cs:255:13:255:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:256:13:256:15 | access to local variable as : null [element] : A | CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:256:25:256:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:256:13:256:15 | access to local variable as : null [element] : A | provenance | | | CollectionFlow.cs:256:27:256:27 | access to local variable a : A | CollectionFlow.cs:256:25:256:29 | { ..., ... } : null [element] : A | provenance | | -| CollectionFlow.cs:257:22:257:22 | SSA def(x) : A | CollectionFlow.cs:258:18:258:18 | access to local variable x | provenance | | -| CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | CollectionFlow.cs:257:22:257:22 | SSA def(x) : A | provenance | | -| CollectionFlow.cs:270:17:270:23 | object creation of type A : A | CollectionFlow.cs:271:27:271:27 | access to local variable a : A | provenance | | -| CollectionFlow.cs:271:25:271:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:272:26:272:28 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | CollectionFlow.cs:258:18:258:18 | access to local variable x | provenance | | +| CollectionFlow.cs:270:13:270:13 | access to local variable a : A | CollectionFlow.cs:271:27:271:27 | access to local variable a : A | provenance | | +| CollectionFlow.cs:270:17:270:23 | object creation of type A : A | CollectionFlow.cs:270:13:270:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:271:13:271:15 | access to local variable as : null [element] : A | CollectionFlow.cs:272:26:272:28 | access to local variable as : null [element] : A | provenance | | +| CollectionFlow.cs:271:25:271:29 | { ..., ... } : null [element] : A | CollectionFlow.cs:271:13:271:15 | access to local variable as : null [element] : A | provenance | | | CollectionFlow.cs:271:27:271:27 | access to local variable a : A | CollectionFlow.cs:271:25:271:29 | { ..., ... } : null [element] : A | provenance | | +| CollectionFlow.cs:272:13:272:22 | access to local variable enumerator : IEnumerator [property Current] : A | CollectionFlow.cs:274:18:274:27 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | | CollectionFlow.cs:272:26:272:28 | access to local variable as : null [element] : A | CollectionFlow.cs:272:26:272:44 | call to method GetEnumerator : IEnumerator [property Current] : A | provenance | | -| CollectionFlow.cs:272:26:272:44 | call to method GetEnumerator : IEnumerator [property Current] : A | CollectionFlow.cs:274:18:274:27 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | +| CollectionFlow.cs:272:26:272:44 | call to method GetEnumerator : IEnumerator [property Current] : A | CollectionFlow.cs:272:13:272:22 | access to local variable enumerator : IEnumerator [property Current] : A | provenance | | | CollectionFlow.cs:274:18:274:27 | access to local variable enumerator : IEnumerator [property Current] : A | CollectionFlow.cs:274:18:274:35 | access to property Current | provenance | | -| CollectionFlow.cs:287:17:287:23 | object creation of type A : A | CollectionFlow.cs:289:18:289:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:287:13:287:13 | access to local variable a : A | CollectionFlow.cs:289:18:289:18 | access to local variable a : A | provenance | | +| CollectionFlow.cs:287:17:287:23 | object creation of type A : A | CollectionFlow.cs:287:13:287:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:289:9:289:12 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:290:26:290:29 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:289:18:289:18 | access to local variable a : A | CollectionFlow.cs:289:9:289:12 | [post] access to local variable list : List [element] : A | provenance | | +| CollectionFlow.cs:290:13:290:22 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:292:18:292:27 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | | CollectionFlow.cs:290:26:290:29 | access to local variable list : List [element] : A | CollectionFlow.cs:290:26:290:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | provenance | | -| CollectionFlow.cs:290:26:290:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:292:18:292:27 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | +| CollectionFlow.cs:290:26:290:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:290:13:290:22 | access to local variable enumerator : List.Enumerator [property Current] : A | provenance | | | CollectionFlow.cs:292:18:292:27 | access to local variable enumerator : List.Enumerator [property Current] : A | CollectionFlow.cs:292:18:292:35 | access to property Current | provenance | | -| CollectionFlow.cs:306:17:306:23 | object creation of type A : A | CollectionFlow.cs:308:43:308:43 | access to local variable a : A | provenance | | +| CollectionFlow.cs:306:13:306:13 | access to local variable a : A | CollectionFlow.cs:308:43:308:43 | access to local variable a : A | provenance | | +| CollectionFlow.cs:306:17:306:23 | object creation of type A : A | CollectionFlow.cs:306:13:306:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:308:9:308:12 | [post] access to local variable list : List [element, property Key] : A | CollectionFlow.cs:309:9:309:12 | access to local variable list : List [element, property Key] : A | provenance | | | CollectionFlow.cs:308:18:308:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | CollectionFlow.cs:308:9:308:12 | [post] access to local variable list : List [element, property Key] : A | provenance | | | CollectionFlow.cs:308:43:308:43 | access to local variable a : A | CollectionFlow.cs:308:18:308:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | provenance | | @@ -201,7 +226,8 @@ edges | CollectionFlow.cs:311:18:311:20 | access to parameter kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:311:18:311:24 | access to property Key | provenance | | | CollectionFlow.cs:328:32:328:38 | element : A | CollectionFlow.cs:328:55:328:61 | access to parameter element : A | provenance | | | CollectionFlow.cs:328:55:328:61 | access to parameter element : A | CollectionFlow.cs:328:44:328:48 | [post] access to parameter array : A[] [element] : A | provenance | | -| CollectionFlow.cs:332:17:332:23 | object creation of type A : A | CollectionFlow.cs:334:23:334:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:332:13:332:13 | access to local variable a : A | CollectionFlow.cs:334:23:334:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:332:17:332:23 | object creation of type A : A | CollectionFlow.cs:332:13:332:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:334:18:334:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:335:14:335:16 | access to local variable as : A[] [element] : A | provenance | | | CollectionFlow.cs:334:18:334:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:336:18:336:20 | access to local variable as : A[] [element] : A | provenance | | | CollectionFlow.cs:334:18:334:20 | [post] access to local variable as : A[] [element] : A | CollectionFlow.cs:337:20:337:22 | access to local variable as : A[] [element] : A | provenance | | @@ -213,7 +239,8 @@ edges | CollectionFlow.cs:337:20:337:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:337:14:337:23 | call to method First | provenance | | | CollectionFlow.cs:350:34:350:40 | element : A | CollectionFlow.cs:350:55:350:61 | access to parameter element : A | provenance | | | CollectionFlow.cs:350:55:350:61 | access to parameter element : A | CollectionFlow.cs:350:46:350:49 | [post] access to parameter list : List [element] : A | provenance | | -| CollectionFlow.cs:354:17:354:23 | object creation of type A : A | CollectionFlow.cs:356:23:356:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:354:13:354:13 | access to local variable a : A | CollectionFlow.cs:356:23:356:23 | access to local variable a : A | provenance | | +| CollectionFlow.cs:354:17:354:23 | object creation of type A : A | CollectionFlow.cs:354:13:354:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:356:17:356:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:357:14:357:17 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:356:17:356:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:358:22:358:25 | access to local variable list : List [element] : A | provenance | | | CollectionFlow.cs:356:17:356:20 | [post] access to local variable list : List [element] : A | CollectionFlow.cs:359:24:359:27 | access to local variable list : List [element] : A | provenance | | @@ -229,46 +256,63 @@ edges | CollectionFlow.cs:376:20:376:38 | array creation of type A[] : null [element] : A | CollectionFlow.cs:36:49:36:52 | args : null [element] : A | provenance | | | CollectionFlow.cs:376:28:376:38 | { ..., ... } : null [element] : A | CollectionFlow.cs:376:20:376:38 | array creation of type A[] : null [element] : A | provenance | | | CollectionFlow.cs:376:30:376:36 | object creation of type A : A | CollectionFlow.cs:376:28:376:38 | { ..., ... } : null [element] : A | provenance | | -| CollectionFlow.cs:406:17:406:23 | object creation of type A : A | CollectionFlow.cs:408:20:408:20 | access to local variable a : A | provenance | | +| CollectionFlow.cs:406:13:406:13 | access to local variable a : A | CollectionFlow.cs:408:20:408:20 | access to local variable a : A | provenance | | +| CollectionFlow.cs:406:17:406:23 | object creation of type A : A | CollectionFlow.cs:406:13:406:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:408:9:408:13 | [post] access to local variable array : MyInlineArray [element] : A | CollectionFlow.cs:409:14:409:18 | access to local variable array : MyInlineArray [element] : A | provenance | | | CollectionFlow.cs:408:20:408:20 | access to local variable a : A | CollectionFlow.cs:408:9:408:13 | [post] access to local variable array : MyInlineArray [element] : A | provenance | | | CollectionFlow.cs:409:14:409:18 | access to local variable array : MyInlineArray [element] : A | CollectionFlow.cs:409:14:409:21 | access to array element | provenance | | -| CollectionFlow.cs:427:17:427:23 | object creation of type A : A | CollectionFlow.cs:428:22:428:22 | access to local variable a : A | provenance | | -| CollectionFlow.cs:428:21:428:23 | [...] : A[] [element] : A | CollectionFlow.cs:429:14:429:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:427:13:427:13 | access to local variable a : A | CollectionFlow.cs:428:22:428:22 | access to local variable a : A | provenance | | +| CollectionFlow.cs:427:17:427:23 | object creation of type A : A | CollectionFlow.cs:427:13:427:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:428:13:428:17 | access to local variable array : A[] [element] : A | CollectionFlow.cs:429:14:429:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:428:21:428:23 | [...] : A[] [element] : A | CollectionFlow.cs:428:13:428:17 | access to local variable array : A[] [element] : A | provenance | | | CollectionFlow.cs:428:22:428:22 | access to local variable a : A | CollectionFlow.cs:428:21:428:23 | [...] : A[] [element] : A | provenance | | | CollectionFlow.cs:429:14:429:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:429:14:429:21 | access to array element | provenance | | -| CollectionFlow.cs:434:17:434:23 | object creation of type A : A | CollectionFlow.cs:435:22:435:22 | access to local variable a : A | provenance | | -| CollectionFlow.cs:435:21:435:23 | [...] : List [element] : A | CollectionFlow.cs:436:14:436:14 | access to local variable l : List [element] : A | provenance | | +| CollectionFlow.cs:434:13:434:13 | access to local variable a : A | CollectionFlow.cs:435:22:435:22 | access to local variable a : A | provenance | | +| CollectionFlow.cs:434:17:434:23 | object creation of type A : A | CollectionFlow.cs:434:13:434:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:435:17:435:17 | access to local variable l : List [element] : A | CollectionFlow.cs:436:14:436:14 | access to local variable l : List [element] : A | provenance | | +| CollectionFlow.cs:435:21:435:23 | [...] : List [element] : A | CollectionFlow.cs:435:17:435:17 | access to local variable l : List [element] : A | provenance | | | CollectionFlow.cs:435:22:435:22 | access to local variable a : A | CollectionFlow.cs:435:21:435:23 | [...] : List [element] : A | provenance | | | CollectionFlow.cs:436:14:436:14 | access to local variable l : List [element] : A | CollectionFlow.cs:436:14:436:17 | access to indexer | provenance | | -| CollectionFlow.cs:447:17:447:23 | object creation of type A : A | CollectionFlow.cs:448:21:448:21 | access to local variable a : A | provenance | | -| CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A | CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | provenance | | +| CollectionFlow.cs:447:13:447:13 | access to local variable a : A | CollectionFlow.cs:448:21:448:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:447:17:447:23 | object creation of type A : A | CollectionFlow.cs:447:13:447:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:448:13:448:16 | access to local variable temp : A[] [element] : A | CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | provenance | | +| CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A | CollectionFlow.cs:448:13:448:16 | access to local variable temp : A[] [element] : A | provenance | | | CollectionFlow.cs:448:21:448:21 | access to local variable a : A | CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A | provenance | | -| CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:449:13:449:17 | access to local variable array : A[] [element] : A | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | provenance | | +| CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | CollectionFlow.cs:449:13:449:17 | access to local variable array : A[] [element] : A | provenance | | | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:450:14:450:21 | access to array element | provenance | | -| CollectionFlow.cs:487:17:487:23 | object creation of type A : A | CollectionFlow.cs:488:40:488:40 | access to local variable a : A | provenance | | -| CollectionFlow.cs:488:24:488:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:489:14:489:17 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:487:13:487:13 | access to local variable a : A | CollectionFlow.cs:488:40:488:40 | access to local variable a : A | provenance | | +| CollectionFlow.cs:487:17:487:23 | object creation of type A : A | CollectionFlow.cs:487:13:487:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:488:17:488:20 | access to local variable span : Span [element] : A | CollectionFlow.cs:489:14:489:17 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:488:24:488:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:488:17:488:20 | access to local variable span : Span [element] : A | provenance | | | CollectionFlow.cs:488:40:488:40 | access to local variable a : A | CollectionFlow.cs:488:24:488:41 | object creation of type Span : Span [element] : A | provenance | | | CollectionFlow.cs:489:14:489:17 | access to local variable span : Span [element] : A | CollectionFlow.cs:489:14:489:20 | access to indexer | provenance | | -| CollectionFlow.cs:494:17:494:23 | object creation of type A : A | CollectionFlow.cs:495:40:495:40 | access to local variable a : A | provenance | | -| CollectionFlow.cs:495:24:495:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:496:19:496:22 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:494:13:494:13 | access to local variable a : A | CollectionFlow.cs:495:40:495:40 | access to local variable a : A | provenance | | +| CollectionFlow.cs:494:17:494:23 | object creation of type A : A | CollectionFlow.cs:494:13:494:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:495:17:495:20 | access to local variable span : Span [element] : A | CollectionFlow.cs:496:19:496:22 | access to local variable span : Span [element] : A | provenance | | +| CollectionFlow.cs:495:24:495:41 | object creation of type Span : Span [element] : A | CollectionFlow.cs:495:17:495:20 | access to local variable span : Span [element] : A | provenance | | | CollectionFlow.cs:495:40:495:40 | access to local variable a : A | CollectionFlow.cs:495:24:495:41 | object creation of type Span : Span [element] : A | provenance | | +| CollectionFlow.cs:496:13:496:15 | access to local variable arr : T[] [element] : A | CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | provenance | | | CollectionFlow.cs:496:19:496:22 | access to local variable span : Span [element] : A | CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | provenance | | -| CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | provenance | | +| CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | CollectionFlow.cs:496:13:496:15 | access to local variable arr : T[] [element] : A | provenance | | | CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | CollectionFlow.cs:497:14:497:19 | access to array element | provenance | | -| CollectionFlow.cs:502:17:502:23 | object creation of type A : A | CollectionFlow.cs:503:21:503:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:502:13:502:13 | access to local variable a : A | CollectionFlow.cs:503:21:503:21 | access to local variable a : A | provenance | | +| CollectionFlow.cs:502:17:502:23 | object creation of type A : A | CollectionFlow.cs:502:13:502:13 | access to local variable a : A | provenance | | | CollectionFlow.cs:503:9:503:14 | [post] access to parameter target : Span [element] : A | CollectionFlow.cs:504:14:504:19 | access to parameter target : Span [element] : A | provenance | | | CollectionFlow.cs:503:21:503:21 | access to local variable a : A | CollectionFlow.cs:503:9:503:14 | [post] access to parameter target : Span [element] : A | provenance | | | CollectionFlow.cs:504:14:504:19 | access to parameter target : Span [element] : A | CollectionFlow.cs:504:14:504:22 | access to indexer | provenance | | -| CollectionFlow.cs:509:22:509:51 | object creation of type Span : Span [element] : A | CollectionFlow.cs:510:9:510:14 | access to local variable source : Span [element] : A | provenance | | +| CollectionFlow.cs:509:13:509:18 | access to local variable source : Span [element] : A | CollectionFlow.cs:510:9:510:14 | access to local variable source : Span [element] : A | provenance | | +| CollectionFlow.cs:509:22:509:51 | object creation of type Span : Span [element] : A | CollectionFlow.cs:509:13:509:18 | access to local variable source : Span [element] : A | provenance | | | CollectionFlow.cs:509:34:509:50 | array creation of type A[] : null [element] : A | CollectionFlow.cs:509:22:509:51 | object creation of type Span : Span [element] : A | provenance | | | CollectionFlow.cs:509:40:509:50 | { ..., ... } : null [element] : A | CollectionFlow.cs:509:34:509:50 | array creation of type A[] : null [element] : A | provenance | | | CollectionFlow.cs:509:42:509:48 | object creation of type A : A | CollectionFlow.cs:509:40:509:50 | { ..., ... } : null [element] : A | provenance | | | CollectionFlow.cs:510:9:510:14 | access to local variable source : Span [element] : A | CollectionFlow.cs:510:23:510:28 | [post] access to parameter target : Span [element] : A | provenance | | | CollectionFlow.cs:510:23:510:28 | [post] access to parameter target : Span [element] : A | CollectionFlow.cs:511:14:511:19 | access to parameter target : Span [element] : A | provenance | | | CollectionFlow.cs:511:14:511:19 | access to parameter target : Span [element] : A | CollectionFlow.cs:511:14:511:22 | access to indexer | provenance | | -| CollectionFlow.cs:516:17:516:23 | object creation of type A : A | CollectionFlow.cs:517:60:517:60 | access to local variable a : A | provenance | | -| CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | CollectionFlow.cs:518:14:518:17 | access to local variable span : ReadOnlySpan [element] : A | provenance | | +| CollectionFlow.cs:516:13:516:13 | access to local variable a : A | CollectionFlow.cs:517:60:517:60 | access to local variable a : A | provenance | | +| CollectionFlow.cs:516:17:516:23 | object creation of type A : A | CollectionFlow.cs:516:13:516:13 | access to local variable a : A | provenance | | +| CollectionFlow.cs:517:25:517:28 | access to local variable span : ReadOnlySpan [element] : A | CollectionFlow.cs:518:14:518:17 | access to local variable span : ReadOnlySpan [element] : A | provenance | | +| CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | CollectionFlow.cs:517:25:517:28 | access to local variable span : ReadOnlySpan [element] : A | provenance | | | CollectionFlow.cs:517:52:517:62 | array creation of type A[] : null [element] : A | CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | provenance | | | CollectionFlow.cs:517:58:517:62 | { ..., ... } : null [element] : A | CollectionFlow.cs:517:52:517:62 | array creation of type A[] : null [element] : A | provenance | | | CollectionFlow.cs:517:60:517:60 | access to local variable a : A | CollectionFlow.cs:517:58:517:62 | { ..., ... } : null [element] : A | provenance | | @@ -337,7 +381,9 @@ nodes | CollectionFlow.cs:36:63:36:66 | access to parameter args : A[] [element] : A | semmle.label | access to parameter args : A[] [element] : A | | CollectionFlow.cs:36:63:36:66 | access to parameter args : null [element] : A | semmle.label | access to parameter args : null [element] : A | | CollectionFlow.cs:36:63:36:69 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:40:13:40:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:40:17:40:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:41:13:41:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:41:25:41:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:41:27:41:27 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:42:14:42:16 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | @@ -345,7 +391,9 @@ nodes | CollectionFlow.cs:43:18:43:20 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:44:14:44:23 | call to method First | semmle.label | call to method First | | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | +| CollectionFlow.cs:58:13:58:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:58:17:58:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:59:13:59:13 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | | CollectionFlow.cs:59:38:59:57 | { ..., ... } : CollectionFlow [field As, element] : A | semmle.label | { ..., ... } : CollectionFlow [field As, element] : A | | CollectionFlow.cs:59:45:59:55 | { ..., ... } : A[] [element] : A | semmle.label | { ..., ... } : A[] [element] : A | | CollectionFlow.cs:59:53:59:53 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -357,6 +405,7 @@ nodes | CollectionFlow.cs:62:14:62:24 | call to method First | semmle.label | call to method First | | CollectionFlow.cs:62:20:62:20 | access to local variable c : CollectionFlow [field As, element] : A | semmle.label | access to local variable c : CollectionFlow [field As, element] : A | | CollectionFlow.cs:62:20:62:23 | access to field As : A[] [element] : A | semmle.label | access to field As : A[] [element] : A | +| CollectionFlow.cs:76:13:76:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:76:17:76:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:78:9:78:11 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | | CollectionFlow.cs:78:18:78:18 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -365,6 +414,7 @@ nodes | CollectionFlow.cs:80:18:80:20 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | | CollectionFlow.cs:81:14:81:23 | call to method First | semmle.label | call to method First | | CollectionFlow.cs:81:20:81:22 | access to local variable as : A[] [element] : A | semmle.label | access to local variable as : A[] [element] : A | +| CollectionFlow.cs:96:13:96:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:96:17:96:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:98:9:98:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:98:19:98:19 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -373,7 +423,9 @@ nodes | CollectionFlow.cs:100:22:100:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:101:14:101:28 | call to method ListFirst | semmle.label | call to method ListFirst | | CollectionFlow.cs:101:24:101:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:115:13:115:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:115:17:115:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:116:13:116:16 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:116:20:116:38 | object creation of type List : List [element] : A | semmle.label | object creation of type List : List [element] : A | | CollectionFlow.cs:116:36:116:36 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:117:14:117:17 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | @@ -381,6 +433,7 @@ nodes | CollectionFlow.cs:118:22:118:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:119:14:119:28 | call to method ListFirst | semmle.label | call to method ListFirst | | CollectionFlow.cs:119:24:119:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:132:13:132:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:132:17:132:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:134:9:134:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:134:18:134:18 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -389,6 +442,7 @@ nodes | CollectionFlow.cs:136:22:136:25 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:137:14:137:28 | call to method ListFirst | semmle.label | call to method ListFirst | | CollectionFlow.cs:137:24:137:27 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | +| CollectionFlow.cs:151:13:151:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:151:17:151:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:153:9:153:12 | [post] access to local variable dict : Dictionary [element, property Value] : A | semmle.label | [post] access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:153:19:153:19 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -401,7 +455,9 @@ nodes | CollectionFlow.cs:157:29:157:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:158:14:158:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | | CollectionFlow.cs:158:30:158:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:174:13:174:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:174:17:174:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:175:13:175:16 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:175:20:175:56 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | | CollectionFlow.cs:175:52:175:52 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:176:14:176:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | @@ -413,7 +469,9 @@ nodes | CollectionFlow.cs:179:29:179:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:180:14:180:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | | CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:195:13:195:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:195:17:195:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:196:13:196:16 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:196:20:196:55 | object creation of type Dictionary : Dictionary [element, property Value] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Value] : A | | CollectionFlow.cs:196:53:196:53 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:197:14:197:17 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | @@ -425,7 +483,9 @@ nodes | CollectionFlow.cs:200:29:200:32 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | | CollectionFlow.cs:201:14:201:34 | call to method DictValuesFirst | semmle.label | call to method DictValuesFirst | | CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary [element, property Value] : A | semmle.label | access to local variable dict : Dictionary [element, property Value] : A | +| CollectionFlow.cs:217:13:217:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:217:17:217:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:218:13:218:16 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:218:20:218:56 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | | CollectionFlow.cs:218:49:218:49 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:219:14:219:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | @@ -436,7 +496,9 @@ nodes | CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:222:14:222:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | | CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:236:13:236:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:236:17:236:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:237:13:237:16 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:237:20:237:55 | object creation of type Dictionary : Dictionary [element, property Key] : A | semmle.label | object creation of type Dictionary : Dictionary [element, property Key] : A | | CollectionFlow.cs:237:48:237:48 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:238:14:238:17 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | @@ -447,26 +509,33 @@ nodes | CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | | CollectionFlow.cs:241:14:241:31 | call to method DictFirstKey | semmle.label | call to method DictFirstKey | | CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary [element, property Key] : A | semmle.label | access to local variable dict : Dictionary [element, property Key] : A | +| CollectionFlow.cs:255:13:255:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:255:17:255:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:256:13:256:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:256:25:256:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:256:27:256:27 | access to local variable a : A | semmle.label | access to local variable a : A | -| CollectionFlow.cs:257:22:257:22 | SSA def(x) : A | semmle.label | SSA def(x) : A | | CollectionFlow.cs:257:27:257:29 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:258:18:258:18 | access to local variable x | semmle.label | access to local variable x | +| CollectionFlow.cs:270:13:270:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:270:17:270:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:271:13:271:15 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:271:25:271:29 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:271:27:271:27 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:272:13:272:22 | access to local variable enumerator : IEnumerator [property Current] : A | semmle.label | access to local variable enumerator : IEnumerator [property Current] : A | | CollectionFlow.cs:272:26:272:28 | access to local variable as : null [element] : A | semmle.label | access to local variable as : null [element] : A | | CollectionFlow.cs:272:26:272:44 | call to method GetEnumerator : IEnumerator [property Current] : A | semmle.label | call to method GetEnumerator : IEnumerator [property Current] : A | | CollectionFlow.cs:274:18:274:27 | access to local variable enumerator : IEnumerator [property Current] : A | semmle.label | access to local variable enumerator : IEnumerator [property Current] : A | | CollectionFlow.cs:274:18:274:35 | access to property Current | semmle.label | access to property Current | +| CollectionFlow.cs:287:13:287:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:287:17:287:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:289:9:289:12 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:289:18:289:18 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:290:13:290:22 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | | CollectionFlow.cs:290:26:290:29 | access to local variable list : List [element] : A | semmle.label | access to local variable list : List [element] : A | | CollectionFlow.cs:290:26:290:45 | call to method GetEnumerator : List.Enumerator [property Current] : A | semmle.label | call to method GetEnumerator : List.Enumerator [property Current] : A | | CollectionFlow.cs:292:18:292:27 | access to local variable enumerator : List.Enumerator [property Current] : A | semmle.label | access to local variable enumerator : List.Enumerator [property Current] : A | | CollectionFlow.cs:292:18:292:35 | access to property Current | semmle.label | access to property Current | +| CollectionFlow.cs:306:13:306:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:306:17:306:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:308:9:308:12 | [post] access to local variable list : List [element, property Key] : A | semmle.label | [post] access to local variable list : List [element, property Key] : A | | CollectionFlow.cs:308:18:308:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | semmle.label | object creation of type KeyValuePair : KeyValuePair [property Key] : A | @@ -478,6 +547,7 @@ nodes | CollectionFlow.cs:328:32:328:38 | element : A | semmle.label | element : A | | CollectionFlow.cs:328:44:328:48 | [post] access to parameter array : A[] [element] : A | semmle.label | [post] access to parameter array : A[] [element] : A | | CollectionFlow.cs:328:55:328:61 | access to parameter element : A | semmle.label | access to parameter element : A | +| CollectionFlow.cs:332:13:332:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:332:17:332:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:334:18:334:20 | [post] access to local variable as : A[] [element] : A | semmle.label | [post] access to local variable as : A[] [element] : A | | CollectionFlow.cs:334:23:334:23 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -489,6 +559,7 @@ nodes | CollectionFlow.cs:350:34:350:40 | element : A | semmle.label | element : A | | CollectionFlow.cs:350:46:350:49 | [post] access to parameter list : List [element] : A | semmle.label | [post] access to parameter list : List [element] : A | | CollectionFlow.cs:350:55:350:61 | access to parameter element : A | semmle.label | access to parameter element : A | +| CollectionFlow.cs:354:13:354:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:354:17:354:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:356:17:356:20 | [post] access to local variable list : List [element] : A | semmle.label | [post] access to local variable list : List [element] : A | | CollectionFlow.cs:356:23:356:23 | access to local variable a : A | semmle.label | access to local variable a : A | @@ -503,44 +574,59 @@ nodes | CollectionFlow.cs:376:20:376:38 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | | CollectionFlow.cs:376:28:376:38 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | | CollectionFlow.cs:376:30:376:36 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:406:13:406:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:406:17:406:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:408:9:408:13 | [post] access to local variable array : MyInlineArray [element] : A | semmle.label | [post] access to local variable array : MyInlineArray [element] : A | | CollectionFlow.cs:408:20:408:20 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:409:14:409:18 | access to local variable array : MyInlineArray [element] : A | semmle.label | access to local variable array : MyInlineArray [element] : A | | CollectionFlow.cs:409:14:409:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:427:13:427:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:427:17:427:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:428:13:428:17 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | | CollectionFlow.cs:428:21:428:23 | [...] : A[] [element] : A | semmle.label | [...] : A[] [element] : A | | CollectionFlow.cs:428:22:428:22 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:429:14:429:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | | CollectionFlow.cs:429:14:429:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:434:13:434:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:434:17:434:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:435:17:435:17 | access to local variable l : List [element] : A | semmle.label | access to local variable l : List [element] : A | | CollectionFlow.cs:435:21:435:23 | [...] : List [element] : A | semmle.label | [...] : List [element] : A | | CollectionFlow.cs:435:22:435:22 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:436:14:436:14 | access to local variable l : List [element] : A | semmle.label | access to local variable l : List [element] : A | | CollectionFlow.cs:436:14:436:17 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:447:13:447:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:447:17:447:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:448:13:448:16 | access to local variable temp : A[] [element] : A | semmle.label | access to local variable temp : A[] [element] : A | | CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A | semmle.label | [...] : A[] [element] : A | | CollectionFlow.cs:448:21:448:21 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:449:13:449:17 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | | CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | semmle.label | .. access to local variable temp : A[] [element] : A | | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | | CollectionFlow.cs:450:14:450:21 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:487:13:487:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:487:17:487:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:488:17:488:20 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | | CollectionFlow.cs:488:24:488:41 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | | CollectionFlow.cs:488:40:488:40 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:489:14:489:17 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | | CollectionFlow.cs:489:14:489:20 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:494:13:494:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:494:17:494:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:495:17:495:20 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | | CollectionFlow.cs:495:24:495:41 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | | CollectionFlow.cs:495:40:495:40 | access to local variable a : A | semmle.label | access to local variable a : A | +| CollectionFlow.cs:496:13:496:15 | access to local variable arr : T[] [element] : A | semmle.label | access to local variable arr : T[] [element] : A | | CollectionFlow.cs:496:19:496:22 | access to local variable span : Span [element] : A | semmle.label | access to local variable span : Span [element] : A | | CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | semmle.label | call to method ToArray : T[] [element] : A | | CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | semmle.label | access to local variable arr : T[] [element] : A | | CollectionFlow.cs:497:14:497:19 | access to array element | semmle.label | access to array element | +| CollectionFlow.cs:502:13:502:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:502:17:502:23 | object creation of type A : A | semmle.label | object creation of type A : A | | CollectionFlow.cs:503:9:503:14 | [post] access to parameter target : Span [element] : A | semmle.label | [post] access to parameter target : Span [element] : A | | CollectionFlow.cs:503:21:503:21 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:504:14:504:19 | access to parameter target : Span [element] : A | semmle.label | access to parameter target : Span [element] : A | | CollectionFlow.cs:504:14:504:22 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:509:13:509:18 | access to local variable source : Span [element] : A | semmle.label | access to local variable source : Span [element] : A | | CollectionFlow.cs:509:22:509:51 | object creation of type Span : Span [element] : A | semmle.label | object creation of type Span : Span [element] : A | | CollectionFlow.cs:509:34:509:50 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | | CollectionFlow.cs:509:40:509:50 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | @@ -549,7 +635,9 @@ nodes | CollectionFlow.cs:510:23:510:28 | [post] access to parameter target : Span [element] : A | semmle.label | [post] access to parameter target : Span [element] : A | | CollectionFlow.cs:511:14:511:19 | access to parameter target : Span [element] : A | semmle.label | access to parameter target : Span [element] : A | | CollectionFlow.cs:511:14:511:22 | access to indexer | semmle.label | access to indexer | +| CollectionFlow.cs:516:13:516:13 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:516:17:516:23 | object creation of type A : A | semmle.label | object creation of type A : A | +| CollectionFlow.cs:517:25:517:28 | access to local variable span : ReadOnlySpan [element] : A | semmle.label | access to local variable span : ReadOnlySpan [element] : A | | CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | semmle.label | object creation of type ReadOnlySpan : ReadOnlySpan [element] : A | | CollectionFlow.cs:517:52:517:62 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A | | CollectionFlow.cs:517:58:517:62 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A | diff --git a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected index 177f14a8948..47c418c803e 100644 --- a/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/constructors/ConstructorFlow.expected @@ -2,13 +2,15 @@ testFailures edges | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:5:29:5:45 | call to method Source : Object | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | provenance | | -| Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | provenance | | +| Constructors.cs:9:23:9:23 | access to local variable c : C_no_ctor [field s1] : Object | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | provenance | | +| Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | Constructors.cs:9:23:9:23 | access to local variable c : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | Constructors.cs:13:21:13:22 | this : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:13:21:13:22 | this : C_no_ctor [field s1] : Object | Constructors.cs:15:18:15:19 | this access : C_no_ctor [field s1] : Object | provenance | | | Constructors.cs:15:18:15:19 | this access : C_no_ctor [field s1] : Object | Constructors.cs:15:18:15:19 | access to field s1 | provenance | | | Constructors.cs:21:24:21:25 | [post] this access : C_with_ctor [field s1] : Object | Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:21:29:21:45 | call to method Source : Object | Constructors.cs:21:24:21:25 | [post] this access : C_with_ctor [field s1] : Object | provenance | | -| Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | provenance | | +| Constructors.cs:25:25:25:25 | access to local variable c : C_with_ctor [field s1] : Object | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | provenance | | +| Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | Constructors.cs:25:25:25:25 | access to local variable c : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | Constructors.cs:31:21:31:22 | this : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:31:21:31:22 | this : C_with_ctor [field s1] : Object | Constructors.cs:33:18:33:19 | this access : C_with_ctor [field s1] : Object | provenance | | | Constructors.cs:33:18:33:19 | this access : C_with_ctor [field s1] : Object | Constructors.cs:33:18:33:19 | access to field s1 | provenance | | @@ -21,21 +23,27 @@ edges | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | access to parameter o22param : Object | provenance | | | Constructors.cs:50:32:50:36 | this : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | this access : C2 [field Obj21] : Object | provenance | | | Constructors.cs:50:32:50:36 | this access : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | access to field Obj21 : Object | provenance | | -| Constructors.cs:52:35:52:35 | o : Object | Constructors.cs:54:13:54:24 | SSA def(o22param) : Object | provenance | | -| Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:19 | SSA def(o1) : Object | provenance | | +| Constructors.cs:52:35:52:35 | o : Object | Constructors.cs:54:13:54:20 | access to parameter o22param : Object | provenance | | +| Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:14 | access to parameter o1 : Object | provenance | | | Constructors.cs:62:41:62:41 | o : Object | Constructors.cs:64:37:64:37 | access to parameter o : Object | provenance | | | Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | provenance | | -| Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | provenance | | -| Constructors.cs:70:17:70:33 | call to method Source : Object | Constructors.cs:71:25:71:25 | access to local variable o : Object | provenance | | -| Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | Constructors.cs:72:14:72:15 | access to local variable c1 : C1 [field Obj] : Object | provenance | | +| Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:64:27:64:34 | access to parameter o22param : Object | provenance | | +| Constructors.cs:70:13:70:13 | access to local variable o : Object | Constructors.cs:71:25:71:25 | access to local variable o : Object | provenance | | +| Constructors.cs:70:17:70:33 | call to method Source : Object | Constructors.cs:70:13:70:13 | access to local variable o : Object | provenance | | +| Constructors.cs:71:13:71:14 | access to local variable c1 : C1 [field Obj] : Object | Constructors.cs:72:14:72:15 | access to local variable c1 : C1 [field Obj] : Object | provenance | | +| Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | Constructors.cs:71:13:71:14 | access to local variable c1 : C1 [field Obj] : Object | provenance | | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:41:26:41:26 | o : Object | provenance | | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | provenance | | | Constructors.cs:72:14:72:15 | access to local variable c1 : C1 [field Obj] : Object | Constructors.cs:72:14:72:19 | access to field Obj | provenance | | -| Constructors.cs:77:19:77:35 | call to method Source : Object | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | provenance | | -| Constructors.cs:78:19:78:35 | call to method Source : Object | Constructors.cs:79:30:79:32 | access to local variable o22 : Object | provenance | | -| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | Constructors.cs:80:14:80:15 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | -| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | -| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [parameter o22param] : Object | Constructors.cs:81:14:81:15 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | +| Constructors.cs:77:13:77:15 | access to local variable o21 : Object | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | provenance | | +| Constructors.cs:77:19:77:35 | call to method Source : Object | Constructors.cs:77:13:77:15 | access to local variable o21 : Object | provenance | | +| Constructors.cs:78:13:78:15 | access to local variable o22 : Object | Constructors.cs:79:30:79:32 | access to local variable o22 : Object | provenance | | +| Constructors.cs:78:19:78:35 | call to method Source : Object | Constructors.cs:78:13:78:15 | access to local variable o22 : Object | provenance | | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:80:14:80:15 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:81:14:81:15 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | +| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [field Obj21] : Object | provenance | | +| Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [parameter o22param] : Object | Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | Constructors.cs:44:28:44:35 | o21param : Object | provenance | | | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | provenance | | | Constructors.cs:79:30:79:32 | access to local variable o22 : Object | Constructors.cs:44:45:44:52 | o22param : Object | provenance | | @@ -45,21 +53,25 @@ edges | Constructors.cs:81:14:81:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:81:14:81:21 | access to property Obj22 | provenance | | | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | this : C2 [field Obj21] : Object | provenance | | | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:82:14:82:21 | access to property Obj23 | provenance | | -| Constructors.cs:91:21:91:37 | call to method Source : Object | Constructors.cs:92:19:92:23 | access to local variable taint : Object | provenance | | +| Constructors.cs:91:13:91:17 | access to local variable taint : Object | Constructors.cs:92:19:92:23 | access to local variable taint : Object | provenance | | +| Constructors.cs:91:21:91:37 | call to method Source : Object | Constructors.cs:91:13:91:17 | access to local variable taint : Object | provenance | | | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:92:19:92:23 | access to local variable taint : Object | Constructors.cs:52:35:52:35 | o : Object | provenance | | | Constructors.cs:92:19:92:23 | access to local variable taint : Object | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:93:14:93:21 | access to property Obj22 | provenance | | -| Constructors.cs:99:21:99:37 | call to method Source : Object | Constructors.cs:100:25:100:29 | access to local variable taint : Object | provenance | | +| Constructors.cs:99:13:99:17 | access to local variable taint : Object | Constructors.cs:100:25:100:29 | access to local variable taint : Object | provenance | | +| Constructors.cs:99:21:99:37 | call to method Source : Object | Constructors.cs:99:13:99:17 | access to local variable taint : Object | provenance | | | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:101:14:101:15 | access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:100:25:100:29 | access to local variable taint : Object | Constructors.cs:62:41:62:41 | o : Object | provenance | | | Constructors.cs:100:25:100:29 | access to local variable taint : Object | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:101:14:101:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | provenance | | | Constructors.cs:101:14:101:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:101:14:101:21 | access to property Obj22 | provenance | | | Constructors.cs:106:32:106:39 | this : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | access to parameter o31param : Object | provenance | | -| Constructors.cs:111:19:111:35 | call to method Source : Object | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | provenance | | -| Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | provenance | | +| Constructors.cs:111:13:111:15 | access to local variable o31 : Object | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | provenance | | +| Constructors.cs:111:19:111:35 | call to method Source : Object | Constructors.cs:111:13:111:15 | access to local variable o31 : Object | provenance | | +| Constructors.cs:112:13:112:14 | access to local variable c3 : C3 [parameter o31param] : Object | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | provenance | | +| Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | Constructors.cs:112:13:112:14 | access to local variable c3 : C3 [parameter o31param] : Object | provenance | | | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | Constructors.cs:104:28:104:35 | o31param : Object | provenance | | | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | provenance | | | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | this : C3 [parameter o31param] : Object | provenance | | @@ -68,20 +80,28 @@ edges | Constructors.cs:121:38:121:40 | oc2 : Object | Constructors.cs:124:20:124:22 | access to parameter oc2 : Object | provenance | | | Constructors.cs:123:20:123:22 | access to parameter oc1 : Object | Constructors.cs:123:13:123:16 | [post] this access : C4 [property Obj1] : Object | provenance | | | Constructors.cs:124:20:124:22 | access to parameter oc2 : Object | Constructors.cs:124:13:124:16 | [post] this access : C4 [property Obj2] : Object | provenance | | -| Constructors.cs:130:18:130:34 | call to method Source : Object | Constructors.cs:132:25:132:26 | access to local variable o1 : Object | provenance | | -| Constructors.cs:131:18:131:34 | call to method Source : Object | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | provenance | | -| Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | Constructors.cs:133:14:133:15 | access to local variable c4 : C4 [property Obj1] : Object | provenance | | -| Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | provenance | | +| Constructors.cs:130:13:130:14 | access to local variable o1 : Object | Constructors.cs:132:25:132:26 | access to local variable o1 : Object | provenance | | +| Constructors.cs:130:18:130:34 | call to method Source : Object | Constructors.cs:130:13:130:14 | access to local variable o1 : Object | provenance | | +| Constructors.cs:131:13:131:14 | access to local variable o2 : Object | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | provenance | | +| Constructors.cs:131:18:131:34 | call to method Source : Object | Constructors.cs:131:13:131:14 | access to local variable o2 : Object | provenance | | +| Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj1] : Object | Constructors.cs:133:14:133:15 | access to local variable c4 : C4 [property Obj1] : Object | provenance | | +| Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj2] : Object | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | provenance | | +| Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj1] : Object | provenance | | +| Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj2] : Object | provenance | | | Constructors.cs:132:25:132:26 | access to local variable o1 : Object | Constructors.cs:121:26:121:28 | oc1 : Object | provenance | | | Constructors.cs:132:25:132:26 | access to local variable o1 : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | provenance | | | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:121:38:121:40 | oc2 : Object | provenance | | | Constructors.cs:132:29:132:30 | access to local variable o2 : Object | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | provenance | | | Constructors.cs:133:14:133:15 | access to local variable c4 : C4 [property Obj1] : Object | Constructors.cs:133:14:133:20 | access to property Obj1 | provenance | | | Constructors.cs:134:14:134:15 | access to local variable c4 : C4 [property Obj2] : Object | Constructors.cs:134:14:134:20 | access to property Obj2 | provenance | | -| Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:143:25:143:26 | access to local variable o1 : Object | provenance | | -| Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:143:29:143:30 | access to local variable o2 : Object | provenance | | -| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | provenance | | -| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | provenance | | +| Constructors.cs:141:13:141:14 | access to local variable o1 : Object | Constructors.cs:143:25:143:26 | access to local variable o1 : Object | provenance | | +| Constructors.cs:141:18:141:34 | call to method Source : Object | Constructors.cs:141:13:141:14 | access to local variable o1 : Object | provenance | | +| Constructors.cs:142:13:142:14 | access to local variable o2 : Object | Constructors.cs:143:29:143:30 | access to local variable o2 : Object | provenance | | +| Constructors.cs:142:18:142:35 | call to method Source : Object | Constructors.cs:142:13:142:14 | access to local variable o2 : Object | provenance | | +| Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj1] : Object | Constructors.cs:144:14:144:15 | access to local variable r1 : R1 [property Obj1] : Object | provenance | | +| Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj2] : Object | Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | provenance | | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj1] : Object | provenance | | +| Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj2] : Object | provenance | | | Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:137:29:137:32 | Obj1 : Object | provenance | | | Constructors.cs:143:25:143:26 | access to local variable o1 : Object | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | provenance | | | Constructors.cs:143:29:143:30 | access to local variable o2 : Object | Constructors.cs:137:42:137:45 | Obj2 : Object | provenance | | @@ -91,6 +111,7 @@ edges nodes | Constructors.cs:5:24:5:25 | [post] this access : C_no_ctor [field s1] : Object | semmle.label | [post] this access : C_no_ctor [field s1] : Object | | Constructors.cs:5:29:5:45 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:9:23:9:23 | access to local variable c : C_no_ctor [field s1] : Object | semmle.label | access to local variable c : C_no_ctor [field s1] : Object | | Constructors.cs:9:27:9:41 | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | semmle.label | object creation of type C_no_ctor : C_no_ctor [field s1] : Object | | Constructors.cs:10:13:10:13 | access to local variable c : C_no_ctor [field s1] : Object | semmle.label | access to local variable c : C_no_ctor [field s1] : Object | | Constructors.cs:13:21:13:22 | this : C_no_ctor [field s1] : Object | semmle.label | this : C_no_ctor [field s1] : Object | @@ -98,6 +119,7 @@ nodes | Constructors.cs:15:18:15:19 | this access : C_no_ctor [field s1] : Object | semmle.label | this access : C_no_ctor [field s1] : Object | | Constructors.cs:21:24:21:25 | [post] this access : C_with_ctor [field s1] : Object | semmle.label | [post] this access : C_with_ctor [field s1] : Object | | Constructors.cs:21:29:21:45 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:25:25:25:25 | access to local variable c : C_with_ctor [field s1] : Object | semmle.label | access to local variable c : C_with_ctor [field s1] : Object | | Constructors.cs:25:29:25:45 | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | semmle.label | object creation of type C_with_ctor : C_with_ctor [field s1] : Object | | Constructors.cs:26:13:26:13 | access to local variable c : C_with_ctor [field s1] : Object | semmle.label | access to local variable c : C_with_ctor [field s1] : Object | | Constructors.cs:31:21:31:22 | this : C_with_ctor [field s1] : Object | semmle.label | this : C_with_ctor [field s1] : Object | @@ -117,19 +139,25 @@ nodes | Constructors.cs:50:32:50:36 | this : C2 [field Obj21] : Object | semmle.label | this : C2 [field Obj21] : Object | | Constructors.cs:50:32:50:36 | this access : C2 [field Obj21] : Object | semmle.label | this access : C2 [field Obj21] : Object | | Constructors.cs:52:35:52:35 | o : Object | semmle.label | o : Object | -| Constructors.cs:54:13:54:24 | SSA def(o22param) : Object | semmle.label | SSA def(o22param) : Object | +| Constructors.cs:54:13:54:20 | access to parameter o22param : Object | semmle.label | access to parameter o22param : Object | | Constructors.cs:57:54:57:55 | o2 : Object | semmle.label | o2 : Object | -| Constructors.cs:59:13:59:19 | SSA def(o1) : Object | semmle.label | SSA def(o1) : Object | +| Constructors.cs:59:13:59:14 | access to parameter o1 : Object | semmle.label | access to parameter o1 : Object | | Constructors.cs:62:41:62:41 | o : Object | semmle.label | o : Object | -| Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | semmle.label | SSA def(o22param) : Object | +| Constructors.cs:64:27:64:34 | access to parameter o22param : Object | semmle.label | access to parameter o22param : Object | | Constructors.cs:64:37:64:37 | access to parameter o : Object | semmle.label | access to parameter o : Object | +| Constructors.cs:70:13:70:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Constructors.cs:70:17:70:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:71:13:71:14 | access to local variable c1 : C1 [field Obj] : Object | semmle.label | access to local variable c1 : C1 [field Obj] : Object | | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | semmle.label | object creation of type C1 : C1 [field Obj] : Object | | Constructors.cs:71:25:71:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Constructors.cs:72:14:72:15 | access to local variable c1 : C1 [field Obj] : Object | semmle.label | access to local variable c1 : C1 [field Obj] : Object | | Constructors.cs:72:14:72:19 | access to field Obj | semmle.label | access to field Obj | +| Constructors.cs:77:13:77:15 | access to local variable o21 : Object | semmle.label | access to local variable o21 : Object | | Constructors.cs:77:19:77:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:78:13:78:15 | access to local variable o22 : Object | semmle.label | access to local variable o22 : Object | | Constructors.cs:78:19:78:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [field Obj21] : Object | semmle.label | access to local variable c2 : C2 [field Obj21] : Object | +| Constructors.cs:79:13:79:14 | access to local variable c2 : C2 [parameter o22param] : Object | semmle.label | access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | semmle.label | object creation of type C2 : C2 [field Obj21] : Object | | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [parameter o22param] : Object | semmle.label | object creation of type C2 : C2 [parameter o22param] : Object | | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | semmle.label | access to local variable o21 : Object | @@ -140,11 +168,13 @@ nodes | Constructors.cs:81:14:81:21 | access to property Obj22 | semmle.label | access to property Obj22 | | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | semmle.label | access to local variable c2 : C2 [field Obj21] : Object | | Constructors.cs:82:14:82:21 | access to property Obj23 | semmle.label | access to property Obj23 | +| Constructors.cs:91:13:91:17 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | | Constructors.cs:91:21:91:37 | call to method Source : Object | semmle.label | call to method Source : Object | | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | semmle.label | [post] access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:92:19:92:23 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | semmle.label | access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:93:14:93:21 | access to property Obj22 | semmle.label | access to property Obj22 | +| Constructors.cs:99:13:99:17 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | | Constructors.cs:99:21:99:37 | call to method Source : Object | semmle.label | call to method Source : Object | | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | semmle.label | [post] access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:100:25:100:29 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | @@ -153,7 +183,9 @@ nodes | Constructors.cs:104:28:104:35 | o31param : Object | semmle.label | o31param : Object | | Constructors.cs:106:32:106:39 | access to parameter o31param : Object | semmle.label | access to parameter o31param : Object | | Constructors.cs:106:32:106:39 | this : C3 [parameter o31param] : Object | semmle.label | this : C3 [parameter o31param] : Object | +| Constructors.cs:111:13:111:15 | access to local variable o31 : Object | semmle.label | access to local variable o31 : Object | | Constructors.cs:111:19:111:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:112:13:112:14 | access to local variable c3 : C3 [parameter o31param] : Object | semmle.label | access to local variable c3 : C3 [parameter o31param] : Object | | Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | semmle.label | object creation of type C3 : C3 [parameter o31param] : Object | | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | semmle.label | access to local variable o31 : Object | | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | semmle.label | access to local variable c3 : C3 [parameter o31param] : Object | @@ -164,8 +196,12 @@ nodes | Constructors.cs:123:20:123:22 | access to parameter oc1 : Object | semmle.label | access to parameter oc1 : Object | | Constructors.cs:124:13:124:16 | [post] this access : C4 [property Obj2] : Object | semmle.label | [post] this access : C4 [property Obj2] : Object | | Constructors.cs:124:20:124:22 | access to parameter oc2 : Object | semmle.label | access to parameter oc2 : Object | +| Constructors.cs:130:13:130:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | | Constructors.cs:130:18:130:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:131:13:131:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | | Constructors.cs:131:18:131:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj1] : Object | semmle.label | access to local variable c4 : C4 [property Obj1] : Object | +| Constructors.cs:132:13:132:14 | access to local variable c4 : C4 [property Obj2] : Object | semmle.label | access to local variable c4 : C4 [property Obj2] : Object | | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj1] : Object | semmle.label | object creation of type C4 : C4 [property Obj1] : Object | | Constructors.cs:132:18:132:31 | object creation of type C4 : C4 [property Obj2] : Object | semmle.label | object creation of type C4 : C4 [property Obj2] : Object | | Constructors.cs:132:25:132:26 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | @@ -176,8 +212,12 @@ nodes | Constructors.cs:134:14:134:20 | access to property Obj2 | semmle.label | access to property Obj2 | | Constructors.cs:137:29:137:32 | Obj1 : Object | semmle.label | Obj1 : Object | | Constructors.cs:137:42:137:45 | Obj2 : Object | semmle.label | Obj2 : Object | +| Constructors.cs:141:13:141:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | | Constructors.cs:141:18:141:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:142:13:142:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | | Constructors.cs:142:18:142:35 | call to method Source : Object | semmle.label | call to method Source : Object | +| Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj1] : Object | semmle.label | access to local variable r1 : R1 [property Obj1] : Object | +| Constructors.cs:143:13:143:14 | access to local variable r1 : R1 [property Obj2] : Object | semmle.label | access to local variable r1 : R1 [property Obj2] : Object | | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj1] : Object | semmle.label | object creation of type R1 : R1 [property Obj1] : Object | | Constructors.cs:143:18:143:31 | object creation of type R1 : R1 [property Obj2] : Object | semmle.label | object creation of type R1 : R1 [property Obj2] : Object | | Constructors.cs:143:25:143:26 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | @@ -187,15 +227,15 @@ nodes | Constructors.cs:145:14:145:15 | access to local variable r1 : R1 [property Obj2] : Object | semmle.label | access to local variable r1 : R1 [property Obj2] : Object | | Constructors.cs:145:14:145:20 | access to property Obj2 | semmle.label | access to property Obj2 | subpaths -| Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:19 | SSA def(o1) : Object | Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | +| Constructors.cs:64:37:64:37 | access to parameter o : Object | Constructors.cs:57:54:57:55 | o2 : Object | Constructors.cs:59:13:59:14 | access to parameter o1 : Object | Constructors.cs:64:27:64:34 | access to parameter o22param : Object | | Constructors.cs:71:25:71:25 | access to local variable o : Object | Constructors.cs:41:26:41:26 | o : Object | Constructors.cs:41:32:41:34 | [post] this access : C1 [field Obj] : Object | Constructors.cs:71:18:71:26 | object creation of type C1 : C1 [field Obj] : Object | | Constructors.cs:79:25:79:27 | access to local variable o21 : Object | Constructors.cs:44:28:44:35 | o21param : Object | Constructors.cs:46:23:46:27 | [post] this access : C2 [field Obj21] : Object | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [field Obj21] : Object | | Constructors.cs:79:30:79:32 | access to local variable o22 : Object | Constructors.cs:44:45:44:52 | o22param : Object | Constructors.cs:44:45:44:52 | o22param : Object | Constructors.cs:79:18:79:33 | object creation of type C2 : C2 [parameter o22param] : Object | | Constructors.cs:81:14:81:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | access to parameter o22param : Object | Constructors.cs:81:14:81:21 | access to property Obj22 | | Constructors.cs:82:14:82:15 | access to local variable c2 : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | this : C2 [field Obj21] : Object | Constructors.cs:50:32:50:36 | access to field Obj21 : Object | Constructors.cs:82:14:82:21 | access to property Obj23 | -| Constructors.cs:92:19:92:23 | access to local variable taint : Object | Constructors.cs:52:35:52:35 | o : Object | Constructors.cs:54:13:54:24 | SSA def(o22param) : Object | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | +| Constructors.cs:92:19:92:23 | access to local variable taint : Object | Constructors.cs:52:35:52:35 | o : Object | Constructors.cs:54:13:54:20 | access to parameter o22param : Object | Constructors.cs:92:9:92:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:93:14:93:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | access to parameter o22param : Object | Constructors.cs:93:14:93:21 | access to property Obj22 | -| Constructors.cs:100:25:100:29 | access to local variable taint : Object | Constructors.cs:62:41:62:41 | o : Object | Constructors.cs:64:27:64:34 | SSA def(o22param) : Object | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | +| Constructors.cs:100:25:100:29 | access to local variable taint : Object | Constructors.cs:62:41:62:41 | o : Object | Constructors.cs:64:27:64:34 | access to parameter o22param : Object | Constructors.cs:100:9:100:10 | [post] access to local variable c2 : C2 [parameter o22param] : Object | | Constructors.cs:101:14:101:15 | access to local variable c2 : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | this : C2 [parameter o22param] : Object | Constructors.cs:48:32:48:39 | access to parameter o22param : Object | Constructors.cs:101:14:101:21 | access to property Obj22 | | Constructors.cs:112:25:112:27 | access to local variable o31 : Object | Constructors.cs:104:28:104:35 | o31param : Object | Constructors.cs:104:28:104:35 | o31param : Object | Constructors.cs:112:18:112:28 | object creation of type C3 : C3 [parameter o31param] : Object | | Constructors.cs:113:14:113:15 | access to local variable c3 : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | this : C3 [parameter o31param] : Object | Constructors.cs:106:32:106:39 | access to parameter o31param : Object | Constructors.cs:113:14:113:21 | access to property Obj31 | diff --git a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected index a64ed809a80..c6a600f068a 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.expected @@ -1,12 +1,16 @@ invalidModelRow edges -| ExternalFlow.cs:9:27:9:38 | object creation of type Object : Object | ExternalFlow.cs:10:29:10:32 | access to local variable arg1 : Object | provenance | | +| ExternalFlow.cs:9:20:9:23 | access to local variable arg1 : Object | ExternalFlow.cs:10:29:10:32 | access to local variable arg1 : Object | provenance | | +| ExternalFlow.cs:9:27:9:38 | object creation of type Object : Object | ExternalFlow.cs:9:20:9:23 | access to local variable arg1 : Object | provenance | | | ExternalFlow.cs:10:29:10:32 | access to local variable arg1 : Object | ExternalFlow.cs:10:18:10:33 | call to method StepArgRes | provenance | | -| ExternalFlow.cs:15:29:15:40 | object creation of type Object : Object | ExternalFlow.cs:17:24:17:29 | access to local variable argIn1 : Object | provenance | | -| ExternalFlow.cs:16:30:16:41 | object creation of type Object : Object | ExternalFlow.cs:18:18:18:24 | access to local variable argOut1 | provenance | | +| ExternalFlow.cs:15:20:15:25 | access to local variable argIn1 : Object | ExternalFlow.cs:17:24:17:29 | access to local variable argIn1 : Object | provenance | | +| ExternalFlow.cs:15:29:15:40 | object creation of type Object : Object | ExternalFlow.cs:15:20:15:25 | access to local variable argIn1 : Object | provenance | | +| ExternalFlow.cs:16:20:16:26 | access to local variable argOut1 : Object | ExternalFlow.cs:18:18:18:24 | access to local variable argOut1 | provenance | | +| ExternalFlow.cs:16:30:16:41 | object creation of type Object : Object | ExternalFlow.cs:16:20:16:26 | access to local variable argOut1 : Object | provenance | | | ExternalFlow.cs:17:24:17:29 | access to local variable argIn1 : Object | ExternalFlow.cs:17:32:17:38 | [post] access to local variable argOut1 : Object | provenance | | | ExternalFlow.cs:17:32:17:38 | [post] access to local variable argOut1 : Object | ExternalFlow.cs:18:18:18:24 | access to local variable argOut1 | provenance | | -| ExternalFlow.cs:23:27:23:38 | object creation of type Object : Object | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | provenance | | +| ExternalFlow.cs:23:20:23:23 | access to local variable arg2 : Object | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | provenance | | +| ExternalFlow.cs:23:27:23:38 | object creation of type Object : Object | ExternalFlow.cs:23:20:23:23 | access to local variable arg2 : Object | provenance | | | ExternalFlow.cs:24:13:24:29 | [post] this access : D | ExternalFlow.cs:25:18:25:21 | this access | provenance | | | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | ExternalFlow.cs:24:13:24:29 | [post] this access : D | provenance | | | ExternalFlow.cs:30:13:30:16 | [post] this access : D [field Field] : Object | ExternalFlow.cs:31:18:31:21 | this access : D [field Field] : Object | provenance | | @@ -30,23 +34,29 @@ edges | ExternalFlow.cs:55:18:55:21 | this access : D [element] : Object | ExternalFlow.cs:55:18:55:41 | call to method StepElementGetter | provenance | | | ExternalFlow.cs:60:35:60:35 | o : Object | ExternalFlow.cs:60:47:60:47 | access to parameter o | provenance | | | ExternalFlow.cs:60:64:60:75 | object creation of type Object : Object | ExternalFlow.cs:60:35:60:35 | o : Object | provenance | | -| ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | ExternalFlow.cs:66:18:66:18 | access to local variable o | provenance | | +| ExternalFlow.cs:65:17:65:17 | access to local variable o : Object | ExternalFlow.cs:66:18:66:18 | access to local variable o | provenance | | +| ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | ExternalFlow.cs:65:17:65:17 | access to local variable o : Object | provenance | | | ExternalFlow.cs:65:45:65:56 | object creation of type Object : Object | ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | provenance | | -| ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | provenance | | +| ExternalFlow.cs:71:17:71:20 | access to local variable objs : null [element] : Object | ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | provenance | | +| ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:71:17:71:20 | access to local variable objs : null [element] : Object | provenance | | | ExternalFlow.cs:71:32:71:43 | object creation of type Object : Object | ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | provenance | | | ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | ExternalFlow.cs:72:23:72:23 | o : Object | provenance | | | ExternalFlow.cs:72:23:72:23 | o : Object | ExternalFlow.cs:72:35:72:35 | access to parameter o | provenance | | -| ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | provenance | | +| ExternalFlow.cs:77:17:77:20 | access to local variable objs : T[] [element] : Object | ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | provenance | | +| ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | ExternalFlow.cs:77:17:77:20 | access to local variable objs : T[] [element] : Object | provenance | | | ExternalFlow.cs:77:46:77:57 | object creation of type Object : Object | ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | provenance | | | ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | ExternalFlow.cs:78:18:78:24 | access to array element | provenance | | -| ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | provenance | | +| ExternalFlow.cs:83:17:83:20 | access to local variable objs : null [element] : Object | ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | provenance | | +| ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | ExternalFlow.cs:83:17:83:20 | access to local variable objs : null [element] : Object | provenance | | | ExternalFlow.cs:83:32:83:43 | object creation of type Object : Object | ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | provenance | | -| ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | provenance | | +| ExternalFlow.cs:84:17:84:21 | access to local variable objs2 : T[] [element] : Object | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | provenance | | +| ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | ExternalFlow.cs:84:17:84:21 | access to local variable objs2 : T[] [element] : Object | provenance | | | ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | provenance | | | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | ExternalFlow.cs:85:18:85:25 | access to array element | provenance | | -| ExternalFlow.cs:90:21:90:34 | object creation of type String : String | ExternalFlow.cs:91:19:91:19 | access to local variable s : String | provenance | | -| ExternalFlow.cs:91:19:91:19 | access to local variable s : String | ExternalFlow.cs:91:30:91:30 | SSA def(i) : Int32 | provenance | | -| ExternalFlow.cs:91:30:91:30 | SSA def(i) : Int32 | ExternalFlow.cs:92:18:92:18 | (...) ... | provenance | | +| ExternalFlow.cs:90:17:90:17 | access to local variable s : String | ExternalFlow.cs:91:19:91:19 | access to local variable s : String | provenance | | +| ExternalFlow.cs:90:21:90:34 | object creation of type String : String | ExternalFlow.cs:90:17:90:17 | access to local variable s : String | provenance | | +| ExternalFlow.cs:91:19:91:19 | access to local variable s : String | ExternalFlow.cs:91:30:91:30 | Int32 i : Int32 | provenance | | +| ExternalFlow.cs:91:30:91:30 | Int32 i : Int32 | ExternalFlow.cs:92:18:92:18 | (...) ... | provenance | | | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | ExternalFlow.cs:103:16:103:17 | access to local variable d1 : D [field Field] : Object | provenance | | | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | ExternalFlow.cs:104:18:104:19 | access to local variable d1 : D [field Field] : Object | provenance | | | ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | provenance | | @@ -56,31 +66,42 @@ edges | ExternalFlow.cs:111:13:111:13 | [post] access to local variable f : F [field MyField] : Object | ExternalFlow.cs:112:18:112:18 | access to local variable f : F [field MyField] : Object | provenance | | | ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | ExternalFlow.cs:111:13:111:13 | [post] access to local variable f : F [field MyField] : Object | provenance | | | ExternalFlow.cs:112:18:112:18 | access to local variable f : F [field MyField] : Object | ExternalFlow.cs:112:18:112:25 | access to property MyProp | provenance | | -| ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | provenance | | +| ExternalFlow.cs:117:17:117:17 | access to local variable a : null [element] : Object | ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | provenance | | +| ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | ExternalFlow.cs:117:17:117:17 | access to local variable a : null [element] : Object | provenance | | | ExternalFlow.cs:117:36:117:47 | object creation of type Object : Object | ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | provenance | | -| ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | provenance | | +| ExternalFlow.cs:118:17:118:17 | access to local variable b : null [element] : Object | ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | provenance | | +| ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | ExternalFlow.cs:118:17:118:17 | access to local variable b : null [element] : Object | provenance | | | ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | provenance | | | ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | ExternalFlow.cs:120:18:120:21 | access to array element | provenance | | -| ExternalFlow.cs:205:22:205:33 | object creation of type Object : Object | ExternalFlow.cs:206:38:206:39 | access to local variable o2 : Object | provenance | | +| ExternalFlow.cs:205:17:205:18 | access to local variable o2 : Object | ExternalFlow.cs:206:38:206:39 | access to local variable o2 : Object | provenance | | +| ExternalFlow.cs:205:22:205:33 | object creation of type Object : Object | ExternalFlow.cs:205:17:205:18 | access to local variable o2 : Object | provenance | | | ExternalFlow.cs:206:38:206:39 | access to local variable o2 : Object | ExternalFlow.cs:206:18:206:40 | call to method MixedFlowArgs | provenance | | -| ExternalFlow.cs:211:22:211:33 | object creation of type Object : Object | ExternalFlow.cs:212:52:212:53 | access to local variable o1 : Object | provenance | | +| ExternalFlow.cs:211:17:211:18 | access to local variable o1 : Object | ExternalFlow.cs:212:52:212:53 | access to local variable o1 : Object | provenance | | +| ExternalFlow.cs:211:22:211:33 | object creation of type Object : Object | ExternalFlow.cs:211:17:211:18 | access to local variable o1 : Object | provenance | | | ExternalFlow.cs:212:52:212:53 | access to local variable o1 : Object | ExternalFlow.cs:212:18:212:54 | call to method GeneratedFlowWithGeneratedNeutral | provenance | | -| ExternalFlow.cs:244:21:244:28 | object creation of type HC : HC | ExternalFlow.cs:245:21:245:21 | access to local variable h : HC | provenance | | +| ExternalFlow.cs:244:17:244:17 | access to local variable h : HC | ExternalFlow.cs:245:21:245:21 | access to local variable h : HC | provenance | | +| ExternalFlow.cs:244:21:244:28 | object creation of type HC : HC | ExternalFlow.cs:244:17:244:17 | access to local variable h : HC | provenance | | +| ExternalFlow.cs:245:17:245:17 | access to local variable o : HC | ExternalFlow.cs:246:18:246:18 | access to local variable o | provenance | | | ExternalFlow.cs:245:21:245:21 | access to local variable h : HC | ExternalFlow.cs:245:21:245:39 | call to method ExtensionMethod : HC | provenance | | -| ExternalFlow.cs:245:21:245:39 | call to method ExtensionMethod : HC | ExternalFlow.cs:246:18:246:18 | access to local variable o | provenance | | +| ExternalFlow.cs:245:21:245:39 | call to method ExtensionMethod : HC | ExternalFlow.cs:245:17:245:17 | access to local variable o : HC | provenance | | | ExternalFlow.cs:262:13:262:13 | [post] access to parameter a : MyInlineArray [element] : Object | ExternalFlow.cs:263:30:263:30 | access to parameter a : MyInlineArray [element] : Object | provenance | | | ExternalFlow.cs:262:20:262:31 | object creation of type Object : Object | ExternalFlow.cs:262:13:262:13 | [post] access to parameter a : MyInlineArray [element] : Object | provenance | | -| ExternalFlow.cs:263:21:263:31 | call to method GetFirst : Object | ExternalFlow.cs:264:18:264:18 | access to local variable b | provenance | | +| ExternalFlow.cs:263:17:263:17 | access to local variable b : Object | ExternalFlow.cs:264:18:264:18 | access to local variable b | provenance | | +| ExternalFlow.cs:263:21:263:31 | call to method GetFirst : Object | ExternalFlow.cs:263:17:263:17 | access to local variable b : Object | provenance | | | ExternalFlow.cs:263:30:263:30 | access to parameter a : MyInlineArray [element] : Object | ExternalFlow.cs:263:21:263:31 | call to method GetFirst : Object | provenance | | nodes +| ExternalFlow.cs:9:20:9:23 | access to local variable arg1 : Object | semmle.label | access to local variable arg1 : Object | | ExternalFlow.cs:9:27:9:38 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:10:18:10:33 | call to method StepArgRes | semmle.label | call to method StepArgRes | | ExternalFlow.cs:10:29:10:32 | access to local variable arg1 : Object | semmle.label | access to local variable arg1 : Object | +| ExternalFlow.cs:15:20:15:25 | access to local variable argIn1 : Object | semmle.label | access to local variable argIn1 : Object | | ExternalFlow.cs:15:29:15:40 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:16:20:16:26 | access to local variable argOut1 : Object | semmle.label | access to local variable argOut1 : Object | | ExternalFlow.cs:16:30:16:41 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:17:24:17:29 | access to local variable argIn1 : Object | semmle.label | access to local variable argIn1 : Object | | ExternalFlow.cs:17:32:17:38 | [post] access to local variable argOut1 : Object | semmle.label | [post] access to local variable argOut1 : Object | | ExternalFlow.cs:18:18:18:24 | access to local variable argOut1 | semmle.label | access to local variable argOut1 | +| ExternalFlow.cs:23:20:23:23 | access to local variable arg2 : Object | semmle.label | access to local variable arg2 : Object | | ExternalFlow.cs:23:27:23:38 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:24:13:24:29 | [post] this access : D | semmle.label | [post] this access : D | | ExternalFlow.cs:24:25:24:28 | access to local variable arg2 : Object | semmle.label | access to local variable arg2 : Object | @@ -112,27 +133,33 @@ nodes | ExternalFlow.cs:60:35:60:35 | o : Object | semmle.label | o : Object | | ExternalFlow.cs:60:47:60:47 | access to parameter o | semmle.label | access to parameter o | | ExternalFlow.cs:60:64:60:75 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:65:17:65:17 | access to local variable o : Object | semmle.label | access to local variable o : Object | | ExternalFlow.cs:65:21:65:60 | call to method Apply : Object | semmle.label | call to method Apply : Object | | ExternalFlow.cs:65:45:65:56 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:66:18:66:18 | access to local variable o | semmle.label | access to local variable o | +| ExternalFlow.cs:71:17:71:20 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | | ExternalFlow.cs:71:30:71:45 | { ..., ... } : null [element] : Object | semmle.label | { ..., ... } : null [element] : Object | | ExternalFlow.cs:71:32:71:43 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:72:17:72:20 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | | ExternalFlow.cs:72:23:72:23 | o : Object | semmle.label | o : Object | | ExternalFlow.cs:72:35:72:35 | access to parameter o | semmle.label | access to parameter o | +| ExternalFlow.cs:77:17:77:20 | access to local variable objs : T[] [element] : Object | semmle.label | access to local variable objs : T[] [element] : Object | | ExternalFlow.cs:77:24:77:58 | call to method Map : T[] [element] : Object | semmle.label | call to method Map : T[] [element] : Object | | ExternalFlow.cs:77:46:77:57 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:78:18:78:21 | access to local variable objs : T[] [element] : Object | semmle.label | access to local variable objs : T[] [element] : Object | | ExternalFlow.cs:78:18:78:24 | access to array element | semmle.label | access to array element | +| ExternalFlow.cs:83:17:83:20 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | | ExternalFlow.cs:83:30:83:45 | { ..., ... } : null [element] : Object | semmle.label | { ..., ... } : null [element] : Object | | ExternalFlow.cs:83:32:83:43 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:84:17:84:21 | access to local variable objs2 : T[] [element] : Object | semmle.label | access to local variable objs2 : T[] [element] : Object | | ExternalFlow.cs:84:25:84:41 | call to method Map : T[] [element] : Object | semmle.label | call to method Map : T[] [element] : Object | | ExternalFlow.cs:84:29:84:32 | access to local variable objs : null [element] : Object | semmle.label | access to local variable objs : null [element] : Object | | ExternalFlow.cs:85:18:85:22 | access to local variable objs2 : T[] [element] : Object | semmle.label | access to local variable objs2 : T[] [element] : Object | | ExternalFlow.cs:85:18:85:25 | access to array element | semmle.label | access to array element | +| ExternalFlow.cs:90:17:90:17 | access to local variable s : String | semmle.label | access to local variable s : String | | ExternalFlow.cs:90:21:90:34 | object creation of type String : String | semmle.label | object creation of type String : String | | ExternalFlow.cs:91:19:91:19 | access to local variable s : String | semmle.label | access to local variable s : String | -| ExternalFlow.cs:91:30:91:30 | SSA def(i) : Int32 | semmle.label | SSA def(i) : Int32 | +| ExternalFlow.cs:91:30:91:30 | Int32 i : Int32 | semmle.label | Int32 i : Int32 | | ExternalFlow.cs:92:18:92:18 | (...) ... | semmle.label | (...) ... | | ExternalFlow.cs:98:13:98:14 | [post] access to local variable d1 : D [field Field] : Object | semmle.label | [post] access to local variable d1 : D [field Field] : Object | | ExternalFlow.cs:98:24:98:35 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | @@ -145,24 +172,31 @@ nodes | ExternalFlow.cs:111:24:111:35 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:112:18:112:18 | access to local variable f : F [field MyField] : Object | semmle.label | access to local variable f : F [field MyField] : Object | | ExternalFlow.cs:112:18:112:25 | access to property MyProp | semmle.label | access to property MyProp | +| ExternalFlow.cs:117:17:117:17 | access to local variable a : null [element] : Object | semmle.label | access to local variable a : null [element] : Object | | ExternalFlow.cs:117:34:117:49 | { ..., ... } : null [element] : Object | semmle.label | { ..., ... } : null [element] : Object | | ExternalFlow.cs:117:36:117:47 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:118:17:118:17 | access to local variable b : null [element] : Object | semmle.label | access to local variable b : null [element] : Object | | ExternalFlow.cs:118:21:118:30 | call to method Reverse : null [element] : Object | semmle.label | call to method Reverse : null [element] : Object | | ExternalFlow.cs:118:29:118:29 | access to local variable a : null [element] : Object | semmle.label | access to local variable a : null [element] : Object | | ExternalFlow.cs:120:18:120:18 | access to local variable b : null [element] : Object | semmle.label | access to local variable b : null [element] : Object | | ExternalFlow.cs:120:18:120:21 | access to array element | semmle.label | access to array element | +| ExternalFlow.cs:205:17:205:18 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | | ExternalFlow.cs:205:22:205:33 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:206:18:206:40 | call to method MixedFlowArgs | semmle.label | call to method MixedFlowArgs | | ExternalFlow.cs:206:38:206:39 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| ExternalFlow.cs:211:17:211:18 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | | ExternalFlow.cs:211:22:211:33 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | | ExternalFlow.cs:212:18:212:54 | call to method GeneratedFlowWithGeneratedNeutral | semmle.label | call to method GeneratedFlowWithGeneratedNeutral | | ExternalFlow.cs:212:52:212:53 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| ExternalFlow.cs:244:17:244:17 | access to local variable h : HC | semmle.label | access to local variable h : HC | | ExternalFlow.cs:244:21:244:28 | object creation of type HC : HC | semmle.label | object creation of type HC : HC | +| ExternalFlow.cs:245:17:245:17 | access to local variable o : HC | semmle.label | access to local variable o : HC | | ExternalFlow.cs:245:21:245:21 | access to local variable h : HC | semmle.label | access to local variable h : HC | | ExternalFlow.cs:245:21:245:39 | call to method ExtensionMethod : HC | semmle.label | call to method ExtensionMethod : HC | | ExternalFlow.cs:246:18:246:18 | access to local variable o | semmle.label | access to local variable o | | ExternalFlow.cs:262:13:262:13 | [post] access to parameter a : MyInlineArray [element] : Object | semmle.label | [post] access to parameter a : MyInlineArray [element] : Object | | ExternalFlow.cs:262:20:262:31 | object creation of type Object : Object | semmle.label | object creation of type Object : Object | +| ExternalFlow.cs:263:17:263:17 | access to local variable b : Object | semmle.label | access to local variable b : Object | | ExternalFlow.cs:263:21:263:31 | call to method GetFirst : Object | semmle.label | call to method GetFirst : Object | | ExternalFlow.cs:263:30:263:30 | access to parameter a : MyInlineArray [element] : Object | semmle.label | access to parameter a : MyInlineArray [element] : Object | | ExternalFlow.cs:264:18:264:18 | access to local variable b | semmle.label | access to local variable b | diff --git a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected index 4ab54cac22b..f6f6da0109c 100644 --- a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected @@ -1,9 +1,13 @@ testFailures edges -| A.cs:5:17:5:28 | call to method Source : C | A.cs:6:24:6:24 | access to local variable c : C | provenance | | -| A.cs:5:17:5:28 | call to method Source : C | A.cs:6:24:6:24 | access to local variable c : C | provenance | | -| A.cs:6:17:6:25 | call to method Make : B [field c] : C | A.cs:7:14:7:14 | access to local variable b : B [field c] : C | provenance | | -| A.cs:6:17:6:25 | call to method Make : B [field c] : C | A.cs:7:14:7:14 | access to local variable b : B [field c] : C | provenance | | +| A.cs:5:13:5:13 | access to local variable c : C | A.cs:6:24:6:24 | access to local variable c : C | provenance | | +| A.cs:5:13:5:13 | access to local variable c : C | A.cs:6:24:6:24 | access to local variable c : C | provenance | | +| A.cs:5:17:5:28 | call to method Source : C | A.cs:5:13:5:13 | access to local variable c : C | provenance | | +| A.cs:5:17:5:28 | call to method Source : C | A.cs:5:13:5:13 | access to local variable c : C | provenance | | +| A.cs:6:13:6:13 | access to local variable b : B [field c] : C | A.cs:7:14:7:14 | access to local variable b : B [field c] : C | provenance | | +| A.cs:6:13:6:13 | access to local variable b : B [field c] : C | A.cs:7:14:7:14 | access to local variable b : B [field c] : C | provenance | | +| A.cs:6:17:6:25 | call to method Make : B [field c] : C | A.cs:6:13:6:13 | access to local variable b : B [field c] : C | provenance | | +| A.cs:6:17:6:25 | call to method Make : B [field c] : C | A.cs:6:13:6:13 | access to local variable b : B [field c] : C | provenance | | | A.cs:6:24:6:24 | access to local variable c : C | A.cs:6:17:6:25 | call to method Make : B [field c] : C | provenance | | | A.cs:6:24:6:24 | access to local variable c : C | A.cs:6:17:6:25 | call to method Make : B [field c] : C | provenance | | | A.cs:6:24:6:24 | access to local variable c : C | A.cs:147:32:147:32 | c : C | provenance | | @@ -28,16 +32,20 @@ edges | A.cs:15:21:15:34 | call to method Source : C | A.cs:15:15:15:35 | object creation of type B : B [field c] : C | provenance | | | A.cs:15:21:15:34 | call to method Source : C | A.cs:141:20:141:20 | c : C | provenance | | | A.cs:15:21:15:34 | call to method Source : C | A.cs:141:20:141:20 | c : C | provenance | | -| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | provenance | | -| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | provenance | | | A.cs:22:25:22:37 | call to method Source : C2 | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | provenance | | | A.cs:22:25:22:37 | call to method Source : C2 | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | provenance | | | A.cs:22:25:22:37 | call to method Source : C2 | A.cs:42:29:42:29 | c : C2 | provenance | | | A.cs:22:25:22:37 | call to method Source : C2 | A.cs:42:29:42:29 | c : C2 | provenance | | | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | A.cs:24:14:24:17 | access to field c | provenance | | | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | A.cs:24:14:24:17 | access to field c | provenance | | -| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | provenance | | -| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | provenance | | | A.cs:31:29:31:41 | call to method Source : C2 | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | provenance | | | A.cs:31:29:31:41 | call to method Source : C2 | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | provenance | | | A.cs:31:29:31:41 | call to method Source : C2 | A.cs:36:33:36:33 | c : C2 | provenance | | @@ -46,8 +54,10 @@ edges | A.cs:33:14:33:15 | access to local variable b2 : B [field c] : C2 | A.cs:33:14:33:17 | access to field c | provenance | | | A.cs:36:33:36:33 | c : C2 | A.cs:38:29:38:29 | access to parameter c : C2 | provenance | | | A.cs:36:33:36:33 | c : C2 | A.cs:38:29:38:29 | access to parameter c : C2 | provenance | | -| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | provenance | | -| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | provenance | | +| A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | provenance | | +| A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | A.cs:39:16:39:28 | ... ? ... : ... : B [field c] : C2 | provenance | | +| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | provenance | | +| A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | provenance | | | A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | provenance | | | A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | provenance | | | A.cs:38:29:38:29 | access to parameter c : C2 | A.cs:42:29:42:29 | c : C2 | provenance | | @@ -60,8 +70,10 @@ edges | A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:47:13:47:14 | [post] access to local variable b2 : B [field c] : C2 | provenance | | | A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:145:27:145:27 | c : C2 | provenance | | | A.cs:47:20:47:20 | access to parameter c : C2 | A.cs:145:27:145:27 | c : C2 | provenance | | -| A.cs:55:17:55:28 | call to method Source : A | A.cs:57:16:57:16 | access to local variable a : A | provenance | | -| A.cs:55:17:55:28 | call to method Source : A | A.cs:57:16:57:16 | access to local variable a : A | provenance | | +| A.cs:55:13:55:13 | access to local variable a : A | A.cs:57:16:57:16 | access to local variable a : A | provenance | | +| A.cs:55:13:55:13 | access to local variable a : A | A.cs:57:16:57:16 | access to local variable a : A | provenance | | +| A.cs:55:17:55:28 | call to method Source : A | A.cs:55:13:55:13 | access to local variable a : A | provenance | | +| A.cs:55:17:55:28 | call to method Source : A | A.cs:55:13:55:13 | access to local variable a : A | provenance | | | A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | A.cs:58:12:58:13 | access to local variable c1 : C1 [field a] : A | provenance | | | A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | A.cs:58:12:58:13 | access to local variable c1 : C1 [field a] : A | provenance | | | A.cs:57:16:57:16 | access to local variable a : A | A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | provenance | | @@ -104,12 +116,18 @@ edges | A.cs:98:22:98:43 | ... ? ... : ... : B [field c] : C | A.cs:98:13:98:16 | [post] this access : D [field b, field c] : C | provenance | | | A.cs:98:30:98:43 | call to method Source : B | A.cs:98:22:98:43 | ... ? ... : ... : B | provenance | | | A.cs:98:30:98:43 | call to method Source : B | A.cs:98:22:98:43 | ... ? ... : ... : B | provenance | | -| A.cs:104:17:104:30 | call to method Source : B | A.cs:105:23:105:23 | access to local variable b : B | provenance | | -| A.cs:104:17:104:30 | call to method Source : B | A.cs:105:23:105:23 | access to local variable b : B | provenance | | -| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | provenance | | -| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | provenance | | -| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | A.cs:106:14:106:14 | access to local variable d : D [field b] : B | provenance | | -| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | A.cs:106:14:106:14 | access to local variable d : D [field b] : B | provenance | | +| A.cs:104:13:104:13 | access to local variable b : B | A.cs:105:23:105:23 | access to local variable b : B | provenance | | +| A.cs:104:13:104:13 | access to local variable b : B | A.cs:105:23:105:23 | access to local variable b : B | provenance | | +| A.cs:104:17:104:30 | call to method Source : B | A.cs:104:13:104:13 | access to local variable b : B | provenance | | +| A.cs:104:17:104:30 | call to method Source : B | A.cs:104:13:104:13 | access to local variable b : B | provenance | | +| A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | provenance | | +| A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | A.cs:107:14:107:14 | access to local variable d : D [field b, field c] : C | provenance | | +| A.cs:105:13:105:13 | access to local variable d : D [field b] : B | A.cs:106:14:106:14 | access to local variable d : D [field b] : B | provenance | | +| A.cs:105:13:105:13 | access to local variable d : D [field b] : B | A.cs:106:14:106:14 | access to local variable d : D [field b] : B | provenance | | +| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | provenance | | +| A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | provenance | | +| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | A.cs:105:13:105:13 | access to local variable d : D [field b] : B | provenance | | +| A.cs:105:17:105:29 | object creation of type D : D [field b] : B | A.cs:105:13:105:13 | access to local variable d : D [field b] : B | provenance | | | A.cs:105:23:105:23 | [post] access to local variable b : B [field c] : C | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | provenance | | | A.cs:105:23:105:23 | [post] access to local variable b : B [field c] : C | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | provenance | | | A.cs:105:23:105:23 | access to local variable b : B | A.cs:95:20:95:20 | b : B | provenance | | @@ -124,24 +142,32 @@ edges | A.cs:107:14:107:16 | access to field b : B [field c] : C | A.cs:107:14:107:18 | access to field c | provenance | | | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | A.cs:108:14:108:16 | access to field c | provenance | | | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | A.cs:108:14:108:16 | access to field c | provenance | | -| A.cs:113:17:113:29 | call to method Source : B | A.cs:114:29:114:29 | access to local variable b : B | provenance | | -| A.cs:113:17:113:29 | call to method Source : B | A.cs:114:29:114:29 | access to local variable b : B | provenance | | -| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | provenance | | -| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | provenance | | +| A.cs:113:13:113:13 | access to local variable b : B | A.cs:114:29:114:29 | access to local variable b : B | provenance | | +| A.cs:113:13:113:13 | access to local variable b : B | A.cs:114:29:114:29 | access to local variable b : B | provenance | | +| A.cs:113:17:113:29 | call to method Source : B | A.cs:113:13:113:13 | access to local variable b : B | provenance | | +| A.cs:113:17:113:29 | call to method Source : B | A.cs:113:13:113:13 | access to local variable b : B | provenance | | +| A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | provenance | | +| A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | provenance | | +| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | provenance | | +| A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | provenance | | | A.cs:114:29:114:29 | access to local variable b : B | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | provenance | | | A.cs:114:29:114:29 | access to local variable b : B | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | provenance | | | A.cs:114:29:114:29 | access to local variable b : B | A.cs:157:25:157:28 | head : B | provenance | | | A.cs:114:29:114:29 | access to local variable b : B | A.cs:157:25:157:28 | head : B | provenance | | -| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | provenance | | -| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | provenance | | +| A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | provenance | | +| A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | provenance | | +| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | provenance | | +| A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | provenance | | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | provenance | | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | provenance | | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:157:38:157:41 | next : MyList [field head] : B | provenance | | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | A.cs:157:38:157:41 | next : MyList [field head] : B | provenance | | -| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | -| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | -| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | -| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | A.cs:119:14:119:15 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | +| A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | provenance | | | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | provenance | | | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | provenance | | | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | A.cs:157:38:157:41 | next : MyList [field next, field head] : B | provenance | | @@ -152,14 +178,20 @@ edges | A.cs:119:14:119:20 | access to field next : MyList [field next, field head] : B | A.cs:119:14:119:25 | access to field next : MyList [field head] : B | provenance | | | A.cs:119:14:119:25 | access to field next : MyList [field head] : B | A.cs:119:14:119:30 | access to field head | provenance | | | A.cs:119:14:119:25 | access to field next : MyList [field head] : B | A.cs:119:14:119:30 | access to field head | provenance | | +| A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | provenance | | +| A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | provenance | | +| A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | provenance | | +| A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | provenance | | +| A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | provenance | | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field head] : B | provenance | | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field head] : B | provenance | | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | provenance | | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | provenance | | -| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | provenance | | -| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | provenance | | -| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | provenance | | -| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | provenance | | +| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | provenance | | +| A.cs:121:41:121:46 | access to field next : MyList [field head] : B | A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | provenance | | +| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | provenance | | +| A.cs:121:41:121:46 | access to field next : MyList [field next, field head] : B | A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | provenance | | | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | A.cs:123:18:123:23 | access to field head | provenance | | | A.cs:123:18:123:18 | access to local variable l : MyList [field head] : B | A.cs:123:18:123:23 | access to field head | provenance | | | A.cs:141:20:141:20 | c : C | A.cs:143:22:143:22 | access to parameter c : C | provenance | | @@ -204,16 +236,22 @@ edges | A.cs:160:25:160:28 | access to parameter next : MyList [field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field head] : B | provenance | | | A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field next, field head] : B | provenance | | | A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | A.cs:160:13:160:16 | [post] this access : MyList [field next, field next, field head] : B | provenance | | -| B.cs:5:17:5:31 | call to method Source : Elem | B.cs:6:27:6:27 | access to local variable e : Elem | provenance | | -| B.cs:5:17:5:31 | call to method Source : Elem | B.cs:6:27:6:27 | access to local variable e : Elem | provenance | | -| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | -| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | +| B.cs:5:13:5:13 | access to local variable e : Elem | B.cs:6:27:6:27 | access to local variable e : Elem | provenance | | +| B.cs:5:13:5:13 | access to local variable e : Elem | B.cs:6:27:6:27 | access to local variable e : Elem | provenance | | +| B.cs:5:17:5:31 | call to method Source : Elem | B.cs:5:13:5:13 | access to local variable e : Elem | provenance | | +| B.cs:5:17:5:31 | call to method Source : Elem | B.cs:5:13:5:13 | access to local variable e : Elem | provenance | | +| B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | +| B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | +| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | +| B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | provenance | | | B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | provenance | | | B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | provenance | | | B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:29:26:29:27 | e1 : Elem | provenance | | | B.cs:6:27:6:27 | access to local variable e : Elem | B.cs:29:26:29:27 | e1 : Elem | provenance | | -| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | -| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | +| B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | +| B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | +| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | +| B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | provenance | | | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | provenance | | | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | provenance | | | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | B.cs:39:26:39:27 | b1 : Box1 [field elem1] : Elem | provenance | | @@ -222,16 +260,22 @@ edges | B.cs:8:14:8:15 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | provenance | | | B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | B.cs:8:14:8:26 | access to field elem1 | provenance | | | B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | B.cs:8:14:8:26 | access to field elem1 | provenance | | -| B.cs:14:17:14:31 | call to method Source : Elem | B.cs:15:33:15:33 | access to local variable e : Elem | provenance | | -| B.cs:14:17:14:31 | call to method Source : Elem | B.cs:15:33:15:33 | access to local variable e : Elem | provenance | | -| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | -| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | +| B.cs:14:13:14:13 | access to local variable e : Elem | B.cs:15:33:15:33 | access to local variable e : Elem | provenance | | +| B.cs:14:13:14:13 | access to local variable e : Elem | B.cs:15:33:15:33 | access to local variable e : Elem | provenance | | +| B.cs:14:17:14:31 | call to method Source : Elem | B.cs:14:13:14:13 | access to local variable e : Elem | provenance | | +| B.cs:14:17:14:31 | call to method Source : Elem | B.cs:14:13:14:13 | access to local variable e : Elem | provenance | | +| B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | +| B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | +| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | +| B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | provenance | | | B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | provenance | | | B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | provenance | | | B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:29:35:29:36 | e2 : Elem | provenance | | | B.cs:15:33:15:33 | access to local variable e : Elem | B.cs:29:35:29:36 | e2 : Elem | provenance | | -| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | -| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | +| B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | +| B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | B.cs:18:14:18:15 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | +| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | +| B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | provenance | | | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | provenance | | | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | provenance | | | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | B.cs:39:26:39:27 | b1 : Box1 [field elem2] : Elem | provenance | | @@ -272,14 +316,22 @@ edges | C.cs:7:37:7:51 | call to method Source : Elem | C.cs:7:18:7:19 | [post] this access : C [property s5] : Elem | provenance | | | C.cs:8:30:8:44 | call to method Source : Elem | C.cs:28:14:28:15 | access to property s6 | provenance | | | C.cs:8:30:8:44 | call to method Source : Elem | C.cs:28:14:28:15 | access to property s6 | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | provenance | | -| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | C.cs:13:9:13:9 | access to local variable c : C [field s3] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | provenance | | +| C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | C.cs:13:9:13:9 | access to local variable c : C [property s5] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [field s3] : Elem | C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | provenance | | +| C.cs:12:15:12:21 | object creation of type C : C [property s5] : Elem | C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | provenance | | | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | C.cs:21:17:21:18 | this : C [field s1] : Elem | provenance | | | C.cs:13:9:13:9 | access to local variable c : C [field s1] : Elem | C.cs:21:17:21:18 | this : C [field s1] : Elem | provenance | | | C.cs:13:9:13:9 | access to local variable c : C [field s2] : Elem | C.cs:21:17:21:18 | this : C [field s2] : Elem | provenance | | @@ -348,22 +400,28 @@ edges | D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:15:9:15:11 | value : Object | provenance | | | D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:23:9:23:11 | [post] access to local variable ret : D [field trivialPropField] : Object | provenance | | | D.cs:23:27:23:28 | access to parameter o3 : Object | D.cs:23:9:23:11 | [post] access to local variable ret : D [field trivialPropField] : Object | provenance | | -| D.cs:29:17:29:33 | call to method Source : Object | D.cs:31:24:31:24 | access to local variable o : Object | provenance | | -| D.cs:29:17:29:33 | call to method Source : Object | D.cs:31:24:31:24 | access to local variable o : Object | provenance | | -| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | provenance | | -| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | provenance | | +| D.cs:29:13:29:13 | access to local variable o : Object | D.cs:31:24:31:24 | access to local variable o : Object | provenance | | +| D.cs:29:13:29:13 | access to local variable o : Object | D.cs:31:24:31:24 | access to local variable o : Object | provenance | | +| D.cs:29:17:29:33 | call to method Source : Object | D.cs:29:13:29:13 | access to local variable o : Object | provenance | | +| D.cs:29:17:29:33 | call to method Source : Object | D.cs:29:13:29:13 | access to local variable o : Object | provenance | | +| D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | provenance | | +| D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | provenance | | +| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | provenance | | +| D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | provenance | | | D.cs:31:24:31:24 | access to local variable o : Object | D.cs:18:28:18:29 | o1 : Object | provenance | | | D.cs:31:24:31:24 | access to local variable o : Object | D.cs:18:28:18:29 | o1 : Object | provenance | | | D.cs:31:24:31:24 | access to local variable o : Object | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | provenance | | | D.cs:31:24:31:24 | access to local variable o : Object | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | provenance | | | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | D.cs:32:14:32:23 | access to property AutoProp | provenance | | | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | D.cs:32:14:32:23 | access to property AutoProp | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:39:14:39:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:40:14:40:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | provenance | | | D.cs:37:26:37:42 | call to method Source : Object | D.cs:18:39:18:40 | o2 : Object | provenance | | | D.cs:37:26:37:42 | call to method Source : Object | D.cs:18:39:18:40 | o2 : Object | provenance | | | D.cs:37:26:37:42 | call to method Source : Object | D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | provenance | | @@ -378,12 +436,14 @@ edges | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:14:9:14:11 | this : D [field trivialPropField] : Object | provenance | | | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:41:14:41:26 | access to property ComplexProp | provenance | | | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | D.cs:41:14:41:26 | access to property ComplexProp | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | -| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:45:14:45:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:46:14:46:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | D.cs:47:14:47:14 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | provenance | | +| D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | provenance | | | D.cs:43:32:43:48 | call to method Source : Object | D.cs:18:50:18:51 | o3 : Object | provenance | | | D.cs:43:32:43:48 | call to method Source : Object | D.cs:18:50:18:51 | o3 : Object | provenance | | | D.cs:43:32:43:48 | call to method Source : Object | D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | provenance | | @@ -404,10 +464,14 @@ edges | E.cs:11:9:11:11 | [post] access to local variable ret : S [field Field] : Object | E.cs:12:16:12:18 | access to local variable ret : S [field Field] : Object | provenance | | | E.cs:11:21:11:21 | access to parameter o : Object | E.cs:11:9:11:11 | [post] access to local variable ret : S [field Field] : Object | provenance | | | E.cs:11:21:11:21 | access to parameter o : Object | E.cs:11:9:11:11 | [post] access to local variable ret : S [field Field] : Object | provenance | | -| E.cs:22:17:22:33 | call to method Source : Object | E.cs:23:25:23:25 | access to local variable o : Object | provenance | | -| E.cs:22:17:22:33 | call to method Source : Object | E.cs:23:25:23:25 | access to local variable o : Object | provenance | | -| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | provenance | | -| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | provenance | | +| E.cs:22:13:22:13 | access to local variable o : Object | E.cs:23:25:23:25 | access to local variable o : Object | provenance | | +| E.cs:22:13:22:13 | access to local variable o : Object | E.cs:23:25:23:25 | access to local variable o : Object | provenance | | +| E.cs:22:17:22:33 | call to method Source : Object | E.cs:22:13:22:13 | access to local variable o : Object | provenance | | +| E.cs:22:17:22:33 | call to method Source : Object | E.cs:22:13:22:13 | access to local variable o : Object | provenance | | +| E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | provenance | | +| E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | E.cs:24:14:24:14 | access to local variable s : S [field Field] : Object | provenance | | +| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | provenance | | +| E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | provenance | | | E.cs:23:25:23:25 | access to local variable o : Object | E.cs:8:29:8:29 | o : Object | provenance | | | E.cs:23:25:23:25 | access to local variable o : Object | E.cs:8:29:8:29 | o : Object | provenance | | | E.cs:23:25:23:25 | access to local variable o : Object | E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | provenance | | @@ -418,8 +482,10 @@ edges | E.cs:43:46:43:46 | o : Object | E.cs:46:22:46:22 | access to parameter o : Object | provenance | | | E.cs:46:22:46:22 | access to parameter o : Object | E.cs:46:9:46:9 | [post] access to parameter s : RefS [field RefField] : Object | provenance | | | E.cs:46:22:46:22 | access to parameter o : Object | E.cs:46:9:46:9 | [post] access to parameter s : RefS [field RefField] : Object | provenance | | -| E.cs:54:21:54:37 | call to method Source : Object | E.cs:55:29:55:33 | access to local variable taint : Object | provenance | | -| E.cs:54:21:54:37 | call to method Source : Object | E.cs:55:29:55:33 | access to local variable taint : Object | provenance | | +| E.cs:54:13:54:17 | access to local variable taint : Object | E.cs:55:29:55:33 | access to local variable taint : Object | provenance | | +| E.cs:54:13:54:17 | access to local variable taint : Object | E.cs:55:29:55:33 | access to local variable taint : Object | provenance | | +| E.cs:54:21:54:37 | call to method Source : Object | E.cs:54:13:54:17 | access to local variable taint : Object | provenance | | +| E.cs:54:21:54:37 | call to method Source : Object | E.cs:54:13:54:17 | access to local variable taint : Object | provenance | | | E.cs:55:23:55:26 | [post] access to local variable refs : RefS [field RefField] : Object | E.cs:57:14:57:17 | access to local variable refs : RefS [field RefField] : Object | provenance | | | E.cs:55:23:55:26 | [post] access to local variable refs : RefS [field RefField] : Object | E.cs:57:14:57:17 | access to local variable refs : RefS [field RefField] : Object | provenance | | | E.cs:55:29:55:33 | access to local variable taint : Object | E.cs:43:46:43:46 | o : Object | provenance | | @@ -440,46 +506,62 @@ edges | F.cs:6:65:6:66 | access to parameter o1 : Object | F.cs:6:54:6:81 | { ..., ... } : F [field Field1] : Object | provenance | | | F.cs:6:78:6:79 | access to parameter o2 : Object | F.cs:6:54:6:81 | { ..., ... } : F [field Field2] : Object | provenance | | | F.cs:6:78:6:79 | access to parameter o2 : Object | F.cs:6:54:6:81 | { ..., ... } : F [field Field2] : Object | provenance | | -| F.cs:10:17:10:33 | call to method Source : Object | F.cs:11:24:11:24 | access to local variable o : Object | provenance | | -| F.cs:10:17:10:33 | call to method Source : Object | F.cs:11:24:11:24 | access to local variable o : Object | provenance | | -| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | provenance | | -| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:10:13:10:13 | access to local variable o : Object | F.cs:11:24:11:24 | access to local variable o : Object | provenance | | +| F.cs:10:13:10:13 | access to local variable o : Object | F.cs:11:24:11:24 | access to local variable o : Object | provenance | | +| F.cs:10:17:10:33 | call to method Source : Object | F.cs:10:13:10:13 | access to local variable o : Object | provenance | | +| F.cs:10:17:10:33 | call to method Source : Object | F.cs:10:13:10:13 | access to local variable o : Object | provenance | | +| F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | provenance | | | F.cs:11:24:11:24 | access to local variable o : Object | F.cs:6:28:6:29 | o1 : Object | provenance | | | F.cs:11:24:11:24 | access to local variable o : Object | F.cs:6:28:6:29 | o1 : Object | provenance | | | F.cs:11:24:11:24 | access to local variable o : Object | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | provenance | | | F.cs:11:24:11:24 | access to local variable o : Object | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | provenance | | | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | F.cs:12:14:12:21 | access to field Field1 | provenance | | | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | F.cs:12:14:12:21 | access to field Field1 | provenance | | -| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | provenance | | -| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | provenance | | | F.cs:15:26:15:42 | call to method Source : Object | F.cs:6:39:6:40 | o2 : Object | provenance | | | F.cs:15:26:15:42 | call to method Source : Object | F.cs:6:39:6:40 | o2 : Object | provenance | | | F.cs:15:26:15:42 | call to method Source : Object | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | provenance | | | F.cs:15:26:15:42 | call to method Source : Object | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | provenance | | | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | F.cs:17:14:17:21 | access to field Field2 | provenance | | | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | F.cs:17:14:17:21 | access to field Field2 | provenance | | -| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | provenance | | -| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | provenance | | +| F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | provenance | | | F.cs:19:32:19:48 | call to method Source : Object | F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | provenance | | | F.cs:19:32:19:48 | call to method Source : Object | F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | provenance | | | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | F.cs:20:14:20:21 | access to field Field1 | provenance | | | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | F.cs:20:14:20:21 | access to field Field1 | provenance | | -| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | provenance | | -| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | provenance | | +| F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | provenance | | | F.cs:23:32:23:48 | call to method Source : Object | F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | provenance | | | F.cs:23:32:23:48 | call to method Source : Object | F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | provenance | | | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | F.cs:25:14:25:21 | access to field Field2 | provenance | | | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | F.cs:25:14:25:21 | access to field Field2 | provenance | | -| F.cs:30:17:30:33 | call to method Source : Object | F.cs:32:27:32:27 | access to local variable o : Object | provenance | | -| F.cs:30:17:30:33 | call to method Source : Object | F.cs:32:27:32:27 | access to local variable o : Object | provenance | | -| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | -| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | +| F.cs:30:13:30:13 | access to local variable o : Object | F.cs:32:27:32:27 | access to local variable o : Object | provenance | | +| F.cs:30:13:30:13 | access to local variable o : Object | F.cs:32:27:32:27 | access to local variable o : Object | provenance | | +| F.cs:30:17:30:33 | call to method Source : Object | F.cs:30:13:30:13 | access to local variable o : Object | provenance | | +| F.cs:30:17:30:33 | call to method Source : Object | F.cs:30:13:30:13 | access to local variable o : Object | provenance | | +| F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | +| F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | +| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | +| F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | provenance | | | F.cs:32:27:32:27 | access to local variable o : Object | F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | provenance | | | F.cs:32:27:32:27 | access to local variable o : Object | F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | provenance | | | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | F.cs:33:14:33:16 | access to property X | provenance | | | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | F.cs:33:14:33:16 | access to property X | provenance | | -| G.cs:7:18:7:32 | call to method Source : Elem | G.cs:9:23:9:23 | access to local variable e : Elem | provenance | | -| G.cs:7:18:7:32 | call to method Source : Elem | G.cs:9:23:9:23 | access to local variable e : Elem | provenance | | +| G.cs:7:14:7:14 | access to local variable e : Elem | G.cs:9:23:9:23 | access to local variable e : Elem | provenance | | +| G.cs:7:14:7:14 | access to local variable e : Elem | G.cs:9:23:9:23 | access to local variable e : Elem | provenance | | +| G.cs:7:18:7:32 | call to method Source : Elem | G.cs:7:14:7:14 | access to local variable e : Elem | provenance | | +| G.cs:7:18:7:32 | call to method Source : Elem | G.cs:7:14:7:14 | access to local variable e : Elem | provenance | | | G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:9:9:9:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | @@ -488,8 +570,10 @@ edges | G.cs:9:23:9:23 | access to local variable e : Elem | G.cs:9:9:9:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | provenance | | | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | -| G.cs:15:18:15:32 | call to method Source : Elem | G.cs:17:24:17:24 | access to local variable e : Elem | provenance | | -| G.cs:15:18:15:32 | call to method Source : Elem | G.cs:17:24:17:24 | access to local variable e : Elem | provenance | | +| G.cs:15:14:15:14 | access to local variable e : Elem | G.cs:17:24:17:24 | access to local variable e : Elem | provenance | | +| G.cs:15:14:15:14 | access to local variable e : Elem | G.cs:17:24:17:24 | access to local variable e : Elem | provenance | | +| G.cs:15:18:15:32 | call to method Source : Elem | G.cs:15:14:15:14 | access to local variable e : Elem | provenance | | +| G.cs:15:18:15:32 | call to method Source : Elem | G.cs:15:14:15:14 | access to local variable e : Elem | provenance | | | G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:17:9:17:14 | [post] access to field Box1 : Box1 [field Elem] : Elem | G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | @@ -500,8 +584,10 @@ edges | G.cs:17:24:17:24 | access to local variable e : Elem | G.cs:64:34:64:34 | e : Elem | provenance | | | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | -| G.cs:23:18:23:32 | call to method Source : Elem | G.cs:25:28:25:28 | access to local variable e : Elem | provenance | | -| G.cs:23:18:23:32 | call to method Source : Elem | G.cs:25:28:25:28 | access to local variable e : Elem | provenance | | +| G.cs:23:14:23:14 | access to local variable e : Elem | G.cs:25:28:25:28 | access to local variable e : Elem | provenance | | +| G.cs:23:14:23:14 | access to local variable e : Elem | G.cs:25:28:25:28 | access to local variable e : Elem | provenance | | +| G.cs:23:18:23:32 | call to method Source : Elem | G.cs:23:14:23:14 | access to local variable e : Elem | provenance | | +| G.cs:23:18:23:32 | call to method Source : Elem | G.cs:23:14:23:14 | access to local variable e : Elem | provenance | | | G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:25:9:25:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | @@ -510,8 +596,10 @@ edges | G.cs:25:28:25:28 | access to local variable e : Elem | G.cs:25:9:25:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | provenance | | | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:37:38:37:39 | b2 : Box2 [field Box1, field Elem] : Elem | provenance | | -| G.cs:31:18:31:32 | call to method Source : Elem | G.cs:33:29:33:29 | access to local variable e : Elem | provenance | | -| G.cs:31:18:31:32 | call to method Source : Elem | G.cs:33:29:33:29 | access to local variable e : Elem | provenance | | +| G.cs:31:14:31:14 | access to local variable e : Elem | G.cs:33:29:33:29 | access to local variable e : Elem | provenance | | +| G.cs:31:14:31:14 | access to local variable e : Elem | G.cs:33:29:33:29 | access to local variable e : Elem | provenance | | +| G.cs:31:18:31:32 | call to method Source : Elem | G.cs:31:14:31:14 | access to local variable e : Elem | provenance | | +| G.cs:31:18:31:32 | call to method Source : Elem | G.cs:31:14:31:14 | access to local variable e : Elem | provenance | | | G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:34:18:34:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | G.cs:34:18:34:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | | G.cs:33:9:33:19 | [post] call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | provenance | | @@ -532,8 +620,10 @@ edges | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:39:14:39:35 | call to method GetElem | provenance | | | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:63:21:63:27 | this : Box1 [field Elem] : Elem | provenance | | | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | G.cs:63:21:63:27 | this : Box1 [field Elem] : Elem | provenance | | -| G.cs:44:18:44:32 | call to method Source : Elem | G.cs:46:30:46:30 | access to local variable e : Elem | provenance | | -| G.cs:44:18:44:32 | call to method Source : Elem | G.cs:46:30:46:30 | access to local variable e : Elem | provenance | | +| G.cs:44:14:44:14 | access to local variable e : Elem | G.cs:46:30:46:30 | access to local variable e : Elem | provenance | | +| G.cs:44:14:44:14 | access to local variable e : Elem | G.cs:46:30:46:30 | access to local variable e : Elem | provenance | | +| G.cs:44:18:44:32 | call to method Source : Elem | G.cs:44:14:44:14 | access to local variable e : Elem | provenance | | +| G.cs:44:18:44:32 | call to method Source : Elem | G.cs:44:14:44:14 | access to local variable e : Elem | provenance | | | G.cs:46:9:46:16 | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | G.cs:46:9:46:16 | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | provenance | | | G.cs:46:9:46:16 | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | G.cs:46:9:46:16 | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | provenance | | | G.cs:46:9:46:16 | [post] this access : G [field boxfield, field Box1, field Elem] : Elem | G.cs:47:9:47:13 | this access : G [field boxfield, field Box1, field Elem] : Elem | provenance | | @@ -576,8 +666,10 @@ edges | H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:23:20:23:36 | call to method Source : Object | H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:23:20:23:36 | call to method Source : Object | H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | -| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | provenance | | -| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | provenance | | +| H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | provenance | | +| H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | H.cs:25:14:25:18 | access to local variable clone : A [field FieldA] : Object | provenance | | +| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | provenance | | +| H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | provenance | | | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | H.cs:13:15:13:15 | a : A [field FieldA] : Object | provenance | | | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | H.cs:13:15:13:15 | a : A [field FieldA] : Object | provenance | | | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | provenance | | @@ -604,8 +696,10 @@ edges | H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:43:20:43:36 | call to method Source : Object | H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:43:20:43:36 | call to method Source : Object | H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | -| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | provenance | | -| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | H.cs:45:14:45:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | provenance | | | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | provenance | | | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | provenance | | @@ -672,8 +766,10 @@ edges | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:112:20:112:36 | call to method Source : Object | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:112:20:112:36 | call to method Source : Object | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | -| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | provenance | | -| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | H.cs:114:14:114:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | H.cs:102:23:102:23 | a : A [field FieldA] : Object | provenance | | | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | H.cs:102:23:102:23 | a : A [field FieldA] : Object | provenance | | | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | provenance | | @@ -708,16 +804,20 @@ edges | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | H.cs:33:19:33:19 | a : A [field FieldA] : A | provenance | | | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | H.cs:142:16:142:27 | call to method Transform : B [field FieldB] : A | provenance | | | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | H.cs:142:16:142:27 | call to method Transform : B [field FieldB] : A | provenance | | -| H.cs:147:17:147:39 | call to method Through : A | H.cs:148:14:148:14 | access to local variable a | provenance | | -| H.cs:147:17:147:39 | call to method Through : A | H.cs:148:14:148:14 | access to local variable a | provenance | | +| H.cs:147:13:147:13 | access to local variable a : A | H.cs:148:14:148:14 | access to local variable a | provenance | | +| H.cs:147:13:147:13 | access to local variable a : A | H.cs:148:14:148:14 | access to local variable a | provenance | | +| H.cs:147:17:147:39 | call to method Through : A | H.cs:147:13:147:13 | access to local variable a : A | provenance | | +| H.cs:147:17:147:39 | call to method Through : A | H.cs:147:13:147:13 | access to local variable a : A | provenance | | | H.cs:147:25:147:38 | call to method Source : A | H.cs:138:27:138:27 | o : A | provenance | | | H.cs:147:25:147:38 | call to method Source : A | H.cs:138:27:138:27 | o : A | provenance | | | H.cs:147:25:147:38 | call to method Source : A | H.cs:147:17:147:39 | call to method Through : A | provenance | | | H.cs:147:25:147:38 | call to method Source : A | H.cs:147:17:147:39 | call to method Through : A | provenance | | | H.cs:153:32:153:32 | o : Object | H.cs:156:20:156:20 | access to parameter o : Object | provenance | | | H.cs:153:32:153:32 | o : Object | H.cs:156:20:156:20 | access to parameter o : Object | provenance | | -| H.cs:155:17:155:30 | call to method Source : B | H.cs:156:9:156:9 | access to local variable b : B | provenance | | -| H.cs:155:17:155:30 | call to method Source : B | H.cs:156:9:156:9 | access to local variable b : B | provenance | | +| H.cs:155:13:155:13 | access to local variable b : B | H.cs:156:9:156:9 | access to local variable b : B | provenance | | +| H.cs:155:13:155:13 | access to local variable b : B | H.cs:156:9:156:9 | access to local variable b : B | provenance | | +| H.cs:155:17:155:30 | call to method Source : B | H.cs:155:13:155:13 | access to local variable b : B | provenance | | +| H.cs:155:17:155:30 | call to method Source : B | H.cs:155:13:155:13 | access to local variable b : B | provenance | | | H.cs:156:9:156:9 | [post] access to local variable b : B [field FieldB] : Object | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:156:9:156:9 | [post] access to local variable b : B [field FieldB] : Object | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:156:9:156:9 | access to local variable b : B | H.cs:157:20:157:20 | access to local variable b : B | provenance | | @@ -730,8 +830,10 @@ edges | H.cs:157:20:157:20 | access to local variable b : B | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA] : B | provenance | | | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | provenance | | | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | H.cs:157:9:157:9 | [post] access to parameter a : A [field FieldA, field FieldB] : Object | provenance | | -| H.cs:163:17:163:35 | call to method Source : Object | H.cs:164:22:164:22 | access to local variable o : Object | provenance | | -| H.cs:163:17:163:35 | call to method Source : Object | H.cs:164:22:164:22 | access to local variable o : Object | provenance | | +| H.cs:163:13:163:13 | access to local variable o : Object | H.cs:164:22:164:22 | access to local variable o : Object | provenance | | +| H.cs:163:13:163:13 | access to local variable o : Object | H.cs:164:22:164:22 | access to local variable o : Object | provenance | | +| H.cs:163:17:163:35 | call to method Source : Object | H.cs:163:13:163:13 | access to local variable o : Object | provenance | | +| H.cs:163:17:163:35 | call to method Source : Object | H.cs:163:13:163:13 | access to local variable o : Object | provenance | | | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | provenance | | | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | provenance | | | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA] : B | H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | provenance | | @@ -740,10 +842,14 @@ edges | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:153:32:153:32 | o : Object | provenance | | | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | provenance | | | H.cs:164:22:164:22 | access to local variable o : Object | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | provenance | | -| H.cs:165:17:165:27 | (...) ... : B | H.cs:166:14:166:14 | access to local variable b | provenance | | -| H.cs:165:17:165:27 | (...) ... : B | H.cs:166:14:166:14 | access to local variable b | provenance | | -| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | provenance | | -| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:165:13:165:13 | access to local variable b : B | H.cs:166:14:166:14 | access to local variable b | provenance | | +| H.cs:165:13:165:13 | access to local variable b : B | H.cs:166:14:166:14 | access to local variable b | provenance | | +| H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:165:17:165:27 | (...) ... : B | H.cs:165:13:165:13 | access to local variable b : B | provenance | | +| H.cs:165:17:165:27 | (...) ... : B | H.cs:165:13:165:13 | access to local variable b : B | provenance | | +| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | provenance | | +| H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | provenance | | | H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | provenance | | | H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | H.cs:165:20:165:27 | access to field FieldA : B | provenance | | @@ -760,8 +866,10 @@ edges | I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | provenance | | | I.cs:7:18:7:34 | call to method Source : Object | I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | provenance | | | I.cs:7:18:7:34 | call to method Source : Object | I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | provenance | | -| I.cs:13:17:13:33 | call to method Source : Object | I.cs:15:20:15:20 | access to local variable o : Object | provenance | | -| I.cs:13:17:13:33 | call to method Source : Object | I.cs:15:20:15:20 | access to local variable o : Object | provenance | | +| I.cs:13:13:13:13 | access to local variable o : Object | I.cs:15:20:15:20 | access to local variable o : Object | provenance | | +| I.cs:13:13:13:13 | access to local variable o : Object | I.cs:15:20:15:20 | access to local variable o : Object | provenance | | +| I.cs:13:17:13:33 | call to method Source : Object | I.cs:13:13:13:13 | access to local variable o : Object | provenance | | +| I.cs:13:17:13:33 | call to method Source : Object | I.cs:13:13:13:13 | access to local variable o : Object | provenance | | | I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:16:9:16:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:16:9:16:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:15:20:15:20 | access to local variable o : Object | I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | provenance | | @@ -772,18 +880,24 @@ edges | I.cs:17:9:17:9 | access to local variable i : I [field Field1] : Object | I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | I.cs:18:14:18:21 | access to field Field1 | provenance | | | I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | I.cs:18:14:18:21 | access to field Field1 | provenance | | -| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | provenance | | -| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:21 | access to field Field1 | provenance | | | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | I.cs:23:14:23:21 | access to field Field1 | provenance | | -| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | provenance | | -| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | provenance | | +| I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | I.cs:27:14:27:21 | access to field Field1 | provenance | | | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | I.cs:27:14:27:21 | access to field Field1 | provenance | | -| I.cs:31:13:31:29 | call to method Source : Object | I.cs:32:20:32:20 | access to local variable o : Object | provenance | | -| I.cs:31:13:31:29 | call to method Source : Object | I.cs:32:20:32:20 | access to local variable o : Object | provenance | | +| I.cs:31:9:31:9 | access to local variable o : Object | I.cs:32:20:32:20 | access to local variable o : Object | provenance | | +| I.cs:31:9:31:9 | access to local variable o : Object | I.cs:32:20:32:20 | access to local variable o : Object | provenance | | +| I.cs:31:13:31:29 | call to method Source : Object | I.cs:31:9:31:9 | access to local variable o : Object | provenance | | +| I.cs:31:13:31:29 | call to method Source : Object | I.cs:31:9:31:9 | access to local variable o : Object | provenance | | | I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:33:9:33:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | I.cs:33:9:33:9 | access to local variable i : I [field Field1] : Object | provenance | | | I.cs:32:20:32:20 | access to local variable o : Object | I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | provenance | | @@ -806,106 +920,156 @@ edges | J.cs:14:66:14:70 | access to parameter field : Object | J.cs:14:50:14:54 | [post] this access : Struct [field Field] : Object | provenance | | | J.cs:14:73:14:76 | access to parameter prop : Object | J.cs:14:57:14:60 | [post] this access : Struct [property Prop] : Object | provenance | | | J.cs:14:73:14:76 | access to parameter prop : Object | J.cs:14:57:14:60 | [post] this access : Struct [property Prop] : Object | provenance | | -| J.cs:21:17:21:33 | call to method Source : Object | J.cs:22:34:22:34 | access to local variable o : Object | provenance | | -| J.cs:21:17:21:33 | call to method Source : Object | J.cs:22:34:22:34 | access to local variable o : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | -| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:21:13:21:13 | access to local variable o : Object | J.cs:22:34:22:34 | access to local variable o : Object | provenance | | +| J.cs:21:13:21:13 | access to local variable o : Object | J.cs:22:34:22:34 | access to local variable o : Object | provenance | | +| J.cs:21:17:21:33 | call to method Source : Object | J.cs:21:13:21:13 | access to local variable o : Object | provenance | | +| J.cs:21:17:21:33 | call to method Source : Object | J.cs:21:13:21:13 | access to local variable o : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | provenance | | | J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | provenance | | | J.cs:22:34:22:34 | access to local variable o : Object | J.cs:6:40:6:44 | Prop1 : Object | provenance | | | J.cs:22:34:22:34 | access to local variable o : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | provenance | | | J.cs:22:34:22:34 | access to local variable o : Object | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | provenance | | | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:21 | access to property Prop1 | provenance | | | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | J.cs:23:14:23:21 | access to property Prop1 | provenance | | +| J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | provenance | | | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | J.cs:27:14:27:21 | access to property Prop1 | provenance | | | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | J.cs:27:14:27:21 | access to property Prop1 | provenance | | -| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | -| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | provenance | | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | +| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | +| J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | provenance | | | J.cs:30:36:30:52 | call to method Source : Object | J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | provenance | | | J.cs:30:36:30:52 | call to method Source : Object | J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | provenance | | | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | J.cs:31:14:31:21 | access to property Prop1 | provenance | | | J.cs:31:14:31:15 | access to local variable r3 : RecordClass [property Prop1] : Object | J.cs:31:14:31:21 | access to property Prop1 | provenance | | | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | J.cs:32:14:32:21 | access to property Prop2 | provenance | | | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | J.cs:32:14:32:21 | access to property Prop2 | provenance | | -| J.cs:41:17:41:33 | call to method Source : Object | J.cs:42:35:42:35 | access to local variable o : Object | provenance | | -| J.cs:41:17:41:33 | call to method Source : Object | J.cs:42:35:42:35 | access to local variable o : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | -| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:41:13:41:13 | access to local variable o : Object | J.cs:42:35:42:35 | access to local variable o : Object | provenance | | +| J.cs:41:13:41:13 | access to local variable o : Object | J.cs:42:35:42:35 | access to local variable o : Object | provenance | | +| J.cs:41:17:41:33 | call to method Source : Object | J.cs:41:13:41:13 | access to local variable o : Object | provenance | | +| J.cs:41:17:41:33 | call to method Source : Object | J.cs:41:13:41:13 | access to local variable o : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | provenance | | | J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | provenance | | | J.cs:42:35:42:35 | access to local variable o : Object | J.cs:8:42:8:46 | Prop1 : Object | provenance | | | J.cs:42:35:42:35 | access to local variable o : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | provenance | | | J.cs:42:35:42:35 | access to local variable o : Object | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | provenance | | | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:21 | access to property Prop1 | provenance | | | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | J.cs:43:14:43:21 | access to property Prop1 | provenance | | +| J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | provenance | | | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | J.cs:47:14:47:21 | access to property Prop1 | provenance | | | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | J.cs:47:14:47:21 | access to property Prop1 | provenance | | -| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | -| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | provenance | | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | +| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | +| J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | provenance | | | J.cs:50:36:50:52 | call to method Source : Object | J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | provenance | | | J.cs:50:36:50:52 | call to method Source : Object | J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | provenance | | | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | J.cs:51:14:51:21 | access to property Prop1 | provenance | | | J.cs:51:14:51:15 | access to local variable r3 : RecordStruct [property Prop1] : Object | J.cs:51:14:51:21 | access to property Prop1 | provenance | | | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | J.cs:52:14:52:21 | access to property Prop2 | provenance | | | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | J.cs:52:14:52:21 | access to property Prop2 | provenance | | -| J.cs:61:17:61:33 | call to method Source : Object | J.cs:62:29:62:29 | access to local variable o : Object | provenance | | -| J.cs:61:17:61:33 | call to method Source : Object | J.cs:62:29:62:29 | access to local variable o : Object | provenance | | -| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | provenance | | -| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | provenance | | -| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | -| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:61:13:61:13 | access to local variable o : Object | J.cs:62:29:62:29 | access to local variable o : Object | provenance | | +| J.cs:61:13:61:13 | access to local variable o : Object | J.cs:62:29:62:29 | access to local variable o : Object | provenance | | +| J.cs:61:17:61:33 | call to method Source : Object | J.cs:61:13:61:13 | access to local variable o : Object | provenance | | +| J.cs:61:17:61:33 | call to method Source : Object | J.cs:61:13:61:13 | access to local variable o : Object | provenance | | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | provenance | | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | provenance | | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | provenance | | +| J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | provenance | | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | provenance | | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:14:26:14:30 | field : Object | provenance | | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | provenance | | | J.cs:62:29:62:29 | access to local variable o : Object | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | provenance | | +| J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | provenance | | +| J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | provenance | | | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | J.cs:65:14:65:21 | access to field Field | provenance | | | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | J.cs:65:14:65:21 | access to field Field | provenance | | -| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | -| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | provenance | | | J.cs:68:35:68:51 | call to method Source : Object | J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | provenance | | | J.cs:68:35:68:51 | call to method Source : Object | J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | provenance | | | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:69:14:69:21 | access to field Field | provenance | | | J.cs:69:14:69:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:69:14:69:21 | access to field Field | provenance | | | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:70:14:70:20 | access to property Prop | provenance | | | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:70:14:70:20 | access to property Prop | provenance | | -| J.cs:79:17:79:33 | call to method Source : Object | J.cs:80:35:80:35 | access to local variable o : Object | provenance | | -| J.cs:79:17:79:33 | call to method Source : Object | J.cs:80:35:80:35 | access to local variable o : Object | provenance | | -| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | provenance | | -| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | provenance | | -| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | -| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:79:13:79:13 | access to local variable o : Object | J.cs:80:35:80:35 | access to local variable o : Object | provenance | | +| J.cs:79:13:79:13 | access to local variable o : Object | J.cs:80:35:80:35 | access to local variable o : Object | provenance | | +| J.cs:79:17:79:33 | call to method Source : Object | J.cs:79:13:79:13 | access to local variable o : Object | provenance | | +| J.cs:79:17:79:33 | call to method Source : Object | J.cs:79:13:79:13 | access to local variable o : Object | provenance | | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | provenance | | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | provenance | | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | provenance | | +| J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | provenance | | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:14:40:14:43 | prop : Object | provenance | | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:14:40:14:43 | prop : Object | provenance | | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | provenance | | | J.cs:80:35:80:35 | access to local variable o : Object | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | provenance | | +| J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | provenance | | +| J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | provenance | | | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | J.cs:84:14:84:20 | access to property Prop | provenance | | | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | J.cs:84:14:84:20 | access to property Prop | provenance | | -| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | -| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | provenance | | +| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | provenance | | +| J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | provenance | | | J.cs:86:36:86:52 | call to method Source : Object | J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | provenance | | | J.cs:86:36:86:52 | call to method Source : Object | J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | provenance | | | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:87:14:87:21 | access to field Field | provenance | | | J.cs:87:14:87:15 | access to local variable s3 : Struct [field Field] : Object | J.cs:87:14:87:21 | access to field Field | provenance | | | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:88:14:88:20 | access to property Prop | provenance | | | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | J.cs:88:14:88:20 | access to property Prop | provenance | | -| J.cs:97:17:97:33 | call to method Source : Object | J.cs:99:28:99:28 | access to local variable o : Object | provenance | | -| J.cs:97:17:97:33 | call to method Source : Object | J.cs:99:28:99:28 | access to local variable o : Object | provenance | | -| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | -| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | -| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | -| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:97:13:97:13 | access to local variable o : Object | J.cs:99:28:99:28 | access to local variable o : Object | provenance | | +| J.cs:97:13:97:13 | access to local variable o : Object | J.cs:99:28:99:28 | access to local variable o : Object | provenance | | +| J.cs:97:17:97:33 | call to method Source : Object | J.cs:97:13:97:13 | access to local variable o : Object | provenance | | +| J.cs:97:17:97:33 | call to method Source : Object | J.cs:97:13:97:13 | access to local variable o : Object | provenance | | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | provenance | | | J.cs:99:28:99:28 | access to local variable o : Object | J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | provenance | | | J.cs:99:28:99:28 | access to local variable o : Object | J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | provenance | | | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | J.cs:102:14:102:17 | access to property X | provenance | | | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | J.cs:102:14:102:17 | access to property X | provenance | | -| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | -| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | provenance | | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | J.cs:107:14:107:15 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | +| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | +| J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | provenance | | | J.cs:105:32:105:48 | call to method Source : Object | J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | provenance | | | J.cs:105:32:105:48 | call to method Source : Object | J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | provenance | | | J.cs:106:14:106:15 | access to local variable a3 : <>__AnonType0 [property X] : Object | J.cs:106:14:106:17 | access to property X | provenance | | @@ -921,8 +1085,12 @@ edges | J.cs:125:14:125:17 | access to array element : Int32 | J.cs:125:14:125:17 | (...) ... | provenance | | | J.cs:125:14:125:17 | access to array element : Int32 | J.cs:125:14:125:17 | (...) ... | provenance | | nodes +| A.cs:5:13:5:13 | access to local variable c : C | semmle.label | access to local variable c : C | +| A.cs:5:13:5:13 | access to local variable c : C | semmle.label | access to local variable c : C | | A.cs:5:17:5:28 | call to method Source : C | semmle.label | call to method Source : C | | A.cs:5:17:5:28 | call to method Source : C | semmle.label | call to method Source : C | +| A.cs:6:13:6:13 | access to local variable b : B [field c] : C | semmle.label | access to local variable b : B [field c] : C | +| A.cs:6:13:6:13 | access to local variable b : B [field c] : C | semmle.label | access to local variable b : B [field c] : C | | A.cs:6:17:6:25 | call to method Make : B [field c] : C | semmle.label | call to method Make : B [field c] : C | | A.cs:6:17:6:25 | call to method Make : B [field c] : C | semmle.label | call to method Make : B [field c] : C | | A.cs:6:24:6:24 | access to local variable c : C | semmle.label | access to local variable c : C | @@ -945,6 +1113,8 @@ nodes | A.cs:15:15:15:35 | object creation of type B : B [field c] : C | semmle.label | object creation of type B : B [field c] : C | | A.cs:15:21:15:34 | call to method Source : C | semmle.label | call to method Source : C | | A.cs:15:21:15:34 | call to method Source : C | semmle.label | call to method Source : C | +| A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | +| A.cs:22:9:22:10 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:22:14:22:38 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:22:25:22:37 | call to method Source : C2 | semmle.label | call to method Source : C2 | @@ -953,6 +1123,8 @@ nodes | A.cs:24:14:24:15 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:24:14:24:17 | access to field c | semmle.label | access to field c | | A.cs:24:14:24:17 | access to field c | semmle.label | access to field c | +| A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | +| A.cs:31:9:31:10 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | semmle.label | call to method SetOnBWrap : B [field c] : C2 | | A.cs:31:14:31:42 | call to method SetOnBWrap : B [field c] : C2 | semmle.label | call to method SetOnBWrap : B [field c] : C2 | | A.cs:31:29:31:41 | call to method Source : C2 | semmle.label | call to method Source : C2 | @@ -963,6 +1135,8 @@ nodes | A.cs:33:14:33:17 | access to field c | semmle.label | access to field c | | A.cs:36:33:36:33 | c : C2 | semmle.label | c : C2 | | A.cs:36:33:36:33 | c : C2 | semmle.label | c : C2 | +| A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | +| A.cs:38:13:38:14 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:38:18:38:30 | call to method SetOnB : B [field c] : C2 | semmle.label | call to method SetOnB : B [field c] : C2 | | A.cs:38:29:38:29 | access to parameter c : C2 | semmle.label | access to parameter c : C2 | @@ -977,6 +1151,8 @@ nodes | A.cs:47:20:47:20 | access to parameter c : C2 | semmle.label | access to parameter c : C2 | | A.cs:48:20:48:21 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | | A.cs:48:20:48:21 | access to local variable b2 : B [field c] : C2 | semmle.label | access to local variable b2 : B [field c] : C2 | +| A.cs:55:13:55:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| A.cs:55:13:55:13 | access to local variable a : A | semmle.label | access to local variable a : A | | A.cs:55:17:55:28 | call to method Source : A | semmle.label | call to method Source : A | | A.cs:55:17:55:28 | call to method Source : A | semmle.label | call to method Source : A | | A.cs:57:9:57:10 | [post] access to local variable c1 : C1 [field a] : A | semmle.label | [post] access to local variable c1 : C1 [field a] : A | @@ -1023,8 +1199,14 @@ nodes | A.cs:98:22:98:43 | ... ? ... : ... : B [field c] : C | semmle.label | ... ? ... : ... : B [field c] : C | | A.cs:98:30:98:43 | call to method Source : B | semmle.label | call to method Source : B | | A.cs:98:30:98:43 | call to method Source : B | semmle.label | call to method Source : B | +| A.cs:104:13:104:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| A.cs:104:13:104:13 | access to local variable b : B | semmle.label | access to local variable b : B | | A.cs:104:17:104:30 | call to method Source : B | semmle.label | call to method Source : B | | A.cs:104:17:104:30 | call to method Source : B | semmle.label | call to method Source : B | +| A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | semmle.label | access to local variable d : D [field b, field c] : C | +| A.cs:105:13:105:13 | access to local variable d : D [field b, field c] : C | semmle.label | access to local variable d : D [field b, field c] : C | +| A.cs:105:13:105:13 | access to local variable d : D [field b] : B | semmle.label | access to local variable d : D [field b] : B | +| A.cs:105:13:105:13 | access to local variable d : D [field b] : B | semmle.label | access to local variable d : D [field b] : B | | A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | semmle.label | object creation of type D : D [field b, field c] : C | | A.cs:105:17:105:29 | object creation of type D : D [field b, field c] : C | semmle.label | object creation of type D : D [field b, field c] : C | | A.cs:105:17:105:29 | object creation of type D : D [field b] : B | semmle.label | object creation of type D : D [field b] : B | @@ -1047,16 +1229,24 @@ nodes | A.cs:108:14:108:14 | access to local variable b : B [field c] : C | semmle.label | access to local variable b : B [field c] : C | | A.cs:108:14:108:16 | access to field c | semmle.label | access to field c | | A.cs:108:14:108:16 | access to field c | semmle.label | access to field c | +| A.cs:113:13:113:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| A.cs:113:13:113:13 | access to local variable b : B | semmle.label | access to local variable b : B | | A.cs:113:17:113:29 | call to method Source : B | semmle.label | call to method Source : B | | A.cs:113:17:113:29 | call to method Source : B | semmle.label | call to method Source : B | +| A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | semmle.label | access to local variable l1 : MyList [field head] : B | +| A.cs:114:13:114:14 | access to local variable l1 : MyList [field head] : B | semmle.label | access to local variable l1 : MyList [field head] : B | | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | semmle.label | object creation of type MyList : MyList [field head] : B | | A.cs:114:18:114:54 | object creation of type MyList : MyList [field head] : B | semmle.label | object creation of type MyList : MyList [field head] : B | | A.cs:114:29:114:29 | access to local variable b : B | semmle.label | access to local variable b : B | | A.cs:114:29:114:29 | access to local variable b : B | semmle.label | access to local variable b : B | +| A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | semmle.label | access to local variable l2 : MyList [field next, field head] : B | +| A.cs:115:13:115:14 | access to local variable l2 : MyList [field next, field head] : B | semmle.label | access to local variable l2 : MyList [field next, field head] : B | | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field head] : B | | A.cs:115:18:115:37 | object creation of type MyList : MyList [field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field head] : B | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | semmle.label | access to local variable l1 : MyList [field head] : B | | A.cs:115:35:115:36 | access to local variable l1 : MyList [field head] : B | semmle.label | access to local variable l1 : MyList [field head] : B | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | semmle.label | access to local variable l3 : MyList [field next, field next, field head] : B | +| A.cs:116:13:116:14 | access to local variable l3 : MyList [field next, field next, field head] : B | semmle.label | access to local variable l3 : MyList [field next, field next, field head] : B | | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field next, field head] : B | | A.cs:116:18:116:37 | object creation of type MyList : MyList [field next, field next, field head] : B | semmle.label | object creation of type MyList : MyList [field next, field next, field head] : B | | A.cs:116:35:116:36 | access to local variable l2 : MyList [field next, field head] : B | semmle.label | access to local variable l2 : MyList [field next, field head] : B | @@ -1069,6 +1259,12 @@ nodes | A.cs:119:14:119:25 | access to field next : MyList [field head] : B | semmle.label | access to field next : MyList [field head] : B | | A.cs:119:14:119:30 | access to field head | semmle.label | access to field head | | A.cs:119:14:119:30 | access to field head | semmle.label | access to field head | +| A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field next, field head] : B | +| A.cs:121:18:121:18 | access to local variable l : MyList [field next, field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field next, field head] : B | +| A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | semmle.label | access to local variable l : MyList [field head] : B | +| A.cs:121:37:121:37 | access to local variable l : MyList [field head] : B | semmle.label | access to local variable l : MyList [field head] : B | +| A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field head] : B | +| A.cs:121:37:121:37 | access to local variable l : MyList [field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field head] : B | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field head] : B | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field head] : B | | A.cs:121:41:121:41 | access to local variable l : MyList [field next, field next, field head] : B | semmle.label | access to local variable l : MyList [field next, field next, field head] : B | @@ -1141,12 +1337,18 @@ nodes | A.cs:160:25:160:28 | access to parameter next : MyList [field head] : B | semmle.label | access to parameter next : MyList [field head] : B | | A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | semmle.label | access to parameter next : MyList [field next, field head] : B | | A.cs:160:25:160:28 | access to parameter next : MyList [field next, field head] : B | semmle.label | access to parameter next : MyList [field next, field head] : B | +| B.cs:5:13:5:13 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| B.cs:5:13:5:13 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | B.cs:5:17:5:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | | B.cs:5:17:5:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | +| B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | semmle.label | access to local variable b1 : Box1 [field elem1] : Elem | +| B.cs:6:13:6:14 | access to local variable b1 : Box1 [field elem1] : Elem | semmle.label | access to local variable b1 : Box1 [field elem1] : Elem | | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem1] : Elem | | B.cs:6:18:6:34 | object creation of type Box1 : Box1 [field elem1] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem1] : Elem | | B.cs:6:27:6:27 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | B.cs:6:27:6:27 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem1] : Elem | +| B.cs:7:13:7:14 | access to local variable b2 : Box2 [field box1, field elem1] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem1] : Elem | | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | | B.cs:7:18:7:29 | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem1] : Elem | | B.cs:7:27:7:28 | access to local variable b1 : Box1 [field elem1] : Elem | semmle.label | access to local variable b1 : Box1 [field elem1] : Elem | @@ -1157,12 +1359,18 @@ nodes | B.cs:8:14:8:20 | access to field box1 : Box1 [field elem1] : Elem | semmle.label | access to field box1 : Box1 [field elem1] : Elem | | B.cs:8:14:8:26 | access to field elem1 | semmle.label | access to field elem1 | | B.cs:8:14:8:26 | access to field elem1 | semmle.label | access to field elem1 | +| B.cs:14:13:14:13 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| B.cs:14:13:14:13 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | B.cs:14:17:14:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | | B.cs:14:17:14:31 | call to method Source : Elem | semmle.label | call to method Source : Elem | +| B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | semmle.label | access to local variable b1 : Box1 [field elem2] : Elem | +| B.cs:15:13:15:14 | access to local variable b1 : Box1 [field elem2] : Elem | semmle.label | access to local variable b1 : Box1 [field elem2] : Elem | | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem2] : Elem | | B.cs:15:18:15:34 | object creation of type Box1 : Box1 [field elem2] : Elem | semmle.label | object creation of type Box1 : Box1 [field elem2] : Elem | | B.cs:15:33:15:33 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | B.cs:15:33:15:33 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem2] : Elem | +| B.cs:16:13:16:14 | access to local variable b2 : Box2 [field box1, field elem2] : Elem | semmle.label | access to local variable b2 : Box2 [field box1, field elem2] : Elem | | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | | B.cs:16:18:16:29 | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | semmle.label | object creation of type Box2 : Box2 [field box1, field elem2] : Elem | | B.cs:16:27:16:28 | access to local variable b1 : Box1 [field elem2] : Elem | semmle.label | access to local variable b1 : Box1 [field elem2] : Elem | @@ -1213,6 +1421,14 @@ nodes | C.cs:7:37:7:51 | call to method Source : Elem | semmle.label | call to method Source : Elem | | C.cs:8:30:8:44 | call to method Source : Elem | semmle.label | call to method Source : Elem | | C.cs:8:30:8:44 | call to method Source : Elem | semmle.label | call to method Source : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | semmle.label | access to local variable c : C [field s1] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s1] : Elem | semmle.label | access to local variable c : C [field s1] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | semmle.label | access to local variable c : C [field s2] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s2] : Elem | semmle.label | access to local variable c : C [field s2] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | semmle.label | access to local variable c : C [field s3] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [field s3] : Elem | semmle.label | access to local variable c : C [field s3] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | semmle.label | access to local variable c : C [property s5] : Elem | +| C.cs:12:11:12:11 | access to local variable c : C [property s5] : Elem | semmle.label | access to local variable c : C [property s5] : Elem | | C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | semmle.label | object creation of type C : C [field s1] : Elem | | C.cs:12:15:12:21 | object creation of type C : C [field s1] : Elem | semmle.label | object creation of type C : C [field s1] : Elem | | C.cs:12:15:12:21 | object creation of type C : C [field s2] : Elem | semmle.label | object creation of type C : C [field s2] : Elem | @@ -1309,8 +1525,12 @@ nodes | D.cs:24:16:24:18 | access to local variable ret : D [field trivialPropField] : Object | semmle.label | access to local variable ret : D [field trivialPropField] : Object | | D.cs:24:16:24:18 | access to local variable ret : D [property AutoProp] : Object | semmle.label | access to local variable ret : D [property AutoProp] : Object | | D.cs:24:16:24:18 | access to local variable ret : D [property AutoProp] : Object | semmle.label | access to local variable ret : D [property AutoProp] : Object | +| D.cs:29:13:29:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| D.cs:29:13:29:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | D.cs:29:17:29:33 | call to method Source : Object | semmle.label | call to method Source : Object | | D.cs:29:17:29:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | semmle.label | access to local variable d : D [property AutoProp] : Object | +| D.cs:31:13:31:13 | access to local variable d : D [property AutoProp] : Object | semmle.label | access to local variable d : D [property AutoProp] : Object | | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | semmle.label | call to method Create : D [property AutoProp] : Object | | D.cs:31:17:31:37 | call to method Create : D [property AutoProp] : Object | semmle.label | call to method Create : D [property AutoProp] : Object | | D.cs:31:24:31:24 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1319,6 +1539,8 @@ nodes | D.cs:32:14:32:14 | access to local variable d : D [property AutoProp] : Object | semmle.label | access to local variable d : D [property AutoProp] : Object | | D.cs:32:14:32:23 | access to property AutoProp | semmle.label | access to property AutoProp | | D.cs:32:14:32:23 | access to property AutoProp | semmle.label | access to property AutoProp | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | +| D.cs:37:9:37:9 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:37:13:37:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:37:26:37:42 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1335,6 +1557,8 @@ nodes | D.cs:41:14:41:14 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:41:14:41:26 | access to property ComplexProp | semmle.label | access to property ComplexProp | | D.cs:41:14:41:26 | access to property ComplexProp | semmle.label | access to property ComplexProp | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | +| D.cs:43:9:43:9 | access to local variable d : D [field trivialPropField] : Object | semmle.label | access to local variable d : D [field trivialPropField] : Object | | D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:43:13:43:49 | call to method Create : D [field trivialPropField] : Object | semmle.label | call to method Create : D [field trivialPropField] : Object | | D.cs:43:32:43:48 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1359,8 +1583,12 @@ nodes | E.cs:11:21:11:21 | access to parameter o : Object | semmle.label | access to parameter o : Object | | E.cs:12:16:12:18 | access to local variable ret : S [field Field] : Object | semmle.label | access to local variable ret : S [field Field] : Object | | E.cs:12:16:12:18 | access to local variable ret : S [field Field] : Object | semmle.label | access to local variable ret : S [field Field] : Object | +| E.cs:22:13:22:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| E.cs:22:13:22:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | E.cs:22:17:22:33 | call to method Source : Object | semmle.label | call to method Source : Object | | E.cs:22:17:22:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | semmle.label | access to local variable s : S [field Field] : Object | +| E.cs:23:13:23:13 | access to local variable s : S [field Field] : Object | semmle.label | access to local variable s : S [field Field] : Object | | E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | semmle.label | call to method CreateS : S [field Field] : Object | | E.cs:23:17:23:26 | call to method CreateS : S [field Field] : Object | semmle.label | call to method CreateS : S [field Field] : Object | | E.cs:23:25:23:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1375,6 +1603,8 @@ nodes | E.cs:46:9:46:9 | [post] access to parameter s : RefS [field RefField] : Object | semmle.label | [post] access to parameter s : RefS [field RefField] : Object | | E.cs:46:22:46:22 | access to parameter o : Object | semmle.label | access to parameter o : Object | | E.cs:46:22:46:22 | access to parameter o : Object | semmle.label | access to parameter o : Object | +| E.cs:54:13:54:17 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | +| E.cs:54:13:54:17 | access to local variable taint : Object | semmle.label | access to local variable taint : Object | | E.cs:54:21:54:37 | call to method Source : Object | semmle.label | call to method Source : Object | | E.cs:54:21:54:37 | call to method Source : Object | semmle.label | call to method Source : Object | | E.cs:55:23:55:26 | [post] access to local variable refs : RefS [field RefField] : Object | semmle.label | [post] access to local variable refs : RefS [field RefField] : Object | @@ -1401,8 +1631,12 @@ nodes | F.cs:6:65:6:66 | access to parameter o1 : Object | semmle.label | access to parameter o1 : Object | | F.cs:6:78:6:79 | access to parameter o2 : Object | semmle.label | access to parameter o2 : Object | | F.cs:6:78:6:79 | access to parameter o2 : Object | semmle.label | access to parameter o2 : Object | +| F.cs:10:13:10:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| F.cs:10:13:10:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | F.cs:10:17:10:33 | call to method Source : Object | semmle.label | call to method Source : Object | | F.cs:10:17:10:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | +| F.cs:11:13:11:13 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | semmle.label | call to method Create : F [field Field1] : Object | | F.cs:11:17:11:31 | call to method Create : F [field Field1] : Object | semmle.label | call to method Create : F [field Field1] : Object | | F.cs:11:24:11:24 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1411,6 +1645,8 @@ nodes | F.cs:12:14:12:14 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:12:14:12:21 | access to field Field1 | semmle.label | access to field Field1 | | F.cs:12:14:12:21 | access to field Field1 | semmle.label | access to field Field1 | +| F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | +| F.cs:15:9:15:9 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | semmle.label | call to method Create : F [field Field2] : Object | | F.cs:15:13:15:43 | call to method Create : F [field Field2] : Object | semmle.label | call to method Create : F [field Field2] : Object | | F.cs:15:26:15:42 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1419,6 +1655,8 @@ nodes | F.cs:17:14:17:14 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:17:14:17:21 | access to field Field2 | semmle.label | access to field Field2 | | F.cs:17:14:17:21 | access to field Field2 | semmle.label | access to field Field2 | +| F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | +| F.cs:19:9:19:9 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | semmle.label | { ..., ... } : F [field Field1] : Object | | F.cs:19:21:19:50 | { ..., ... } : F [field Field1] : Object | semmle.label | { ..., ... } : F [field Field1] : Object | | F.cs:19:32:19:48 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1427,6 +1665,8 @@ nodes | F.cs:20:14:20:14 | access to local variable f : F [field Field1] : Object | semmle.label | access to local variable f : F [field Field1] : Object | | F.cs:20:14:20:21 | access to field Field1 | semmle.label | access to field Field1 | | F.cs:20:14:20:21 | access to field Field1 | semmle.label | access to field Field1 | +| F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | +| F.cs:23:9:23:9 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | semmle.label | { ..., ... } : F [field Field2] : Object | | F.cs:23:21:23:50 | { ..., ... } : F [field Field2] : Object | semmle.label | { ..., ... } : F [field Field2] : Object | | F.cs:23:32:23:48 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1435,8 +1675,12 @@ nodes | F.cs:25:14:25:14 | access to local variable f : F [field Field2] : Object | semmle.label | access to local variable f : F [field Field2] : Object | | F.cs:25:14:25:21 | access to field Field2 | semmle.label | access to field Field2 | | F.cs:25:14:25:21 | access to field Field2 | semmle.label | access to field Field2 | +| F.cs:30:13:30:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| F.cs:30:13:30:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | F.cs:30:17:30:33 | call to method Source : Object | semmle.label | call to method Source : Object | | F.cs:30:17:30:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a : <>__AnonType0 [property X] : Object | +| F.cs:32:13:32:13 | access to local variable a : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a : <>__AnonType0 [property X] : Object | | F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | F.cs:32:17:32:40 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | F.cs:32:27:32:27 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1445,6 +1689,8 @@ nodes | F.cs:33:14:33:14 | access to local variable a : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a : <>__AnonType0 [property X] : Object | | F.cs:33:14:33:16 | access to property X | semmle.label | access to property X | | F.cs:33:14:33:16 | access to property X | semmle.label | access to property X | +| G.cs:7:14:7:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:7:14:7:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:7:18:7:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:7:18:7:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:9:9:9:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | @@ -1455,6 +1701,8 @@ nodes | G.cs:9:23:9:23 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | | G.cs:10:18:10:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:15:14:15:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:15:14:15:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:15:18:15:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:15:18:15:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:17:9:17:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | @@ -1465,6 +1713,8 @@ nodes | G.cs:17:24:17:24 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | | G.cs:18:18:18:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:23:14:23:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:23:14:23:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:23:18:23:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:23:18:23:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:25:9:25:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | @@ -1475,6 +1725,8 @@ nodes | G.cs:25:28:25:28 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | | G.cs:26:18:26:18 | access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | access to local variable b : Box2 [field Box1, field Elem] : Elem | +| G.cs:31:14:31:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:31:14:31:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:31:18:31:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:31:18:31:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:33:9:33:9 | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to local variable b : Box2 [field Box1, field Elem] : Elem | @@ -1493,6 +1745,8 @@ nodes | G.cs:39:14:39:25 | call to method GetBox1 : Box1 [field Elem] : Elem | semmle.label | call to method GetBox1 : Box1 [field Elem] : Elem | | G.cs:39:14:39:35 | call to method GetElem | semmle.label | call to method GetElem | | G.cs:39:14:39:35 | call to method GetElem | semmle.label | call to method GetElem | +| G.cs:44:14:44:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | +| G.cs:44:14:44:14 | access to local variable e : Elem | semmle.label | access to local variable e : Elem | | G.cs:44:18:44:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:44:18:44:32 | call to method Source : Elem | semmle.label | call to method Source : Elem | | G.cs:46:9:46:16 | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | semmle.label | [post] access to field boxfield : Box2 [field Box1, field Elem] : Elem | @@ -1547,6 +1801,8 @@ nodes | H.cs:23:9:23:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:23:20:23:36 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:23:20:23:36 | call to method Source : Object | semmle.label | call to method Source : Object | +| H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | semmle.label | access to local variable clone : A [field FieldA] : Object | +| H.cs:24:13:24:17 | access to local variable clone : A [field FieldA] : Object | semmle.label | access to local variable clone : A [field FieldA] : Object | | H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | semmle.label | call to method Clone : A [field FieldA] : Object | | H.cs:24:21:24:28 | call to method Clone : A [field FieldA] : Object | semmle.label | call to method Clone : A [field FieldA] : Object | | H.cs:24:27:24:27 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | @@ -1579,6 +1835,8 @@ nodes | H.cs:43:9:43:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:43:20:43:36 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:43:20:43:36 | call to method Source : Object | semmle.label | call to method Source : Object | +| H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | +| H.cs:44:13:44:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | semmle.label | call to method Transform : B [field FieldB] : Object | | H.cs:44:17:44:28 | call to method Transform : B [field FieldB] : Object | semmle.label | call to method Transform : B [field FieldB] : Object | | H.cs:44:27:44:27 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | @@ -1649,6 +1907,8 @@ nodes | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:112:20:112:36 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:112:20:112:36 | call to method Source : Object | semmle.label | call to method Source : Object | +| H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | +| H.cs:113:13:113:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | semmle.label | call to method TransformWrap : B [field FieldB] : Object | | H.cs:113:17:113:32 | call to method TransformWrap : B [field FieldB] : Object | semmle.label | call to method TransformWrap : B [field FieldB] : Object | | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | semmle.label | access to local variable a : A [field FieldA] : Object | @@ -1685,6 +1945,8 @@ nodes | H.cs:142:16:142:34 | access to field FieldB : A | semmle.label | access to field FieldB : A | | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | semmle.label | access to local variable a : A [field FieldA] : A | | H.cs:142:26:142:26 | access to local variable a : A [field FieldA] : A | semmle.label | access to local variable a : A [field FieldA] : A | +| H.cs:147:13:147:13 | access to local variable a : A | semmle.label | access to local variable a : A | +| H.cs:147:13:147:13 | access to local variable a : A | semmle.label | access to local variable a : A | | H.cs:147:17:147:39 | call to method Through : A | semmle.label | call to method Through : A | | H.cs:147:17:147:39 | call to method Through : A | semmle.label | call to method Through : A | | H.cs:147:25:147:38 | call to method Source : A | semmle.label | call to method Source : A | @@ -1693,6 +1955,8 @@ nodes | H.cs:148:14:148:14 | access to local variable a | semmle.label | access to local variable a | | H.cs:153:32:153:32 | o : Object | semmle.label | o : Object | | H.cs:153:32:153:32 | o : Object | semmle.label | o : Object | +| H.cs:155:13:155:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| H.cs:155:13:155:13 | access to local variable b : B | semmle.label | access to local variable b : B | | H.cs:155:17:155:30 | call to method Source : B | semmle.label | call to method Source : B | | H.cs:155:17:155:30 | call to method Source : B | semmle.label | call to method Source : B | | H.cs:156:9:156:9 | [post] access to local variable b : B [field FieldB] : Object | semmle.label | [post] access to local variable b : B [field FieldB] : Object | @@ -1709,6 +1973,8 @@ nodes | H.cs:157:20:157:20 | access to local variable b : B | semmle.label | access to local variable b : B | | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:157:20:157:20 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | +| H.cs:163:13:163:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| H.cs:163:13:163:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | H.cs:163:17:163:35 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:163:17:163:35 | call to method Source : Object | semmle.label | call to method Source : Object | | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA, field FieldB] : Object | semmle.label | [post] access to local variable a : A [field FieldA, field FieldB] : Object | @@ -1717,6 +1983,10 @@ nodes | H.cs:164:19:164:19 | [post] access to local variable a : A [field FieldA] : B | semmle.label | [post] access to local variable a : A [field FieldA] : B | | H.cs:164:22:164:22 | access to local variable o : Object | semmle.label | access to local variable o : Object | | H.cs:164:22:164:22 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| H.cs:165:13:165:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| H.cs:165:13:165:13 | access to local variable b : B | semmle.label | access to local variable b : B | +| H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | +| H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | | H.cs:165:17:165:27 | (...) ... : B | semmle.label | (...) ... : B | | H.cs:165:17:165:27 | (...) ... : B | semmle.label | (...) ... : B | | H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | semmle.label | (...) ... : B [field FieldB] : Object | @@ -1739,6 +2009,8 @@ nodes | I.cs:7:9:7:14 | [post] this access : I [field Field1] : Object | semmle.label | [post] this access : I [field Field1] : Object | | I.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| I.cs:13:13:13:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| I.cs:13:13:13:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | I.cs:13:17:13:33 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:13:17:13:33 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:15:9:15:9 | [post] access to local variable i : I [field Field1] : Object | semmle.label | [post] access to local variable i : I [field Field1] : Object | @@ -1753,6 +2025,8 @@ nodes | I.cs:18:14:18:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:18:14:18:21 | access to field Field1 | semmle.label | access to field Field1 | | I.cs:18:14:18:21 | access to field Field1 | semmle.label | access to field Field1 | +| I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | +| I.cs:21:9:21:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | semmle.label | object creation of type I : I [field Field1] : Object | | I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | semmle.label | object creation of type I : I [field Field1] : Object | | I.cs:22:9:22:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | @@ -1761,12 +2035,16 @@ nodes | I.cs:23:14:23:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:23:14:23:21 | access to field Field1 | semmle.label | access to field Field1 | | I.cs:23:14:23:21 | access to field Field1 | semmle.label | access to field Field1 | +| I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | +| I.cs:26:9:26:9 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | semmle.label | [pre-initializer] object creation of type I : I [field Field1] : Object | | I.cs:26:13:26:37 | [pre-initializer] object creation of type I : I [field Field1] : Object | semmle.label | [pre-initializer] object creation of type I : I [field Field1] : Object | | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:27:14:27:14 | access to local variable i : I [field Field1] : Object | semmle.label | access to local variable i : I [field Field1] : Object | | I.cs:27:14:27:21 | access to field Field1 | semmle.label | access to field Field1 | | I.cs:27:14:27:21 | access to field Field1 | semmle.label | access to field Field1 | +| I.cs:31:9:31:9 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| I.cs:31:9:31:9 | access to local variable o : Object | semmle.label | access to local variable o : Object | | I.cs:31:13:31:29 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:31:13:31:29 | call to method Source : Object | semmle.label | call to method Source : Object | | I.cs:32:9:32:9 | [post] access to local variable i : I [field Field1] : Object | semmle.label | [post] access to local variable i : I [field Field1] : Object | @@ -1801,8 +2079,12 @@ nodes | J.cs:14:66:14:70 | access to parameter field : Object | semmle.label | access to parameter field : Object | | J.cs:14:73:14:76 | access to parameter prop : Object | semmle.label | access to parameter prop : Object | | J.cs:14:73:14:76 | access to parameter prop : Object | semmle.label | access to parameter prop : Object | +| J.cs:21:13:21:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:21:13:21:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:21:17:21:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:21:17:21:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r1 : RecordClass [property Prop1] : Object | +| J.cs:22:13:22:14 | access to local variable r1 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r1 : RecordClass [property Prop1] : Object | | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | semmle.label | object creation of type RecordClass : RecordClass [property Prop1] : Object | | J.cs:22:18:22:41 | object creation of type RecordClass : RecordClass [property Prop1] : Object | semmle.label | object creation of type RecordClass : RecordClass [property Prop1] : Object | | J.cs:22:34:22:34 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1811,10 +2093,16 @@ nodes | J.cs:23:14:23:15 | access to local variable r1 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r1 : RecordClass [property Prop1] : Object | | J.cs:23:14:23:21 | access to property Prop1 | semmle.label | access to property Prop1 | | J.cs:23:14:23:21 | access to property Prop1 | semmle.label | access to property Prop1 | +| J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r2 : RecordClass [property Prop1] : Object | +| J.cs:26:13:26:14 | access to local variable r2 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r2 : RecordClass [property Prop1] : Object | | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r2 : RecordClass [property Prop1] : Object | | J.cs:27:14:27:15 | access to local variable r2 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r2 : RecordClass [property Prop1] : Object | | J.cs:27:14:27:21 | access to property Prop1 | semmle.label | access to property Prop1 | | J.cs:27:14:27:21 | access to property Prop1 | semmle.label | access to property Prop1 | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop1] : Object | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop1] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop1] : Object | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop2] : Object | +| J.cs:30:13:30:14 | access to local variable r3 : RecordClass [property Prop2] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop2] : Object | | J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | semmle.label | ... with { ... } : RecordClass [property Prop2] : Object | | J.cs:30:18:30:54 | ... with { ... } : RecordClass [property Prop2] : Object | semmle.label | ... with { ... } : RecordClass [property Prop2] : Object | | J.cs:30:36:30:52 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1827,8 +2115,12 @@ nodes | J.cs:32:14:32:15 | access to local variable r3 : RecordClass [property Prop2] : Object | semmle.label | access to local variable r3 : RecordClass [property Prop2] : Object | | J.cs:32:14:32:21 | access to property Prop2 | semmle.label | access to property Prop2 | | J.cs:32:14:32:21 | access to property Prop2 | semmle.label | access to property Prop2 | +| J.cs:41:13:41:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:41:13:41:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:41:17:41:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:41:17:41:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r1 : RecordStruct [property Prop1] : Object | +| J.cs:42:13:42:14 | access to local variable r1 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r1 : RecordStruct [property Prop1] : Object | | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | semmle.label | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | | J.cs:42:18:42:42 | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | semmle.label | object creation of type RecordStruct : RecordStruct [property Prop1] : Object | | J.cs:42:35:42:35 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -1837,10 +2129,16 @@ nodes | J.cs:43:14:43:15 | access to local variable r1 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r1 : RecordStruct [property Prop1] : Object | | J.cs:43:14:43:21 | access to property Prop1 | semmle.label | access to property Prop1 | | J.cs:43:14:43:21 | access to property Prop1 | semmle.label | access to property Prop1 | +| J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r2 : RecordStruct [property Prop1] : Object | +| J.cs:46:13:46:14 | access to local variable r2 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r2 : RecordStruct [property Prop1] : Object | | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r2 : RecordStruct [property Prop1] : Object | | J.cs:47:14:47:15 | access to local variable r2 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r2 : RecordStruct [property Prop1] : Object | | J.cs:47:14:47:21 | access to property Prop1 | semmle.label | access to property Prop1 | | J.cs:47:14:47:21 | access to property Prop1 | semmle.label | access to property Prop1 | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop1] : Object | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop1] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop1] : Object | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop2] : Object | +| J.cs:50:13:50:14 | access to local variable r3 : RecordStruct [property Prop2] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop2] : Object | | J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | semmle.label | ... with { ... } : RecordStruct [property Prop2] : Object | | J.cs:50:18:50:54 | ... with { ... } : RecordStruct [property Prop2] : Object | semmle.label | ... with { ... } : RecordStruct [property Prop2] : Object | | J.cs:50:36:50:52 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1853,16 +2151,26 @@ nodes | J.cs:52:14:52:15 | access to local variable r3 : RecordStruct [property Prop2] : Object | semmle.label | access to local variable r3 : RecordStruct [property Prop2] : Object | | J.cs:52:14:52:21 | access to property Prop2 | semmle.label | access to property Prop2 | | J.cs:52:14:52:21 | access to property Prop2 | semmle.label | access to property Prop2 | +| J.cs:61:13:61:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:61:13:61:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:61:17:61:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:61:17:61:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | semmle.label | access to local variable s1 : Struct [field Field] : Object | +| J.cs:62:13:62:14 | access to local variable s1 : Struct [field Field] : Object | semmle.label | access to local variable s1 : Struct [field Field] : Object | | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | semmle.label | object creation of type Struct : Struct [field Field] : Object | | J.cs:62:18:62:36 | object creation of type Struct : Struct [field Field] : Object | semmle.label | object creation of type Struct : Struct [field Field] : Object | | J.cs:62:29:62:29 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:62:29:62:29 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | semmle.label | access to local variable s2 : Struct [field Field] : Object | +| J.cs:64:13:64:14 | access to local variable s2 : Struct [field Field] : Object | semmle.label | access to local variable s2 : Struct [field Field] : Object | | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | semmle.label | access to local variable s2 : Struct [field Field] : Object | | J.cs:65:14:65:15 | access to local variable s2 : Struct [field Field] : Object | semmle.label | access to local variable s2 : Struct [field Field] : Object | | J.cs:65:14:65:21 | access to field Field | semmle.label | access to field Field | | J.cs:65:14:65:21 | access to field Field | semmle.label | access to field Field | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | +| J.cs:68:13:68:14 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | semmle.label | ... with { ... } : Struct [property Prop] : Object | | J.cs:68:18:68:53 | ... with { ... } : Struct [property Prop] : Object | semmle.label | ... with { ... } : Struct [property Prop] : Object | | J.cs:68:35:68:51 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1875,16 +2183,26 @@ nodes | J.cs:70:14:70:15 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:70:14:70:20 | access to property Prop | semmle.label | access to property Prop | | J.cs:70:14:70:20 | access to property Prop | semmle.label | access to property Prop | +| J.cs:79:13:79:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:79:13:79:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:79:17:79:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:79:17:79:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | semmle.label | access to local variable s1 : Struct [property Prop] : Object | +| J.cs:80:13:80:14 | access to local variable s1 : Struct [property Prop] : Object | semmle.label | access to local variable s1 : Struct [property Prop] : Object | | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | semmle.label | object creation of type Struct : Struct [property Prop] : Object | | J.cs:80:18:80:36 | object creation of type Struct : Struct [property Prop] : Object | semmle.label | object creation of type Struct : Struct [property Prop] : Object | | J.cs:80:35:80:35 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:80:35:80:35 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | semmle.label | access to local variable s2 : Struct [property Prop] : Object | +| J.cs:82:13:82:14 | access to local variable s2 : Struct [property Prop] : Object | semmle.label | access to local variable s2 : Struct [property Prop] : Object | | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | semmle.label | access to local variable s2 : Struct [property Prop] : Object | | J.cs:84:14:84:15 | access to local variable s2 : Struct [property Prop] : Object | semmle.label | access to local variable s2 : Struct [property Prop] : Object | | J.cs:84:14:84:20 | access to property Prop | semmle.label | access to property Prop | | J.cs:84:14:84:20 | access to property Prop | semmle.label | access to property Prop | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [field Field] : Object | semmle.label | access to local variable s3 : Struct [field Field] : Object | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | +| J.cs:86:13:86:14 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | semmle.label | ... with { ... } : Struct [field Field] : Object | | J.cs:86:18:86:54 | ... with { ... } : Struct [field Field] : Object | semmle.label | ... with { ... } : Struct [field Field] : Object | | J.cs:86:36:86:52 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -1897,16 +2215,26 @@ nodes | J.cs:88:14:88:15 | access to local variable s3 : Struct [property Prop] : Object | semmle.label | access to local variable s3 : Struct [property Prop] : Object | | J.cs:88:14:88:20 | access to property Prop | semmle.label | access to property Prop | | J.cs:88:14:88:20 | access to property Prop | semmle.label | access to property Prop | +| J.cs:97:13:97:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:97:13:97:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:97:17:97:33 | call to method Source : Object | semmle.label | call to method Source : Object | | J.cs:97:17:97:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a1 : <>__AnonType0 [property X] : Object | +| J.cs:99:13:99:14 | access to local variable a1 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a1 : <>__AnonType0 [property X] : Object | | J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | J.cs:99:18:99:41 | { ..., ... } : <>__AnonType0 [property X] : Object | semmle.label | { ..., ... } : <>__AnonType0 [property X] : Object | | J.cs:99:28:99:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | | J.cs:99:28:99:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a2 : <>__AnonType0 [property X] : Object | +| J.cs:101:13:101:14 | access to local variable a2 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a2 : <>__AnonType0 [property X] : Object | | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a2 : <>__AnonType0 [property X] : Object | | J.cs:102:14:102:15 | access to local variable a2 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a2 : <>__AnonType0 [property X] : Object | | J.cs:102:14:102:17 | access to property X | semmle.label | access to property X | | J.cs:102:14:102:17 | access to property X | semmle.label | access to property X | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property X] : Object | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property X] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property X] : Object | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property Y] : Object | +| J.cs:105:13:105:14 | access to local variable a3 : <>__AnonType0 [property Y] : Object | semmle.label | access to local variable a3 : <>__AnonType0 [property Y] : Object | | J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | semmle.label | ... with { ... } : <>__AnonType0 [property Y] : Object | | J.cs:105:18:105:50 | ... with { ... } : <>__AnonType0 [property Y] : Object | semmle.label | ... with { ... } : <>__AnonType0 [property Y] : Object | | J.cs:105:32:105:48 | call to method Source : Object | semmle.label | call to method Source : Object | diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected index 4d549939f1c..3e7fca0c3e3 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected @@ -1,43 +1,50 @@ edges -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:11:17:11:22 | access to local variable sink27 : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:20:21:20:26 | access to local variable sink28 : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:29:17:29:22 | access to local variable sink29 : String | provenance | | | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:61:36:61:42 | access to parameter tainted : String | provenance | | +| Capture.cs:11:17:11:22 | access to local variable sink27 : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | +| Capture.cs:20:21:20:26 | access to local variable sink28 : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | +| Capture.cs:29:17:29:22 | access to local variable sink29 : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | | Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | | Capture.cs:61:36:61:42 | access to parameter tainted : String | Capture.cs:50:50:50:55 | sink39 : String | provenance | | -| Capture.cs:69:13:69:35 | SSA def(sink30) : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | -| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:69:13:69:35 | SSA def(sink30) : String | provenance | | -| Capture.cs:79:17:79:39 | SSA def(sink31) : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | -| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:39 | SSA def(sink31) : String | provenance | | -| Capture.cs:89:13:89:35 | SSA def(sink32) : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | -| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:35 | SSA def(sink32) : String | provenance | | -| Capture.cs:115:17:115:39 | SSA def(sink40) : String | Capture.cs:122:15:122:20 | access to local variable sink40 | provenance | | -| Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:115:17:115:39 | SSA def(sink40) : String | provenance | | +| Capture.cs:69:13:69:18 | access to local variable sink30 : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | +| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:69:13:69:18 | access to local variable sink30 : String | provenance | | +| Capture.cs:79:17:79:22 | access to local variable sink31 : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | +| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:22 | access to local variable sink31 : String | provenance | | +| Capture.cs:89:13:89:18 | access to local variable sink32 : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | +| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:18 | access to local variable sink32 : String | provenance | | +| Capture.cs:115:17:115:22 | access to local variable sink40 : String | Capture.cs:122:15:122:20 | access to local variable sink40 | provenance | | +| Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:115:17:115:22 | access to local variable sink40 : String | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:168:25:168:31 | access to parameter tainted : String | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:194:25:194:31 | access to parameter tainted : String | provenance | | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | Capture.cs:161:15:161:20 | access to local variable sink36 | provenance | | +| Capture.cs:160:13:160:18 | access to local variable sink36 : String | Capture.cs:161:15:161:20 | access to local variable sink36 | provenance | | +| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | Capture.cs:160:13:160:18 | access to local variable sink36 : String | provenance | | | Capture.cs:168:25:168:31 | access to parameter tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | provenance | | | Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | provenance | | -| Capture.cs:194:22:194:32 | call to local function Id : String | Capture.cs:195:15:195:20 | access to local variable sink38 | provenance | | +| Capture.cs:194:13:194:18 | access to local variable sink38 : String | Capture.cs:195:15:195:20 | access to local variable sink38 | provenance | | +| Capture.cs:194:22:194:32 | call to local function Id : String | Capture.cs:194:13:194:18 | access to local variable sink38 : String | provenance | | | Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | provenance | | | Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:194:22:194:32 | call to local function Id : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:53:20:53:37 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:54:28:54:45 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:55:44:55:61 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:56:28:56:45 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:53:20:53:37 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:54:28:54:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:55:44:55:61 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:56:28:56:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | @@ -107,98 +114,119 @@ edges | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | GlobalDataFlow.cs:396:52:396:52 | x : String | provenance | | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | GlobalDataFlow.cs:427:9:427:11 | value : String | provenance | | -| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | provenance | | -| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | provenance | | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | provenance | | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | provenance | | +| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | provenance | | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | provenance | | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | provenance | | -| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | provenance | | -| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | provenance | | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | provenance | | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | provenance | | +| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | provenance | | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | provenance | | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | provenance | | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | provenance | | -| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | provenance | | +| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | provenance | | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | provenance | | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | provenance | | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | provenance | | -| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | provenance | | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | provenance | | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | provenance | | +| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | provenance | | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | provenance | | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | provenance | | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | provenance | | -| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | provenance | | -| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | provenance | | +| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | provenance | | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | provenance | | | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:81:79:81:79 | x : String | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | provenance | | | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | provenance | | +| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | provenance | | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | provenance | | | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | provenance | | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | provenance | | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | provenance | | | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | provenance | | -| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | provenance | | -| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | provenance | | +| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | provenance | | | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | provenance | | +| GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | provenance | | | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | provenance | | -| GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | provenance | | +| GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | provenance | | | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | provenance | | -| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | provenance | | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | provenance | | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | provenance | | +| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | provenance | | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | provenance | | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | provenance | | -| GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | provenance | | +| GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | provenance | | +| GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | provenance | | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | provenance | | -| GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | provenance | | -| GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | provenance | | +| GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | provenance | | +| GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | provenance | | +| GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | provenance | | +| GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | provenance | | +| GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | provenance | | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | provenance | | -| GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | provenance | | -| GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | provenance | | +| GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | provenance | | +| GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | provenance | | +| GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | provenance | | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | provenance | | -| GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | provenance | | +| GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | provenance | | +| GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | provenance | | +| GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | provenance | | | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | provenance | | -| GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | provenance | | -| GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | provenance | | +| GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | provenance | | +| GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | provenance | | +| GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | provenance | | | GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | provenance | | | GlobalDataFlow.cs:215:71:215:71 | x : String | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | provenance | | +| GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | provenance | | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | provenance | | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | provenance | | -| GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | provenance | | +| GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | provenance | | +| GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | provenance | | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:215:71:215:71 | x : String | provenance | | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | provenance | | -| GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | provenance | | +| GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | provenance | | +| GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | provenance | | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | provenance | | | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | provenance | | -| GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | provenance | | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | provenance | | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | provenance | | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | provenance | | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | provenance | | | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | provenance | | -| GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | provenance | | -| GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | provenance | | +| GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | provenance | | +| GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | provenance | | +| GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | provenance | | | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:22:244:31 | await ... : String | provenance | | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | provenance | | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | provenance | | @@ -210,21 +238,22 @@ edges | GlobalDataFlow.cs:283:26:283:35 | sinkParam6 : String | GlobalDataFlow.cs:285:15:285:24 | access to parameter sinkParam6 | provenance | | | GlobalDataFlow.cs:288:26:288:35 | sinkParam7 : String | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | provenance | | | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | provenance | | -| GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | provenance | | +| GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | provenance | | +| GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | provenance | | | GlobalDataFlow.cs:300:27:300:28 | x0 : String | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | provenance | | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | provenance | | -| GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | provenance | | +| GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | provenance | | +| GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | provenance | | | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | provenance | | | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | provenance | | | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | provenance | | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | provenance | | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | provenance | | -| GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | provenance | | -| GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | provenance | | -| GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | provenance | | -| GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | provenance | | +| GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | provenance | | +| GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | provenance | | +| GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | provenance | | +| GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | provenance | | @@ -245,19 +274,25 @@ edges | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:57:37:57:37 | x : String | provenance | | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:278:26:278:35 | sinkParam5 : String | provenance | | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:283:26:283:35 | sinkParam6 : String | provenance | | -| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | provenance | | -| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | provenance | | +| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | provenance | | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | provenance | | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | provenance | | | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | provenance | | -| GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | provenance | | +| GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | provenance | | +| GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | provenance | | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | provenance | | -| GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | provenance | | | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | -| GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | -| GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | provenance | | | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | provenance | | -| GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | provenance | | +| GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | provenance | | | GlobalDataFlow.cs:466:53:466:55 | arg : String | GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | provenance | | | GlobalDataFlow.cs:469:21:469:21 | s : String | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | provenance | | | GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | GlobalDataFlow.cs:469:21:469:21 | s : String | provenance | | @@ -303,15 +338,16 @@ edges | GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | provenance | | | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:21 | access to field field | provenance | | | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | provenance | | -| GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | | -| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | provenance | | +| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:81:79:81:79 | x : String | provenance | | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | provenance | | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | provenance | | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | | +| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | | +| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | provenance | | @@ -329,51 +365,62 @@ edges | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | provenance | | | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | | | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | | +| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | | +| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | provenance | | -| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | | -| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | | -| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | | +| Splitting.cs:39:13:39:13 | access to local variable s : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | | +| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:39:13:39:13 | access to local variable s : String | provenance | | +| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | | +| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | | +| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:48:13:48:13 | access to local variable s : String | provenance | | nodes | Capture.cs:7:20:7:26 | tainted : String | semmle.label | tainted : String | +| Capture.cs:11:17:11:22 | access to local variable sink27 : String | semmle.label | access to local variable sink27 : String | | Capture.cs:12:19:12:24 | access to local variable sink27 | semmle.label | access to local variable sink27 | +| Capture.cs:20:21:20:26 | access to local variable sink28 : String | semmle.label | access to local variable sink28 : String | | Capture.cs:21:23:21:28 | access to local variable sink28 | semmle.label | access to local variable sink28 | +| Capture.cs:29:17:29:22 | access to local variable sink29 : String | semmle.label | access to local variable sink29 : String | | Capture.cs:30:19:30:24 | access to local variable sink29 | semmle.label | access to local variable sink29 | | Capture.cs:50:50:50:55 | sink39 : String | semmle.label | sink39 : String | | Capture.cs:57:27:57:32 | access to parameter sink39 | semmle.label | access to parameter sink39 | | Capture.cs:61:36:61:42 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:69:13:69:35 | SSA def(sink30) : String | semmle.label | SSA def(sink30) : String | +| Capture.cs:69:13:69:18 | access to local variable sink30 : String | semmle.label | access to local variable sink30 : String | | Capture.cs:69:22:69:35 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:72:15:72:20 | access to local variable sink30 | semmle.label | access to local variable sink30 | -| Capture.cs:79:17:79:39 | SSA def(sink31) : String | semmle.label | SSA def(sink31) : String | +| Capture.cs:79:17:79:22 | access to local variable sink31 : String | semmle.label | access to local variable sink31 : String | | Capture.cs:79:26:79:39 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:84:15:84:20 | access to local variable sink31 | semmle.label | access to local variable sink31 | -| Capture.cs:89:13:89:35 | SSA def(sink32) : String | semmle.label | SSA def(sink32) : String | +| Capture.cs:89:13:89:18 | access to local variable sink32 : String | semmle.label | access to local variable sink32 : String | | Capture.cs:89:22:89:35 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:93:15:93:20 | access to local variable sink32 | semmle.label | access to local variable sink32 | -| Capture.cs:115:17:115:39 | SSA def(sink40) : String | semmle.label | SSA def(sink40) : String | +| Capture.cs:115:17:115:22 | access to local variable sink40 : String | semmle.label | access to local variable sink40 : String | | Capture.cs:115:26:115:39 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:122:15:122:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | | Capture.cs:125:25:125:31 | tainted : String | semmle.label | tainted : String | | Capture.cs:133:15:133:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | | Capture.cs:145:15:145:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | | Capture.cs:154:15:154:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | +| Capture.cs:160:13:160:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | | Capture.cs:161:15:161:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | | Capture.cs:168:25:168:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:169:15:169:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | | Capture.cs:188:26:188:26 | s : String | semmle.label | s : String | | Capture.cs:191:20:191:22 | call to local function M : String | semmle.label | call to local function M : String | +| Capture.cs:194:13:194:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | | Capture.cs:194:22:194:32 | call to local function Id : String | semmle.label | call to local function Id : String | | Capture.cs:194:25:194:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:195:15:195:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | semmle.label | access to field SinkField0 : String | | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | semmle.label | access to field SinkField0 | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | semmle.label | access to property SinkProperty0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | @@ -391,19 +438,22 @@ nodes | GlobalDataFlow.cs:57:46:57:46 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | semmle.label | call to method Return : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | semmle.label | access to local variable sink0 | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | | GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | semmle.label | (...) ... : String | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | semmle.label | call to method Invoke : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | semmle.label | access to local variable sink1 | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | semmle.label | SSA def(sink2) : String | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | semmle.label | access to local variable sink2 | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | semmle.label | SSA def(sink3) : String | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | semmle.label | access to local variable sink3 | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | semmle.label | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | @@ -412,18 +462,21 @@ nodes | GlobalDataFlow.cs:81:79:81:79 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | semmle.label | access to local variable sink13 | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | semmle.label | access to local variable sink14 | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | semmle.label | access to local variable sink15 : String | | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | semmle.label | access to local variable sink15 | +| GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | semmle.label | access to local variable sink16 : String | | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | @@ -433,31 +486,40 @@ nodes | GlobalDataFlow.cs:138:40:138:40 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | semmle.label | access to local variable sink4 : String | | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | semmle.label | access to local variable sink4 | +| GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | semmle.label | access to local variable sink5 : String | | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | semmle.label | access to local variable sink4 : String | | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | semmle.label | access to local variable sink5 | +| GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | semmle.label | access to local variable sink6 : String | | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | semmle.label | call to method Out : String | | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | semmle.label | access to local variable sink6 | -| GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | semmle.label | SSA def(sink7) : String | +| GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | semmle.label | access to local variable sink7 : String | | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | semmle.label | access to local variable sink7 | -| GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | semmle.label | SSA def(sink8) : String | +| GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | semmle.label | access to local variable sink8 : String | | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | semmle.label | access to local variable sink8 | +| GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | semmle.label | access to local variable sink12 : String | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | semmle.label | call to method OutYield : IEnumerable [element] : String | | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | semmle.label | access to local variable sink12 | +| GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | semmle.label | access to local variable sink23 : String | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | semmle.label | call to method TaintedParam : String | | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | semmle.label | access to local variable sink23 | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | semmle.label | access to local variable sink9 : String | | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | semmle.label | access to local variable sink9 | +| GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | semmle.label | access to local variable sink10 : String | | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | semmle.label | object creation of type Lazy : Lazy [property Value] : String | | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | semmle.label | access to property Value : String | | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | semmle.label | access to local variable sink10 | +| GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | semmle.label | access to local variable sink19 : String | | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | semmle.label | access to property OutProperty : String | | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | semmle.label | access to local variable sink19 | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | semmle.label | array creation of type String[] : null [element] : String | | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | semmle.label | call to method AsQueryable : IQueryable [element] : String | | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | @@ -466,23 +528,29 @@ nodes | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | semmle.label | access to parameter sinkParam10 | | GlobalDataFlow.cs:215:71:215:71 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | semmle.label | access to local variable sink24 : String | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | semmle.label | access to local variable sink24 | +| GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | semmle.label | access to local variable sink25 : String | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | semmle.label | call to method Select : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | semmle.label | access to local variable sink25 | +| GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | semmle.label | access to local variable sink26 : String | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | semmle.label | access to local variable sink26 | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | semmle.label | access to local variable sink41 : String | | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | semmle.label | access to property Result : String | | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | semmle.label | access to local variable sink41 | +| GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | semmle.label | access to local variable sink42 : String | | GlobalDataFlow.cs:244:22:244:31 | await ... : String | semmle.label | await ... : String | | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | semmle.label | access to local variable sink42 | @@ -502,15 +570,16 @@ nodes | GlobalDataFlow.cs:288:26:288:35 | sinkParam7 : String | semmle.label | sinkParam7 : String | | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | semmle.label | access to parameter sinkParam7 | | GlobalDataFlow.cs:298:26:298:26 | x : String | semmle.label | x : String | +| GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | semmle.label | access to local variable y : String | | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:300:27:300:28 | x0 : String | semmle.label | x0 : String | | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | semmle.label | access to parameter x0 : String | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | semmle.label | ... ? ... : ... : String | | GlobalDataFlow.cs:304:32:304:32 | x : String | semmle.label | x : String | -| GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | +| GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | semmle.label | access to parameter y : String | | GlobalDataFlow.cs:310:32:310:32 | x : String | semmle.label | x : String | -| GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | +| GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | semmle.label | access to parameter y : String | | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | semmle.label | sinkParam8 : String | | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | semmle.label | access to parameter sinkParam8 | | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | semmle.label | sinkParam9 : String | @@ -518,9 +587,9 @@ nodes | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | semmle.label | sinkParam11 : String | | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | semmle.label | access to parameter sinkParam11 | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:382:41:382:41 | x : String | semmle.label | x : String | @@ -543,17 +612,23 @@ nodes | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:401:39:401:45 | tainted : String | semmle.label | tainted : String | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | semmle.label | access to local variable sink11 : String | | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | semmle.label | access to local variable sink11 | | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | semmle.label | access to local variable sink11 : String | | GlobalDataFlow.cs:427:9:427:11 | value : String | semmle.label | value : String | +| GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | semmle.label | access to local variable sink20 : String | | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | semmle.label | access to local variable sink20 | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | semmle.label | access to local variable sink45 : String | | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | semmle.label | call to method GetResult : String | | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | semmle.label | access to local variable sink45 | @@ -604,11 +679,12 @@ nodes | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:547:15:547:21 | access to field field | semmle.label | access to field field | | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | semmle.label | e : null [element] : String | -| GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | semmle.label | access to parameter e : null [element] : String | | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:3:28:3:34 | tainted : String | semmle.label | tainted : String | +| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | semmle.label | [b (line 3): false] call to method Return : String | | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | semmle.label | [b (line 3): true] call to method Return : String | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | semmle.label | [b (line 3): false] access to parameter tainted : String | @@ -627,6 +703,8 @@ nodes | Splitting.cs:24:28:24:34 | tainted : String | semmle.label | tainted : String | | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String | | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | semmle.label | [b (line 24): true] access to parameter tainted : String | +| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | semmle.label | [b (line 24): false] dynamic access to element : String | | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | semmle.label | [b (line 24): true] dynamic access to element : String | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String | @@ -634,8 +712,10 @@ nodes | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | semmle.label | [b (line 24): false] access to local variable x | | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | semmle.label | [b (line 24): true] access to local variable x | | Splitting.cs:34:19:34:19 | access to local variable x | semmle.label | access to local variable x | +| Splitting.cs:39:13:39:13 | access to local variable s : String | semmle.label | access to local variable s : String | | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | semmle.label | [b (line 37): true] "taint source" : String | | Splitting.cs:41:19:41:19 | access to local variable s | semmle.label | access to local variable s | +| Splitting.cs:48:13:48:13 | access to local variable s : String | semmle.label | access to local variable s : String | | Splitting.cs:48:36:48:49 | "taint source" : String | semmle.label | "taint source" : String | | Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s | | Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s | @@ -643,8 +723,8 @@ subpaths | Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | Capture.cs:194:22:194:32 | call to local function Id : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | -| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | -| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | +| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | +| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | diff --git a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected index bfe1895663c..4a38023038a 100644 --- a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected +++ b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected @@ -40,10 +40,10 @@ | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 | | GlobalDataFlow.cs:73:29:73:64 | call to method GetMethod | normal | GlobalDataFlow.cs:73:29:73:64 | call to method GetMethod | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke | normal | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke | -| GlobalDataFlow.cs:76:9:76:46 | call to method ReturnOut | out parameter 1 | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) | -| GlobalDataFlow.cs:76:9:76:46 | call to method ReturnOut | ref parameter 1 | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) | -| GlobalDataFlow.cs:79:9:79:46 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) | -| GlobalDataFlow.cs:79:9:79:46 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) | +| GlobalDataFlow.cs:76:9:76:46 | call to method ReturnOut | out parameter 1 | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 | +| GlobalDataFlow.cs:76:9:76:46 | call to method ReturnOut | ref parameter 1 | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 | +| GlobalDataFlow.cs:79:9:79:46 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 | +| GlobalDataFlow.cs:79:9:79:46 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven | normal | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven | | GlobalDataFlow.cs:81:22:81:93 | call to method First | normal | GlobalDataFlow.cs:81:22:81:93 | call to method First | | GlobalDataFlow.cs:83:22:83:87 | call to method Select | normal | GlobalDataFlow.cs:83:22:83:87 | call to method Select | @@ -55,25 +55,25 @@ | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate | normal | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate | | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate | normal | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate | | GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | normal | GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | -| GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) | -| GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) | +| GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 | +| GlobalDataFlow.cs:94:9:94:42 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 | | GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | normal | GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | -| GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) | -| GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) | +| GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 | +| GlobalDataFlow.cs:97:9:97:41 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 | | GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | normal | GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | -| GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | out parameter 3 | GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) | -| GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | ref parameter 3 | GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) | +| GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | out parameter 3 | GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b | +| GlobalDataFlow.cs:100:9:100:89 | call to method TryParse | ref parameter 3 | GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b | | GlobalDataFlow.cs:104:24:104:33 | call to method Return | normal | GlobalDataFlow.cs:104:24:104:33 | call to method Return | | GlobalDataFlow.cs:106:28:106:63 | call to method GetMethod | normal | GlobalDataFlow.cs:106:28:106:63 | call to method GetMethod | | GlobalDataFlow.cs:106:28:106:103 | call to method Invoke | normal | GlobalDataFlow.cs:106:28:106:103 | call to method Invoke | -| GlobalDataFlow.cs:108:9:108:49 | call to method ReturnOut | out parameter 1 | GlobalDataFlow.cs:108:27:108:34 | SSA def(nonSink0) | -| GlobalDataFlow.cs:108:9:108:49 | call to method ReturnOut | ref parameter 1 | GlobalDataFlow.cs:108:27:108:34 | SSA def(nonSink0) | -| GlobalDataFlow.cs:110:9:110:49 | call to method ReturnOut | out parameter 2 | GlobalDataFlow.cs:110:41:110:48 | SSA def(nonSink0) | -| GlobalDataFlow.cs:110:9:110:49 | call to method ReturnOut | ref parameter 2 | GlobalDataFlow.cs:110:41:110:48 | SSA def(nonSink0) | -| GlobalDataFlow.cs:112:9:112:49 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:112:27:112:34 | SSA def(nonSink0) | -| GlobalDataFlow.cs:112:9:112:49 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:112:27:112:34 | SSA def(nonSink0) | -| GlobalDataFlow.cs:114:9:114:49 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:114:30:114:34 | SSA def(sink1) | -| GlobalDataFlow.cs:114:9:114:49 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:114:30:114:34 | SSA def(sink1) | +| GlobalDataFlow.cs:108:9:108:49 | call to method ReturnOut | out parameter 1 | GlobalDataFlow.cs:108:27:108:34 | access to local variable nonSink0 | +| GlobalDataFlow.cs:108:9:108:49 | call to method ReturnOut | ref parameter 1 | GlobalDataFlow.cs:108:27:108:34 | access to local variable nonSink0 | +| GlobalDataFlow.cs:110:9:110:49 | call to method ReturnOut | out parameter 2 | GlobalDataFlow.cs:110:41:110:48 | access to local variable nonSink0 | +| GlobalDataFlow.cs:110:9:110:49 | call to method ReturnOut | ref parameter 2 | GlobalDataFlow.cs:110:41:110:48 | access to local variable nonSink0 | +| GlobalDataFlow.cs:112:9:112:49 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:112:27:112:34 | access to local variable nonSink0 | +| GlobalDataFlow.cs:112:9:112:49 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:112:27:112:34 | access to local variable nonSink0 | +| GlobalDataFlow.cs:114:9:114:49 | call to method ReturnRef | out parameter 1 | GlobalDataFlow.cs:114:30:114:34 | access to local variable sink1 | +| GlobalDataFlow.cs:114:9:114:49 | call to method ReturnRef | ref parameter 1 | GlobalDataFlow.cs:114:30:114:34 | access to local variable sink1 | | GlobalDataFlow.cs:116:20:116:86 | call to method SelectEven | normal | GlobalDataFlow.cs:116:20:116:86 | call to method SelectEven | | GlobalDataFlow.cs:116:20:116:94 | call to method First | normal | GlobalDataFlow.cs:116:20:116:94 | call to method First | | GlobalDataFlow.cs:118:20:118:82 | call to method Select | normal | GlobalDataFlow.cs:118:20:118:82 | call to method Select | @@ -86,11 +86,11 @@ | GlobalDataFlow.cs:126:20:126:109 | call to method Aggregate | normal | GlobalDataFlow.cs:126:20:126:109 | call to method Aggregate | | GlobalDataFlow.cs:128:20:128:107 | call to method Aggregate | normal | GlobalDataFlow.cs:128:20:128:107 | call to method Aggregate | | GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | normal | GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | -| GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:131:38:131:45 | SSA def(nonSink2) | -| GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:131:38:131:45 | SSA def(nonSink2) | +| GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:131:38:131:45 | access to local variable nonSink2 | +| GlobalDataFlow.cs:131:9:131:46 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:131:38:131:45 | access to local variable nonSink2 | | GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | normal | GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | -| GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:134:37:134:44 | SSA def(nonSink3) | -| GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:134:37:134:44 | SSA def(nonSink3) | +| GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | out parameter 1 | GlobalDataFlow.cs:134:37:134:44 | access to local variable nonSink3 | +| GlobalDataFlow.cs:134:9:134:45 | call to method TryParse | ref parameter 1 | GlobalDataFlow.cs:134:37:134:44 | access to local variable nonSink3 | | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc | normal | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc | | GlobalDataFlow.cs:139:21:139:34 | delegate call | normal | GlobalDataFlow.cs:139:21:139:34 | delegate call | | GlobalDataFlow.cs:143:20:143:36 | delegate call | normal | GlobalDataFlow.cs:143:20:143:36 | delegate call | @@ -98,18 +98,18 @@ | GlobalDataFlow.cs:151:20:151:40 | call to method ApplyFunc | normal | GlobalDataFlow.cs:151:20:151:40 | call to method ApplyFunc | | GlobalDataFlow.cs:153:20:153:44 | call to method ApplyFunc | normal | GlobalDataFlow.cs:153:20:153:44 | call to method ApplyFunc | | GlobalDataFlow.cs:157:21:157:25 | call to method Out | normal | GlobalDataFlow.cs:157:21:157:25 | call to method Out | -| GlobalDataFlow.cs:160:9:160:25 | call to method OutOut | out parameter 0 | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) | -| GlobalDataFlow.cs:160:9:160:25 | call to method OutOut | ref parameter 0 | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) | -| GlobalDataFlow.cs:163:9:163:25 | call to method OutRef | out parameter 0 | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) | -| GlobalDataFlow.cs:163:9:163:25 | call to method OutRef | ref parameter 0 | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) | +| GlobalDataFlow.cs:160:9:160:25 | call to method OutOut | out parameter 0 | GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 | +| GlobalDataFlow.cs:160:9:160:25 | call to method OutOut | ref parameter 0 | GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 | +| GlobalDataFlow.cs:163:9:163:25 | call to method OutRef | out parameter 0 | GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 | +| GlobalDataFlow.cs:163:9:163:25 | call to method OutRef | ref parameter 0 | GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield | normal | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield | | GlobalDataFlow.cs:165:22:165:39 | call to method First | normal | GlobalDataFlow.cs:165:22:165:39 | call to method First | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam | normal | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam | | GlobalDataFlow.cs:171:20:171:27 | call to method NonOut | normal | GlobalDataFlow.cs:171:20:171:27 | call to method NonOut | -| GlobalDataFlow.cs:173:9:173:31 | call to method NonOutOut | out parameter 0 | GlobalDataFlow.cs:173:23:173:30 | SSA def(nonSink0) | -| GlobalDataFlow.cs:173:9:173:31 | call to method NonOutOut | ref parameter 0 | GlobalDataFlow.cs:173:23:173:30 | SSA def(nonSink0) | -| GlobalDataFlow.cs:175:9:175:31 | call to method NonOutRef | out parameter 0 | GlobalDataFlow.cs:175:23:175:30 | SSA def(nonSink0) | -| GlobalDataFlow.cs:175:9:175:31 | call to method NonOutRef | ref parameter 0 | GlobalDataFlow.cs:175:23:175:30 | SSA def(nonSink0) | +| GlobalDataFlow.cs:173:9:173:31 | call to method NonOutOut | out parameter 0 | GlobalDataFlow.cs:173:23:173:30 | access to local variable nonSink0 | +| GlobalDataFlow.cs:173:9:173:31 | call to method NonOutOut | ref parameter 0 | GlobalDataFlow.cs:173:23:173:30 | access to local variable nonSink0 | +| GlobalDataFlow.cs:175:9:175:31 | call to method NonOutRef | out parameter 0 | GlobalDataFlow.cs:175:23:175:30 | access to local variable nonSink0 | +| GlobalDataFlow.cs:175:9:175:31 | call to method NonOutRef | ref parameter 0 | GlobalDataFlow.cs:175:23:175:30 | access to local variable nonSink0 | | GlobalDataFlow.cs:177:20:177:32 | call to method NonOutYield | normal | GlobalDataFlow.cs:177:20:177:32 | call to method NonOutYield | | GlobalDataFlow.cs:177:20:177:40 | call to method First | normal | GlobalDataFlow.cs:177:20:177:40 | call to method First | | GlobalDataFlow.cs:179:20:179:44 | call to method NonTaintedParam | normal | GlobalDataFlow.cs:179:20:179:44 | call to method NonTaintedParam | diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected index ace244f6961..1a8330776ab 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected @@ -1,43 +1,50 @@ edges -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:11:17:11:22 | access to local variable sink27 : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:20:21:20:26 | access to local variable sink28 : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:29:17:29:22 | access to local variable sink29 : String | provenance | | | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:61:36:61:42 | access to parameter tainted : String | provenance | | +| Capture.cs:11:17:11:22 | access to local variable sink27 : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | +| Capture.cs:20:21:20:26 | access to local variable sink28 : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | +| Capture.cs:29:17:29:22 | access to local variable sink29 : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | | Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | | Capture.cs:61:36:61:42 | access to parameter tainted : String | Capture.cs:50:50:50:55 | sink39 : String | provenance | | -| Capture.cs:69:13:69:35 | SSA def(sink30) : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | -| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:69:13:69:35 | SSA def(sink30) : String | provenance | | -| Capture.cs:79:17:79:39 | SSA def(sink31) : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | -| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:39 | SSA def(sink31) : String | provenance | | -| Capture.cs:89:13:89:35 | SSA def(sink32) : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | -| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:35 | SSA def(sink32) : String | provenance | | -| Capture.cs:115:17:115:39 | SSA def(sink40) : String | Capture.cs:122:15:122:20 | access to local variable sink40 | provenance | | -| Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:115:17:115:39 | SSA def(sink40) : String | provenance | | +| Capture.cs:69:13:69:18 | access to local variable sink30 : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | +| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:69:13:69:18 | access to local variable sink30 : String | provenance | | +| Capture.cs:79:17:79:22 | access to local variable sink31 : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | +| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:22 | access to local variable sink31 : String | provenance | | +| Capture.cs:89:13:89:18 | access to local variable sink32 : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | +| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:18 | access to local variable sink32 : String | provenance | | +| Capture.cs:115:17:115:22 | access to local variable sink40 : String | Capture.cs:122:15:122:20 | access to local variable sink40 | provenance | | +| Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:115:17:115:22 | access to local variable sink40 : String | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:168:25:168:31 | access to parameter tainted : String | provenance | | | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:194:25:194:31 | access to parameter tainted : String | provenance | | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | Capture.cs:161:15:161:20 | access to local variable sink36 | provenance | | +| Capture.cs:160:13:160:18 | access to local variable sink36 : String | Capture.cs:161:15:161:20 | access to local variable sink36 | provenance | | +| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | Capture.cs:160:13:160:18 | access to local variable sink36 : String | provenance | | | Capture.cs:168:25:168:31 | access to parameter tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | provenance | | | Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | provenance | | -| Capture.cs:194:22:194:32 | call to local function Id : String | Capture.cs:195:15:195:20 | access to local variable sink38 | provenance | | +| Capture.cs:194:13:194:18 | access to local variable sink38 : String | Capture.cs:195:15:195:20 | access to local variable sink38 | provenance | | +| Capture.cs:194:22:194:32 | call to local function Id : String | Capture.cs:194:13:194:18 | access to local variable sink38 : String | provenance | | | Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | provenance | | | Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:194:22:194:32 | call to local function Id : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:53:20:53:37 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:54:28:54:45 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:55:44:55:61 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:56:28:56:45 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | provenance | | -| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:53:20:53:37 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:54:28:54:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:55:44:55:61 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:56:28:56:45 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | provenance | | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:38:35:38:52 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | GlobalDataFlow.cs:46:13:46:30 | access to property SinkProperty0 : String | provenance | | @@ -107,115 +114,138 @@ edges | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | GlobalDataFlow.cs:396:52:396:52 | x : String | provenance | | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | GlobalDataFlow.cs:427:9:427:11 | value : String | provenance | | -| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | provenance | | -| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | provenance | | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | provenance | | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | provenance | | +| GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | provenance | | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | provenance | | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | provenance | | -| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | provenance | | -| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | provenance | | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | provenance | | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | provenance | | +| GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | provenance | | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | provenance | | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | provenance | | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | provenance | | -| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | provenance | | +| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | provenance | | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | provenance | | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | provenance | | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | provenance | | -| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | provenance | | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | provenance | | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | provenance | | +| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | provenance | | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | provenance | | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | provenance | | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | provenance | | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | provenance | | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | provenance | | -| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | provenance | | -| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | provenance | | +| GlobalDataFlow.cs:81:22:81:93 | call to method First : String | GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | provenance | | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | provenance | | | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:81:59:81:63 | access to local variable sink3 : String | GlobalDataFlow.cs:81:57:81:65 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:81:79:81:79 | x : String | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | provenance | | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | provenance | | | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | provenance | | -| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | provenance | | +| GlobalDataFlow.cs:83:22:83:95 | call to method First : String | GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | provenance | | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | provenance | | | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | provenance | | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | provenance | | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | provenance | | | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | provenance | | -| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | provenance | | -| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | provenance | | +| GlobalDataFlow.cs:85:22:85:136 | call to method First : String | GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | provenance | | | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | provenance | | +| GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | provenance | | | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | provenance | | -| GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | provenance | | +| GlobalDataFlow.cs:87:22:87:136 | call to method First : String | GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | provenance | | | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | provenance | | -| GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | provenance | | +| GlobalDataFlow.cs:89:13:89:18 | access to local variable sink17 : String | GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | provenance | | +| GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | GlobalDataFlow.cs:89:13:89:18 | access to local variable sink17 : String | provenance | | | GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | provenance | | | GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | provenance | | | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | provenance | | -| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:92:15:92:20 | access to local variable sink18 | provenance | | -| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | provenance | | -| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | provenance | | -| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | provenance | | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:92:15:92:20 | access to local variable sink18 | provenance | | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | provenance | | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | provenance | | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | provenance | | +| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | provenance | | | GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | provenance | | -| GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) : Int32 | provenance | | -| GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) : Int32 | GlobalDataFlow.cs:95:15:95:20 | access to local variable sink21 | provenance | | -| GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) : Boolean | provenance | | -| GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) : Boolean | GlobalDataFlow.cs:98:15:98:20 | access to local variable sink22 | provenance | | -| GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) : Int32 | provenance | | -| GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) : Int32 | GlobalDataFlow.cs:101:15:101:21 | access to local variable sink21b | provenance | | +| GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 : Int32 | provenance | | +| GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 : Int32 | GlobalDataFlow.cs:95:15:95:20 | access to local variable sink21 | provenance | | +| GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 : Boolean | provenance | | +| GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 : Boolean | GlobalDataFlow.cs:98:15:98:20 | access to local variable sink22 | provenance | | +| GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b : Int32 | provenance | | +| GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b : Int32 | GlobalDataFlow.cs:101:15:101:21 | access to local variable sink21b | provenance | | | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | provenance | | -| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | provenance | | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | provenance | | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | provenance | | +| GlobalDataFlow.cs:139:21:139:34 | delegate call : String | GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | provenance | | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | provenance | | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | provenance | | -| GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | provenance | | +| GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | provenance | | +| GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | provenance | | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | provenance | | -| GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | provenance | | -| GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | provenance | | +| GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | provenance | | +| GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | provenance | | +| GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | provenance | | +| GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | provenance | | +| GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | provenance | | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | provenance | | -| GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | provenance | | -| GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | provenance | | +| GlobalDataFlow.cs:165:22:165:39 | call to method First : String | GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | provenance | | +| GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | provenance | | +| GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | provenance | | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | provenance | | -| GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | provenance | | +| GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | provenance | | +| GlobalDataFlow.cs:184:21:184:26 | delegate call : String | GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | provenance | | +| GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | provenance | | | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | provenance | | -| GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | provenance | | -| GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | provenance | | +| GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | provenance | | +| GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | provenance | | +| GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | provenance | | -| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | provenance | | +| GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | provenance | | | GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | provenance | | | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | provenance | | | GlobalDataFlow.cs:215:71:215:71 | x : String | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | provenance | | +| GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | provenance | | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:214:35:214:45 | sinkParam10 : String | provenance | | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | provenance | | -| GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | provenance | | +| GlobalDataFlow.cs:216:22:216:47 | call to method First : String | GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | provenance | | +| GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | provenance | | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:215:71:215:71 | x : String | provenance | | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | provenance | | | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | provenance | | -| GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | provenance | | +| GlobalDataFlow.cs:218:22:218:47 | call to method First : String | GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | provenance | | +| GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | provenance | | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | provenance | | | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | provenance | | -| GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | provenance | | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | provenance | | -| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:220:22:220:57 | call to method First : String | GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | provenance | | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | provenance | | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | provenance | | | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | provenance | | -| GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | provenance | | -| GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | provenance | | +| GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | provenance | | +| GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | provenance | | +| GlobalDataFlow.cs:244:22:244:31 | await ... : String | GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | provenance | | | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:244:22:244:31 | await ... : String | provenance | | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:259:16:259:25 | access to parameter sinkParam0 : String | provenance | | | GlobalDataFlow.cs:257:26:257:35 | sinkParam0 : String | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | provenance | | @@ -227,21 +257,22 @@ edges | GlobalDataFlow.cs:283:26:283:35 | sinkParam6 : String | GlobalDataFlow.cs:285:15:285:24 | access to parameter sinkParam6 | provenance | | | GlobalDataFlow.cs:288:26:288:35 | sinkParam7 : String | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | provenance | | | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | provenance | | -| GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | provenance | | +| GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | provenance | | +| GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | provenance | | | GlobalDataFlow.cs:300:27:300:28 | x0 : String | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | provenance | | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | provenance | | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | provenance | | -| GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | provenance | | -| GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | provenance | | +| GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | provenance | | +| GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | provenance | | | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | provenance | | | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | provenance | | | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | provenance | | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | provenance | | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | provenance | | -| GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | provenance | | -| GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | provenance | | -| GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | provenance | | -| GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | provenance | | +| GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | provenance | | +| GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | provenance | | +| GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | provenance | | +| GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | provenance | | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | provenance | | | GlobalDataFlow.cs:382:41:382:41 | x : String | GlobalDataFlow.cs:384:11:384:11 | access to parameter x : String | provenance | | @@ -262,21 +293,28 @@ edges | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:57:37:57:37 | x : String | provenance | | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:278:26:278:35 | sinkParam5 : String | provenance | | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | GlobalDataFlow.cs:283:26:283:35 | sinkParam6 : String | provenance | | -| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | provenance | | -| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | provenance | | +| GlobalDataFlow.cs:401:39:401:45 | tainted : String | GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | provenance | | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | provenance | | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | provenance | | | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | provenance | | -| GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | provenance | | +| GlobalDataFlow.cs:427:9:427:11 | value : String | GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | provenance | | +| GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | provenance | | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | provenance | | -| GlobalDataFlow.cs:448:22:448:65 | call to method Join : String | GlobalDataFlow.cs:449:15:449:20 | access to local variable sink44 | provenance | | +| GlobalDataFlow.cs:448:13:448:18 | access to local variable sink44 : String | GlobalDataFlow.cs:449:15:449:20 | access to local variable sink44 | provenance | | +| GlobalDataFlow.cs:448:22:448:65 | call to method Join : String | GlobalDataFlow.cs:448:13:448:18 | access to local variable sink44 : String | provenance | | | GlobalDataFlow.cs:448:51:448:64 | "taint source" : String | GlobalDataFlow.cs:448:22:448:65 | call to method Join : String | provenance | | -| GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | provenance | | | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | provenance | | +| GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | -| GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | -| GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | provenance | | +| GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | provenance | | | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | provenance | | -| GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | provenance | | +| GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | provenance | | | GlobalDataFlow.cs:466:53:466:55 | arg : String | GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | provenance | | | GlobalDataFlow.cs:469:21:469:21 | s : String | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | provenance | | | GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | GlobalDataFlow.cs:469:21:469:21 | s : String | provenance | | @@ -322,8 +360,7 @@ edges | GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | provenance | | | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:21 | access to field field | provenance | | | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | provenance | | -| GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | | -| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | provenance | | +| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:81:79:81:79 | x : String | provenance | | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | provenance | | | GlobalDataFlowStringBuilder.cs:17:64:17:64 | s : String | GlobalDataFlowStringBuilder.cs:19:19:19:19 | access to parameter s : String | provenance | | @@ -335,26 +372,32 @@ edges | GlobalDataFlowStringBuilder.cs:30:31:30:32 | [post] access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:40:20:40:26 | (...) ... : AppendInterpolatedStringHandler | provenance | | | GlobalDataFlowStringBuilder.cs:30:35:30:48 | "taint source" : String | GlobalDataFlowStringBuilder.cs:17:64:17:64 | s : String | provenance | | | GlobalDataFlowStringBuilder.cs:30:35:30:48 | "taint source" : String | GlobalDataFlowStringBuilder.cs:30:31:30:32 | [post] access to local variable sb : StringBuilder | provenance | | +| GlobalDataFlowStringBuilder.cs:31:13:31:17 | access to local variable sink0 : String | GlobalDataFlowStringBuilder.cs:32:15:32:19 | access to local variable sink0 | provenance | | | GlobalDataFlowStringBuilder.cs:31:21:31:22 | access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:31:21:31:33 | call to method ToString : String | provenance | | -| GlobalDataFlowStringBuilder.cs:31:21:31:33 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:32:15:32:19 | access to local variable sink0 | provenance | | +| GlobalDataFlowStringBuilder.cs:31:21:31:33 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:31:13:31:17 | access to local variable sink0 : String | provenance | | | GlobalDataFlowStringBuilder.cs:35:9:35:11 | [post] access to local variable sb1 : StringBuilder | GlobalDataFlowStringBuilder.cs:36:21:36:23 | access to local variable sb1 : StringBuilder | provenance | | | GlobalDataFlowStringBuilder.cs:35:20:35:21 | access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:35:9:35:11 | [post] access to local variable sb1 : StringBuilder | provenance | | +| GlobalDataFlowStringBuilder.cs:36:13:36:17 | access to local variable sink1 : String | GlobalDataFlowStringBuilder.cs:37:15:37:19 | access to local variable sink1 | provenance | | | GlobalDataFlowStringBuilder.cs:36:21:36:23 | access to local variable sb1 : StringBuilder | GlobalDataFlowStringBuilder.cs:36:21:36:34 | call to method ToString : String | provenance | | -| GlobalDataFlowStringBuilder.cs:36:21:36:34 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:37:15:37:19 | access to local variable sink1 | provenance | | +| GlobalDataFlowStringBuilder.cs:36:21:36:34 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:36:13:36:17 | access to local variable sink1 : String | provenance | | | GlobalDataFlowStringBuilder.cs:40:9:40:11 | [post] access to local variable sb2 : StringBuilder | GlobalDataFlowStringBuilder.cs:41:21:41:23 | access to local variable sb2 : StringBuilder | provenance | | | GlobalDataFlowStringBuilder.cs:40:20:40:26 | (...) ... : AppendInterpolatedStringHandler | GlobalDataFlowStringBuilder.cs:40:9:40:11 | [post] access to local variable sb2 : StringBuilder | provenance | | +| GlobalDataFlowStringBuilder.cs:41:13:41:17 | access to local variable sink2 : String | GlobalDataFlowStringBuilder.cs:42:15:42:19 | access to local variable sink2 | provenance | | | GlobalDataFlowStringBuilder.cs:41:21:41:23 | access to local variable sb2 : StringBuilder | GlobalDataFlowStringBuilder.cs:41:21:41:34 | call to method ToString : String | provenance | | -| GlobalDataFlowStringBuilder.cs:41:21:41:34 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:42:15:42:19 | access to local variable sink2 | provenance | | +| GlobalDataFlowStringBuilder.cs:41:21:41:34 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:41:13:41:17 | access to local variable sink2 : String | provenance | | | GlobalDataFlowStringBuilder.cs:48:43:48:44 | [post] access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:49:21:49:22 | access to local variable sb : StringBuilder | provenance | | | GlobalDataFlowStringBuilder.cs:48:47:48:60 | "taint source" : String | GlobalDataFlowStringBuilder.cs:22:76:22:76 | s : String | provenance | | | GlobalDataFlowStringBuilder.cs:48:47:48:60 | "taint source" : String | GlobalDataFlowStringBuilder.cs:48:43:48:44 | [post] access to local variable sb : StringBuilder | provenance | | +| GlobalDataFlowStringBuilder.cs:49:13:49:17 | access to local variable sink3 : String | GlobalDataFlowStringBuilder.cs:50:15:50:19 | access to local variable sink3 | provenance | | | GlobalDataFlowStringBuilder.cs:49:21:49:22 | access to local variable sb : StringBuilder | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString : String | provenance | | -| GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:50:15:50:19 | access to local variable sink3 | provenance | | +| GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString : String | GlobalDataFlowStringBuilder.cs:49:13:49:17 | access to local variable sink3 : String | provenance | | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | provenance | | | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | | -| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | | +| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | | +| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | | +| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | | | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | provenance | | @@ -372,51 +415,62 @@ edges | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | provenance | | | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | | | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | | -| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | | +| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | | +| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | | +| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | | | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | provenance | | -| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | | -| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | | -| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | | +| Splitting.cs:39:13:39:13 | access to local variable s : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | | +| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:39:13:39:13 | access to local variable s : String | provenance | | +| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | | +| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | | +| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:48:13:48:13 | access to local variable s : String | provenance | | nodes | Capture.cs:7:20:7:26 | tainted : String | semmle.label | tainted : String | +| Capture.cs:11:17:11:22 | access to local variable sink27 : String | semmle.label | access to local variable sink27 : String | | Capture.cs:12:19:12:24 | access to local variable sink27 | semmle.label | access to local variable sink27 | +| Capture.cs:20:21:20:26 | access to local variable sink28 : String | semmle.label | access to local variable sink28 : String | | Capture.cs:21:23:21:28 | access to local variable sink28 | semmle.label | access to local variable sink28 | +| Capture.cs:29:17:29:22 | access to local variable sink29 : String | semmle.label | access to local variable sink29 : String | | Capture.cs:30:19:30:24 | access to local variable sink29 | semmle.label | access to local variable sink29 | | Capture.cs:50:50:50:55 | sink39 : String | semmle.label | sink39 : String | | Capture.cs:57:27:57:32 | access to parameter sink39 | semmle.label | access to parameter sink39 | | Capture.cs:61:36:61:42 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:69:13:69:35 | SSA def(sink30) : String | semmle.label | SSA def(sink30) : String | +| Capture.cs:69:13:69:18 | access to local variable sink30 : String | semmle.label | access to local variable sink30 : String | | Capture.cs:69:22:69:35 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:72:15:72:20 | access to local variable sink30 | semmle.label | access to local variable sink30 | -| Capture.cs:79:17:79:39 | SSA def(sink31) : String | semmle.label | SSA def(sink31) : String | +| Capture.cs:79:17:79:22 | access to local variable sink31 : String | semmle.label | access to local variable sink31 : String | | Capture.cs:79:26:79:39 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:84:15:84:20 | access to local variable sink31 | semmle.label | access to local variable sink31 | -| Capture.cs:89:13:89:35 | SSA def(sink32) : String | semmle.label | SSA def(sink32) : String | +| Capture.cs:89:13:89:18 | access to local variable sink32 : String | semmle.label | access to local variable sink32 : String | | Capture.cs:89:22:89:35 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:93:15:93:20 | access to local variable sink32 | semmle.label | access to local variable sink32 | -| Capture.cs:115:17:115:39 | SSA def(sink40) : String | semmle.label | SSA def(sink40) : String | +| Capture.cs:115:17:115:22 | access to local variable sink40 : String | semmle.label | access to local variable sink40 : String | | Capture.cs:115:26:115:39 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:122:15:122:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | | Capture.cs:125:25:125:31 | tainted : String | semmle.label | tainted : String | | Capture.cs:133:15:133:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | | Capture.cs:145:15:145:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | | Capture.cs:154:15:154:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | +| Capture.cs:160:13:160:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | | Capture.cs:161:15:161:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | | Capture.cs:168:25:168:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:169:15:169:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | | Capture.cs:188:26:188:26 | s : String | semmle.label | s : String | | Capture.cs:191:20:191:22 | call to local function M : String | semmle.label | call to local function M : String | +| Capture.cs:194:13:194:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | | Capture.cs:194:22:194:32 | call to local function Id : String | semmle.label | call to local function Id : String | | Capture.cs:194:25:194:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:195:15:195:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | semmle.label | access to field SinkField0 : String | | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | semmle.label | access to field SinkField0 | +| GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | semmle.label | access to property SinkProperty0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:36:13:36:30 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | @@ -434,19 +488,22 @@ nodes | GlobalDataFlow.cs:57:46:57:46 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:58:35:58:52 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:65:22:65:39 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | +| GlobalDataFlow.cs:71:13:71:17 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | semmle.label | call to method Return : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | semmle.label | access to property SinkProperty0 : String | | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | semmle.label | access to local variable sink0 | +| GlobalDataFlow.cs:73:13:73:17 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | | GlobalDataFlow.cs:73:21:73:101 | (...) ... : String | semmle.label | (...) ... : String | | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | semmle.label | call to method Invoke : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlow.cs:74:15:74:19 | access to local variable sink1 | semmle.label | access to local variable sink1 | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | -| GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | semmle.label | SSA def(sink2) : String | +| GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | | GlobalDataFlow.cs:77:15:77:19 | access to local variable sink2 | semmle.label | access to local variable sink2 | | GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | -| GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | semmle.label | SSA def(sink3) : String | +| GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:80:15:80:19 | access to local variable sink3 | semmle.label | access to local variable sink3 | +| GlobalDataFlow.cs:81:13:81:18 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | semmle.label | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:81:22:81:93 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | @@ -455,69 +512,83 @@ nodes | GlobalDataFlow.cs:81:79:81:79 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:82:15:82:20 | access to local variable sink13 | semmle.label | access to local variable sink13 | +| GlobalDataFlow.cs:83:13:83:18 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:83:22:83:87 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:83:22:83:95 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:83:57:83:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:83:59:83:64 | access to local variable sink13 : String | semmle.label | access to local variable sink13 : String | | GlobalDataFlow.cs:84:15:84:20 | access to local variable sink14 | semmle.label | access to local variable sink14 | +| GlobalDataFlow.cs:85:13:85:18 | access to local variable sink15 : String | semmle.label | access to local variable sink15 : String | | GlobalDataFlow.cs:85:22:85:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:85:22:85:136 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:85:57:85:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:85:59:85:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:86:15:86:20 | access to local variable sink15 | semmle.label | access to local variable sink15 | +| GlobalDataFlow.cs:87:13:87:18 | access to local variable sink16 : String | semmle.label | access to local variable sink16 : String | | GlobalDataFlow.cs:87:22:87:128 | call to method Zip : IEnumerable [element] : String | semmle.label | call to method Zip : IEnumerable [element] : String | | GlobalDataFlow.cs:87:22:87:136 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:87:104:87:113 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:87:106:87:111 | access to local variable sink15 : String | semmle.label | access to local variable sink15 : String | | GlobalDataFlow.cs:88:15:88:20 | access to local variable sink16 | semmle.label | access to local variable sink16 | +| GlobalDataFlow.cs:89:13:89:18 | access to local variable sink17 : String | semmle.label | access to local variable sink17 : String | | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate : String | semmle.label | call to method Aggregate : String | | GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String | | GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | | GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | semmle.label | access to local variable sink17 | +| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String | | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate : String | semmle.label | call to method Aggregate : String | | GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String | | GlobalDataFlow.cs:92:15:92:20 | access to local variable sink18 | semmle.label | access to local variable sink18 | | GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String | -| GlobalDataFlow.cs:94:36:94:41 | SSA def(sink21) : Int32 | semmle.label | SSA def(sink21) : Int32 | +| GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 : Int32 | semmle.label | access to local variable sink21 : Int32 | | GlobalDataFlow.cs:95:15:95:20 | access to local variable sink21 | semmle.label | access to local variable sink21 | | GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String | -| GlobalDataFlow.cs:97:35:97:40 | SSA def(sink22) : Boolean | semmle.label | SSA def(sink22) : Boolean | +| GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 : Boolean | semmle.label | access to local variable sink22 : Boolean | | GlobalDataFlow.cs:98:15:98:20 | access to local variable sink22 | semmle.label | access to local variable sink22 | | GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String | -| GlobalDataFlow.cs:100:82:100:88 | SSA def(sink21b) : Int32 | semmle.label | SSA def(sink21b) : Int32 | +| GlobalDataFlow.cs:100:82:100:88 | access to local variable sink21b : Int32 | semmle.label | access to local variable sink21b : Int32 | | GlobalDataFlow.cs:101:15:101:21 | access to local variable sink21b | semmle.label | access to local variable sink21b | | GlobalDataFlow.cs:138:40:138:40 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:139:13:139:17 | access to local variable sink4 : String | semmle.label | access to local variable sink4 : String | | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | semmle.label | access to local variable sink4 | +| GlobalDataFlow.cs:147:13:147:17 | access to local variable sink5 : String | semmle.label | access to local variable sink5 : String | | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | semmle.label | access to local variable sink4 : String | | GlobalDataFlow.cs:148:15:148:19 | access to local variable sink5 | semmle.label | access to local variable sink5 | +| GlobalDataFlow.cs:157:13:157:17 | access to local variable sink6 : String | semmle.label | access to local variable sink6 : String | | GlobalDataFlow.cs:157:21:157:25 | call to method Out : String | semmle.label | call to method Out : String | | GlobalDataFlow.cs:158:15:158:19 | access to local variable sink6 | semmle.label | access to local variable sink6 | -| GlobalDataFlow.cs:160:20:160:24 | SSA def(sink7) : String | semmle.label | SSA def(sink7) : String | +| GlobalDataFlow.cs:160:20:160:24 | access to local variable sink7 : String | semmle.label | access to local variable sink7 : String | | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | semmle.label | access to local variable sink7 | -| GlobalDataFlow.cs:163:20:163:24 | SSA def(sink8) : String | semmle.label | SSA def(sink8) : String | +| GlobalDataFlow.cs:163:20:163:24 | access to local variable sink8 : String | semmle.label | access to local variable sink8 : String | | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | semmle.label | access to local variable sink8 | +| GlobalDataFlow.cs:165:13:165:18 | access to local variable sink12 : String | semmle.label | access to local variable sink12 : String | | GlobalDataFlow.cs:165:22:165:31 | call to method OutYield : IEnumerable [element] : String | semmle.label | call to method OutYield : IEnumerable [element] : String | | GlobalDataFlow.cs:165:22:165:39 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:166:15:166:20 | access to local variable sink12 | semmle.label | access to local variable sink12 | +| GlobalDataFlow.cs:167:13:167:18 | access to local variable sink23 : String | semmle.label | access to local variable sink23 : String | | GlobalDataFlow.cs:167:22:167:43 | call to method TaintedParam : String | semmle.label | call to method TaintedParam : String | | GlobalDataFlow.cs:168:15:168:20 | access to local variable sink23 | semmle.label | access to local variable sink23 | | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:184:13:184:17 | access to local variable sink9 : String | semmle.label | access to local variable sink9 : String | | GlobalDataFlow.cs:184:21:184:26 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | semmle.label | access to local variable sink9 | +| GlobalDataFlow.cs:193:13:193:18 | access to local variable sink10 : String | semmle.label | access to local variable sink10 : String | | GlobalDataFlow.cs:193:22:193:42 | object creation of type Lazy : Lazy [property Value] : String | semmle.label | object creation of type Lazy : Lazy [property Value] : String | | GlobalDataFlow.cs:193:22:193:48 | access to property Value : String | semmle.label | access to property Value : String | | GlobalDataFlow.cs:194:15:194:20 | access to local variable sink10 | semmle.label | access to local variable sink10 | +| GlobalDataFlow.cs:201:13:201:18 | access to local variable sink19 : String | semmle.label | access to local variable sink19 : String | | GlobalDataFlow.cs:201:22:201:32 | access to property OutProperty : String | semmle.label | access to property OutProperty : String | | GlobalDataFlow.cs:202:15:202:20 | access to local variable sink19 | semmle.label | access to local variable sink19 | +| GlobalDataFlow.cs:211:28:211:34 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:211:38:211:61 | array creation of type String[] : null [element] : String | semmle.label | array creation of type String[] : null [element] : String | | GlobalDataFlow.cs:211:38:211:75 | call to method AsQueryable : IQueryable [element] : String | semmle.label | call to method AsQueryable : IQueryable [element] : String | | GlobalDataFlow.cs:211:44:211:61 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String | @@ -526,23 +597,29 @@ nodes | GlobalDataFlow.cs:214:58:214:68 | access to parameter sinkParam10 | semmle.label | access to parameter sinkParam10 | | GlobalDataFlow.cs:215:71:215:71 | x : String | semmle.label | x : String | | GlobalDataFlow.cs:215:89:215:89 | access to parameter x : String | semmle.label | access to parameter x : String | +| GlobalDataFlow.cs:216:13:216:18 | access to local variable sink24 : String | semmle.label | access to local variable sink24 : String | | GlobalDataFlow.cs:216:22:216:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:216:22:216:39 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:216:22:216:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:217:15:217:20 | access to local variable sink24 | semmle.label | access to local variable sink24 | +| GlobalDataFlow.cs:218:13:218:18 | access to local variable sink25 : String | semmle.label | access to local variable sink25 : String | | GlobalDataFlow.cs:218:22:218:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:39 | call to method Select : IQueryable [element] : String | semmle.label | call to method Select : IQueryable [element] : String | | GlobalDataFlow.cs:218:22:218:47 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:219:15:219:20 | access to local variable sink25 | semmle.label | access to local variable sink25 | +| GlobalDataFlow.cs:220:13:220:18 | access to local variable sink26 : String | semmle.label | access to local variable sink26 : String | | GlobalDataFlow.cs:220:22:220:28 | access to local variable tainted : IQueryable [element] : String | semmle.label | access to local variable tainted : IQueryable [element] : String | | GlobalDataFlow.cs:220:22:220:49 | call to method Select : IEnumerable [element] : String | semmle.label | call to method Select : IEnumerable [element] : String | | GlobalDataFlow.cs:220:22:220:57 | call to method First : String | semmle.label | call to method First : String | | GlobalDataFlow.cs:221:15:221:20 | access to local variable sink26 | semmle.label | access to local variable sink26 | +| GlobalDataFlow.cs:241:13:241:16 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:241:20:241:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:242:13:242:18 | access to local variable sink41 : String | semmle.label | access to local variable sink41 : String | | GlobalDataFlow.cs:242:22:242:25 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:242:22:242:32 | access to property Result : String | semmle.label | access to property Result : String | | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | semmle.label | access to local variable sink41 | +| GlobalDataFlow.cs:244:13:244:18 | access to local variable sink42 : String | semmle.label | access to local variable sink42 : String | | GlobalDataFlow.cs:244:22:244:31 | await ... : String | semmle.label | await ... : String | | GlobalDataFlow.cs:244:28:244:31 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | semmle.label | access to local variable sink42 | @@ -562,15 +639,16 @@ nodes | GlobalDataFlow.cs:288:26:288:35 | sinkParam7 : String | semmle.label | sinkParam7 : String | | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | semmle.label | access to parameter sinkParam7 | | GlobalDataFlow.cs:298:26:298:26 | x : String | semmle.label | x : String | +| GlobalDataFlow.cs:300:13:300:13 | access to local variable y : String | semmle.label | access to local variable y : String | | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc : String | semmle.label | call to method ApplyFunc : String | | GlobalDataFlow.cs:300:27:300:28 | x0 : String | semmle.label | x0 : String | | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | semmle.label | access to parameter x0 : String | | GlobalDataFlow.cs:300:37:300:37 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | semmle.label | ... ? ... : ... : String | | GlobalDataFlow.cs:304:32:304:32 | x : String | semmle.label | x : String | -| GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | +| GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | semmle.label | access to parameter y : String | | GlobalDataFlow.cs:310:32:310:32 | x : String | semmle.label | x : String | -| GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | semmle.label | SSA def(y) : String | +| GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | semmle.label | access to parameter y : String | | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | semmle.label | sinkParam8 : String | | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | semmle.label | access to parameter sinkParam8 | | GlobalDataFlow.cs:321:32:321:41 | sinkParam9 : String | semmle.label | sinkParam9 : String | @@ -578,9 +656,9 @@ nodes | GlobalDataFlow.cs:327:32:327:42 | sinkParam11 : String | semmle.label | sinkParam11 : String | | GlobalDataFlow.cs:329:15:329:25 | access to parameter sinkParam11 | semmle.label | access to parameter sinkParam11 | | GlobalDataFlow.cs:341:16:341:29 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:346:9:346:26 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| GlobalDataFlow.cs:346:9:346:9 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | semmle.label | "taint source" : String | -| GlobalDataFlow.cs:351:9:351:26 | SSA def(x) : String | semmle.label | SSA def(x) : String | +| GlobalDataFlow.cs:351:9:351:9 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:357:22:357:35 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:382:41:382:41 | x : String | semmle.label | x : String | @@ -603,20 +681,27 @@ nodes | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:398:11:398:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:401:39:401:45 | tainted : String | semmle.label | tainted : String | +| GlobalDataFlow.cs:403:13:403:18 | access to local variable sink11 : String | semmle.label | access to local variable sink11 : String | | GlobalDataFlow.cs:404:15:404:20 | access to local variable sink11 | semmle.label | access to local variable sink11 | | GlobalDataFlow.cs:405:16:405:21 | access to local variable sink11 : String | semmle.label | access to local variable sink11 : String | | GlobalDataFlow.cs:427:9:427:11 | value : String | semmle.label | value : String | +| GlobalDataFlow.cs:427:19:427:24 | access to local variable sink20 : String | semmle.label | access to local variable sink20 : String | | GlobalDataFlow.cs:427:41:427:46 | access to local variable sink20 | semmle.label | access to local variable sink20 | | GlobalDataFlow.cs:438:22:438:35 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:448:13:448:18 | access to local variable sink44 : String | semmle.label | access to local variable sink44 : String | | GlobalDataFlow.cs:448:22:448:65 | call to method Join : String | semmle.label | call to method Join : String | | GlobalDataFlow.cs:448:51:448:64 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:449:15:449:20 | access to local variable sink44 | semmle.label | access to local variable sink44 | +| GlobalDataFlow.cs:457:13:457:16 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:457:20:457:49 | call to method Run : Task [property Result] : String | semmle.label | call to method Run : Task [property Result] : String | | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlow.cs:458:13:458:21 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:458:25:458:28 | access to local variable task : Task [property Result] : String | semmle.label | access to local variable task : Task [property Result] : String | | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method ConfigureAwait : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:459:13:459:19 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:459:23:459:31 | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaitable : ConfiguredTaskAwaitable [synthetic m_configuredTaskAwaiter, synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | call to method GetAwaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | +| GlobalDataFlow.cs:460:13:460:18 | access to local variable sink45 : String | semmle.label | access to local variable sink45 : String | | GlobalDataFlow.cs:460:22:460:28 | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | semmle.label | access to local variable awaiter : ConfiguredTaskAwaitable.ConfiguredTaskAwaiter [synthetic m_task_configured_task_awaitable, property Result] : String | | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult : String | semmle.label | call to method GetResult : String | | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | semmle.label | access to local variable sink45 | @@ -667,7 +752,6 @@ nodes | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String | | GlobalDataFlow.cs:547:15:547:21 | access to field field | semmle.label | access to field field | | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | semmle.label | e : null [element] : String | -| GlobalDataFlow.cs:556:22:556:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | semmle.label | access to parameter e : null [element] : String | | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | semmle.label | delegate call : String | | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | semmle.label | access to local variable x : String | @@ -679,25 +763,31 @@ nodes | GlobalDataFlowStringBuilder.cs:24:19:24:26 | (...) ... : AppendInterpolatedStringHandler | semmle.label | (...) ... : AppendInterpolatedStringHandler | | GlobalDataFlowStringBuilder.cs:30:31:30:32 | [post] access to local variable sb : StringBuilder | semmle.label | [post] access to local variable sb : StringBuilder | | GlobalDataFlowStringBuilder.cs:30:35:30:48 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlowStringBuilder.cs:31:13:31:17 | access to local variable sink0 : String | semmle.label | access to local variable sink0 : String | | GlobalDataFlowStringBuilder.cs:31:21:31:22 | access to local variable sb : StringBuilder | semmle.label | access to local variable sb : StringBuilder | | GlobalDataFlowStringBuilder.cs:31:21:31:33 | call to method ToString : String | semmle.label | call to method ToString : String | | GlobalDataFlowStringBuilder.cs:32:15:32:19 | access to local variable sink0 | semmle.label | access to local variable sink0 | | GlobalDataFlowStringBuilder.cs:35:9:35:11 | [post] access to local variable sb1 : StringBuilder | semmle.label | [post] access to local variable sb1 : StringBuilder | | GlobalDataFlowStringBuilder.cs:35:20:35:21 | access to local variable sb : StringBuilder | semmle.label | access to local variable sb : StringBuilder | +| GlobalDataFlowStringBuilder.cs:36:13:36:17 | access to local variable sink1 : String | semmle.label | access to local variable sink1 : String | | GlobalDataFlowStringBuilder.cs:36:21:36:23 | access to local variable sb1 : StringBuilder | semmle.label | access to local variable sb1 : StringBuilder | | GlobalDataFlowStringBuilder.cs:36:21:36:34 | call to method ToString : String | semmle.label | call to method ToString : String | | GlobalDataFlowStringBuilder.cs:37:15:37:19 | access to local variable sink1 | semmle.label | access to local variable sink1 | | GlobalDataFlowStringBuilder.cs:40:9:40:11 | [post] access to local variable sb2 : StringBuilder | semmle.label | [post] access to local variable sb2 : StringBuilder | | GlobalDataFlowStringBuilder.cs:40:20:40:26 | (...) ... : AppendInterpolatedStringHandler | semmle.label | (...) ... : AppendInterpolatedStringHandler | +| GlobalDataFlowStringBuilder.cs:41:13:41:17 | access to local variable sink2 : String | semmle.label | access to local variable sink2 : String | | GlobalDataFlowStringBuilder.cs:41:21:41:23 | access to local variable sb2 : StringBuilder | semmle.label | access to local variable sb2 : StringBuilder | | GlobalDataFlowStringBuilder.cs:41:21:41:34 | call to method ToString : String | semmle.label | call to method ToString : String | | GlobalDataFlowStringBuilder.cs:42:15:42:19 | access to local variable sink2 | semmle.label | access to local variable sink2 | | GlobalDataFlowStringBuilder.cs:48:43:48:44 | [post] access to local variable sb : StringBuilder | semmle.label | [post] access to local variable sb : StringBuilder | | GlobalDataFlowStringBuilder.cs:48:47:48:60 | "taint source" : String | semmle.label | "taint source" : String | +| GlobalDataFlowStringBuilder.cs:49:13:49:17 | access to local variable sink3 : String | semmle.label | access to local variable sink3 : String | | GlobalDataFlowStringBuilder.cs:49:21:49:22 | access to local variable sb : StringBuilder | semmle.label | access to local variable sb : StringBuilder | | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString : String | semmle.label | call to method ToString : String | | GlobalDataFlowStringBuilder.cs:50:15:50:19 | access to local variable sink3 | semmle.label | access to local variable sink3 | | Splitting.cs:3:28:3:34 | tainted : String | semmle.label | tainted : String | +| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return : String | semmle.label | [b (line 3): false] call to method Return : String | | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return : String | semmle.label | [b (line 3): true] call to method Return : String | | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | semmle.label | [b (line 3): false] access to parameter tainted : String | @@ -716,6 +806,8 @@ nodes | Splitting.cs:24:28:24:34 | tainted : String | semmle.label | tainted : String | | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String | | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | semmle.label | [b (line 24): true] access to parameter tainted : String | +| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | semmle.label | [b (line 24): false] dynamic access to element : String | | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | semmle.label | [b (line 24): true] dynamic access to element : String | | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String | @@ -723,8 +815,10 @@ nodes | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | semmle.label | [b (line 24): false] access to local variable x | | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | semmle.label | [b (line 24): true] access to local variable x | | Splitting.cs:34:19:34:19 | access to local variable x | semmle.label | access to local variable x | +| Splitting.cs:39:13:39:13 | access to local variable s : String | semmle.label | access to local variable s : String | | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | semmle.label | [b (line 37): true] "taint source" : String | | Splitting.cs:41:19:41:19 | access to local variable s | semmle.label | access to local variable s | +| Splitting.cs:48:13:48:13 | access to local variable s : String | semmle.label | access to local variable s : String | | Splitting.cs:48:36:48:49 | "taint source" : String | semmle.label | "taint source" : String | | Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s | | Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s | @@ -732,8 +826,8 @@ subpaths | Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | Capture.cs:194:22:194:32 | call to local function Id : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | -| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:13 | SSA def(y) : String | GlobalDataFlow.cs:76:30:76:34 | SSA def(sink2) : String | -| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:13 | SSA def(y) : String | GlobalDataFlow.cs:79:30:79:34 | SSA def(sink3) : String | +| GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | +| GlobalDataFlow.cs:79:19:79:23 | access to local variable sink2 : String | GlobalDataFlow.cs:310:32:310:32 | x : String | GlobalDataFlow.cs:312:9:312:9 | access to parameter y : String | GlobalDataFlow.cs:79:30:79:34 | access to local variable sink3 : String | | GlobalDataFlow.cs:81:23:81:65 | (...) ... : null [element] : String | GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String | GlobalDataFlow.cs:81:22:81:85 | call to method SelectEven : IEnumerable [element] : String | | GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | | GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String | diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected index afb49ad2bce..17838631b58 100644 --- a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1,5 +1,6 @@ | Capture.cs:5:17:5:17 | this | Capture.cs:13:9:13:14 | this access | -| Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:17 | SSA def(i) | +| Capture.cs:7:13:7:13 | access to local variable i | Capture.cs:7:13:7:17 | SSA def(i) | +| Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:13 | access to local variable i | | Capture.cs:9:9:12:9 | SSA capture def(i) | Capture.cs:11:17:11:17 | access to local variable i | | Capture.cs:13:9:13:14 | this access | Capture.cs:23:9:23:14 | this access | | Capture.cs:15:9:22:9 | this | Capture.cs:21:13:21:18 | this access | @@ -7,437 +8,544 @@ | Capture.cs:23:9:23:14 | this access | Capture.cs:34:9:34:14 | this access | | Capture.cs:25:9:33:9 | this | Capture.cs:32:13:32:18 | this access | | Capture.cs:27:13:30:13 | SSA capture def(i) | Capture.cs:29:21:29:21 | access to local variable i | -| Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:17 | SSA def(i) | +| Capture.cs:31:13:31:13 | access to local variable i | Capture.cs:31:13:31:17 | SSA def(i) | +| Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:13 | access to local variable i | | Capture.cs:34:9:34:14 | this access | Capture.cs:40:9:40:15 | this access | -| Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:17 | SSA def(i) | +| Capture.cs:38:13:38:13 | access to local variable i | Capture.cs:38:13:38:17 | SSA def(i) | +| Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:13 | access to local variable i | | Capture.cs:40:9:40:15 | this access | Capture.cs:51:9:51:15 | this access | | Capture.cs:40:9:40:17 | SSA call def(i) | Capture.cs:41:13:41:13 | access to local variable i | | Capture.cs:43:9:50:9 | this | Capture.cs:49:13:49:19 | this access | -| Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:21 | SSA def(i) | +| Capture.cs:47:17:47:17 | access to local variable i | Capture.cs:47:17:47:21 | SSA def(i) | +| Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:17 | access to local variable i | | Capture.cs:51:9:51:15 | this access | Capture.cs:63:9:63:15 | this access | | Capture.cs:51:9:51:17 | SSA call def(i) | Capture.cs:52:13:52:13 | access to local variable i | | Capture.cs:54:9:62:9 | this | Capture.cs:60:13:60:19 | this access | -| Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:21 | SSA def(i) | -| Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:17 | SSA def(i) | +| Capture.cs:58:17:58:17 | access to local variable i | Capture.cs:58:17:58:21 | SSA def(i) | +| Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:17 | access to local variable i | +| Capture.cs:61:13:61:13 | access to local variable i | Capture.cs:61:13:61:17 | SSA def(i) | +| Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:13 | access to local variable i | | Capture.cs:63:9:63:17 | SSA call def(i) | Capture.cs:64:13:64:13 | access to local variable i | | LocalDataFlow.cs:48:24:48:24 | b | LocalDataFlow.cs:84:21:84:21 | access to parameter b | +| LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | -| LocalDataFlow.cs:51:21:51:34 | "taint source" | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | +| LocalDataFlow.cs:51:21:51:34 | "taint source" | LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | | LocalDataFlow.cs:52:15:52:19 | [post] access to local variable sink0 | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | +| LocalDataFlow.cs:55:13:55:20 | access to local variable nonSink0 | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | LocalDataFlow.cs:56:15:56:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:55:24:55:25 | "" | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:55:24:55:25 | "" | LocalDataFlow.cs:55:13:55:20 | access to local variable nonSink0 | | LocalDataFlow.cs:56:15:56:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:56:15:56:22 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | -| LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | -| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | +| LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | +| LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | +| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | | LocalDataFlow.cs:61:15:61:19 | [post] access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | -| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | | LocalDataFlow.cs:65:15:65:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:68:13:68:17 | access to local variable sink5 | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | LocalDataFlow.cs:69:15:69:19 | access to local variable sink5 | | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | LocalDataFlow.cs:168:33:168:37 | access to local variable sink1 | -| LocalDataFlow.cs:68:21:68:32 | ... + ... | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | +| LocalDataFlow.cs:68:21:68:32 | ... + ... | LocalDataFlow.cs:68:13:68:17 | access to local variable sink5 | | LocalDataFlow.cs:69:15:69:19 | [post] access to local variable sink5 | LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | | LocalDataFlow.cs:69:15:69:19 | access to local variable sink5 | LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | +| LocalDataFlow.cs:72:9:72:16 | access to local variable nonSink0 | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | LocalDataFlow.cs:73:15:73:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:72:20:72:36 | ... + ... | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | +| LocalDataFlow.cs:72:20:72:36 | ... + ... | LocalDataFlow.cs:72:9:72:16 | access to local variable nonSink0 | | LocalDataFlow.cs:73:15:73:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | | LocalDataFlow.cs:73:15:73:22 | access to local variable nonSink0 | LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | +| LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | -| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | +| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | | LocalDataFlow.cs:77:15:77:19 | [post] access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | +| LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | LocalDataFlow.cs:81:15:81:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | +| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | +| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | | LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): false] access to parameter b | | LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): true] access to parameter b | -| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | -| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | +| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | +| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | | LocalDataFlow.cs:84:25:84:27 | [b (line 48): true] "a" | LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | +| LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | +| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 | | LocalDataFlow.cs:88:24:88:28 | "abc" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | | LocalDataFlow.cs:88:32:88:36 | "def" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | | LocalDataFlow.cs:89:15:89:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | LocalDataFlow.cs:93:15:93:19 | access to local variable sink8 | -| LocalDataFlow.cs:92:21:92:33 | (...) ... | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | +| LocalDataFlow.cs:92:21:92:33 | (...) ... | LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 | LocalDataFlow.cs:92:21:92:33 | (...) ... | | LocalDataFlow.cs:93:15:93:19 | [post] access to local variable sink8 | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | | LocalDataFlow.cs:93:15:93:19 | access to local variable sink8 | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | +| LocalDataFlow.cs:96:13:96:20 | access to local variable nonSink3 | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | LocalDataFlow.cs:97:15:97:22 | access to local variable nonSink3 | -| LocalDataFlow.cs:96:24:96:39 | (...) ... | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | +| LocalDataFlow.cs:96:24:96:39 | (...) ... | LocalDataFlow.cs:96:13:96:20 | access to local variable nonSink3 | | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | LocalDataFlow.cs:96:24:96:39 | (...) ... | | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:100:13:100:17 | access to local variable sink9 | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | LocalDataFlow.cs:101:15:101:19 | access to local variable sink9 | | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | LocalDataFlow.cs:100:21:100:35 | ... as ... | | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | -| LocalDataFlow.cs:100:21:100:35 | ... as ... | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | +| LocalDataFlow.cs:100:21:100:35 | ... as ... | LocalDataFlow.cs:100:13:100:17 | access to local variable sink9 | | LocalDataFlow.cs:101:15:101:19 | [post] access to local variable sink9 | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | | LocalDataFlow.cs:101:15:101:19 | access to local variable sink9 | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | +| LocalDataFlow.cs:104:9:104:16 | access to local variable nonSink3 | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | LocalDataFlow.cs:105:15:105:22 | access to local variable nonSink3 | | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | LocalDataFlow.cs:104:20:104:37 | ... as ... | | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | -| LocalDataFlow.cs:104:20:104:37 | ... as ... | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | +| LocalDataFlow.cs:104:20:104:37 | ... as ... | LocalDataFlow.cs:104:9:104:16 | access to local variable nonSink3 | | LocalDataFlow.cs:105:15:105:22 | [post] access to local variable nonSink3 | LocalDataFlow.cs:170:33:170:40 | access to local variable nonSink3 | | LocalDataFlow.cs:105:15:105:22 | access to local variable nonSink3 | LocalDataFlow.cs:170:33:170:40 | access to local variable nonSink3 | +| LocalDataFlow.cs:108:13:108:18 | access to local variable sink15 | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | LocalDataFlow.cs:109:15:109:20 | access to local variable sink15 | -| LocalDataFlow.cs:108:22:108:39 | call to method Parse | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | +| LocalDataFlow.cs:108:22:108:39 | call to method Parse | LocalDataFlow.cs:108:13:108:18 | access to local variable sink15 | | LocalDataFlow.cs:108:34:108:38 | [post] access to local variable sink9 | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | | LocalDataFlow.cs:109:15:109:20 | access to local variable sink15 | LocalDataFlow.cs:160:22:160:27 | access to local variable sink15 | +| LocalDataFlow.cs:111:13:111:18 | access to local variable sink16 | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | LocalDataFlow.cs:112:15:112:20 | access to local variable sink16 | -| LocalDataFlow.cs:111:22:111:56 | call to method TryParse | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | +| LocalDataFlow.cs:111:22:111:56 | call to method TryParse | LocalDataFlow.cs:111:13:111:18 | access to local variable sink16 | | LocalDataFlow.cs:111:37:111:41 | [post] access to local variable sink9 | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | +| LocalDataFlow.cs:113:13:113:18 | access to local variable sink17 | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | LocalDataFlow.cs:114:15:114:20 | access to local variable sink17 | | LocalDataFlow.cs:113:22:113:29 | [post] access to local variable nonSink0 | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | -| LocalDataFlow.cs:113:22:113:49 | call to method Replace | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | +| LocalDataFlow.cs:113:22:113:49 | call to method Replace | LocalDataFlow.cs:113:13:113:18 | access to local variable sink17 | | LocalDataFlow.cs:113:44:113:48 | [post] access to local variable sink9 | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | +| LocalDataFlow.cs:115:13:115:18 | access to local variable sink18 | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | LocalDataFlow.cs:116:15:116:20 | access to local variable sink18 | -| LocalDataFlow.cs:115:22:115:51 | call to method Format | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | +| LocalDataFlow.cs:115:22:115:51 | call to method Format | LocalDataFlow.cs:115:13:115:18 | access to local variable sink18 | | LocalDataFlow.cs:115:36:115:43 | [post] access to local variable nonSink0 | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | | LocalDataFlow.cs:115:46:115:50 | [post] access to local variable sink9 | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | | LocalDataFlow.cs:116:15:116:20 | [post] access to local variable sink18 | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | | LocalDataFlow.cs:116:15:116:20 | access to local variable sink18 | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | +| LocalDataFlow.cs:117:13:117:18 | access to local variable sink19 | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | LocalDataFlow.cs:118:15:118:20 | access to local variable sink19 | -| LocalDataFlow.cs:117:22:117:52 | call to method Format | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | +| LocalDataFlow.cs:117:22:117:52 | call to method Format | LocalDataFlow.cs:117:13:117:18 | access to local variable sink19 | | LocalDataFlow.cs:117:44:117:51 | [post] access to local variable nonSink0 | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:119:13:119:18 | access to local variable sink45 | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | LocalDataFlow.cs:120:15:120:20 | access to local variable sink45 | -| LocalDataFlow.cs:119:22:119:38 | call to method Parse | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | +| LocalDataFlow.cs:119:22:119:38 | call to method Parse | LocalDataFlow.cs:119:13:119:18 | access to local variable sink45 | | LocalDataFlow.cs:119:33:119:37 | [post] access to local variable sink9 | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | +| LocalDataFlow.cs:122:13:122:18 | access to local variable sink46 | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | LocalDataFlow.cs:123:15:123:20 | access to local variable sink46 | -| LocalDataFlow.cs:122:22:122:56 | call to method TryParse | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | +| LocalDataFlow.cs:122:22:122:56 | call to method TryParse | LocalDataFlow.cs:122:13:122:18 | access to local variable sink46 | | LocalDataFlow.cs:122:36:122:40 | [post] access to local variable sink9 | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | | LocalDataFlow.cs:123:15:123:20 | access to local variable sink46 | LocalDataFlow.cs:124:37:124:42 | access to local variable sink46 | +| LocalDataFlow.cs:124:13:124:18 | access to local variable sink47 | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | LocalDataFlow.cs:125:15:125:20 | access to local variable sink47 | -| LocalDataFlow.cs:124:22:124:43 | call to method ToByte | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | +| LocalDataFlow.cs:124:22:124:43 | call to method ToByte | LocalDataFlow.cs:124:13:124:18 | access to local variable sink47 | | LocalDataFlow.cs:125:15:125:20 | access to local variable sink47 | LocalDataFlow.cs:126:40:126:45 | access to local variable sink47 | +| LocalDataFlow.cs:126:13:126:18 | access to local variable sink49 | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | LocalDataFlow.cs:127:15:127:20 | access to local variable sink49 | -| LocalDataFlow.cs:126:22:126:46 | call to method Concat | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | +| LocalDataFlow.cs:126:22:126:46 | call to method Concat | LocalDataFlow.cs:126:13:126:18 | access to local variable sink49 | | LocalDataFlow.cs:126:40:126:45 | access to local variable sink47 | LocalDataFlow.cs:126:40:126:45 | (...) ... | | LocalDataFlow.cs:127:15:127:20 | [post] access to local variable sink49 | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | | LocalDataFlow.cs:127:15:127:20 | access to local variable sink49 | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | +| LocalDataFlow.cs:128:13:128:18 | access to local variable sink50 | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | LocalDataFlow.cs:129:15:129:20 | access to local variable sink50 | -| LocalDataFlow.cs:128:22:128:40 | call to method Copy | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | +| LocalDataFlow.cs:128:22:128:40 | call to method Copy | LocalDataFlow.cs:128:13:128:18 | access to local variable sink50 | | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | LocalDataFlow.cs:128:22:128:40 | call to method Copy | | LocalDataFlow.cs:129:15:129:20 | [post] access to local variable sink50 | LocalDataFlow.cs:130:59:130:64 | access to local variable sink50 | | LocalDataFlow.cs:129:15:129:20 | access to local variable sink50 | LocalDataFlow.cs:130:59:130:64 | access to local variable sink50 | +| LocalDataFlow.cs:130:13:130:18 | access to local variable sink51 | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | LocalDataFlow.cs:131:15:131:20 | access to local variable sink51 | -| LocalDataFlow.cs:130:22:130:71 | call to method Join | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | +| LocalDataFlow.cs:130:22:130:71 | call to method Join | LocalDataFlow.cs:130:13:130:18 | access to local variable sink51 | | LocalDataFlow.cs:130:53:130:70 | { ..., ... } | LocalDataFlow.cs:130:40:130:70 | array creation of type String[] | | LocalDataFlow.cs:131:15:131:20 | [post] access to local variable sink51 | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | | LocalDataFlow.cs:131:15:131:20 | access to local variable sink51 | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | +| LocalDataFlow.cs:132:13:132:18 | access to local variable sink52 | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | LocalDataFlow.cs:133:15:133:20 | access to local variable sink52 | -| LocalDataFlow.cs:132:22:132:41 | call to method Insert | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | +| LocalDataFlow.cs:132:22:132:41 | call to method Insert | LocalDataFlow.cs:132:13:132:18 | access to local variable sink52 | +| LocalDataFlow.cs:136:9:136:16 | access to local variable nonSink2 | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | LocalDataFlow.cs:137:15:137:22 | access to local variable nonSink2 | -| LocalDataFlow.cs:136:20:136:40 | call to method Parse | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | +| LocalDataFlow.cs:136:20:136:40 | call to method Parse | LocalDataFlow.cs:136:9:136:16 | access to local variable nonSink2 | | LocalDataFlow.cs:136:32:136:39 | [post] access to local variable nonSink0 | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | +| LocalDataFlow.cs:138:13:138:20 | access to local variable nonSink7 | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | LocalDataFlow.cs:139:15:139:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:138:24:138:61 | call to method TryParse | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | +| LocalDataFlow.cs:138:24:138:61 | call to method TryParse | LocalDataFlow.cs:138:13:138:20 | access to local variable nonSink7 | | LocalDataFlow.cs:138:39:138:46 | [post] access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:140:9:140:16 | access to local variable nonSink0 | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink0 | | LocalDataFlow.cs:140:20:140:27 | [post] access to local variable nonSink0 | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | -| LocalDataFlow.cs:140:20:140:50 | call to method Replace | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | +| LocalDataFlow.cs:140:20:140:50 | call to method Replace | LocalDataFlow.cs:140:9:140:16 | access to local variable nonSink0 | | LocalDataFlow.cs:141:15:141:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink0 | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | +| LocalDataFlow.cs:142:9:142:16 | access to local variable nonSink0 | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | LocalDataFlow.cs:143:15:143:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:142:20:142:52 | call to method Format | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | +| LocalDataFlow.cs:142:20:142:52 | call to method Format | LocalDataFlow.cs:142:9:142:16 | access to local variable nonSink0 | | LocalDataFlow.cs:142:34:142:41 | [post] access to local variable nonSink0 | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | | LocalDataFlow.cs:143:15:143:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | | LocalDataFlow.cs:143:15:143:22 | access to local variable nonSink0 | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | +| LocalDataFlow.cs:144:9:144:16 | access to local variable nonSink7 | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | LocalDataFlow.cs:145:15:145:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:144:20:144:39 | call to method Parse | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | +| LocalDataFlow.cs:144:20:144:39 | call to method Parse | LocalDataFlow.cs:144:9:144:16 | access to local variable nonSink7 | | LocalDataFlow.cs:144:31:144:38 | [post] access to local variable nonSink0 | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | +| LocalDataFlow.cs:146:9:146:16 | access to local variable nonSink7 | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | LocalDataFlow.cs:147:15:147:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:146:20:146:57 | call to method TryParse | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | +| LocalDataFlow.cs:146:20:146:57 | call to method TryParse | LocalDataFlow.cs:146:9:146:16 | access to local variable nonSink7 | | LocalDataFlow.cs:147:15:147:22 | access to local variable nonSink7 | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | +| LocalDataFlow.cs:148:13:148:21 | access to local variable nonSink14 | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | LocalDataFlow.cs:149:15:149:23 | access to local variable nonSink14 | -| LocalDataFlow.cs:148:25:148:48 | call to method ToByte | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | +| LocalDataFlow.cs:148:25:148:48 | call to method ToByte | LocalDataFlow.cs:148:13:148:21 | access to local variable nonSink14 | | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | LocalDataFlow.cs:150:38:150:45 | access to local variable nonSink7 | +| LocalDataFlow.cs:150:9:150:16 | access to local variable nonSink0 | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | LocalDataFlow.cs:151:15:151:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:150:20:150:46 | call to method Concat | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | +| LocalDataFlow.cs:150:20:150:46 | call to method Concat | LocalDataFlow.cs:150:9:150:16 | access to local variable nonSink0 | | LocalDataFlow.cs:150:38:150:45 | access to local variable nonSink7 | LocalDataFlow.cs:150:38:150:45 | (...) ... | | LocalDataFlow.cs:151:15:151:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | | LocalDataFlow.cs:151:15:151:22 | access to local variable nonSink0 | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:152:9:152:16 | access to local variable nonSink0 | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | LocalDataFlow.cs:153:15:153:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:152:20:152:40 | call to method Copy | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | +| LocalDataFlow.cs:152:20:152:40 | call to method Copy | LocalDataFlow.cs:152:9:152:16 | access to local variable nonSink0 | | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | LocalDataFlow.cs:152:20:152:40 | call to method Copy | | LocalDataFlow.cs:153:15:153:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:154:57:154:64 | access to local variable nonSink0 | | LocalDataFlow.cs:153:15:153:22 | access to local variable nonSink0 | LocalDataFlow.cs:154:57:154:64 | access to local variable nonSink0 | +| LocalDataFlow.cs:154:9:154:16 | access to local variable nonSink0 | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | LocalDataFlow.cs:155:15:155:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:154:20:154:71 | call to method Join | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | +| LocalDataFlow.cs:154:20:154:71 | call to method Join | LocalDataFlow.cs:154:9:154:16 | access to local variable nonSink0 | | LocalDataFlow.cs:154:51:154:70 | { ..., ... } | LocalDataFlow.cs:154:38:154:70 | array creation of type String[] | | LocalDataFlow.cs:155:15:155:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | | LocalDataFlow.cs:155:15:155:22 | access to local variable nonSink0 | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | +| LocalDataFlow.cs:156:9:156:16 | access to local variable nonSink0 | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | LocalDataFlow.cs:157:15:157:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:156:20:156:41 | call to method Insert | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | +| LocalDataFlow.cs:156:20:156:41 | call to method Insert | LocalDataFlow.cs:156:9:156:16 | access to local variable nonSink0 | | LocalDataFlow.cs:157:15:157:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | | LocalDataFlow.cs:157:15:157:22 | access to local variable nonSink0 | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | +| LocalDataFlow.cs:160:13:160:18 | access to local variable sink20 | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | LocalDataFlow.cs:161:15:161:20 | access to local variable sink20 | -| LocalDataFlow.cs:160:22:160:32 | ... > ... | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | +| LocalDataFlow.cs:160:22:160:32 | ... > ... | LocalDataFlow.cs:160:13:160:18 | access to local variable sink20 | | LocalDataFlow.cs:161:15:161:20 | access to local variable sink20 | LocalDataFlow.cs:174:22:174:27 | access to local variable sink20 | +| LocalDataFlow.cs:162:13:162:18 | access to local variable sink21 | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | LocalDataFlow.cs:163:15:163:20 | access to local variable sink21 | | LocalDataFlow.cs:162:22:162:26 | [post] access to local variable sink9 | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | -| LocalDataFlow.cs:162:22:162:40 | call to method Equals | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | +| LocalDataFlow.cs:162:22:162:40 | call to method Equals | LocalDataFlow.cs:162:13:162:18 | access to local variable sink21 | +| LocalDataFlow.cs:164:13:164:18 | access to local variable sink22 | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | LocalDataFlow.cs:165:15:165:20 | access to local variable sink22 | | LocalDataFlow.cs:164:22:164:26 | [post] access to local variable sink8 | LocalDataFlow.cs:170:20:170:24 | access to local variable sink8 | | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | LocalDataFlow.cs:170:20:170:24 | access to local variable sink8 | -| LocalDataFlow.cs:164:22:164:45 | call to method Equals | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | +| LocalDataFlow.cs:164:22:164:45 | call to method Equals | LocalDataFlow.cs:164:13:164:18 | access to local variable sink22 | | LocalDataFlow.cs:164:43:164:44 | 41 | LocalDataFlow.cs:164:35:164:44 | (...) ... | +| LocalDataFlow.cs:168:9:168:16 | access to local variable nonSink7 | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | LocalDataFlow.cs:169:15:169:22 | access to local variable nonSink7 | | LocalDataFlow.cs:168:20:168:24 | [post] access to local variable sink0 | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | -| LocalDataFlow.cs:168:20:168:38 | call to method Equals | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | +| LocalDataFlow.cs:168:20:168:38 | call to method Equals | LocalDataFlow.cs:168:9:168:16 | access to local variable nonSink7 | | LocalDataFlow.cs:168:33:168:37 | [post] access to local variable sink1 | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | | LocalDataFlow.cs:168:33:168:37 | access to local variable sink1 | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | +| LocalDataFlow.cs:170:9:170:16 | access to local variable nonSink7 | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | LocalDataFlow.cs:171:15:171:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:170:20:170:41 | call to method Equals | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | +| LocalDataFlow.cs:170:20:170:41 | call to method Equals | LocalDataFlow.cs:170:9:170:16 | access to local variable nonSink7 | | LocalDataFlow.cs:171:15:171:22 | access to local variable nonSink7 | LocalDataFlow.cs:178:20:178:27 | access to local variable nonSink7 | +| LocalDataFlow.cs:174:13:174:18 | access to local variable sink25 | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | LocalDataFlow.cs:175:15:175:20 | access to local variable sink25 | -| LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | +| LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | LocalDataFlow.cs:174:13:174:18 | access to local variable sink25 | +| LocalDataFlow.cs:178:9:178:16 | access to local variable nonSink7 | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | LocalDataFlow.cs:179:15:179:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | +| LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | LocalDataFlow.cs:178:9:178:16 | access to local variable nonSink7 | +| LocalDataFlow.cs:182:13:182:18 | access to local variable sink26 | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | LocalDataFlow.cs:183:15:183:20 | access to local variable sink26 | -| LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | +| LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | LocalDataFlow.cs:182:13:182:18 | access to local variable sink26 | | LocalDataFlow.cs:183:15:183:20 | [post] access to local variable sink26 | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | | LocalDataFlow.cs:183:15:183:20 | access to local variable sink26 | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | +| LocalDataFlow.cs:184:13:184:18 | access to local variable sink27 | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | LocalDataFlow.cs:185:15:185:20 | access to local variable sink27 | | LocalDataFlow.cs:184:22:184:27 | [post] access to local variable sink26 | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | -| LocalDataFlow.cs:184:22:184:38 | call to method ToString | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | +| LocalDataFlow.cs:184:22:184:38 | call to method ToString | LocalDataFlow.cs:184:13:184:18 | access to local variable sink27 | +| LocalDataFlow.cs:186:13:186:18 | access to local variable sink28 | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | LocalDataFlow.cs:187:15:187:20 | access to local variable sink28 | | LocalDataFlow.cs:186:22:186:27 | [post] access to local variable sink26 | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | -| LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | +| LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | LocalDataFlow.cs:186:13:186:18 | access to local variable sink28 | +| LocalDataFlow.cs:188:13:188:18 | access to local variable sink29 | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | LocalDataFlow.cs:189:15:189:20 | access to local variable sink29 | | LocalDataFlow.cs:188:22:188:27 | [post] access to local variable sink26 | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | -| LocalDataFlow.cs:188:22:188:33 | access to property Query | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | +| LocalDataFlow.cs:188:22:188:33 | access to property Query | LocalDataFlow.cs:188:13:188:18 | access to local variable sink29 | +| LocalDataFlow.cs:190:13:190:18 | access to local variable sink30 | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | LocalDataFlow.cs:191:15:191:20 | access to local variable sink30 | -| LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | +| LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | LocalDataFlow.cs:190:13:190:18 | access to local variable sink30 | | LocalDataFlow.cs:191:15:191:20 | [post] access to local variable sink30 | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | | LocalDataFlow.cs:191:15:191:20 | access to local variable sink30 | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | +| LocalDataFlow.cs:194:13:194:20 | access to local variable nonSink8 | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | LocalDataFlow.cs:195:15:195:22 | access to local variable nonSink8 | -| LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | +| LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | LocalDataFlow.cs:194:13:194:20 | access to local variable nonSink8 | | LocalDataFlow.cs:195:15:195:22 | [post] access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | | LocalDataFlow.cs:195:15:195:22 | access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | +| LocalDataFlow.cs:196:9:196:16 | access to local variable nonSink0 | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | LocalDataFlow.cs:197:15:197:22 | access to local variable nonSink0 | | LocalDataFlow.cs:196:20:196:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:196:20:196:38 | call to method ToString | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | +| LocalDataFlow.cs:196:20:196:38 | call to method ToString | LocalDataFlow.cs:196:9:196:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:198:9:198:16 | access to local variable nonSink0 | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | LocalDataFlow.cs:199:15:199:22 | access to local variable nonSink0 | | LocalDataFlow.cs:198:20:198:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | +| LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | LocalDataFlow.cs:198:9:198:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:200:9:200:16 | access to local variable nonSink0 | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | LocalDataFlow.cs:201:15:201:22 | access to local variable nonSink0 | | LocalDataFlow.cs:200:20:200:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:200:20:200:33 | access to property Query | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | +| LocalDataFlow.cs:200:20:200:33 | access to property Query | LocalDataFlow.cs:200:9:200:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:202:9:202:16 | access to local variable nonSink0 | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | LocalDataFlow.cs:203:15:203:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | +| LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | LocalDataFlow.cs:202:9:202:16 | access to local variable nonSink0 | | LocalDataFlow.cs:203:15:203:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | | LocalDataFlow.cs:203:15:203:22 | access to local variable nonSink0 | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | +| LocalDataFlow.cs:206:13:206:18 | access to local variable sink31 | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | LocalDataFlow.cs:207:15:207:20 | access to local variable sink31 | -| LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | +| LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | LocalDataFlow.cs:206:13:206:18 | access to local variable sink31 | | LocalDataFlow.cs:207:15:207:20 | [post] access to local variable sink31 | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | | LocalDataFlow.cs:207:15:207:20 | access to local variable sink31 | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | +| LocalDataFlow.cs:208:13:208:18 | access to local variable sink32 | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | LocalDataFlow.cs:209:15:209:20 | access to local variable sink32 | -| LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | +| LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | LocalDataFlow.cs:208:13:208:18 | access to local variable sink32 | | LocalDataFlow.cs:209:15:209:20 | [post] access to local variable sink32 | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | | LocalDataFlow.cs:209:15:209:20 | access to local variable sink32 | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | +| LocalDataFlow.cs:212:13:212:20 | access to local variable nonSink9 | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | LocalDataFlow.cs:213:15:213:22 | access to local variable nonSink9 | -| LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | +| LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | LocalDataFlow.cs:212:13:212:20 | access to local variable nonSink9 | | LocalDataFlow.cs:213:15:213:22 | [post] access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | | LocalDataFlow.cs:213:15:213:22 | access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | +| LocalDataFlow.cs:214:9:214:16 | access to local variable nonSink0 | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | LocalDataFlow.cs:214:9:214:16 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | +| LocalDataFlow.cs:218:13:218:18 | access to local variable sink33 | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | LocalDataFlow.cs:219:15:219:20 | access to local variable sink33 | -| LocalDataFlow.cs:218:22:218:127 | (...) ... | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | +| LocalDataFlow.cs:218:22:218:127 | (...) ... | LocalDataFlow.cs:218:13:218:18 | access to local variable sink33 | | LocalDataFlow.cs:218:30:218:119 | call to method Insert | LocalDataFlow.cs:218:30:218:127 | call to method Clone | | LocalDataFlow.cs:218:30:218:127 | call to method Clone | LocalDataFlow.cs:218:22:218:127 | (...) ... | | LocalDataFlow.cs:219:15:219:20 | [post] access to local variable sink33 | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | | LocalDataFlow.cs:219:15:219:20 | access to local variable sink33 | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | +| LocalDataFlow.cs:220:13:220:18 | access to local variable sink48 | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | LocalDataFlow.cs:221:15:221:20 | access to local variable sink48 | | LocalDataFlow.cs:220:22:220:27 | [post] access to local variable sink33 | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | -| LocalDataFlow.cs:220:22:220:52 | call to method Remove | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | +| LocalDataFlow.cs:220:22:220:52 | call to method Remove | LocalDataFlow.cs:220:13:220:18 | access to local variable sink48 | +| LocalDataFlow.cs:224:9:224:16 | access to local variable nonSink0 | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | LocalDataFlow.cs:225:15:225:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:224:20:224:127 | (...) ... | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | +| LocalDataFlow.cs:224:20:224:127 | (...) ... | LocalDataFlow.cs:224:9:224:16 | access to local variable nonSink0 | | LocalDataFlow.cs:224:28:224:119 | call to method Insert | LocalDataFlow.cs:224:28:224:127 | call to method Clone | | LocalDataFlow.cs:224:28:224:127 | call to method Clone | LocalDataFlow.cs:224:20:224:127 | (...) ... | | LocalDataFlow.cs:225:15:225:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | | LocalDataFlow.cs:225:15:225:22 | access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | +| LocalDataFlow.cs:226:13:226:21 | access to local variable nonSink15 | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | LocalDataFlow.cs:227:15:227:23 | access to local variable nonSink15 | | LocalDataFlow.cs:226:25:226:32 | [post] access to local variable nonSink0 | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | -| LocalDataFlow.cs:226:25:226:57 | call to method Remove | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | +| LocalDataFlow.cs:226:25:226:57 | call to method Remove | LocalDataFlow.cs:226:13:226:21 | access to local variable nonSink15 | +| LocalDataFlow.cs:230:13:230:18 | access to local variable sink34 | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | LocalDataFlow.cs:231:15:231:20 | access to local variable sink34 | -| LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | +| LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | LocalDataFlow.cs:230:13:230:18 | access to local variable sink34 | | LocalDataFlow.cs:231:15:231:20 | [post] access to local variable sink34 | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | | LocalDataFlow.cs:231:15:231:20 | access to local variable sink34 | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | +| LocalDataFlow.cs:232:13:232:18 | access to local variable sink35 | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | LocalDataFlow.cs:233:15:233:20 | access to local variable sink35 | -| LocalDataFlow.cs:232:22:232:38 | call to method ToString | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | +| LocalDataFlow.cs:232:22:232:38 | call to method ToString | LocalDataFlow.cs:232:13:232:18 | access to local variable sink35 | | LocalDataFlow.cs:233:15:233:20 | [post] access to local variable sink35 | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | | LocalDataFlow.cs:233:15:233:20 | access to local variable sink35 | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | +| LocalDataFlow.cs:234:13:234:18 | access to local variable sink36 | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | -| LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | +| LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | LocalDataFlow.cs:234:13:234:18 | access to local variable sink36 | | LocalDataFlow.cs:235:9:235:14 | [post] access to local variable sink36 | LocalDataFlow.cs:236:15:236:20 | access to local variable sink36 | | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | LocalDataFlow.cs:235:9:235:33 | call to method AppendLine | | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | LocalDataFlow.cs:236:15:236:20 | access to local variable sink36 | +| LocalDataFlow.cs:239:13:239:21 | access to local variable nonSink10 | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | LocalDataFlow.cs:240:15:240:23 | access to local variable nonSink10 | -| LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | +| LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | LocalDataFlow.cs:239:13:239:21 | access to local variable nonSink10 | | LocalDataFlow.cs:240:15:240:23 | [post] access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | | LocalDataFlow.cs:240:15:240:23 | access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | +| LocalDataFlow.cs:241:9:241:16 | access to local variable nonSink0 | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | LocalDataFlow.cs:242:15:242:22 | access to local variable nonSink0 | | LocalDataFlow.cs:241:20:241:28 | [post] access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | -| LocalDataFlow.cs:241:20:241:39 | call to method ToString | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:241:20:241:39 | call to method ToString | LocalDataFlow.cs:241:9:241:16 | access to local variable nonSink0 | | LocalDataFlow.cs:242:15:242:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | | LocalDataFlow.cs:242:15:242:22 | access to local variable nonSink0 | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | | LocalDataFlow.cs:243:9:243:17 | [post] access to local variable nonSink10 | LocalDataFlow.cs:244:15:244:23 | access to local variable nonSink10 | | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:38 | call to method AppendLine | | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | LocalDataFlow.cs:244:15:244:23 | access to local variable nonSink10 | +| LocalDataFlow.cs:247:13:247:31 | access to local variable taintedDataContract | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AList) | LocalDataFlow.cs:250:22:250:46 | access to property AList | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AString) | LocalDataFlow.cs:248:22:248:48 | access to property AString | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AnInt) | LocalDataFlow.cs:257:20:257:44 | access to property AnInt | -| LocalDataFlow.cs:247:35:247:52 | object creation of type DataContract | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | +| LocalDataFlow.cs:247:35:247:52 | object creation of type DataContract | LocalDataFlow.cs:247:13:247:31 | access to local variable taintedDataContract | +| LocalDataFlow.cs:248:13:248:18 | access to local variable sink53 | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | LocalDataFlow.cs:249:15:249:20 | access to local variable sink53 | | LocalDataFlow.cs:248:22:248:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | -| LocalDataFlow.cs:248:22:248:48 | access to property AString | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | +| LocalDataFlow.cs:248:22:248:48 | access to property AString | LocalDataFlow.cs:248:13:248:18 | access to local variable sink53 | +| LocalDataFlow.cs:250:13:250:18 | access to local variable sink54 | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | LocalDataFlow.cs:251:15:251:20 | access to local variable sink54 | | LocalDataFlow.cs:250:22:250:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:250:22:250:46 | [post] access to property AList | LocalDataFlow.cs:259:20:259:44 | access to property AList | | LocalDataFlow.cs:250:22:250:46 | access to property AList | LocalDataFlow.cs:259:20:259:44 | access to property AList | -| LocalDataFlow.cs:250:22:250:57 | access to property AString | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | +| LocalDataFlow.cs:250:22:250:57 | access to property AString | LocalDataFlow.cs:250:13:250:18 | access to local variable sink54 | +| LocalDataFlow.cs:254:13:254:34 | access to local variable nonTaintedDataContract | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | LocalDataFlow.cs:255:20:255:41 | access to local variable nonTaintedDataContract | | LocalDataFlow.cs:254:13:254:55 | SSA qualifier def(nonTaintedDataContract.AString) | LocalDataFlow.cs:255:20:255:49 | access to property AString | -| LocalDataFlow.cs:254:38:254:55 | object creation of type DataContract | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | +| LocalDataFlow.cs:254:38:254:55 | object creation of type DataContract | LocalDataFlow.cs:254:13:254:34 | access to local variable nonTaintedDataContract | +| LocalDataFlow.cs:255:9:255:16 | access to local variable nonSink0 | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | LocalDataFlow.cs:256:15:256:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:255:20:255:49 | access to property AString | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | +| LocalDataFlow.cs:255:20:255:49 | access to property AString | LocalDataFlow.cs:255:9:255:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:257:9:257:16 | access to local variable nonSink2 | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | LocalDataFlow.cs:258:15:258:22 | access to local variable nonSink2 | | LocalDataFlow.cs:257:20:257:38 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | -| LocalDataFlow.cs:257:20:257:44 | access to property AnInt | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | +| LocalDataFlow.cs:257:20:257:44 | access to property AnInt | LocalDataFlow.cs:257:9:257:16 | access to local variable nonSink2 | +| LocalDataFlow.cs:259:9:259:16 | access to local variable nonSink2 | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | LocalDataFlow.cs:260:15:260:22 | access to local variable nonSink2 | -| LocalDataFlow.cs:259:20:259:53 | access to property AnInt | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | +| LocalDataFlow.cs:259:20:259:53 | access to property AnInt | LocalDataFlow.cs:259:9:259:16 | access to local variable nonSink2 | +| LocalDataFlow.cs:263:17:263:30 | access to local variable taintedTextBox | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | LocalDataFlow.cs:264:22:264:35 | access to local variable taintedTextBox | | LocalDataFlow.cs:263:17:263:37 | SSA qualifier def(taintedTextBox.Text) | LocalDataFlow.cs:264:22:264:40 | access to property Text | -| LocalDataFlow.cs:263:34:263:37 | null | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | +| LocalDataFlow.cs:263:34:263:37 | null | LocalDataFlow.cs:263:17:263:30 | access to local variable taintedTextBox | +| LocalDataFlow.cs:264:13:264:18 | access to local variable sink60 | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | LocalDataFlow.cs:265:15:265:20 | access to local variable sink60 | -| LocalDataFlow.cs:264:22:264:40 | access to property Text | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | +| LocalDataFlow.cs:264:22:264:40 | access to property Text | LocalDataFlow.cs:264:13:264:18 | access to local variable sink60 | +| LocalDataFlow.cs:268:17:268:33 | access to local variable nonTaintedTextBox | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | LocalDataFlow.cs:269:20:269:36 | access to local variable nonTaintedTextBox | | LocalDataFlow.cs:268:17:268:40 | SSA qualifier def(nonTaintedTextBox.Text) | LocalDataFlow.cs:269:20:269:41 | access to property Text | -| LocalDataFlow.cs:268:37:268:40 | null | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | +| LocalDataFlow.cs:268:37:268:40 | null | LocalDataFlow.cs:268:17:268:33 | access to local variable nonTaintedTextBox | +| LocalDataFlow.cs:269:9:269:16 | access to local variable nonSink0 | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | LocalDataFlow.cs:270:15:270:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:269:20:269:41 | access to property Text | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | +| LocalDataFlow.cs:269:20:269:41 | access to property Text | LocalDataFlow.cs:269:9:269:16 | access to local variable nonSink0 | | LocalDataFlow.cs:270:15:270:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | | LocalDataFlow.cs:270:15:270:22 | access to local variable nonSink0 | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | +| LocalDataFlow.cs:273:13:273:18 | access to local variable sink69 | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | LocalDataFlow.cs:274:15:274:20 | access to local variable sink69 | -| LocalDataFlow.cs:273:22:273:36 | $"..." | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | +| LocalDataFlow.cs:273:22:273:36 | $"..." | LocalDataFlow.cs:273:13:273:18 | access to local variable sink69 | +| LocalDataFlow.cs:277:9:277:16 | access to local variable nonSink0 | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | LocalDataFlow.cs:278:15:278:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:277:20:277:37 | $"..." | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | +| LocalDataFlow.cs:277:20:277:37 | $"..." | LocalDataFlow.cs:277:9:277:16 | access to local variable nonSink0 | | LocalDataFlow.cs:278:15:278:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | | LocalDataFlow.cs:278:15:278:22 | access to local variable nonSink0 | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | +| LocalDataFlow.cs:281:13:281:18 | access to local variable sink70 | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | LocalDataFlow.cs:282:15:282:20 | access to local variable sink70 | -| LocalDataFlow.cs:281:22:281:34 | ... = ... | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | +| LocalDataFlow.cs:281:22:281:26 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | +| LocalDataFlow.cs:281:22:281:34 | ... = ... | LocalDataFlow.cs:281:13:281:18 | access to local variable sink70 | | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | +| LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:26 | access to local variable sink0 | | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | ... = ... | -| LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | | LocalDataFlow.cs:282:15:282:20 | [post] access to local variable sink70 | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | | LocalDataFlow.cs:282:15:282:20 | access to local variable sink70 | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | +| LocalDataFlow.cs:285:9:285:16 | access to local variable nonSink0 | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | LocalDataFlow.cs:286:15:286:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:285:20:285:38 | ... = ... | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | +| LocalDataFlow.cs:285:20:285:38 | ... = ... | LocalDataFlow.cs:285:9:285:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | LocalDataFlow.cs:285:20:285:27 | access to local variable nonSink0 | | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | LocalDataFlow.cs:285:20:285:38 | ... = ... | | LocalDataFlow.cs:286:15:286:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | | LocalDataFlow.cs:286:15:286:22 | access to local variable nonSink0 | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | -| LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | +| LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:289:23:289:35 | String sink71 | | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | LocalDataFlow.cs:290:19:290:24 | access to local variable sink71 | -| LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | +| LocalDataFlow.cs:289:23:289:35 | String sink71 | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | +| LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:293:25:293:40 | String nonSink16 | | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | LocalDataFlow.cs:294:19:294:27 | access to local variable nonSink16 | -| LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | +| LocalDataFlow.cs:293:25:293:40 | String nonSink16 | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | +| LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | LocalDataFlow.cs:299:18:299:30 | String sink72 | | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | LocalDataFlow.cs:300:23:300:28 | access to local variable sink72 | -| LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | +| LocalDataFlow.cs:299:18:299:30 | String sink72 | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | +| LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:307:18:307:33 | String nonSink17 | | LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | LocalDataFlow.cs:308:23:308:31 | access to local variable nonSink17 | +| LocalDataFlow.cs:307:18:307:33 | String nonSink17 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | +| LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | LocalDataFlow.cs:315:15:315:20 | access to local variable sink73 | | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... | | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | -| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | +| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... | | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | +| LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | LocalDataFlow.cs:316:15:316:20 | access to local variable sink74 | | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | -| LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | +| LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | | LocalDataFlow.cs:334:28:334:30 | SSA entry def(this.anInt) | LocalDataFlow.cs:334:41:334:45 | access to field anInt | | LocalDataFlow.cs:334:28:334:30 | this | LocalDataFlow.cs:334:41:334:45 | this access | | LocalDataFlow.cs:334:50:334:52 | this | LocalDataFlow.cs:334:56:334:60 | this access | | LocalDataFlow.cs:334:50:334:52 | value | LocalDataFlow.cs:334:64:334:68 | access to parameter value | +| LocalDataFlow.cs:334:64:334:68 | access to parameter value | LocalDataFlow.cs:334:56:334:60 | access to field anInt | | LocalDataFlow.cs:340:41:340:47 | tainted | LocalDataFlow.cs:342:15:342:21 | access to parameter tainted | | LocalDataFlow.cs:345:44:345:53 | nonTainted | LocalDataFlow.cs:347:15:347:24 | access to parameter nonTainted | | LocalDataFlow.cs:350:44:350:44 | x | LocalDataFlow.cs:353:21:353:21 | access to parameter x | | LocalDataFlow.cs:350:67:350:68 | os | LocalDataFlow.cs:356:33:356:34 | access to parameter os | +| LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:17 | access to local variable x1 | | LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:21 | ... = ... | +| LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:29 | access to local variable os2 | | LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:34 | ... = ... | | LocalDataFlow.cs:361:41:361:44 | args | LocalDataFlow.cs:363:29:363:32 | access to parameter args | | LocalDataFlow.cs:363:29:363:32 | [post] access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | | LocalDataFlow.cs:363:29:363:32 | access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | +| LocalDataFlow.cs:363:29:363:32 | call to operator implicit conversion | LocalDataFlow.cs:363:22:363:25 | access to local variable span | +| LocalDataFlow.cs:364:27:364:30 | call to operator implicit conversion | LocalDataFlow.cs:364:23:364:23 | access to local variable x | | LocalDataFlow.cs:367:23:367:24 | b1 | LocalDataFlow.cs:371:13:371:14 | access to parameter b1 | | LocalDataFlow.cs:367:32:367:33 | b2 | LocalDataFlow.cs:374:17:374:18 | access to parameter b2 | +| LocalDataFlow.cs:369:17:369:18 | "" | LocalDataFlow.cs:369:13:369:13 | access to local variable x | +| LocalDataFlow.cs:373:13:373:13 | access to local variable x | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:376:35:376:35 | access to local variable x | | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | -| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | +| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:13 | access to local variable x | +| LocalDataFlow.cs:381:13:381:13 | access to local variable x | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | -| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | +| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:13 | access to local variable x | | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x | | SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S | | SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access | | SSA.cs:5:26:5:32 | tainted | SSA.cs:8:24:8:30 | access to parameter tainted | | SSA.cs:5:42:5:51 | nonTainted | SSA.cs:12:24:12:33 | access to parameter nonTainted | +| SSA.cs:8:13:8:20 | access to local variable ssaSink0 | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | -| SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | +| SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:20 | access to local variable ssaSink0 | | SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:58:27:58:33 | access to parameter tainted | | SSA.cs:9:15:9:22 | [post] access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | +| SSA.cs:12:13:12:20 | access to local variable nonSink0 | SSA.cs:12:13:12:33 | SSA def(nonSink0) | | SSA.cs:12:13:12:33 | SSA def(nonSink0) | SSA.cs:13:15:13:22 | access to local variable nonSink0 | -| SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:33 | SSA def(nonSink0) | +| SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:20 | access to local variable nonSink0 | | SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:23:13:23:22 | access to parameter nonTainted | | SSA.cs:13:15:13:22 | [post] access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | | SSA.cs:13:15:13:22 | access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | @@ -449,35 +557,41 @@ | SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | +| SSA.cs:22:16:22:23 | access to local variable ssaSink1 | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | -| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | +| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:23 | access to local variable ssaSink1 | | SSA.cs:23:13:23:22 | [post] access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:23:13:23:22 | access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | +| SSA.cs:24:13:24:20 | access to local variable ssaSink1 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | -| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | +| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:20 | access to local variable ssaSink1 | | SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 | +| SSA.cs:28:16:28:23 | access to local variable nonSink1 | SSA.cs:28:16:28:28 | SSA def(nonSink1) | | SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | -| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:28 | SSA def(nonSink1) | +| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:23 | access to local variable nonSink1 | | SSA.cs:29:13:29:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:29:13:29:22 | access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | +| SSA.cs:30:13:30:20 | access to local variable nonSink1 | SSA.cs:30:13:30:31 | SSA def(nonSink1) | | SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | -| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:31 | SSA def(nonSink1) | +| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:20 | access to local variable nonSink1 | | SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:49:24:49:31 | access to local variable nonSink0 | | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 | +| SSA.cs:34:16:34:23 | access to local variable ssaSink2 | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | -| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | +| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:23 | access to local variable ssaSink2 | | SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | +| SSA.cs:37:13:37:20 | access to local variable ssaSink2 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:39:21:39:28 | access to local variable ssaSink2 | | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:41:21:41:28 | access to local variable ssaSink2 | -| SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | +| SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:20 | access to local variable ssaSink2 | | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | | SSA.cs:38:17:38:26 | [post] access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | @@ -489,15 +603,17 @@ | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 | +| SSA.cs:46:16:46:23 | access to local variable nonSink2 | SSA.cs:46:16:46:28 | SSA def(nonSink2) | | SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | -| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:28 | SSA def(nonSink2) | +| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:23 | access to local variable nonSink2 | | SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | +| SSA.cs:49:13:49:20 | access to local variable nonSink2 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:51:21:51:28 | access to local variable nonSink2 | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:53:21:53:28 | access to local variable nonSink2 | -| SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | +| SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:20 | access to local variable nonSink2 | | SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | | SSA.cs:50:17:50:26 | [post] access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | @@ -508,21 +624,25 @@ | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 | | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | SSA.cs:55:15:55:22 | access to local variable nonSink2 | +| SSA.cs:58:16:58:23 | access to local variable ssaSink3 | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | SSA.cs:59:23:59:30 | access to local variable ssaSink3 | -| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | +| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:23 | access to local variable ssaSink3 | | SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:67:32:67:38 | access to parameter tainted | | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | SSA.cs:60:15:60:22 | access to local variable ssaSink3 | | SSA.cs:59:23:59:30 | [post] access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | | SSA.cs:59:23:59:30 | access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | +| SSA.cs:59:23:59:30 | access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | | SSA.cs:63:23:63:30 | SSA def(nonSink0) | SSA.cs:64:15:64:22 | access to local variable nonSink0 | | SSA.cs:63:23:63:30 | [post] access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | +| SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:67:9:67:12 | [post] this access | SSA.cs:68:23:68:26 | this access | | SSA.cs:67:9:67:12 | this access | SSA.cs:68:23:68:26 | this access | | SSA.cs:67:9:67:14 | [post] access to field S | SSA.cs:68:23:68:28 | access to field S | | SSA.cs:67:9:67:14 | access to field S | SSA.cs:68:23:68:28 | access to field S | +| SSA.cs:67:9:67:28 | access to field SsaFieldSink0 | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | -| SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | +| SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:28 | access to field SsaFieldSink0 | | SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:77:20:77:26 | access to parameter tainted | | SSA.cs:68:23:68:26 | [post] this access | SSA.cs:69:15:69:18 | this access | | SSA.cs:68:23:68:26 | this access | SSA.cs:69:15:69:18 | this access | @@ -530,6 +650,7 @@ | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | SSA.cs:69:15:69:34 | access to field SsaFieldSink0 | | SSA.cs:68:23:68:28 | [post] access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | | SSA.cs:68:23:68:28 | access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | +| SSA.cs:68:23:68:28 | access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | | SSA.cs:69:15:69:18 | [post] this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:18 | this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:20 | [post] access to field S | SSA.cs:72:9:72:14 | access to field S | @@ -538,22 +659,26 @@ | SSA.cs:72:9:72:12 | this access | SSA.cs:73:23:73:26 | this access | | SSA.cs:72:9:72:14 | [post] access to field S | SSA.cs:73:23:73:28 | access to field S | | SSA.cs:72:9:72:14 | access to field S | SSA.cs:73:23:73:28 | access to field S | +| SSA.cs:72:9:72:31 | access to field SsaFieldNonSink0 | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | -| SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:31 | access to field SsaFieldNonSink0 | | SSA.cs:73:23:73:26 | [post] this access | SSA.cs:74:15:74:18 | this access | | SSA.cs:73:23:73:26 | this access | SSA.cs:74:15:74:18 | this access | | SSA.cs:73:23:73:28 | SSA def(this.S) | SSA.cs:74:15:74:20 | access to field S | | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:74:15:74:37 | access to field SsaFieldNonSink0 | | SSA.cs:73:23:73:28 | [post] access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | | SSA.cs:73:23:73:28 | access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | +| SSA.cs:73:23:73:28 | access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | | SSA.cs:74:15:74:18 | [post] this access | SSA.cs:80:9:80:12 | this access | | SSA.cs:74:15:74:18 | this access | SSA.cs:80:9:80:12 | this access | | SSA.cs:74:15:74:20 | [post] access to field S | SSA.cs:80:9:80:14 | access to field S | | SSA.cs:74:15:74:20 | access to field S | SSA.cs:80:9:80:14 | access to field S | +| SSA.cs:77:9:77:16 | access to local variable nonSink0 | SSA.cs:77:9:77:26 | SSA def(nonSink0) | | SSA.cs:77:9:77:26 | SSA def(nonSink0) | SSA.cs:78:21:78:28 | access to local variable nonSink0 | -| SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:26 | SSA def(nonSink0) | +| SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:16 | access to local variable nonSink0 | | SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:80:35:80:41 | access to parameter tainted | | SSA.cs:78:21:78:28 | SSA def(nonSink0) | SSA.cs:79:15:79:22 | access to local variable nonSink0 | +| SSA.cs:78:21:78:28 | access to local variable nonSink0 | SSA.cs:78:21:78:28 | SSA def(nonSink0) | | SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | | SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | | SSA.cs:79:15:79:22 | access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | @@ -562,18 +687,21 @@ | SSA.cs:80:9:80:12 | this access | SSA.cs:81:21:81:24 | this access | | SSA.cs:80:9:80:14 | [post] access to field S | SSA.cs:81:21:81:26 | access to field S | | SSA.cs:80:9:80:14 | access to field S | SSA.cs:81:21:81:26 | access to field S | +| SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:80:9:80:31 | access to field SsaFieldNonSink0 | | SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:83:35:83:41 | access to parameter tainted | | SSA.cs:81:21:81:24 | [post] this access | SSA.cs:82:15:82:18 | this access | | SSA.cs:81:21:81:24 | this access | SSA.cs:82:15:82:18 | this access | | SSA.cs:81:21:81:26 | SSA def(this.S) | SSA.cs:82:15:82:20 | access to field S | | SSA.cs:81:21:81:26 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:82:15:82:37 | access to field SsaFieldNonSink0 | +| SSA.cs:81:21:81:26 | access to field S | SSA.cs:81:21:81:26 | SSA def(this.S) | | SSA.cs:82:15:82:18 | [post] this access | SSA.cs:83:9:83:12 | this access | | SSA.cs:82:15:82:18 | this access | SSA.cs:83:9:83:12 | this access | | SSA.cs:82:15:82:20 | [post] access to field S | SSA.cs:83:9:83:14 | access to field S | | SSA.cs:82:15:82:20 | access to field S | SSA.cs:83:9:83:14 | access to field S | | SSA.cs:83:9:83:12 | [post] this access | SSA.cs:84:9:84:14 | this access | | SSA.cs:83:9:83:12 | this access | SSA.cs:84:9:84:14 | this access | -| SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:83:9:83:31 | access to field SsaFieldNonSink0 | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:31 | access to field SsaFieldNonSink0 | | SSA.cs:84:9:84:14 | SSA call def(this.S) | SSA.cs:85:15:85:20 | access to field S | | SSA.cs:84:9:84:14 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:85:15:85:37 | access to field SsaFieldNonSink0 | | SSA.cs:84:9:84:14 | [post] this access | SSA.cs:85:15:85:18 | this access | @@ -582,15 +710,17 @@ | SSA.cs:85:15:85:18 | this access | SSA.cs:114:9:114:12 | this access | | SSA.cs:85:15:85:20 | [post] access to field S | SSA.cs:114:9:114:14 | access to field S | | SSA.cs:85:15:85:20 | access to field S | SSA.cs:114:9:114:14 | access to field S | +| SSA.cs:88:16:88:23 | access to local variable ssaSink4 | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | -| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | +| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:23 | access to local variable ssaSink4 | | SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | +| SSA.cs:91:13:91:20 | access to local variable ssaSink4 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:93:21:93:28 | access to local variable ssaSink4 | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:95:21:95:28 | access to local variable ssaSink4 | -| SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | +| SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:20 | access to local variable ssaSink4 | | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | | SSA.cs:92:17:92:26 | [post] access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | @@ -604,15 +734,18 @@ | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | SSA.cs:98:15:98:22 | access to local variable ssaSink4 | | SSA.cs:97:23:97:30 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | | SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | +| SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | +| SSA.cs:101:16:101:23 | access to local variable nonSink3 | SSA.cs:101:16:101:28 | SSA def(nonSink3) | | SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) | -| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:28 | SSA def(nonSink3) | +| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:23 | access to local variable nonSink3 | | SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | +| SSA.cs:104:13:104:20 | access to local variable nonSink3 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:106:21:106:28 | access to local variable nonSink3 | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:108:21:108:28 | access to local variable nonSink3 | -| SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | +| SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:20 | access to local variable nonSink3 | | SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | | SSA.cs:105:17:105:26 | [post] access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | @@ -626,6 +759,7 @@ | SSA.cs:110:23:110:30 | SSA def(nonSink3) | SSA.cs:111:15:111:22 | access to local variable nonSink3 | | SSA.cs:110:23:110:30 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | +| SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:114:9:114:12 | [post] this access | SSA.cs:117:13:117:16 | this access | | SSA.cs:114:9:114:12 | [post] this access | SSA.cs:123:23:123:26 | this access | | SSA.cs:114:9:114:12 | this access | SSA.cs:117:13:117:16 | this access | @@ -634,8 +768,9 @@ | SSA.cs:114:9:114:14 | [post] access to field S | SSA.cs:123:9:123:30 | SSA phi read(this.S) | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:117:13:117:18 | access to field S | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:123:9:123:30 | SSA phi read(this.S) | +| SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) | -| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | | SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | | SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | @@ -648,9 +783,10 @@ | SSA.cs:117:13:117:18 | [post] access to field S | SSA.cs:121:21:121:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:119:21:119:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:121:21:121:26 | access to field S | +| SSA.cs:117:13:117:32 | access to field SsaFieldSink1 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | -| SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:32 | access to field SsaFieldSink1 | | SSA.cs:118:17:118:26 | [post] access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:119:21:119:24 | [post] this access | SSA.cs:123:23:123:26 | this access | @@ -674,6 +810,7 @@ | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) | SSA.cs:124:15:124:34 | access to field SsaFieldSink1 | | SSA.cs:123:23:123:28 | [post] access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | | SSA.cs:123:23:123:28 | access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | +| SSA.cs:123:23:123:28 | access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | | SSA.cs:124:15:124:18 | [post] this access | SSA.cs:127:9:127:12 | this access | | SSA.cs:124:15:124:18 | this access | SSA.cs:127:9:127:12 | this access | | SSA.cs:124:15:124:20 | [post] access to field S | SSA.cs:127:9:127:14 | access to field S | @@ -686,8 +823,9 @@ | SSA.cs:127:9:127:14 | [post] access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:130:13:130:18 | access to field S | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | +| SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) | -| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | | SSA.cs:128:13:128:22 | [post] access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:128:13:128:22 | access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:130:13:130:16 | [post] this access | SSA.cs:132:21:132:24 | this access | @@ -698,9 +836,10 @@ | SSA.cs:130:13:130:18 | [post] access to field S | SSA.cs:134:21:134:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:132:21:132:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:134:21:134:26 | access to field S | +| SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 | -| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 | | SSA.cs:132:21:132:24 | [post] this access | SSA.cs:136:23:136:26 | this access | | SSA.cs:132:21:132:24 | this access | SSA.cs:136:23:136:26 | this access | | SSA.cs:132:21:132:26 | [post] access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | @@ -721,29 +860,38 @@ | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:137:15:137:37 | access to field SsaFieldNonSink0 | | SSA.cs:136:23:136:28 | [post] access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | | SSA.cs:136:23:136:28 | access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | +| SSA.cs:136:23:136:28 | access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | | SSA.cs:144:34:144:34 | t | SSA.cs:146:13:146:13 | access to parameter t | | SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:146:13:146:13 | (...) ... | | SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:149:17:149:17 | access to parameter t | +| SSA.cs:147:13:147:13 | access to parameter t | SSA.cs:147:13:147:26 | SSA def(t) | | SSA.cs:147:13:147:26 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) | -| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:26 | SSA def(t) | +| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:13 | access to parameter t | +| SSA.cs:149:13:149:13 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) | | SSA.cs:149:13:149:17 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) | -| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) | +| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:13 | access to parameter t | | SSA.cs:152:36:152:36 | t | SSA.cs:154:13:154:13 | access to parameter t | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:152:17:152:28 | SSA phi(t) | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:154:13:154:13 | (...) ... | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:155:25:155:25 | access to parameter t | | SSA.cs:155:25:155:25 | SSA def(t) | SSA.cs:152:17:152:28 | SSA phi(t) | +| SSA.cs:155:25:155:25 | access to parameter t | SSA.cs:155:25:155:25 | SSA def(t) | | SSA.cs:166:10:166:13 | this | SSA.cs:166:19:166:22 | this access | +| SSA.cs:166:28:166:31 | null | SSA.cs:166:19:166:24 | access to field S | | SSA.cs:168:22:168:28 | tainted | SSA.cs:173:24:173:30 | access to parameter tainted | | SSA.cs:168:35:168:35 | i | SSA.cs:171:13:171:13 | access to parameter i | +| SSA.cs:170:16:170:23 | access to local variable ssaSink5 | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | -| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | +| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:23 | access to local variable ssaSink5 | +| SSA.cs:171:13:171:13 | access to parameter i | SSA.cs:171:13:171:15 | SSA def(i) | | SSA.cs:171:13:171:15 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | +| SSA.cs:173:13:173:20 | access to local variable ssaSink5 | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | -| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | +| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:20 | access to local variable ssaSink5 | | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | | SSA.cs:174:20:174:20 | SSA phi(i) | SSA.cs:174:20:174:20 | access to parameter i | +| SSA.cs:174:20:174:20 | access to parameter i | SSA.cs:174:20:174:22 | SSA def(i) | | SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | | SSA.cs:176:21:176:28 | [post] access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | @@ -752,9 +900,10 @@ | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 | | Splitting.cs:3:18:3:18 | b | Splitting.cs:6:13:6:13 | access to parameter b | | Splitting.cs:3:28:3:34 | tainted | Splitting.cs:5:17:5:23 | access to parameter tainted | +| Splitting.cs:5:13:5:13 | access to local variable x | Splitting.cs:5:13:5:23 | SSA def(x) | | Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | | Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:12:15:12:15 | [b (line 3): false] access to local variable x | -| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:23 | SSA def(x) | +| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:13 | access to local variable x | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): false] access to parameter b | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): true] access to parameter b | | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | @@ -763,24 +912,30 @@ | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:12:15:12:15 | [post] [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:17:18:17:18 | b | Splitting.cs:20:13:20:13 | access to parameter b | +| Splitting.cs:19:13:19:13 | access to local variable x | Splitting.cs:19:13:19:18 | SSA def(x) | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | [b (line 17): true] access to local variable x | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | -| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:18 | SSA def(x) | +| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:13 | access to local variable x | | Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): false] access to parameter b | | Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): true] access to parameter b | +| Splitting.cs:23:13:23:13 | access to local variable x | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | -| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | +| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:13 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [post] [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [post] [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:32:18:32:18 | b | Splitting.cs:35:13:35:13 | access to parameter b | +| Splitting.cs:34:17:34:18 | "" | Splitting.cs:34:13:34:13 | access to local variable x | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b | +| Splitting.cs:36:17:36:19 | [b (line 32): true] "a" | Splitting.cs:36:13:36:13 | access to local variable x | +| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | +| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | -| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | -| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | +| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:9 | access to local variable x | +| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:9 | access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | | Splitting.cs:38:15:38:15 | [post] [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | @@ -793,47 +948,68 @@ | Splitting.cs:39:23:39:25 | [b (line 32): false] "c" | Splitting.cs:39:15:39:25 | [b (line 32): false] ... ? ... : ... | | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): false] (...) ... | | Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): true] (...) ... | +| Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:15 | access to local variable x | | Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:21 | [b (line 32): false] ... = ... | +| Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:15 | access to local variable x | | Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:21 | [b (line 32): true] ... = ... | | Splitting.cs:46:18:46:18 | b | Splitting.cs:49:13:49:13 | access to parameter b | +| Splitting.cs:48:13:48:13 | access to local variable x | Splitting.cs:48:13:48:18 | SSA def(x) | | Splitting.cs:48:13:48:18 | SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): false] access to local variable x | -| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:18 | SSA def(x) | +| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:13 | access to local variable x | | Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): false] access to parameter b | | Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): true] access to parameter b | +| Splitting.cs:50:13:50:13 | access to local variable x | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): true] access to local variable x | -| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | +| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:13 | access to local variable x | +| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | +| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y | | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y | -| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | -| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | +| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y | +| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y | | Splitting.cs:51:30:51:36 | [b (line 46): false] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | | Splitting.cs:51:30:51:36 | [b (line 46): true] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | | Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | | Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | | Splitting.cs:52:9:52:9 | [post] [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | | Splitting.cs:52:9:52:9 | [post] [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | +| Splitting.cs:52:16:52:18 | [b (line 46): false] "b" | Splitting.cs:52:9:52:12 | access to array element | +| Splitting.cs:52:16:52:18 | [b (line 46): true] "b" | Splitting.cs:52:9:52:12 | access to array element | +| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | +| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | -| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | -| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | +| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x | +| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x | | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | +| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | +| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): false] access to local variable z | | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): true] access to local variable z | | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): false] access to local variable x | | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): true] access to local variable x | -| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | -| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | +| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z | +| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z | +| Splitting.cs:55:13:55:14 | [b (line 46): false] !... | Splitting.cs:55:9:55:9 | access to local variable z | +| Splitting.cs:55:13:55:14 | [b (line 46): true] !... | Splitting.cs:55:9:55:9 | access to local variable z | +| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | +| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): false] access to local variable x | | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): true] access to local variable x | -| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | -| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | +| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:9 | access to local variable x | +| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:9 | access to local variable x | +| Splitting.cs:57:13:57:24 | [b (line 46): false] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x | +| Splitting.cs:57:13:57:24 | [b (line 46): true] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x | | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): false] access to local variable y | | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): true] access to local variable y | +| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | +| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): false] access to local variable s | | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): true] access to local variable s | | UseUseExplosion.cs:21:10:21:10 | SSA entry def(this.Prop) | UseUseExplosion.cs:24:13:24:16 | access to property Prop | | UseUseExplosion.cs:21:10:21:10 | this | UseUseExplosion.cs:24:13:24:16 | this access | +| UseUseExplosion.cs:23:13:23:13 | access to local variable x | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1712:24:1712 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1727:24:1727 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1742:24:1742 | access to local variable x | @@ -935,7 +1111,7 @@ | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:3182:24:3182 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:3197:24:3197 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | -| UseUseExplosion.cs:23:17:23:17 | 0 | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | +| UseUseExplosion.cs:23:17:23:17 | 0 | UseUseExplosion.cs:23:13:23:13 | access to local variable x | | UseUseExplosion.cs:24:13:24:16 | [post] this access | UseUseExplosion.cs:24:31:24:34 | this access | | UseUseExplosion.cs:24:13:24:16 | [post] this access | UseUseExplosion.cs:24:3193:24:3198 | this access | | UseUseExplosion.cs:24:13:24:16 | access to property Prop | UseUseExplosion.cs:24:31:24:34 | access to property Prop | diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected index dc8cdffaa36..6782695246e 100644 --- a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected @@ -1,5 +1,6 @@ | Capture.cs:5:17:5:17 | this | Capture.cs:13:9:13:14 | this access | -| Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:17 | SSA def(i) | +| Capture.cs:7:13:7:13 | access to local variable i | Capture.cs:7:13:7:17 | SSA def(i) | +| Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:13 | access to local variable i | | Capture.cs:9:9:12:9 | SSA capture def(i) | Capture.cs:11:17:11:17 | access to local variable i | | Capture.cs:13:9:13:14 | this access | Capture.cs:23:9:23:14 | this access | | Capture.cs:15:9:22:9 | this | Capture.cs:21:13:21:18 | this access | @@ -7,123 +8,148 @@ | Capture.cs:23:9:23:14 | this access | Capture.cs:34:9:34:14 | this access | | Capture.cs:25:9:33:9 | this | Capture.cs:32:13:32:18 | this access | | Capture.cs:27:13:30:13 | SSA capture def(i) | Capture.cs:29:21:29:21 | access to local variable i | -| Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:17 | SSA def(i) | +| Capture.cs:31:13:31:13 | access to local variable i | Capture.cs:31:13:31:17 | SSA def(i) | +| Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:13 | access to local variable i | | Capture.cs:34:9:34:14 | this access | Capture.cs:40:9:40:15 | this access | -| Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:17 | SSA def(i) | +| Capture.cs:38:13:38:13 | access to local variable i | Capture.cs:38:13:38:17 | SSA def(i) | +| Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:13 | access to local variable i | | Capture.cs:40:9:40:15 | this access | Capture.cs:51:9:51:15 | this access | | Capture.cs:40:9:40:17 | SSA call def(i) | Capture.cs:41:13:41:13 | access to local variable i | | Capture.cs:43:9:50:9 | this | Capture.cs:49:13:49:19 | this access | -| Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:21 | SSA def(i) | +| Capture.cs:47:17:47:17 | access to local variable i | Capture.cs:47:17:47:21 | SSA def(i) | +| Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:17 | access to local variable i | | Capture.cs:51:9:51:15 | this access | Capture.cs:63:9:63:15 | this access | | Capture.cs:51:9:51:17 | SSA call def(i) | Capture.cs:52:13:52:13 | access to local variable i | | Capture.cs:54:9:62:9 | this | Capture.cs:60:13:60:19 | this access | -| Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:21 | SSA def(i) | -| Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:17 | SSA def(i) | +| Capture.cs:58:17:58:17 | access to local variable i | Capture.cs:58:17:58:21 | SSA def(i) | +| Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:17 | access to local variable i | +| Capture.cs:61:13:61:13 | access to local variable i | Capture.cs:61:13:61:17 | SSA def(i) | +| Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:13 | access to local variable i | | Capture.cs:63:9:63:17 | SSA call def(i) | Capture.cs:64:13:64:13 | access to local variable i | | LocalDataFlow.cs:48:24:48:24 | b | LocalDataFlow.cs:84:21:84:21 | access to parameter b | +| LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | -| LocalDataFlow.cs:51:21:51:34 | "taint source" | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | +| LocalDataFlow.cs:51:21:51:34 | "taint source" | LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | | LocalDataFlow.cs:52:15:52:19 | [post] access to local variable sink0 | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | +| LocalDataFlow.cs:55:13:55:20 | access to local variable nonSink0 | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | LocalDataFlow.cs:56:15:56:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:55:24:55:25 | "" | LocalDataFlow.cs:55:13:55:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:55:24:55:25 | "" | LocalDataFlow.cs:55:13:55:20 | access to local variable nonSink0 | | LocalDataFlow.cs:56:15:56:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:56:15:56:22 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | -| LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | +| LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | ... + ... | -| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | +| LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | +| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:60:9:60:22 | ... + ... | | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | | LocalDataFlow.cs:61:15:61:19 | [post] access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | ... + ... | -| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | | LocalDataFlow.cs:64:21:64:25 | "abc" | LocalDataFlow.cs:64:9:64:25 | ... + ... | | LocalDataFlow.cs:65:15:65:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:68:13:68:17 | access to local variable sink5 | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | LocalDataFlow.cs:69:15:69:19 | access to local variable sink5 | | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | LocalDataFlow.cs:68:21:68:32 | ... + ... | | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | LocalDataFlow.cs:168:33:168:37 | access to local variable sink1 | -| LocalDataFlow.cs:68:21:68:32 | ... + ... | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | +| LocalDataFlow.cs:68:21:68:32 | ... + ... | LocalDataFlow.cs:68:13:68:17 | access to local variable sink5 | | LocalDataFlow.cs:68:29:68:32 | "ok" | LocalDataFlow.cs:68:21:68:32 | ... + ... | | LocalDataFlow.cs:69:15:69:19 | [post] access to local variable sink5 | LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | | LocalDataFlow.cs:69:15:69:19 | access to local variable sink5 | LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | +| LocalDataFlow.cs:72:9:72:16 | access to local variable nonSink0 | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | LocalDataFlow.cs:73:15:73:22 | access to local variable nonSink0 | | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:36 | ... + ... | -| LocalDataFlow.cs:72:20:72:36 | ... + ... | LocalDataFlow.cs:72:9:72:36 | SSA def(nonSink0) | +| LocalDataFlow.cs:72:20:72:36 | ... + ... | LocalDataFlow.cs:72:9:72:16 | access to local variable nonSink0 | | LocalDataFlow.cs:72:31:72:36 | "test" | LocalDataFlow.cs:72:20:72:36 | ... + ... | | LocalDataFlow.cs:73:15:73:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | | LocalDataFlow.cs:73:15:73:22 | access to local variable nonSink0 | LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | +| LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | -| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | +| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | | LocalDataFlow.cs:77:15:77:19 | [post] access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | +| LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | LocalDataFlow.cs:81:15:81:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | +| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | +| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | | LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): false] access to parameter b | | LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): true] access to parameter b | -| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | -| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | +| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | +| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | | LocalDataFlow.cs:84:25:84:27 | [b (line 48): true] "a" | LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | | LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | +| LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | +| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 | | LocalDataFlow.cs:88:24:88:28 | "abc" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | | LocalDataFlow.cs:88:32:88:36 | "def" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | | LocalDataFlow.cs:89:15:89:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | LocalDataFlow.cs:93:15:93:19 | access to local variable sink8 | -| LocalDataFlow.cs:92:21:92:33 | (...) ... | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) | +| LocalDataFlow.cs:92:21:92:33 | (...) ... | LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 | LocalDataFlow.cs:92:21:92:33 | (...) ... | | LocalDataFlow.cs:93:15:93:19 | [post] access to local variable sink8 | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | | LocalDataFlow.cs:93:15:93:19 | access to local variable sink8 | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | +| LocalDataFlow.cs:96:13:96:20 | access to local variable nonSink3 | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | LocalDataFlow.cs:97:15:97:22 | access to local variable nonSink3 | -| LocalDataFlow.cs:96:24:96:39 | (...) ... | LocalDataFlow.cs:96:13:96:39 | SSA def(nonSink3) | +| LocalDataFlow.cs:96:24:96:39 | (...) ... | LocalDataFlow.cs:96:13:96:20 | access to local variable nonSink3 | | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | LocalDataFlow.cs:96:24:96:39 | (...) ... | | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:100:13:100:17 | access to local variable sink9 | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | LocalDataFlow.cs:101:15:101:19 | access to local variable sink9 | | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | LocalDataFlow.cs:100:21:100:35 | ... as ... | | LocalDataFlow.cs:100:21:100:25 | access to local variable sink8 | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | -| LocalDataFlow.cs:100:21:100:35 | ... as ... | LocalDataFlow.cs:100:13:100:35 | SSA def(sink9) | +| LocalDataFlow.cs:100:21:100:35 | ... as ... | LocalDataFlow.cs:100:13:100:17 | access to local variable sink9 | | LocalDataFlow.cs:101:15:101:19 | [post] access to local variable sink9 | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | | LocalDataFlow.cs:101:15:101:19 | access to local variable sink9 | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | +| LocalDataFlow.cs:104:9:104:16 | access to local variable nonSink3 | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | LocalDataFlow.cs:105:15:105:22 | access to local variable nonSink3 | | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | LocalDataFlow.cs:104:20:104:37 | ... as ... | | LocalDataFlow.cs:104:20:104:27 | access to local variable nonSink0 | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | -| LocalDataFlow.cs:104:20:104:37 | ... as ... | LocalDataFlow.cs:104:9:104:37 | SSA def(nonSink3) | +| LocalDataFlow.cs:104:20:104:37 | ... as ... | LocalDataFlow.cs:104:9:104:16 | access to local variable nonSink3 | | LocalDataFlow.cs:105:15:105:22 | [post] access to local variable nonSink3 | LocalDataFlow.cs:170:33:170:40 | access to local variable nonSink3 | | LocalDataFlow.cs:105:15:105:22 | access to local variable nonSink3 | LocalDataFlow.cs:170:33:170:40 | access to local variable nonSink3 | +| LocalDataFlow.cs:108:13:108:18 | access to local variable sink15 | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | LocalDataFlow.cs:109:15:109:20 | access to local variable sink15 | -| LocalDataFlow.cs:108:22:108:39 | call to method Parse | LocalDataFlow.cs:108:13:108:39 | SSA def(sink15) | +| LocalDataFlow.cs:108:22:108:39 | call to method Parse | LocalDataFlow.cs:108:13:108:18 | access to local variable sink15 | | LocalDataFlow.cs:108:34:108:38 | [post] access to local variable sink9 | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | LocalDataFlow.cs:108:22:108:39 | call to method Parse | | LocalDataFlow.cs:108:34:108:38 | access to local variable sink9 | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | | LocalDataFlow.cs:109:15:109:20 | access to local variable sink15 | LocalDataFlow.cs:160:22:160:27 | access to local variable sink15 | +| LocalDataFlow.cs:111:13:111:18 | access to local variable sink16 | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | LocalDataFlow.cs:112:15:112:20 | access to local variable sink16 | -| LocalDataFlow.cs:111:22:111:56 | call to method TryParse | LocalDataFlow.cs:111:13:111:56 | SSA def(sink16) | +| LocalDataFlow.cs:111:22:111:56 | call to method TryParse | LocalDataFlow.cs:111:13:111:18 | access to local variable sink16 | | LocalDataFlow.cs:111:37:111:41 | [post] access to local variable sink9 | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | LocalDataFlow.cs:111:22:111:56 | call to method TryParse | | LocalDataFlow.cs:111:37:111:41 | access to local variable sink9 | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | +| LocalDataFlow.cs:113:13:113:18 | access to local variable sink17 | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | LocalDataFlow.cs:114:15:114:20 | access to local variable sink17 | | LocalDataFlow.cs:113:22:113:29 | [post] access to local variable nonSink0 | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | LocalDataFlow.cs:113:22:113:49 | call to method Replace | | LocalDataFlow.cs:113:22:113:29 | access to local variable nonSink0 | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | -| LocalDataFlow.cs:113:22:113:49 | call to method Replace | LocalDataFlow.cs:113:13:113:49 | SSA def(sink17) | +| LocalDataFlow.cs:113:22:113:49 | call to method Replace | LocalDataFlow.cs:113:13:113:18 | access to local variable sink17 | | LocalDataFlow.cs:113:44:113:48 | [post] access to local variable sink9 | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | LocalDataFlow.cs:113:22:113:49 | call to method Replace | | LocalDataFlow.cs:113:44:113:48 | access to local variable sink9 | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | +| LocalDataFlow.cs:115:13:115:18 | access to local variable sink18 | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | LocalDataFlow.cs:116:15:116:20 | access to local variable sink18 | -| LocalDataFlow.cs:115:22:115:51 | call to method Format | LocalDataFlow.cs:115:13:115:51 | SSA def(sink18) | +| LocalDataFlow.cs:115:22:115:51 | call to method Format | LocalDataFlow.cs:115:13:115:18 | access to local variable sink18 | | LocalDataFlow.cs:115:36:115:43 | [post] access to local variable nonSink0 | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | LocalDataFlow.cs:115:22:115:51 | call to method Format | | LocalDataFlow.cs:115:36:115:43 | access to local variable nonSink0 | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | @@ -132,41 +158,48 @@ | LocalDataFlow.cs:115:46:115:50 | access to local variable sink9 | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | | LocalDataFlow.cs:116:15:116:20 | [post] access to local variable sink18 | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | | LocalDataFlow.cs:116:15:116:20 | access to local variable sink18 | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | +| LocalDataFlow.cs:117:13:117:18 | access to local variable sink19 | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | LocalDataFlow.cs:118:15:118:20 | access to local variable sink19 | -| LocalDataFlow.cs:117:22:117:52 | call to method Format | LocalDataFlow.cs:117:13:117:52 | SSA def(sink19) | +| LocalDataFlow.cs:117:22:117:52 | call to method Format | LocalDataFlow.cs:117:13:117:18 | access to local variable sink19 | | LocalDataFlow.cs:117:36:117:41 | access to local variable sink18 | LocalDataFlow.cs:117:22:117:52 | call to method Format | | LocalDataFlow.cs:117:44:117:51 | [post] access to local variable nonSink0 | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | LocalDataFlow.cs:117:22:117:52 | call to method Format | | LocalDataFlow.cs:117:44:117:51 | access to local variable nonSink0 | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:119:13:119:18 | access to local variable sink45 | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | LocalDataFlow.cs:120:15:120:20 | access to local variable sink45 | -| LocalDataFlow.cs:119:22:119:38 | call to method Parse | LocalDataFlow.cs:119:13:119:38 | SSA def(sink45) | +| LocalDataFlow.cs:119:22:119:38 | call to method Parse | LocalDataFlow.cs:119:13:119:18 | access to local variable sink45 | | LocalDataFlow.cs:119:33:119:37 | [post] access to local variable sink9 | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | LocalDataFlow.cs:119:22:119:38 | call to method Parse | | LocalDataFlow.cs:119:33:119:37 | access to local variable sink9 | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | +| LocalDataFlow.cs:122:13:122:18 | access to local variable sink46 | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | LocalDataFlow.cs:123:15:123:20 | access to local variable sink46 | -| LocalDataFlow.cs:122:22:122:56 | call to method TryParse | LocalDataFlow.cs:122:13:122:56 | SSA def(sink46) | +| LocalDataFlow.cs:122:22:122:56 | call to method TryParse | LocalDataFlow.cs:122:13:122:18 | access to local variable sink46 | | LocalDataFlow.cs:122:36:122:40 | [post] access to local variable sink9 | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | LocalDataFlow.cs:122:22:122:56 | call to method TryParse | | LocalDataFlow.cs:122:36:122:40 | access to local variable sink9 | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | | LocalDataFlow.cs:123:15:123:20 | access to local variable sink46 | LocalDataFlow.cs:124:37:124:42 | access to local variable sink46 | +| LocalDataFlow.cs:124:13:124:18 | access to local variable sink47 | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | LocalDataFlow.cs:125:15:125:20 | access to local variable sink47 | -| LocalDataFlow.cs:124:22:124:43 | call to method ToByte | LocalDataFlow.cs:124:13:124:43 | SSA def(sink47) | +| LocalDataFlow.cs:124:22:124:43 | call to method ToByte | LocalDataFlow.cs:124:13:124:18 | access to local variable sink47 | | LocalDataFlow.cs:124:37:124:42 | access to local variable sink46 | LocalDataFlow.cs:124:22:124:43 | call to method ToByte | | LocalDataFlow.cs:125:15:125:20 | access to local variable sink47 | LocalDataFlow.cs:126:40:126:45 | access to local variable sink47 | +| LocalDataFlow.cs:126:13:126:18 | access to local variable sink49 | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | LocalDataFlow.cs:127:15:127:20 | access to local variable sink49 | -| LocalDataFlow.cs:126:22:126:46 | call to method Concat | LocalDataFlow.cs:126:13:126:46 | SSA def(sink49) | +| LocalDataFlow.cs:126:22:126:46 | call to method Concat | LocalDataFlow.cs:126:13:126:18 | access to local variable sink49 | | LocalDataFlow.cs:126:36:126:37 | "" | LocalDataFlow.cs:126:22:126:46 | call to method Concat | | LocalDataFlow.cs:126:40:126:45 | (...) ... | LocalDataFlow.cs:126:22:126:46 | call to method Concat | | LocalDataFlow.cs:126:40:126:45 | access to local variable sink47 | LocalDataFlow.cs:126:40:126:45 | (...) ... | | LocalDataFlow.cs:127:15:127:20 | [post] access to local variable sink49 | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | | LocalDataFlow.cs:127:15:127:20 | access to local variable sink49 | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | +| LocalDataFlow.cs:128:13:128:18 | access to local variable sink50 | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | LocalDataFlow.cs:129:15:129:20 | access to local variable sink50 | -| LocalDataFlow.cs:128:22:128:40 | call to method Copy | LocalDataFlow.cs:128:13:128:40 | SSA def(sink50) | +| LocalDataFlow.cs:128:22:128:40 | call to method Copy | LocalDataFlow.cs:128:13:128:18 | access to local variable sink50 | | LocalDataFlow.cs:128:34:128:39 | access to local variable sink49 | LocalDataFlow.cs:128:22:128:40 | call to method Copy | | LocalDataFlow.cs:129:15:129:20 | [post] access to local variable sink50 | LocalDataFlow.cs:130:59:130:64 | access to local variable sink50 | | LocalDataFlow.cs:129:15:129:20 | access to local variable sink50 | LocalDataFlow.cs:130:59:130:64 | access to local variable sink50 | +| LocalDataFlow.cs:130:13:130:18 | access to local variable sink51 | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | LocalDataFlow.cs:131:15:131:20 | access to local variable sink51 | -| LocalDataFlow.cs:130:22:130:71 | call to method Join | LocalDataFlow.cs:130:13:130:71 | SSA def(sink51) | +| LocalDataFlow.cs:130:22:130:71 | call to method Join | LocalDataFlow.cs:130:13:130:18 | access to local variable sink51 | | LocalDataFlow.cs:130:34:130:37 | ", " | LocalDataFlow.cs:130:22:130:71 | call to method Join | | LocalDataFlow.cs:130:40:130:70 | array creation of type String[] | LocalDataFlow.cs:130:22:130:71 | call to method Join | | LocalDataFlow.cs:130:53:130:70 | { ..., ... } | LocalDataFlow.cs:130:40:130:70 | array creation of type String[] | @@ -175,63 +208,74 @@ | LocalDataFlow.cs:130:67:130:68 | "" | LocalDataFlow.cs:130:53:130:70 | { ..., ... } | | LocalDataFlow.cs:131:15:131:20 | [post] access to local variable sink51 | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | | LocalDataFlow.cs:131:15:131:20 | access to local variable sink51 | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | +| LocalDataFlow.cs:132:13:132:18 | access to local variable sink52 | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | LocalDataFlow.cs:133:15:133:20 | access to local variable sink52 | | LocalDataFlow.cs:132:22:132:23 | "" | LocalDataFlow.cs:132:22:132:41 | call to method Insert | -| LocalDataFlow.cs:132:22:132:41 | call to method Insert | LocalDataFlow.cs:132:13:132:41 | SSA def(sink52) | +| LocalDataFlow.cs:132:22:132:41 | call to method Insert | LocalDataFlow.cs:132:13:132:18 | access to local variable sink52 | | LocalDataFlow.cs:132:35:132:40 | access to local variable sink51 | LocalDataFlow.cs:132:22:132:41 | call to method Insert | +| LocalDataFlow.cs:136:9:136:16 | access to local variable nonSink2 | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | LocalDataFlow.cs:137:15:137:22 | access to local variable nonSink2 | -| LocalDataFlow.cs:136:20:136:40 | call to method Parse | LocalDataFlow.cs:136:9:136:40 | SSA def(nonSink2) | +| LocalDataFlow.cs:136:20:136:40 | call to method Parse | LocalDataFlow.cs:136:9:136:16 | access to local variable nonSink2 | | LocalDataFlow.cs:136:32:136:39 | [post] access to local variable nonSink0 | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | LocalDataFlow.cs:136:20:136:40 | call to method Parse | | LocalDataFlow.cs:136:32:136:39 | access to local variable nonSink0 | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | +| LocalDataFlow.cs:138:13:138:20 | access to local variable nonSink7 | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | LocalDataFlow.cs:139:15:139:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:138:24:138:61 | call to method TryParse | LocalDataFlow.cs:138:13:138:61 | SSA def(nonSink7) | +| LocalDataFlow.cs:138:24:138:61 | call to method TryParse | LocalDataFlow.cs:138:13:138:20 | access to local variable nonSink7 | | LocalDataFlow.cs:138:39:138:46 | [post] access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | LocalDataFlow.cs:138:24:138:61 | call to method TryParse | | LocalDataFlow.cs:138:39:138:46 | access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:140:9:140:16 | access to local variable nonSink0 | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink0 | | LocalDataFlow.cs:140:20:140:27 | [post] access to local variable nonSink0 | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:50 | call to method Replace | | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink0 | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | -| LocalDataFlow.cs:140:20:140:50 | call to method Replace | LocalDataFlow.cs:140:9:140:50 | SSA def(nonSink0) | +| LocalDataFlow.cs:140:20:140:50 | call to method Replace | LocalDataFlow.cs:140:9:140:16 | access to local variable nonSink0 | | LocalDataFlow.cs:140:42:140:49 | access to local variable nonSink0 | LocalDataFlow.cs:140:20:140:50 | call to method Replace | | LocalDataFlow.cs:141:15:141:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink0 | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | +| LocalDataFlow.cs:142:9:142:16 | access to local variable nonSink0 | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | LocalDataFlow.cs:143:15:143:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:142:20:142:52 | call to method Format | LocalDataFlow.cs:142:9:142:52 | SSA def(nonSink0) | +| LocalDataFlow.cs:142:20:142:52 | call to method Format | LocalDataFlow.cs:142:9:142:16 | access to local variable nonSink0 | | LocalDataFlow.cs:142:34:142:41 | [post] access to local variable nonSink0 | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | LocalDataFlow.cs:142:20:142:52 | call to method Format | | LocalDataFlow.cs:142:34:142:41 | access to local variable nonSink0 | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | | LocalDataFlow.cs:142:44:142:51 | access to local variable nonSink0 | LocalDataFlow.cs:142:20:142:52 | call to method Format | | LocalDataFlow.cs:143:15:143:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | | LocalDataFlow.cs:143:15:143:22 | access to local variable nonSink0 | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | +| LocalDataFlow.cs:144:9:144:16 | access to local variable nonSink7 | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | LocalDataFlow.cs:145:15:145:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:144:20:144:39 | call to method Parse | LocalDataFlow.cs:144:9:144:39 | SSA def(nonSink7) | +| LocalDataFlow.cs:144:20:144:39 | call to method Parse | LocalDataFlow.cs:144:9:144:16 | access to local variable nonSink7 | | LocalDataFlow.cs:144:31:144:38 | [post] access to local variable nonSink0 | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | LocalDataFlow.cs:144:20:144:39 | call to method Parse | | LocalDataFlow.cs:144:31:144:38 | access to local variable nonSink0 | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | +| LocalDataFlow.cs:146:9:146:16 | access to local variable nonSink7 | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | LocalDataFlow.cs:147:15:147:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:146:20:146:57 | call to method TryParse | LocalDataFlow.cs:146:9:146:57 | SSA def(nonSink7) | +| LocalDataFlow.cs:146:20:146:57 | call to method TryParse | LocalDataFlow.cs:146:9:146:16 | access to local variable nonSink7 | | LocalDataFlow.cs:146:34:146:41 | access to local variable nonSink0 | LocalDataFlow.cs:146:20:146:57 | call to method TryParse | | LocalDataFlow.cs:147:15:147:22 | access to local variable nonSink7 | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | +| LocalDataFlow.cs:148:13:148:21 | access to local variable nonSink14 | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | LocalDataFlow.cs:149:15:149:23 | access to local variable nonSink14 | -| LocalDataFlow.cs:148:25:148:48 | call to method ToByte | LocalDataFlow.cs:148:13:148:48 | SSA def(nonSink14) | +| LocalDataFlow.cs:148:25:148:48 | call to method ToByte | LocalDataFlow.cs:148:13:148:21 | access to local variable nonSink14 | | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | LocalDataFlow.cs:148:25:148:48 | call to method ToByte | | LocalDataFlow.cs:148:40:148:47 | access to local variable nonSink7 | LocalDataFlow.cs:150:38:150:45 | access to local variable nonSink7 | +| LocalDataFlow.cs:150:9:150:16 | access to local variable nonSink0 | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | LocalDataFlow.cs:151:15:151:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:150:20:150:46 | call to method Concat | LocalDataFlow.cs:150:9:150:46 | SSA def(nonSink0) | +| LocalDataFlow.cs:150:20:150:46 | call to method Concat | LocalDataFlow.cs:150:9:150:16 | access to local variable nonSink0 | | LocalDataFlow.cs:150:34:150:35 | "" | LocalDataFlow.cs:150:20:150:46 | call to method Concat | | LocalDataFlow.cs:150:38:150:45 | (...) ... | LocalDataFlow.cs:150:20:150:46 | call to method Concat | | LocalDataFlow.cs:150:38:150:45 | access to local variable nonSink7 | LocalDataFlow.cs:150:38:150:45 | (...) ... | | LocalDataFlow.cs:151:15:151:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | | LocalDataFlow.cs:151:15:151:22 | access to local variable nonSink0 | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | +| LocalDataFlow.cs:152:9:152:16 | access to local variable nonSink0 | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | LocalDataFlow.cs:153:15:153:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:152:20:152:40 | call to method Copy | LocalDataFlow.cs:152:9:152:40 | SSA def(nonSink0) | +| LocalDataFlow.cs:152:20:152:40 | call to method Copy | LocalDataFlow.cs:152:9:152:16 | access to local variable nonSink0 | | LocalDataFlow.cs:152:32:152:39 | access to local variable nonSink0 | LocalDataFlow.cs:152:20:152:40 | call to method Copy | | LocalDataFlow.cs:153:15:153:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:154:57:154:64 | access to local variable nonSink0 | | LocalDataFlow.cs:153:15:153:22 | access to local variable nonSink0 | LocalDataFlow.cs:154:57:154:64 | access to local variable nonSink0 | +| LocalDataFlow.cs:154:9:154:16 | access to local variable nonSink0 | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | LocalDataFlow.cs:155:15:155:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:154:20:154:71 | call to method Join | LocalDataFlow.cs:154:9:154:71 | SSA def(nonSink0) | +| LocalDataFlow.cs:154:20:154:71 | call to method Join | LocalDataFlow.cs:154:9:154:16 | access to local variable nonSink0 | | LocalDataFlow.cs:154:32:154:35 | ", " | LocalDataFlow.cs:154:20:154:71 | call to method Join | | LocalDataFlow.cs:154:38:154:70 | array creation of type String[] | LocalDataFlow.cs:154:20:154:71 | call to method Join | | LocalDataFlow.cs:154:51:154:70 | { ..., ... } | LocalDataFlow.cs:154:38:154:70 | array creation of type String[] | @@ -240,116 +284,139 @@ | LocalDataFlow.cs:154:67:154:68 | "" | LocalDataFlow.cs:154:51:154:70 | { ..., ... } | | LocalDataFlow.cs:155:15:155:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | | LocalDataFlow.cs:155:15:155:22 | access to local variable nonSink0 | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | +| LocalDataFlow.cs:156:9:156:16 | access to local variable nonSink0 | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | LocalDataFlow.cs:157:15:157:22 | access to local variable nonSink0 | | LocalDataFlow.cs:156:20:156:21 | "" | LocalDataFlow.cs:156:20:156:41 | call to method Insert | -| LocalDataFlow.cs:156:20:156:41 | call to method Insert | LocalDataFlow.cs:156:9:156:41 | SSA def(nonSink0) | +| LocalDataFlow.cs:156:20:156:41 | call to method Insert | LocalDataFlow.cs:156:9:156:16 | access to local variable nonSink0 | | LocalDataFlow.cs:156:33:156:40 | access to local variable nonSink0 | LocalDataFlow.cs:156:20:156:41 | call to method Insert | | LocalDataFlow.cs:157:15:157:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | | LocalDataFlow.cs:157:15:157:22 | access to local variable nonSink0 | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | +| LocalDataFlow.cs:160:13:160:18 | access to local variable sink20 | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | LocalDataFlow.cs:161:15:161:20 | access to local variable sink20 | | LocalDataFlow.cs:160:22:160:27 | access to local variable sink15 | LocalDataFlow.cs:160:22:160:32 | ... > ... | -| LocalDataFlow.cs:160:22:160:32 | ... > ... | LocalDataFlow.cs:160:13:160:32 | SSA def(sink20) | +| LocalDataFlow.cs:160:22:160:32 | ... > ... | LocalDataFlow.cs:160:13:160:18 | access to local variable sink20 | | LocalDataFlow.cs:161:15:161:20 | access to local variable sink20 | LocalDataFlow.cs:174:22:174:27 | access to local variable sink20 | +| LocalDataFlow.cs:162:13:162:18 | access to local variable sink21 | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | LocalDataFlow.cs:163:15:163:20 | access to local variable sink21 | | LocalDataFlow.cs:162:22:162:26 | [post] access to local variable sink9 | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | LocalDataFlow.cs:162:22:162:40 | call to method Equals | | LocalDataFlow.cs:162:22:162:26 | access to local variable sink9 | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | -| LocalDataFlow.cs:162:22:162:40 | call to method Equals | LocalDataFlow.cs:162:13:162:40 | SSA def(sink21) | +| LocalDataFlow.cs:162:22:162:40 | call to method Equals | LocalDataFlow.cs:162:13:162:18 | access to local variable sink21 | +| LocalDataFlow.cs:164:13:164:18 | access to local variable sink22 | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | LocalDataFlow.cs:165:15:165:20 | access to local variable sink22 | | LocalDataFlow.cs:164:22:164:26 | [post] access to local variable sink8 | LocalDataFlow.cs:170:20:170:24 | access to local variable sink8 | | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | LocalDataFlow.cs:164:22:164:45 | call to method Equals | | LocalDataFlow.cs:164:22:164:26 | access to local variable sink8 | LocalDataFlow.cs:170:20:170:24 | access to local variable sink8 | -| LocalDataFlow.cs:164:22:164:45 | call to method Equals | LocalDataFlow.cs:164:13:164:45 | SSA def(sink22) | +| LocalDataFlow.cs:164:22:164:45 | call to method Equals | LocalDataFlow.cs:164:13:164:18 | access to local variable sink22 | | LocalDataFlow.cs:164:43:164:44 | 41 | LocalDataFlow.cs:164:35:164:44 | (...) ... | +| LocalDataFlow.cs:168:9:168:16 | access to local variable nonSink7 | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | LocalDataFlow.cs:169:15:169:22 | access to local variable nonSink7 | | LocalDataFlow.cs:168:20:168:24 | [post] access to local variable sink0 | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | -| LocalDataFlow.cs:168:20:168:38 | call to method Equals | LocalDataFlow.cs:168:9:168:38 | SSA def(nonSink7) | +| LocalDataFlow.cs:168:20:168:38 | call to method Equals | LocalDataFlow.cs:168:9:168:16 | access to local variable nonSink7 | | LocalDataFlow.cs:168:33:168:37 | [post] access to local variable sink1 | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | | LocalDataFlow.cs:168:33:168:37 | access to local variable sink1 | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | +| LocalDataFlow.cs:170:9:170:16 | access to local variable nonSink7 | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | LocalDataFlow.cs:171:15:171:22 | access to local variable nonSink7 | -| LocalDataFlow.cs:170:20:170:41 | call to method Equals | LocalDataFlow.cs:170:9:170:41 | SSA def(nonSink7) | +| LocalDataFlow.cs:170:20:170:41 | call to method Equals | LocalDataFlow.cs:170:9:170:16 | access to local variable nonSink7 | | LocalDataFlow.cs:171:15:171:22 | access to local variable nonSink7 | LocalDataFlow.cs:178:20:178:27 | access to local variable nonSink7 | +| LocalDataFlow.cs:174:13:174:18 | access to local variable sink25 | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | LocalDataFlow.cs:175:15:175:20 | access to local variable sink25 | | LocalDataFlow.cs:174:22:174:27 | access to local variable sink20 | LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | -| LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | LocalDataFlow.cs:174:13:174:36 | SSA def(sink25) | +| LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | LocalDataFlow.cs:174:13:174:18 | access to local variable sink25 | | LocalDataFlow.cs:174:32:174:36 | false | LocalDataFlow.cs:174:22:174:36 | ... \|\| ... | +| LocalDataFlow.cs:178:9:178:16 | access to local variable nonSink7 | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | LocalDataFlow.cs:179:15:179:22 | access to local variable nonSink7 | | LocalDataFlow.cs:178:20:178:27 | access to local variable nonSink7 | LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | -| LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | LocalDataFlow.cs:178:9:178:36 | SSA def(nonSink7) | +| LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | LocalDataFlow.cs:178:9:178:16 | access to local variable nonSink7 | | LocalDataFlow.cs:178:32:178:36 | false | LocalDataFlow.cs:178:20:178:36 | ... \|\| ... | +| LocalDataFlow.cs:182:13:182:18 | access to local variable sink26 | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | LocalDataFlow.cs:183:15:183:20 | access to local variable sink26 | -| LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | LocalDataFlow.cs:182:13:182:42 | SSA def(sink26) | +| LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | LocalDataFlow.cs:182:13:182:18 | access to local variable sink26 | | LocalDataFlow.cs:182:37:182:41 | access to local variable sink9 | LocalDataFlow.cs:182:22:182:42 | object creation of type Uri | | LocalDataFlow.cs:183:15:183:20 | [post] access to local variable sink26 | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | | LocalDataFlow.cs:183:15:183:20 | access to local variable sink26 | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | +| LocalDataFlow.cs:184:13:184:18 | access to local variable sink27 | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | LocalDataFlow.cs:185:15:185:20 | access to local variable sink27 | | LocalDataFlow.cs:184:22:184:27 | [post] access to local variable sink26 | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | LocalDataFlow.cs:184:22:184:38 | call to method ToString | | LocalDataFlow.cs:184:22:184:27 | access to local variable sink26 | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | -| LocalDataFlow.cs:184:22:184:38 | call to method ToString | LocalDataFlow.cs:184:13:184:38 | SSA def(sink27) | +| LocalDataFlow.cs:184:22:184:38 | call to method ToString | LocalDataFlow.cs:184:13:184:18 | access to local variable sink27 | +| LocalDataFlow.cs:186:13:186:18 | access to local variable sink28 | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | LocalDataFlow.cs:187:15:187:20 | access to local variable sink28 | | LocalDataFlow.cs:186:22:186:27 | [post] access to local variable sink26 | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | | LocalDataFlow.cs:186:22:186:27 | access to local variable sink26 | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | -| LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | LocalDataFlow.cs:186:13:186:40 | SSA def(sink28) | +| LocalDataFlow.cs:186:22:186:40 | access to property PathAndQuery | LocalDataFlow.cs:186:13:186:18 | access to local variable sink28 | +| LocalDataFlow.cs:188:13:188:18 | access to local variable sink29 | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | LocalDataFlow.cs:189:15:189:20 | access to local variable sink29 | | LocalDataFlow.cs:188:22:188:27 | [post] access to local variable sink26 | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | LocalDataFlow.cs:188:22:188:33 | access to property Query | | LocalDataFlow.cs:188:22:188:27 | access to local variable sink26 | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | -| LocalDataFlow.cs:188:22:188:33 | access to property Query | LocalDataFlow.cs:188:13:188:33 | SSA def(sink29) | +| LocalDataFlow.cs:188:22:188:33 | access to property Query | LocalDataFlow.cs:188:13:188:18 | access to local variable sink29 | +| LocalDataFlow.cs:190:13:190:18 | access to local variable sink30 | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | LocalDataFlow.cs:191:15:191:20 | access to local variable sink30 | | LocalDataFlow.cs:190:22:190:27 | access to local variable sink26 | LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | -| LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | LocalDataFlow.cs:190:13:190:42 | SSA def(sink30) | +| LocalDataFlow.cs:190:22:190:42 | access to property OriginalString | LocalDataFlow.cs:190:13:190:18 | access to local variable sink30 | | LocalDataFlow.cs:191:15:191:20 | [post] access to local variable sink30 | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | | LocalDataFlow.cs:191:15:191:20 | access to local variable sink30 | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | +| LocalDataFlow.cs:194:13:194:20 | access to local variable nonSink8 | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | LocalDataFlow.cs:195:15:195:22 | access to local variable nonSink8 | -| LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | LocalDataFlow.cs:194:13:194:47 | SSA def(nonSink8) | +| LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | LocalDataFlow.cs:194:13:194:20 | access to local variable nonSink8 | | LocalDataFlow.cs:194:39:194:46 | access to local variable nonSink0 | LocalDataFlow.cs:194:24:194:47 | object creation of type Uri | | LocalDataFlow.cs:195:15:195:22 | [post] access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | | LocalDataFlow.cs:195:15:195:22 | access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | +| LocalDataFlow.cs:196:9:196:16 | access to local variable nonSink0 | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | LocalDataFlow.cs:197:15:197:22 | access to local variable nonSink0 | | LocalDataFlow.cs:196:20:196:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | LocalDataFlow.cs:196:20:196:38 | call to method ToString | | LocalDataFlow.cs:196:20:196:27 | access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:196:20:196:38 | call to method ToString | LocalDataFlow.cs:196:9:196:38 | SSA def(nonSink0) | +| LocalDataFlow.cs:196:20:196:38 | call to method ToString | LocalDataFlow.cs:196:9:196:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:198:9:198:16 | access to local variable nonSink0 | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | LocalDataFlow.cs:199:15:199:22 | access to local variable nonSink0 | | LocalDataFlow.cs:198:20:198:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | | LocalDataFlow.cs:198:20:198:27 | access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | LocalDataFlow.cs:198:9:198:40 | SSA def(nonSink0) | +| LocalDataFlow.cs:198:20:198:40 | access to property PathAndQuery | LocalDataFlow.cs:198:9:198:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:200:9:200:16 | access to local variable nonSink0 | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | LocalDataFlow.cs:201:15:201:22 | access to local variable nonSink0 | | LocalDataFlow.cs:200:20:200:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | LocalDataFlow.cs:200:20:200:33 | access to property Query | | LocalDataFlow.cs:200:20:200:27 | access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | -| LocalDataFlow.cs:200:20:200:33 | access to property Query | LocalDataFlow.cs:200:9:200:33 | SSA def(nonSink0) | +| LocalDataFlow.cs:200:20:200:33 | access to property Query | LocalDataFlow.cs:200:9:200:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:202:9:202:16 | access to local variable nonSink0 | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | LocalDataFlow.cs:203:15:203:22 | access to local variable nonSink0 | | LocalDataFlow.cs:202:20:202:27 | access to local variable nonSink8 | LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | -| LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | LocalDataFlow.cs:202:9:202:42 | SSA def(nonSink0) | +| LocalDataFlow.cs:202:20:202:42 | access to property OriginalString | LocalDataFlow.cs:202:9:202:16 | access to local variable nonSink0 | | LocalDataFlow.cs:203:15:203:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | | LocalDataFlow.cs:203:15:203:22 | access to local variable nonSink0 | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | +| LocalDataFlow.cs:206:13:206:18 | access to local variable sink31 | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | LocalDataFlow.cs:207:15:207:20 | access to local variable sink31 | -| LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | LocalDataFlow.cs:206:13:206:55 | SSA def(sink31) | +| LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | LocalDataFlow.cs:206:13:206:18 | access to local variable sink31 | | LocalDataFlow.cs:206:49:206:54 | access to local variable sink30 | LocalDataFlow.cs:206:22:206:55 | object creation of type StringReader | | LocalDataFlow.cs:207:15:207:20 | [post] access to local variable sink31 | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | | LocalDataFlow.cs:207:15:207:20 | access to local variable sink31 | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | +| LocalDataFlow.cs:208:13:208:18 | access to local variable sink32 | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | LocalDataFlow.cs:209:15:209:20 | access to local variable sink32 | | LocalDataFlow.cs:208:22:208:27 | access to local variable sink31 | LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | -| LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | LocalDataFlow.cs:208:13:208:39 | SSA def(sink32) | +| LocalDataFlow.cs:208:22:208:39 | call to method ReadToEnd | LocalDataFlow.cs:208:13:208:18 | access to local variable sink32 | | LocalDataFlow.cs:209:15:209:20 | [post] access to local variable sink32 | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | | LocalDataFlow.cs:209:15:209:20 | access to local variable sink32 | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | +| LocalDataFlow.cs:212:13:212:20 | access to local variable nonSink9 | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | LocalDataFlow.cs:213:15:213:22 | access to local variable nonSink9 | -| LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | LocalDataFlow.cs:212:13:212:59 | SSA def(nonSink9) | +| LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | LocalDataFlow.cs:212:13:212:20 | access to local variable nonSink9 | | LocalDataFlow.cs:212:51:212:58 | access to local variable nonSink0 | LocalDataFlow.cs:212:24:212:59 | object creation of type StringReader | | LocalDataFlow.cs:213:15:213:22 | [post] access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | | LocalDataFlow.cs:213:15:213:22 | access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | +| LocalDataFlow.cs:214:9:214:16 | access to local variable nonSink0 | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink9 | LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | -| LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | LocalDataFlow.cs:214:9:214:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:214:20:214:39 | call to method ReadToEnd | LocalDataFlow.cs:214:9:214:16 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | +| LocalDataFlow.cs:218:13:218:18 | access to local variable sink33 | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | LocalDataFlow.cs:219:15:219:20 | access to local variable sink33 | -| LocalDataFlow.cs:218:22:218:127 | (...) ... | LocalDataFlow.cs:218:13:218:127 | SSA def(sink33) | +| LocalDataFlow.cs:218:22:218:127 | (...) ... | LocalDataFlow.cs:218:13:218:18 | access to local variable sink33 | | LocalDataFlow.cs:218:30:218:35 | access to local variable sink32 | LocalDataFlow.cs:218:30:218:48 | call to method Substring | | LocalDataFlow.cs:218:30:218:48 | call to method Substring | LocalDataFlow.cs:218:30:218:67 | call to method ToLowerInvariant | | LocalDataFlow.cs:218:30:218:67 | call to method ToLowerInvariant | LocalDataFlow.cs:218:30:218:77 | call to method ToUpper | @@ -362,14 +429,16 @@ | LocalDataFlow.cs:218:117:218:118 | "" | LocalDataFlow.cs:218:30:218:119 | call to method Insert | | LocalDataFlow.cs:219:15:219:20 | [post] access to local variable sink33 | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | | LocalDataFlow.cs:219:15:219:20 | access to local variable sink33 | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | +| LocalDataFlow.cs:220:13:220:18 | access to local variable sink48 | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | LocalDataFlow.cs:221:15:221:20 | access to local variable sink48 | | LocalDataFlow.cs:220:22:220:27 | [post] access to local variable sink33 | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | LocalDataFlow.cs:220:22:220:39 | call to method Normalize | | LocalDataFlow.cs:220:22:220:27 | access to local variable sink33 | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | | LocalDataFlow.cs:220:22:220:39 | call to method Normalize | LocalDataFlow.cs:220:22:220:52 | call to method Remove | -| LocalDataFlow.cs:220:22:220:52 | call to method Remove | LocalDataFlow.cs:220:13:220:52 | SSA def(sink48) | +| LocalDataFlow.cs:220:22:220:52 | call to method Remove | LocalDataFlow.cs:220:13:220:18 | access to local variable sink48 | +| LocalDataFlow.cs:224:9:224:16 | access to local variable nonSink0 | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | LocalDataFlow.cs:225:15:225:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:224:20:224:127 | (...) ... | LocalDataFlow.cs:224:9:224:127 | SSA def(nonSink0) | +| LocalDataFlow.cs:224:20:224:127 | (...) ... | LocalDataFlow.cs:224:9:224:16 | access to local variable nonSink0 | | LocalDataFlow.cs:224:28:224:35 | access to local variable nonSink0 | LocalDataFlow.cs:224:28:224:48 | call to method Substring | | LocalDataFlow.cs:224:28:224:48 | call to method Substring | LocalDataFlow.cs:224:28:224:67 | call to method ToLowerInvariant | | LocalDataFlow.cs:224:28:224:67 | call to method ToLowerInvariant | LocalDataFlow.cs:224:28:224:77 | call to method ToUpper | @@ -382,40 +451,46 @@ | LocalDataFlow.cs:224:117:224:118 | "" | LocalDataFlow.cs:224:28:224:119 | call to method Insert | | LocalDataFlow.cs:225:15:225:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | | LocalDataFlow.cs:225:15:225:22 | access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | +| LocalDataFlow.cs:226:13:226:21 | access to local variable nonSink15 | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | LocalDataFlow.cs:227:15:227:23 | access to local variable nonSink15 | | LocalDataFlow.cs:226:25:226:32 | [post] access to local variable nonSink0 | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | LocalDataFlow.cs:226:25:226:44 | call to method Normalize | | LocalDataFlow.cs:226:25:226:32 | access to local variable nonSink0 | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | | LocalDataFlow.cs:226:25:226:44 | call to method Normalize | LocalDataFlow.cs:226:25:226:57 | call to method Remove | -| LocalDataFlow.cs:226:25:226:57 | call to method Remove | LocalDataFlow.cs:226:13:226:57 | SSA def(nonSink15) | +| LocalDataFlow.cs:226:25:226:57 | call to method Remove | LocalDataFlow.cs:226:13:226:21 | access to local variable nonSink15 | +| LocalDataFlow.cs:230:13:230:18 | access to local variable sink34 | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | LocalDataFlow.cs:231:15:231:20 | access to local variable sink34 | -| LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | LocalDataFlow.cs:230:13:230:46 | SSA def(sink34) | +| LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | LocalDataFlow.cs:230:13:230:18 | access to local variable sink34 | | LocalDataFlow.cs:230:40:230:45 | access to local variable sink33 | LocalDataFlow.cs:230:22:230:46 | object creation of type StringBuilder | | LocalDataFlow.cs:231:15:231:20 | [post] access to local variable sink34 | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | | LocalDataFlow.cs:231:15:231:20 | access to local variable sink34 | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | +| LocalDataFlow.cs:232:13:232:18 | access to local variable sink35 | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | LocalDataFlow.cs:233:15:233:20 | access to local variable sink35 | | LocalDataFlow.cs:232:22:232:27 | access to local variable sink34 | LocalDataFlow.cs:232:22:232:38 | call to method ToString | -| LocalDataFlow.cs:232:22:232:38 | call to method ToString | LocalDataFlow.cs:232:13:232:38 | SSA def(sink35) | +| LocalDataFlow.cs:232:22:232:38 | call to method ToString | LocalDataFlow.cs:232:13:232:18 | access to local variable sink35 | | LocalDataFlow.cs:233:15:233:20 | [post] access to local variable sink35 | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | | LocalDataFlow.cs:233:15:233:20 | access to local variable sink35 | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | +| LocalDataFlow.cs:234:13:234:18 | access to local variable sink36 | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | -| LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | LocalDataFlow.cs:234:13:234:42 | SSA def(sink36) | +| LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | LocalDataFlow.cs:234:13:234:18 | access to local variable sink36 | | LocalDataFlow.cs:234:40:234:41 | "" | LocalDataFlow.cs:234:22:234:42 | object creation of type StringBuilder | | LocalDataFlow.cs:235:9:235:14 | [post] access to local variable sink36 | LocalDataFlow.cs:236:15:236:20 | access to local variable sink36 | | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | LocalDataFlow.cs:235:9:235:33 | call to method AppendLine | | LocalDataFlow.cs:235:9:235:14 | access to local variable sink36 | LocalDataFlow.cs:236:15:236:20 | access to local variable sink36 | | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | LocalDataFlow.cs:235:9:235:14 | [post] access to local variable sink36 | | LocalDataFlow.cs:235:27:235:32 | access to local variable sink35 | LocalDataFlow.cs:235:9:235:33 | call to method AppendLine | +| LocalDataFlow.cs:239:13:239:21 | access to local variable nonSink10 | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | LocalDataFlow.cs:240:15:240:23 | access to local variable nonSink10 | -| LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | LocalDataFlow.cs:239:13:239:51 | SSA def(nonSink10) | +| LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | LocalDataFlow.cs:239:13:239:21 | access to local variable nonSink10 | | LocalDataFlow.cs:239:43:239:50 | access to local variable nonSink0 | LocalDataFlow.cs:239:25:239:51 | object creation of type StringBuilder | | LocalDataFlow.cs:240:15:240:23 | [post] access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | | LocalDataFlow.cs:240:15:240:23 | access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | +| LocalDataFlow.cs:241:9:241:16 | access to local variable nonSink0 | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | LocalDataFlow.cs:242:15:242:22 | access to local variable nonSink0 | | LocalDataFlow.cs:241:20:241:28 | [post] access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | LocalDataFlow.cs:241:20:241:39 | call to method ToString | | LocalDataFlow.cs:241:20:241:28 | access to local variable nonSink10 | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | -| LocalDataFlow.cs:241:20:241:39 | call to method ToString | LocalDataFlow.cs:241:9:241:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:241:20:241:39 | call to method ToString | LocalDataFlow.cs:241:9:241:16 | access to local variable nonSink0 | | LocalDataFlow.cs:242:15:242:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | | LocalDataFlow.cs:242:15:242:22 | access to local variable nonSink0 | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | | LocalDataFlow.cs:243:9:243:17 | [post] access to local variable nonSink10 | LocalDataFlow.cs:244:15:244:23 | access to local variable nonSink10 | @@ -423,16 +498,19 @@ | LocalDataFlow.cs:243:9:243:17 | access to local variable nonSink10 | LocalDataFlow.cs:244:15:244:23 | access to local variable nonSink10 | | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | LocalDataFlow.cs:243:9:243:17 | [post] access to local variable nonSink10 | | LocalDataFlow.cs:243:30:243:37 | access to local variable nonSink0 | LocalDataFlow.cs:243:9:243:38 | call to method AppendLine | +| LocalDataFlow.cs:247:13:247:31 | access to local variable taintedDataContract | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AList) | LocalDataFlow.cs:250:22:250:46 | access to property AList | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AString) | LocalDataFlow.cs:248:22:248:48 | access to property AString | | LocalDataFlow.cs:247:13:247:52 | SSA qualifier def(taintedDataContract.AnInt) | LocalDataFlow.cs:257:20:257:44 | access to property AnInt | -| LocalDataFlow.cs:247:35:247:52 | object creation of type DataContract | LocalDataFlow.cs:247:13:247:52 | SSA def(taintedDataContract) | +| LocalDataFlow.cs:247:35:247:52 | object creation of type DataContract | LocalDataFlow.cs:247:13:247:31 | access to local variable taintedDataContract | +| LocalDataFlow.cs:248:13:248:18 | access to local variable sink53 | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | LocalDataFlow.cs:249:15:249:20 | access to local variable sink53 | | LocalDataFlow.cs:248:22:248:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | LocalDataFlow.cs:248:22:248:48 | access to property AString | | LocalDataFlow.cs:248:22:248:40 | access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | -| LocalDataFlow.cs:248:22:248:48 | access to property AString | LocalDataFlow.cs:248:13:248:48 | SSA def(sink53) | +| LocalDataFlow.cs:248:22:248:48 | access to property AString | LocalDataFlow.cs:248:13:248:18 | access to local variable sink53 | +| LocalDataFlow.cs:250:13:250:18 | access to local variable sink54 | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | LocalDataFlow.cs:251:15:251:20 | access to local variable sink54 | | LocalDataFlow.cs:250:22:250:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:250:22:250:40 | access to local variable taintedDataContract | LocalDataFlow.cs:250:22:250:46 | access to property AList | @@ -441,113 +519,143 @@ | LocalDataFlow.cs:250:22:250:46 | access to property AList | LocalDataFlow.cs:250:22:250:49 | access to indexer | | LocalDataFlow.cs:250:22:250:46 | access to property AList | LocalDataFlow.cs:259:20:259:44 | access to property AList | | LocalDataFlow.cs:250:22:250:49 | access to indexer | LocalDataFlow.cs:250:22:250:57 | access to property AString | -| LocalDataFlow.cs:250:22:250:57 | access to property AString | LocalDataFlow.cs:250:13:250:57 | SSA def(sink54) | +| LocalDataFlow.cs:250:22:250:57 | access to property AString | LocalDataFlow.cs:250:13:250:18 | access to local variable sink54 | +| LocalDataFlow.cs:254:13:254:34 | access to local variable nonTaintedDataContract | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | LocalDataFlow.cs:255:20:255:41 | access to local variable nonTaintedDataContract | | LocalDataFlow.cs:254:13:254:55 | SSA qualifier def(nonTaintedDataContract.AString) | LocalDataFlow.cs:255:20:255:49 | access to property AString | -| LocalDataFlow.cs:254:38:254:55 | object creation of type DataContract | LocalDataFlow.cs:254:13:254:55 | SSA def(nonTaintedDataContract) | +| LocalDataFlow.cs:254:38:254:55 | object creation of type DataContract | LocalDataFlow.cs:254:13:254:34 | access to local variable nonTaintedDataContract | +| LocalDataFlow.cs:255:9:255:16 | access to local variable nonSink0 | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | LocalDataFlow.cs:256:15:256:22 | access to local variable nonSink0 | | LocalDataFlow.cs:255:20:255:41 | access to local variable nonTaintedDataContract | LocalDataFlow.cs:255:20:255:49 | access to property AString | -| LocalDataFlow.cs:255:20:255:49 | access to property AString | LocalDataFlow.cs:255:9:255:49 | SSA def(nonSink0) | +| LocalDataFlow.cs:255:20:255:49 | access to property AString | LocalDataFlow.cs:255:9:255:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:257:9:257:16 | access to local variable nonSink2 | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | LocalDataFlow.cs:258:15:258:22 | access to local variable nonSink2 | | LocalDataFlow.cs:257:20:257:38 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:257:20:257:38 | access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | -| LocalDataFlow.cs:257:20:257:44 | access to property AnInt | LocalDataFlow.cs:257:9:257:44 | SSA def(nonSink2) | +| LocalDataFlow.cs:257:20:257:44 | access to property AnInt | LocalDataFlow.cs:257:9:257:16 | access to local variable nonSink2 | +| LocalDataFlow.cs:259:9:259:16 | access to local variable nonSink2 | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | LocalDataFlow.cs:260:15:260:22 | access to local variable nonSink2 | | LocalDataFlow.cs:259:20:259:38 | access to local variable taintedDataContract | LocalDataFlow.cs:259:20:259:44 | access to property AList | | LocalDataFlow.cs:259:20:259:44 | access to property AList | LocalDataFlow.cs:259:20:259:47 | access to indexer | -| LocalDataFlow.cs:259:20:259:53 | access to property AnInt | LocalDataFlow.cs:259:9:259:53 | SSA def(nonSink2) | +| LocalDataFlow.cs:259:20:259:53 | access to property AnInt | LocalDataFlow.cs:259:9:259:16 | access to local variable nonSink2 | +| LocalDataFlow.cs:263:17:263:30 | access to local variable taintedTextBox | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | LocalDataFlow.cs:264:22:264:35 | access to local variable taintedTextBox | | LocalDataFlow.cs:263:17:263:37 | SSA qualifier def(taintedTextBox.Text) | LocalDataFlow.cs:264:22:264:40 | access to property Text | -| LocalDataFlow.cs:263:34:263:37 | null | LocalDataFlow.cs:263:17:263:37 | SSA def(taintedTextBox) | +| LocalDataFlow.cs:263:34:263:37 | null | LocalDataFlow.cs:263:17:263:30 | access to local variable taintedTextBox | +| LocalDataFlow.cs:264:13:264:18 | access to local variable sink60 | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | LocalDataFlow.cs:265:15:265:20 | access to local variable sink60 | | LocalDataFlow.cs:264:22:264:35 | access to local variable taintedTextBox | LocalDataFlow.cs:264:22:264:40 | access to property Text | -| LocalDataFlow.cs:264:22:264:40 | access to property Text | LocalDataFlow.cs:264:13:264:40 | SSA def(sink60) | +| LocalDataFlow.cs:264:22:264:40 | access to property Text | LocalDataFlow.cs:264:13:264:18 | access to local variable sink60 | +| LocalDataFlow.cs:268:17:268:33 | access to local variable nonTaintedTextBox | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | LocalDataFlow.cs:269:20:269:36 | access to local variable nonTaintedTextBox | | LocalDataFlow.cs:268:17:268:40 | SSA qualifier def(nonTaintedTextBox.Text) | LocalDataFlow.cs:269:20:269:41 | access to property Text | -| LocalDataFlow.cs:268:37:268:40 | null | LocalDataFlow.cs:268:17:268:40 | SSA def(nonTaintedTextBox) | +| LocalDataFlow.cs:268:37:268:40 | null | LocalDataFlow.cs:268:17:268:33 | access to local variable nonTaintedTextBox | +| LocalDataFlow.cs:269:9:269:16 | access to local variable nonSink0 | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | LocalDataFlow.cs:270:15:270:22 | access to local variable nonSink0 | | LocalDataFlow.cs:269:20:269:36 | access to local variable nonTaintedTextBox | LocalDataFlow.cs:269:20:269:41 | access to property Text | -| LocalDataFlow.cs:269:20:269:41 | access to property Text | LocalDataFlow.cs:269:9:269:41 | SSA def(nonSink0) | +| LocalDataFlow.cs:269:20:269:41 | access to property Text | LocalDataFlow.cs:269:9:269:16 | access to local variable nonSink0 | | LocalDataFlow.cs:270:15:270:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | | LocalDataFlow.cs:270:15:270:22 | access to local variable nonSink0 | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | +| LocalDataFlow.cs:273:13:273:18 | access to local variable sink69 | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | LocalDataFlow.cs:274:15:274:20 | access to local variable sink69 | -| LocalDataFlow.cs:273:22:273:36 | $"..." | LocalDataFlow.cs:273:13:273:36 | SSA def(sink69) | +| LocalDataFlow.cs:273:22:273:36 | $"..." | LocalDataFlow.cs:273:13:273:18 | access to local variable sink69 | | LocalDataFlow.cs:273:24:273:28 | "test " | LocalDataFlow.cs:273:22:273:36 | $"..." | | LocalDataFlow.cs:273:30:273:34 | access to local variable sink1 | LocalDataFlow.cs:273:22:273:36 | $"..." | +| LocalDataFlow.cs:277:9:277:16 | access to local variable nonSink0 | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | LocalDataFlow.cs:278:15:278:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:277:20:277:37 | $"..." | LocalDataFlow.cs:277:9:277:37 | SSA def(nonSink0) | +| LocalDataFlow.cs:277:20:277:37 | $"..." | LocalDataFlow.cs:277:9:277:16 | access to local variable nonSink0 | | LocalDataFlow.cs:277:22:277:26 | "test " | LocalDataFlow.cs:277:20:277:37 | $"..." | | LocalDataFlow.cs:277:28:277:35 | access to local variable nonSink0 | LocalDataFlow.cs:277:20:277:37 | $"..." | | LocalDataFlow.cs:278:15:278:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | | LocalDataFlow.cs:278:15:278:22 | access to local variable nonSink0 | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | +| LocalDataFlow.cs:281:13:281:18 | access to local variable sink70 | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | LocalDataFlow.cs:282:15:282:20 | access to local variable sink70 | -| LocalDataFlow.cs:281:22:281:34 | ... = ... | LocalDataFlow.cs:281:13:281:34 | SSA def(sink70) | +| LocalDataFlow.cs:281:22:281:26 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | +| LocalDataFlow.cs:281:22:281:34 | ... = ... | LocalDataFlow.cs:281:13:281:18 | access to local variable sink70 | | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | +| LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:26 | access to local variable sink0 | | LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | ... = ... | -| LocalDataFlow.cs:281:30:281:34 | access to local variable sink0 | LocalDataFlow.cs:281:22:281:34 | SSA def(sink0) | | LocalDataFlow.cs:282:15:282:20 | [post] access to local variable sink70 | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | | LocalDataFlow.cs:282:15:282:20 | access to local variable sink70 | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | +| LocalDataFlow.cs:285:9:285:16 | access to local variable nonSink0 | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | LocalDataFlow.cs:286:15:286:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:285:20:285:38 | ... = ... | LocalDataFlow.cs:285:9:285:38 | SSA def(nonSink0) | +| LocalDataFlow.cs:285:20:285:38 | ... = ... | LocalDataFlow.cs:285:9:285:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | LocalDataFlow.cs:285:20:285:27 | access to local variable nonSink0 | | LocalDataFlow.cs:285:31:285:38 | access to local variable nonSink0 | LocalDataFlow.cs:285:20:285:38 | ... = ... | | LocalDataFlow.cs:286:15:286:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | | LocalDataFlow.cs:286:15:286:22 | access to local variable nonSink0 | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | -| LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | +| LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:289:23:289:35 | String sink71 | | LocalDataFlow.cs:289:13:289:18 | access to local variable sink70 | LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | LocalDataFlow.cs:290:19:290:24 | access to local variable sink71 | -| LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | +| LocalDataFlow.cs:289:23:289:35 | String sink71 | LocalDataFlow.cs:289:23:289:35 | SSA def(sink71) | +| LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:293:25:293:40 | String nonSink16 | | LocalDataFlow.cs:293:13:293:20 | access to local variable nonSink0 | LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | LocalDataFlow.cs:294:19:294:27 | access to local variable nonSink16 | -| LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | +| LocalDataFlow.cs:293:25:293:40 | String nonSink16 | LocalDataFlow.cs:293:25:293:40 | SSA def(nonSink16) | +| LocalDataFlow.cs:297:17:297:22 | access to local variable sink70 | LocalDataFlow.cs:299:18:299:30 | String sink72 | | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | LocalDataFlow.cs:300:23:300:28 | access to local variable sink72 | -| LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | +| LocalDataFlow.cs:299:18:299:30 | String sink72 | LocalDataFlow.cs:299:18:299:30 | SSA def(sink72) | +| LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:307:18:307:33 | String nonSink17 | | LocalDataFlow.cs:305:17:305:24 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | LocalDataFlow.cs:308:23:308:31 | access to local variable nonSink17 | +| LocalDataFlow.cs:307:18:307:33 | String nonSink17 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) | +| LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | LocalDataFlow.cs:315:15:315:20 | access to local variable sink73 | | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... | | LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | -| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | +| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... | | LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | +| LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | LocalDataFlow.cs:316:15:316:20 | access to local variable sink74 | | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | -| LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | +| LocalDataFlow.cs:314:22:314:38 | ... ?? ... | LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... | | LocalDataFlow.cs:334:28:334:30 | SSA entry def(this.anInt) | LocalDataFlow.cs:334:41:334:45 | access to field anInt | | LocalDataFlow.cs:334:28:334:30 | this | LocalDataFlow.cs:334:41:334:45 | this access | | LocalDataFlow.cs:334:50:334:52 | this | LocalDataFlow.cs:334:56:334:60 | this access | | LocalDataFlow.cs:334:50:334:52 | value | LocalDataFlow.cs:334:64:334:68 | access to parameter value | +| LocalDataFlow.cs:334:64:334:68 | access to parameter value | LocalDataFlow.cs:334:56:334:60 | access to field anInt | | LocalDataFlow.cs:340:41:340:47 | tainted | LocalDataFlow.cs:342:15:342:21 | access to parameter tainted | | LocalDataFlow.cs:345:44:345:53 | nonTainted | LocalDataFlow.cs:347:15:347:24 | access to parameter nonTainted | | LocalDataFlow.cs:350:44:350:44 | x | LocalDataFlow.cs:353:21:353:21 | access to parameter x | | LocalDataFlow.cs:350:67:350:68 | os | LocalDataFlow.cs:356:33:356:34 | access to parameter os | +| LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:17 | access to local variable x1 | | LocalDataFlow.cs:353:21:353:21 | access to parameter x | LocalDataFlow.cs:353:16:353:21 | ... = ... | +| LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:29 | access to local variable os2 | | LocalDataFlow.cs:356:33:356:34 | access to parameter os | LocalDataFlow.cs:356:27:356:34 | ... = ... | | LocalDataFlow.cs:361:41:361:44 | args | LocalDataFlow.cs:363:29:363:32 | access to parameter args | | LocalDataFlow.cs:363:29:363:32 | [post] access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | | LocalDataFlow.cs:363:29:363:32 | access to parameter args | LocalDataFlow.cs:363:29:363:32 | call to operator implicit conversion | | LocalDataFlow.cs:363:29:363:32 | access to parameter args | LocalDataFlow.cs:364:27:364:30 | access to parameter args | +| LocalDataFlow.cs:363:29:363:32 | call to operator implicit conversion | LocalDataFlow.cs:363:22:363:25 | access to local variable span | +| LocalDataFlow.cs:364:27:364:30 | call to operator implicit conversion | LocalDataFlow.cs:364:23:364:23 | access to local variable x | | LocalDataFlow.cs:367:23:367:24 | b1 | LocalDataFlow.cs:371:13:371:14 | access to parameter b1 | | LocalDataFlow.cs:367:32:367:33 | b2 | LocalDataFlow.cs:374:17:374:18 | access to parameter b2 | +| LocalDataFlow.cs:369:17:369:18 | "" | LocalDataFlow.cs:369:13:369:13 | access to local variable x | +| LocalDataFlow.cs:373:13:373:13 | access to local variable x | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:376:35:376:35 | access to local variable x | | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | -| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:25 | SSA def(x) | +| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:13 | access to local variable x | +| LocalDataFlow.cs:381:13:381:13 | access to local variable x | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | -| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:29 | SSA def(x) | +| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:13 | access to local variable x | | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x | | SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S | | SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access | | SSA.cs:5:26:5:32 | tainted | SSA.cs:8:24:8:30 | access to parameter tainted | | SSA.cs:5:42:5:51 | nonTainted | SSA.cs:12:24:12:33 | access to parameter nonTainted | +| SSA.cs:8:13:8:20 | access to local variable ssaSink0 | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | -| SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | +| SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:20 | access to local variable ssaSink0 | | SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:58:27:58:33 | access to parameter tainted | | SSA.cs:9:15:9:22 | [post] access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | +| SSA.cs:12:13:12:20 | access to local variable nonSink0 | SSA.cs:12:13:12:33 | SSA def(nonSink0) | | SSA.cs:12:13:12:33 | SSA def(nonSink0) | SSA.cs:13:15:13:22 | access to local variable nonSink0 | -| SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:33 | SSA def(nonSink0) | +| SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:20 | access to local variable nonSink0 | | SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:23:13:23:22 | access to parameter nonTainted | | SSA.cs:13:15:13:22 | [post] access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | | SSA.cs:13:15:13:22 | access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | @@ -559,38 +667,44 @@ | SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | +| SSA.cs:22:16:22:23 | access to local variable ssaSink1 | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | -| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | +| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:23 | access to local variable ssaSink1 | | SSA.cs:23:13:23:22 | [post] access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:23:13:23:22 | access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:23:13:23:29 | access to property Length | SSA.cs:23:13:23:33 | ... > ... | +| SSA.cs:24:13:24:20 | access to local variable ssaSink1 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | -| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | +| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:20 | access to local variable ssaSink1 | | SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 | +| SSA.cs:28:16:28:23 | access to local variable nonSink1 | SSA.cs:28:16:28:28 | SSA def(nonSink1) | | SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | -| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:28 | SSA def(nonSink1) | +| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:23 | access to local variable nonSink1 | | SSA.cs:29:13:29:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:29:13:29:22 | access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:29:13:29:29 | access to property Length | SSA.cs:29:13:29:33 | ... > ... | +| SSA.cs:30:13:30:20 | access to local variable nonSink1 | SSA.cs:30:13:30:31 | SSA def(nonSink1) | | SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | -| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:31 | SSA def(nonSink1) | +| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:20 | access to local variable nonSink1 | | SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:49:24:49:31 | access to local variable nonSink0 | | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 | +| SSA.cs:34:16:34:23 | access to local variable ssaSink2 | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | -| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | +| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:23 | access to local variable ssaSink2 | | SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:35:13:35:29 | access to property Length | SSA.cs:35:13:35:33 | ... > ... | +| SSA.cs:37:13:37:20 | access to local variable ssaSink2 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:39:21:39:28 | access to local variable ssaSink2 | | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:41:21:41:28 | access to local variable ssaSink2 | -| SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | +| SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:20 | access to local variable ssaSink2 | | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | | SSA.cs:38:17:38:26 | [post] access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | | SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | @@ -603,16 +717,18 @@ | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 | +| SSA.cs:46:16:46:23 | access to local variable nonSink2 | SSA.cs:46:16:46:28 | SSA def(nonSink2) | | SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | -| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:28 | SSA def(nonSink2) | +| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:23 | access to local variable nonSink2 | | SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:47:13:47:29 | access to property Length | SSA.cs:47:13:47:33 | ... > ... | +| SSA.cs:49:13:49:20 | access to local variable nonSink2 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:51:21:51:28 | access to local variable nonSink2 | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:53:21:53:28 | access to local variable nonSink2 | -| SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | +| SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:20 | access to local variable nonSink2 | | SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | | SSA.cs:50:17:50:26 | [post] access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | | SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | @@ -624,21 +740,25 @@ | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 | | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | SSA.cs:55:15:55:22 | access to local variable nonSink2 | +| SSA.cs:58:16:58:23 | access to local variable ssaSink3 | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | SSA.cs:59:23:59:30 | access to local variable ssaSink3 | -| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:33 | SSA def(ssaSink3) | +| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:23 | access to local variable ssaSink3 | | SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:67:32:67:38 | access to parameter tainted | | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | SSA.cs:60:15:60:22 | access to local variable ssaSink3 | | SSA.cs:59:23:59:30 | [post] access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | | SSA.cs:59:23:59:30 | access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | +| SSA.cs:59:23:59:30 | access to local variable ssaSink3 | SSA.cs:59:23:59:30 | SSA def(ssaSink3) | | SSA.cs:63:23:63:30 | SSA def(nonSink0) | SSA.cs:64:15:64:22 | access to local variable nonSink0 | | SSA.cs:63:23:63:30 | [post] access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | +| SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:67:9:67:12 | [post] this access | SSA.cs:68:23:68:26 | this access | | SSA.cs:67:9:67:12 | this access | SSA.cs:68:23:68:26 | this access | | SSA.cs:67:9:67:14 | [post] access to field S | SSA.cs:68:23:68:28 | access to field S | | SSA.cs:67:9:67:14 | access to field S | SSA.cs:68:23:68:28 | access to field S | +| SSA.cs:67:9:67:28 | access to field SsaFieldSink0 | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | -| SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | +| SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:28 | access to field SsaFieldSink0 | | SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:77:20:77:26 | access to parameter tainted | | SSA.cs:68:23:68:26 | [post] this access | SSA.cs:69:15:69:18 | this access | | SSA.cs:68:23:68:26 | this access | SSA.cs:69:15:69:18 | this access | @@ -646,6 +766,7 @@ | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | SSA.cs:69:15:69:34 | access to field SsaFieldSink0 | | SSA.cs:68:23:68:28 | [post] access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | | SSA.cs:68:23:68:28 | access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | +| SSA.cs:68:23:68:28 | access to field S | SSA.cs:68:23:68:28 | SSA def(this.S) | | SSA.cs:69:15:69:18 | [post] this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:18 | this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:20 | [post] access to field S | SSA.cs:72:9:72:14 | access to field S | @@ -654,22 +775,26 @@ | SSA.cs:72:9:72:12 | this access | SSA.cs:73:23:73:26 | this access | | SSA.cs:72:9:72:14 | [post] access to field S | SSA.cs:73:23:73:28 | access to field S | | SSA.cs:72:9:72:14 | access to field S | SSA.cs:73:23:73:28 | access to field S | +| SSA.cs:72:9:72:31 | access to field SsaFieldNonSink0 | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | -| SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:31 | access to field SsaFieldNonSink0 | | SSA.cs:73:23:73:26 | [post] this access | SSA.cs:74:15:74:18 | this access | | SSA.cs:73:23:73:26 | this access | SSA.cs:74:15:74:18 | this access | | SSA.cs:73:23:73:28 | SSA def(this.S) | SSA.cs:74:15:74:20 | access to field S | | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:74:15:74:37 | access to field SsaFieldNonSink0 | | SSA.cs:73:23:73:28 | [post] access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | | SSA.cs:73:23:73:28 | access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | +| SSA.cs:73:23:73:28 | access to field S | SSA.cs:73:23:73:28 | SSA def(this.S) | | SSA.cs:74:15:74:18 | [post] this access | SSA.cs:80:9:80:12 | this access | | SSA.cs:74:15:74:18 | this access | SSA.cs:80:9:80:12 | this access | | SSA.cs:74:15:74:20 | [post] access to field S | SSA.cs:80:9:80:14 | access to field S | | SSA.cs:74:15:74:20 | access to field S | SSA.cs:80:9:80:14 | access to field S | +| SSA.cs:77:9:77:16 | access to local variable nonSink0 | SSA.cs:77:9:77:26 | SSA def(nonSink0) | | SSA.cs:77:9:77:26 | SSA def(nonSink0) | SSA.cs:78:21:78:28 | access to local variable nonSink0 | -| SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:26 | SSA def(nonSink0) | +| SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:16 | access to local variable nonSink0 | | SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:80:35:80:41 | access to parameter tainted | | SSA.cs:78:21:78:28 | SSA def(nonSink0) | SSA.cs:79:15:79:22 | access to local variable nonSink0 | +| SSA.cs:78:21:78:28 | access to local variable nonSink0 | SSA.cs:78:21:78:28 | SSA def(nonSink0) | | SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | | SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | | SSA.cs:79:15:79:22 | access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | @@ -678,18 +803,21 @@ | SSA.cs:80:9:80:12 | this access | SSA.cs:81:21:81:24 | this access | | SSA.cs:80:9:80:14 | [post] access to field S | SSA.cs:81:21:81:26 | access to field S | | SSA.cs:80:9:80:14 | access to field S | SSA.cs:81:21:81:26 | access to field S | +| SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:80:9:80:31 | access to field SsaFieldNonSink0 | | SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:83:35:83:41 | access to parameter tainted | | SSA.cs:81:21:81:24 | [post] this access | SSA.cs:82:15:82:18 | this access | | SSA.cs:81:21:81:24 | this access | SSA.cs:82:15:82:18 | this access | | SSA.cs:81:21:81:26 | SSA def(this.S) | SSA.cs:82:15:82:20 | access to field S | | SSA.cs:81:21:81:26 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:82:15:82:37 | access to field SsaFieldNonSink0 | +| SSA.cs:81:21:81:26 | access to field S | SSA.cs:81:21:81:26 | SSA def(this.S) | | SSA.cs:82:15:82:18 | [post] this access | SSA.cs:83:9:83:12 | this access | | SSA.cs:82:15:82:18 | this access | SSA.cs:83:9:83:12 | this access | | SSA.cs:82:15:82:20 | [post] access to field S | SSA.cs:83:9:83:14 | access to field S | | SSA.cs:82:15:82:20 | access to field S | SSA.cs:83:9:83:14 | access to field S | | SSA.cs:83:9:83:12 | [post] this access | SSA.cs:84:9:84:14 | this access | | SSA.cs:83:9:83:12 | this access | SSA.cs:84:9:84:14 | this access | -| SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:83:9:83:31 | access to field SsaFieldNonSink0 | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:31 | access to field SsaFieldNonSink0 | | SSA.cs:84:9:84:14 | SSA call def(this.S) | SSA.cs:85:15:85:20 | access to field S | | SSA.cs:84:9:84:14 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:85:15:85:37 | access to field SsaFieldNonSink0 | | SSA.cs:84:9:84:14 | [post] this access | SSA.cs:85:15:85:18 | this access | @@ -698,16 +826,18 @@ | SSA.cs:85:15:85:18 | this access | SSA.cs:114:9:114:12 | this access | | SSA.cs:85:15:85:20 | [post] access to field S | SSA.cs:114:9:114:14 | access to field S | | SSA.cs:85:15:85:20 | access to field S | SSA.cs:114:9:114:14 | access to field S | +| SSA.cs:88:16:88:23 | access to local variable ssaSink4 | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | -| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | +| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:23 | access to local variable ssaSink4 | | SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:89:13:89:29 | access to property Length | SSA.cs:89:13:89:33 | ... > ... | +| SSA.cs:91:13:91:20 | access to local variable ssaSink4 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:93:21:93:28 | access to local variable ssaSink4 | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:95:21:95:28 | access to local variable ssaSink4 | -| SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | +| SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:20 | access to local variable ssaSink4 | | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | | SSA.cs:92:17:92:26 | [post] access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | | SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | @@ -722,16 +852,19 @@ | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | SSA.cs:98:15:98:22 | access to local variable ssaSink4 | | SSA.cs:97:23:97:30 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | | SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | +| SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | +| SSA.cs:101:16:101:23 | access to local variable nonSink3 | SSA.cs:101:16:101:28 | SSA def(nonSink3) | | SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) | -| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:28 | SSA def(nonSink3) | +| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:23 | access to local variable nonSink3 | | SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:102:13:102:29 | access to property Length | SSA.cs:102:13:102:33 | ... > ... | +| SSA.cs:104:13:104:20 | access to local variable nonSink3 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:106:21:106:28 | access to local variable nonSink3 | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:108:21:108:28 | access to local variable nonSink3 | -| SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | +| SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:20 | access to local variable nonSink3 | | SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | | SSA.cs:105:17:105:26 | [post] access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | | SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | @@ -746,6 +879,7 @@ | SSA.cs:110:23:110:30 | SSA def(nonSink3) | SSA.cs:111:15:111:22 | access to local variable nonSink3 | | SSA.cs:110:23:110:30 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | +| SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:114:9:114:12 | [post] this access | SSA.cs:117:13:117:16 | this access | | SSA.cs:114:9:114:12 | [post] this access | SSA.cs:123:23:123:26 | this access | | SSA.cs:114:9:114:12 | this access | SSA.cs:117:13:117:16 | this access | @@ -754,8 +888,9 @@ | SSA.cs:114:9:114:14 | [post] access to field S | SSA.cs:123:9:123:30 | SSA phi read(this.S) | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:117:13:117:18 | access to field S | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:123:9:123:30 | SSA phi read(this.S) | +| SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) | -| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | | SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | | SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | @@ -769,9 +904,10 @@ | SSA.cs:117:13:117:18 | [post] access to field S | SSA.cs:121:21:121:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:119:21:119:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:121:21:121:26 | access to field S | +| SSA.cs:117:13:117:32 | access to field SsaFieldSink1 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | -| SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:32 | access to field SsaFieldSink1 | | SSA.cs:118:17:118:26 | [post] access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | | SSA.cs:118:17:118:33 | access to property Length | SSA.cs:118:17:118:37 | ... > ... | @@ -796,6 +932,7 @@ | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) | SSA.cs:124:15:124:34 | access to field SsaFieldSink1 | | SSA.cs:123:23:123:28 | [post] access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | | SSA.cs:123:23:123:28 | access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | +| SSA.cs:123:23:123:28 | access to field S | SSA.cs:123:23:123:28 | SSA def(this.S) | | SSA.cs:124:15:124:18 | [post] this access | SSA.cs:127:9:127:12 | this access | | SSA.cs:124:15:124:18 | this access | SSA.cs:127:9:127:12 | this access | | SSA.cs:124:15:124:20 | [post] access to field S | SSA.cs:127:9:127:14 | access to field S | @@ -808,8 +945,9 @@ | SSA.cs:127:9:127:14 | [post] access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:130:13:130:18 | access to field S | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:136:9:136:30 | SSA phi read(this.S) | +| SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) | -| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | | SSA.cs:128:13:128:22 | [post] access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:128:13:128:22 | access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:128:13:128:29 | access to property Length | SSA.cs:128:13:128:33 | ... > ... | @@ -821,9 +959,10 @@ | SSA.cs:130:13:130:18 | [post] access to field S | SSA.cs:134:21:134:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:132:21:132:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:134:21:134:26 | access to field S | +| SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 | -| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 | | SSA.cs:131:17:131:33 | access to property Length | SSA.cs:131:17:131:37 | ... > ... | | SSA.cs:132:21:132:24 | [post] this access | SSA.cs:136:23:136:26 | this access | | SSA.cs:132:21:132:24 | this access | SSA.cs:136:23:136:26 | this access | @@ -845,32 +984,41 @@ | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:137:15:137:37 | access to field SsaFieldNonSink0 | | SSA.cs:136:23:136:28 | [post] access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | | SSA.cs:136:23:136:28 | access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | +| SSA.cs:136:23:136:28 | access to field S | SSA.cs:136:23:136:28 | SSA def(this.S) | | SSA.cs:144:34:144:34 | t | SSA.cs:146:13:146:13 | access to parameter t | | SSA.cs:146:13:146:13 | (...) ... | SSA.cs:146:13:146:21 | ... == ... | | SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:146:13:146:13 | (...) ... | | SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:149:17:149:17 | access to parameter t | +| SSA.cs:147:13:147:13 | access to parameter t | SSA.cs:147:13:147:26 | SSA def(t) | | SSA.cs:147:13:147:26 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) | -| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:26 | SSA def(t) | +| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:13 | access to parameter t | +| SSA.cs:149:13:149:13 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) | | SSA.cs:149:13:149:17 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) | -| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) | +| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:13 | access to parameter t | | SSA.cs:152:36:152:36 | t | SSA.cs:154:13:154:13 | access to parameter t | | SSA.cs:154:13:154:13 | (...) ... | SSA.cs:154:13:154:21 | ... == ... | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:152:17:152:28 | SSA phi(t) | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:154:13:154:13 | (...) ... | | SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:155:25:155:25 | access to parameter t | | SSA.cs:155:25:155:25 | SSA def(t) | SSA.cs:152:17:152:28 | SSA phi(t) | +| SSA.cs:155:25:155:25 | access to parameter t | SSA.cs:155:25:155:25 | SSA def(t) | | SSA.cs:166:10:166:13 | this | SSA.cs:166:19:166:22 | this access | +| SSA.cs:166:28:166:31 | null | SSA.cs:166:19:166:24 | access to field S | | SSA.cs:168:22:168:28 | tainted | SSA.cs:173:24:173:30 | access to parameter tainted | | SSA.cs:168:35:168:35 | i | SSA.cs:171:13:171:13 | access to parameter i | +| SSA.cs:170:16:170:23 | access to local variable ssaSink5 | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | -| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:28 | SSA def(ssaSink5) | +| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:23 | access to local variable ssaSink5 | +| SSA.cs:171:13:171:13 | access to parameter i | SSA.cs:171:13:171:15 | SSA def(i) | | SSA.cs:171:13:171:15 | ...-- | SSA.cs:171:13:171:19 | ... > ... | | SSA.cs:171:13:171:15 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | +| SSA.cs:173:13:173:20 | access to local variable ssaSink5 | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | -| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | +| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:20 | access to local variable ssaSink5 | | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | | SSA.cs:174:20:174:20 | SSA phi(i) | SSA.cs:174:20:174:20 | access to parameter i | +| SSA.cs:174:20:174:20 | access to parameter i | SSA.cs:174:20:174:22 | SSA def(i) | | SSA.cs:174:20:174:22 | ...-- | SSA.cs:174:20:174:26 | ... > ... | | SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | | SSA.cs:176:21:176:28 | [post] access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | @@ -880,9 +1028,10 @@ | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 | | Splitting.cs:3:18:3:18 | b | Splitting.cs:6:13:6:13 | access to parameter b | | Splitting.cs:3:28:3:34 | tainted | Splitting.cs:5:17:5:23 | access to parameter tainted | +| Splitting.cs:5:13:5:13 | access to local variable x | Splitting.cs:5:13:5:23 | SSA def(x) | | Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | | Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:12:15:12:15 | [b (line 3): false] access to local variable x | -| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:23 | SSA def(x) | +| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:13 | access to local variable x | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): false] access to parameter b | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): true] access to parameter b | | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | @@ -892,24 +1041,30 @@ | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:12:15:12:15 | [post] [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:17:18:17:18 | b | Splitting.cs:20:13:20:13 | access to parameter b | +| Splitting.cs:19:13:19:13 | access to local variable x | Splitting.cs:19:13:19:18 | SSA def(x) | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | [b (line 17): true] access to local variable x | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | -| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:18 | SSA def(x) | +| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:13 | access to local variable x | | Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): false] access to parameter b | | Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): true] access to parameter b | +| Splitting.cs:23:13:23:13 | access to local variable x | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | -| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | +| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:13 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [post] [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [post] [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:32:18:32:18 | b | Splitting.cs:35:13:35:13 | access to parameter b | +| Splitting.cs:34:17:34:18 | "" | Splitting.cs:34:13:34:13 | access to local variable x | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b | +| Splitting.cs:36:17:36:19 | [b (line 32): true] "a" | Splitting.cs:36:13:36:13 | access to local variable x | +| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | +| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | -| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | -| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | +| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:9 | access to local variable x | +| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:9 | access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | | Splitting.cs:38:15:38:15 | [post] [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | @@ -922,19 +1077,25 @@ | Splitting.cs:39:23:39:25 | [b (line 32): false] "c" | Splitting.cs:39:15:39:25 | [b (line 32): false] ... ? ... : ... | | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): false] (...) ... | | Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): true] (...) ... | +| Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:15 | access to local variable x | | Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:21 | [b (line 32): false] ... = ... | +| Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:15 | access to local variable x | | Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:21 | [b (line 32): true] ... = ... | | Splitting.cs:46:18:46:18 | b | Splitting.cs:49:13:49:13 | access to parameter b | +| Splitting.cs:48:13:48:13 | access to local variable x | Splitting.cs:48:13:48:18 | SSA def(x) | | Splitting.cs:48:13:48:18 | SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): false] access to local variable x | -| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:18 | SSA def(x) | +| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:13 | access to local variable x | | Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): false] access to parameter b | | Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): true] access to parameter b | +| Splitting.cs:50:13:50:13 | access to local variable x | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): true] access to local variable x | -| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | +| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:13 | access to local variable x | +| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | +| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y | | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y | -| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | -| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | +| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y | +| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y | | Splitting.cs:51:30:51:36 | [b (line 46): false] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | | Splitting.cs:51:30:51:36 | [b (line 46): true] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | | Splitting.cs:51:32:51:34 | [b (line 46): false] "a" | Splitting.cs:51:30:51:36 | [b (line 46): false] { ..., ... } | @@ -944,45 +1105,60 @@ | Splitting.cs:52:9:52:9 | [post] [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | | Splitting.cs:52:9:52:9 | [post] [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | | Splitting.cs:52:16:52:18 | [b (line 46): false] "b" | Splitting.cs:52:9:52:9 | [post] [b (line 46): false] access to local variable y | +| Splitting.cs:52:16:52:18 | [b (line 46): false] "b" | Splitting.cs:52:9:52:12 | access to array element | | Splitting.cs:52:16:52:18 | [b (line 46): true] "b" | Splitting.cs:52:9:52:9 | [post] [b (line 46): true] access to local variable y | +| Splitting.cs:52:16:52:18 | [b (line 46): true] "b" | Splitting.cs:52:9:52:12 | access to array element | +| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | +| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | | Splitting.cs:53:13:53:13 | [b (line 46): false] access to local variable x | Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | | Splitting.cs:53:13:53:13 | [b (line 46): true] access to local variable x | Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | -| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | -| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | +| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x | +| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x | | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:20 | [b (line 46): false] access to array element | | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:20 | [b (line 46): true] access to array element | | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | | Splitting.cs:53:17:53:20 | [b (line 46): false] access to array element | Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | | Splitting.cs:53:17:53:20 | [b (line 46): true] access to array element | Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | +| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | +| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): false] access to local variable z | | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): true] access to local variable z | | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): false] access to local variable x | | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): true] access to local variable x | -| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | -| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | +| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z | +| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z | +| Splitting.cs:55:13:55:14 | [b (line 46): false] !... | Splitting.cs:55:9:55:9 | access to local variable z | +| Splitting.cs:55:13:55:14 | [b (line 46): true] !... | Splitting.cs:55:9:55:9 | access to local variable z | | Splitting.cs:55:14:55:14 | [b (line 46): false] access to local variable z | Splitting.cs:55:13:55:14 | [b (line 46): false] !... | | Splitting.cs:55:14:55:14 | [b (line 46): true] access to local variable z | Splitting.cs:55:13:55:14 | [b (line 46): true] !... | +| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | +| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): false] access to local variable x | | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): true] access to local variable x | -| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | -| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | +| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:9 | access to local variable x | +| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:9 | access to local variable x | | Splitting.cs:56:15:56:15 | [b (line 46): false] "c" | Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | | Splitting.cs:56:15:56:15 | [b (line 46): true] "c" | Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | | Splitting.cs:56:17:56:17 | [b (line 46): false] access to local variable x | Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | | Splitting.cs:56:17:56:17 | [b (line 46): true] access to local variable x | Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | +| Splitting.cs:57:13:57:24 | [b (line 46): false] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x | +| Splitting.cs:57:13:57:24 | [b (line 46): true] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x | | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): false] access to local variable y | | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): true] access to local variable y | +| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | +| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): false] access to local variable s | | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): true] access to local variable s | | Splitting.cs:58:27:58:27 | [b (line 46): false] access to local variable y | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | | Splitting.cs:58:27:58:27 | [b (line 46): true] access to local variable y | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | | UseUseExplosion.cs:21:10:21:10 | SSA entry def(this.Prop) | UseUseExplosion.cs:24:13:24:16 | access to property Prop | | UseUseExplosion.cs:21:10:21:10 | this | UseUseExplosion.cs:24:13:24:16 | this access | +| UseUseExplosion.cs:23:13:23:13 | access to local variable x | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1712:24:1712 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1727:24:1727 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:1742:24:1742 | access to local variable x | @@ -1084,7 +1260,7 @@ | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:3182:24:3182 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:24:3197:24:3197 | access to local variable x | | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | -| UseUseExplosion.cs:23:17:23:17 | 0 | UseUseExplosion.cs:23:13:23:17 | SSA def(x) | +| UseUseExplosion.cs:23:17:23:17 | 0 | UseUseExplosion.cs:23:13:23:13 | access to local variable x | | UseUseExplosion.cs:24:13:24:16 | [post] this access | UseUseExplosion.cs:24:31:24:34 | this access | | UseUseExplosion.cs:24:13:24:16 | [post] this access | UseUseExplosion.cs:24:3193:24:3198 | this access | | UseUseExplosion.cs:24:13:24:16 | access to property Prop | UseUseExplosion.cs:24:13:24:22 | ... > ... | diff --git a/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected b/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected index d55c099ca4f..aabd51826b2 100644 --- a/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/operators/operatorFlow.expected @@ -12,64 +12,88 @@ edges | Operator.cs:21:43:21:43 | y : C | Operator.cs:21:49:21:49 | access to parameter y : C | provenance | | | Operator.cs:22:51:22:51 | y : C | Operator.cs:22:57:22:57 | access to parameter y : C | provenance | | | Operator.cs:22:51:22:51 | y : C | Operator.cs:22:57:22:57 | access to parameter y : C | provenance | | -| Operator.cs:27:17:27:28 | call to method Source : C | Operator.cs:29:17:29:17 | access to local variable x : C | provenance | | -| Operator.cs:27:17:27:28 | call to method Source : C | Operator.cs:29:17:29:17 | access to local variable x : C | provenance | | +| Operator.cs:27:13:27:13 | access to local variable x : C | Operator.cs:29:17:29:17 | access to local variable x : C | provenance | | +| Operator.cs:27:13:27:13 | access to local variable x : C | Operator.cs:29:17:29:17 | access to local variable x : C | provenance | | +| Operator.cs:27:17:27:28 | call to method Source : C | Operator.cs:27:13:27:13 | access to local variable x : C | provenance | | +| Operator.cs:27:17:27:28 | call to method Source : C | Operator.cs:27:13:27:13 | access to local variable x : C | provenance | | +| Operator.cs:29:13:29:13 | access to local variable z : C | Operator.cs:30:14:30:14 | access to local variable z | provenance | | +| Operator.cs:29:13:29:13 | access to local variable z : C | Operator.cs:30:14:30:14 | access to local variable z | provenance | | | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:16:38:16:38 | x : C | provenance | | | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:16:38:16:38 | x : C | provenance | | | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:29:17:29:21 | call to operator + : C | provenance | | | Operator.cs:29:17:29:17 | access to local variable x : C | Operator.cs:29:17:29:21 | call to operator + : C | provenance | | -| Operator.cs:29:17:29:21 | call to operator + : C | Operator.cs:30:14:30:14 | access to local variable z | provenance | | -| Operator.cs:29:17:29:21 | call to operator + : C | Operator.cs:30:14:30:14 | access to local variable z | provenance | | -| Operator.cs:35:17:35:28 | call to method Source : C | Operator.cs:37:27:37:27 | access to local variable x : C | provenance | | -| Operator.cs:35:17:35:28 | call to method Source : C | Operator.cs:37:27:37:27 | access to local variable x : C | provenance | | +| Operator.cs:29:17:29:21 | call to operator + : C | Operator.cs:29:13:29:13 | access to local variable z : C | provenance | | +| Operator.cs:29:17:29:21 | call to operator + : C | Operator.cs:29:13:29:13 | access to local variable z : C | provenance | | +| Operator.cs:35:13:35:13 | access to local variable x : C | Operator.cs:37:27:37:27 | access to local variable x : C | provenance | | +| Operator.cs:35:13:35:13 | access to local variable x : C | Operator.cs:37:27:37:27 | access to local variable x : C | provenance | | +| Operator.cs:35:17:35:28 | call to method Source : C | Operator.cs:35:13:35:13 | access to local variable x : C | provenance | | +| Operator.cs:35:17:35:28 | call to method Source : C | Operator.cs:35:13:35:13 | access to local variable x : C | provenance | | +| Operator.cs:37:13:37:13 | access to local variable z : C | Operator.cs:38:14:38:14 | access to local variable z | provenance | | +| Operator.cs:37:13:37:13 | access to local variable z : C | Operator.cs:38:14:38:14 | access to local variable z | provenance | | | Operator.cs:37:27:37:27 | access to local variable x : C | Operator.cs:19:38:19:38 | x : C | provenance | | | Operator.cs:37:27:37:27 | access to local variable x : C | Operator.cs:19:38:19:38 | x : C | provenance | | | Operator.cs:37:27:37:27 | access to local variable x : C | Operator.cs:37:27:37:31 | call to operator - : C | provenance | | | Operator.cs:37:27:37:27 | access to local variable x : C | Operator.cs:37:27:37:31 | call to operator - : C | provenance | | -| Operator.cs:37:27:37:31 | call to operator - : C | Operator.cs:38:14:38:14 | access to local variable z | provenance | | -| Operator.cs:37:27:37:31 | call to operator - : C | Operator.cs:38:14:38:14 | access to local variable z | provenance | | -| Operator.cs:44:17:44:28 | call to method Source : C | Operator.cs:45:29:45:29 | access to local variable y : C | provenance | | -| Operator.cs:44:17:44:28 | call to method Source : C | Operator.cs:45:29:45:29 | access to local variable y : C | provenance | | -| Operator.cs:45:25:45:29 | call to operator checked - : C | Operator.cs:46:14:46:14 | access to local variable z | provenance | | -| Operator.cs:45:25:45:29 | call to operator checked - : C | Operator.cs:46:14:46:14 | access to local variable z | provenance | | +| Operator.cs:37:27:37:31 | call to operator - : C | Operator.cs:37:13:37:13 | access to local variable z : C | provenance | | +| Operator.cs:37:27:37:31 | call to operator - : C | Operator.cs:37:13:37:13 | access to local variable z : C | provenance | | +| Operator.cs:44:13:44:13 | access to local variable y : C | Operator.cs:45:29:45:29 | access to local variable y : C | provenance | | +| Operator.cs:44:13:44:13 | access to local variable y : C | Operator.cs:45:29:45:29 | access to local variable y : C | provenance | | +| Operator.cs:44:17:44:28 | call to method Source : C | Operator.cs:44:13:44:13 | access to local variable y : C | provenance | | +| Operator.cs:44:17:44:28 | call to method Source : C | Operator.cs:44:13:44:13 | access to local variable y : C | provenance | | +| Operator.cs:45:13:45:13 | access to local variable z : C | Operator.cs:46:14:46:14 | access to local variable z | provenance | | +| Operator.cs:45:13:45:13 | access to local variable z : C | Operator.cs:46:14:46:14 | access to local variable z | provenance | | +| Operator.cs:45:25:45:29 | call to operator checked - : C | Operator.cs:45:13:45:13 | access to local variable z : C | provenance | | +| Operator.cs:45:25:45:29 | call to operator checked - : C | Operator.cs:45:13:45:13 | access to local variable z : C | provenance | | | Operator.cs:45:29:45:29 | access to local variable y : C | Operator.cs:18:51:18:51 | y : C | provenance | | | Operator.cs:45:29:45:29 | access to local variable y : C | Operator.cs:18:51:18:51 | y : C | provenance | | | Operator.cs:45:29:45:29 | access to local variable y : C | Operator.cs:45:25:45:29 | call to operator checked - : C | provenance | | | Operator.cs:45:29:45:29 | access to local variable y : C | Operator.cs:45:25:45:29 | call to operator checked - : C | provenance | | | Operator.cs:49:28:49:28 | x : C | Operator.cs:51:17:51:17 | access to parameter x : C | provenance | | | Operator.cs:49:28:49:28 | x : C | Operator.cs:51:17:51:17 | access to parameter x : C | provenance | | +| Operator.cs:51:13:51:13 | access to local variable z : C | Operator.cs:52:14:52:14 | (...) ... | provenance | | +| Operator.cs:51:13:51:13 | access to local variable z : C | Operator.cs:52:14:52:14 | (...) ... | provenance | | | Operator.cs:51:17:51:17 | access to parameter x : C | Operator.cs:9:39:9:39 | x : C | provenance | | | Operator.cs:51:17:51:17 | access to parameter x : C | Operator.cs:9:39:9:39 | x : C | provenance | | | Operator.cs:51:17:51:17 | access to parameter x : C | Operator.cs:51:17:51:21 | call to operator * : C | provenance | | | Operator.cs:51:17:51:17 | access to parameter x : C | Operator.cs:51:17:51:21 | call to operator * : C | provenance | | -| Operator.cs:51:17:51:21 | call to operator * : C | Operator.cs:52:14:52:14 | (...) ... | provenance | | -| Operator.cs:51:17:51:21 | call to operator * : C | Operator.cs:52:14:52:14 | (...) ... | provenance | | -| Operator.cs:57:17:57:28 | call to method Source : C | Operator.cs:59:15:59:15 | access to local variable x : C | provenance | | -| Operator.cs:57:17:57:28 | call to method Source : C | Operator.cs:59:15:59:15 | access to local variable x : C | provenance | | +| Operator.cs:51:17:51:21 | call to operator * : C | Operator.cs:51:13:51:13 | access to local variable z : C | provenance | | +| Operator.cs:51:17:51:21 | call to operator * : C | Operator.cs:51:13:51:13 | access to local variable z : C | provenance | | +| Operator.cs:57:13:57:13 | access to local variable x : C | Operator.cs:59:15:59:15 | access to local variable x : C | provenance | | +| Operator.cs:57:13:57:13 | access to local variable x : C | Operator.cs:59:15:59:15 | access to local variable x : C | provenance | | +| Operator.cs:57:17:57:28 | call to method Source : C | Operator.cs:57:13:57:13 | access to local variable x : C | provenance | | +| Operator.cs:57:17:57:28 | call to method Source : C | Operator.cs:57:13:57:13 | access to local variable x : C | provenance | | | Operator.cs:59:15:59:15 | access to local variable x : C | Operator.cs:49:28:49:28 | x : C | provenance | | | Operator.cs:59:15:59:15 | access to local variable x : C | Operator.cs:49:28:49:28 | x : C | provenance | | | Operator.cs:62:33:62:33 | y : C | Operator.cs:64:21:64:21 | access to parameter y : C | provenance | | | Operator.cs:62:33:62:33 | y : C | Operator.cs:64:21:64:21 | access to parameter y : C | provenance | | -| Operator.cs:64:17:64:21 | call to operator / : C | Operator.cs:65:14:65:14 | (...) ... | provenance | | -| Operator.cs:64:17:64:21 | call to operator / : C | Operator.cs:65:14:65:14 | (...) ... | provenance | | +| Operator.cs:64:13:64:13 | access to local variable z : C | Operator.cs:65:14:65:14 | (...) ... | provenance | | +| Operator.cs:64:13:64:13 | access to local variable z : C | Operator.cs:65:14:65:14 | (...) ... | provenance | | +| Operator.cs:64:17:64:21 | call to operator / : C | Operator.cs:64:13:64:13 | access to local variable z : C | provenance | | +| Operator.cs:64:17:64:21 | call to operator / : C | Operator.cs:64:13:64:13 | access to local variable z : C | provenance | | | Operator.cs:64:21:64:21 | access to parameter y : C | Operator.cs:21:43:21:43 | y : C | provenance | | | Operator.cs:64:21:64:21 | access to parameter y : C | Operator.cs:21:43:21:43 | y : C | provenance | | | Operator.cs:64:21:64:21 | access to parameter y : C | Operator.cs:64:17:64:21 | call to operator / : C | provenance | | | Operator.cs:64:21:64:21 | access to parameter y : C | Operator.cs:64:17:64:21 | call to operator / : C | provenance | | -| Operator.cs:71:17:71:29 | call to method Source : C | Operator.cs:72:18:72:18 | access to local variable y : C | provenance | | -| Operator.cs:71:17:71:29 | call to method Source : C | Operator.cs:72:18:72:18 | access to local variable y : C | provenance | | +| Operator.cs:71:13:71:13 | access to local variable y : C | Operator.cs:72:18:72:18 | access to local variable y : C | provenance | | +| Operator.cs:71:13:71:13 | access to local variable y : C | Operator.cs:72:18:72:18 | access to local variable y : C | provenance | | +| Operator.cs:71:17:71:29 | call to method Source : C | Operator.cs:71:13:71:13 | access to local variable y : C | provenance | | +| Operator.cs:71:17:71:29 | call to method Source : C | Operator.cs:71:13:71:13 | access to local variable y : C | provenance | | | Operator.cs:72:18:72:18 | access to local variable y : C | Operator.cs:62:33:62:33 | y : C | provenance | | | Operator.cs:72:18:72:18 | access to local variable y : C | Operator.cs:62:33:62:33 | y : C | provenance | | | Operator.cs:75:33:75:33 | y : C | Operator.cs:77:29:77:29 | access to parameter y : C | provenance | | | Operator.cs:75:33:75:33 | y : C | Operator.cs:77:29:77:29 | access to parameter y : C | provenance | | -| Operator.cs:77:25:77:29 | call to operator checked / : C | Operator.cs:78:14:78:14 | (...) ... | provenance | | -| Operator.cs:77:25:77:29 | call to operator checked / : C | Operator.cs:78:14:78:14 | (...) ... | provenance | | +| Operator.cs:77:13:77:13 | access to local variable z : C | Operator.cs:78:14:78:14 | (...) ... | provenance | | +| Operator.cs:77:13:77:13 | access to local variable z : C | Operator.cs:78:14:78:14 | (...) ... | provenance | | +| Operator.cs:77:25:77:29 | call to operator checked / : C | Operator.cs:77:13:77:13 | access to local variable z : C | provenance | | +| Operator.cs:77:25:77:29 | call to operator checked / : C | Operator.cs:77:13:77:13 | access to local variable z : C | provenance | | | Operator.cs:77:29:77:29 | access to parameter y : C | Operator.cs:22:51:22:51 | y : C | provenance | | | Operator.cs:77:29:77:29 | access to parameter y : C | Operator.cs:22:51:22:51 | y : C | provenance | | | Operator.cs:77:29:77:29 | access to parameter y : C | Operator.cs:77:25:77:29 | call to operator checked / : C | provenance | | | Operator.cs:77:29:77:29 | access to parameter y : C | Operator.cs:77:25:77:29 | call to operator checked / : C | provenance | | -| Operator.cs:84:17:84:29 | call to method Source : C | Operator.cs:85:18:85:18 | access to local variable y : C | provenance | | -| Operator.cs:84:17:84:29 | call to method Source : C | Operator.cs:85:18:85:18 | access to local variable y : C | provenance | | +| Operator.cs:84:13:84:13 | access to local variable y : C | Operator.cs:85:18:85:18 | access to local variable y : C | provenance | | +| Operator.cs:84:13:84:13 | access to local variable y : C | Operator.cs:85:18:85:18 | access to local variable y : C | provenance | | +| Operator.cs:84:17:84:29 | call to method Source : C | Operator.cs:84:13:84:13 | access to local variable y : C | provenance | | +| Operator.cs:84:17:84:29 | call to method Source : C | Operator.cs:84:13:84:13 | access to local variable y : C | provenance | | | Operator.cs:85:18:85:18 | access to local variable y : C | Operator.cs:75:33:75:33 | y : C | provenance | | | Operator.cs:85:18:85:18 | access to local variable y : C | Operator.cs:75:33:75:33 | y : C | provenance | | nodes @@ -97,24 +121,36 @@ nodes | Operator.cs:22:51:22:51 | y : C | semmle.label | y : C | | Operator.cs:22:57:22:57 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:22:57:22:57 | access to parameter y : C | semmle.label | access to parameter y : C | +| Operator.cs:27:13:27:13 | access to local variable x : C | semmle.label | access to local variable x : C | +| Operator.cs:27:13:27:13 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:27:17:27:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:27:17:27:28 | call to method Source : C | semmle.label | call to method Source : C | +| Operator.cs:29:13:29:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:29:13:29:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:29:17:29:17 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:29:17:29:17 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:29:17:29:21 | call to operator + : C | semmle.label | call to operator + : C | | Operator.cs:29:17:29:21 | call to operator + : C | semmle.label | call to operator + : C | | Operator.cs:30:14:30:14 | access to local variable z | semmle.label | access to local variable z | | Operator.cs:30:14:30:14 | access to local variable z | semmle.label | access to local variable z | +| Operator.cs:35:13:35:13 | access to local variable x : C | semmle.label | access to local variable x : C | +| Operator.cs:35:13:35:13 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:35:17:35:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:35:17:35:28 | call to method Source : C | semmle.label | call to method Source : C | +| Operator.cs:37:13:37:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:37:13:37:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:37:27:37:27 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:37:27:37:27 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:37:27:37:31 | call to operator - : C | semmle.label | call to operator - : C | | Operator.cs:37:27:37:31 | call to operator - : C | semmle.label | call to operator - : C | | Operator.cs:38:14:38:14 | access to local variable z | semmle.label | access to local variable z | | Operator.cs:38:14:38:14 | access to local variable z | semmle.label | access to local variable z | +| Operator.cs:44:13:44:13 | access to local variable y : C | semmle.label | access to local variable y : C | +| Operator.cs:44:13:44:13 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:44:17:44:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:44:17:44:28 | call to method Source : C | semmle.label | call to method Source : C | +| Operator.cs:45:13:45:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:45:13:45:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:45:25:45:29 | call to operator checked - : C | semmle.label | call to operator checked - : C | | Operator.cs:45:25:45:29 | call to operator checked - : C | semmle.label | call to operator checked - : C | | Operator.cs:45:29:45:29 | access to local variable y : C | semmle.label | access to local variable y : C | @@ -123,36 +159,48 @@ nodes | Operator.cs:46:14:46:14 | access to local variable z | semmle.label | access to local variable z | | Operator.cs:49:28:49:28 | x : C | semmle.label | x : C | | Operator.cs:49:28:49:28 | x : C | semmle.label | x : C | +| Operator.cs:51:13:51:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:51:13:51:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:51:17:51:17 | access to parameter x : C | semmle.label | access to parameter x : C | | Operator.cs:51:17:51:17 | access to parameter x : C | semmle.label | access to parameter x : C | | Operator.cs:51:17:51:21 | call to operator * : C | semmle.label | call to operator * : C | | Operator.cs:51:17:51:21 | call to operator * : C | semmle.label | call to operator * : C | | Operator.cs:52:14:52:14 | (...) ... | semmle.label | (...) ... | | Operator.cs:52:14:52:14 | (...) ... | semmle.label | (...) ... | +| Operator.cs:57:13:57:13 | access to local variable x : C | semmle.label | access to local variable x : C | +| Operator.cs:57:13:57:13 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:57:17:57:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:57:17:57:28 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:59:15:59:15 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:59:15:59:15 | access to local variable x : C | semmle.label | access to local variable x : C | | Operator.cs:62:33:62:33 | y : C | semmle.label | y : C | | Operator.cs:62:33:62:33 | y : C | semmle.label | y : C | +| Operator.cs:64:13:64:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:64:13:64:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:64:17:64:21 | call to operator / : C | semmle.label | call to operator / : C | | Operator.cs:64:17:64:21 | call to operator / : C | semmle.label | call to operator / : C | | Operator.cs:64:21:64:21 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:64:21:64:21 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:65:14:65:14 | (...) ... | semmle.label | (...) ... | | Operator.cs:65:14:65:14 | (...) ... | semmle.label | (...) ... | +| Operator.cs:71:13:71:13 | access to local variable y : C | semmle.label | access to local variable y : C | +| Operator.cs:71:13:71:13 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:71:17:71:29 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:71:17:71:29 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:72:18:72:18 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:72:18:72:18 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:75:33:75:33 | y : C | semmle.label | y : C | | Operator.cs:75:33:75:33 | y : C | semmle.label | y : C | +| Operator.cs:77:13:77:13 | access to local variable z : C | semmle.label | access to local variable z : C | +| Operator.cs:77:13:77:13 | access to local variable z : C | semmle.label | access to local variable z : C | | Operator.cs:77:25:77:29 | call to operator checked / : C | semmle.label | call to operator checked / : C | | Operator.cs:77:25:77:29 | call to operator checked / : C | semmle.label | call to operator checked / : C | | Operator.cs:77:29:77:29 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:77:29:77:29 | access to parameter y : C | semmle.label | access to parameter y : C | | Operator.cs:78:14:78:14 | (...) ... | semmle.label | (...) ... | | Operator.cs:78:14:78:14 | (...) ... | semmle.label | (...) ... | +| Operator.cs:84:13:84:13 | access to local variable y : C | semmle.label | access to local variable y : C | +| Operator.cs:84:13:84:13 | access to local variable y : C | semmle.label | access to local variable y : C | | Operator.cs:84:17:84:29 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:84:17:84:29 | call to method Source : C | semmle.label | call to method Source : C | | Operator.cs:85:18:85:18 | access to local variable y : C | semmle.label | access to local variable y : C | diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest1.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest1.expected index 2000a735bdb..9bcebb45caf 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest1.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest1.expected @@ -1,7 +1,8 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | @@ -11,6 +12,7 @@ nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest2.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest2.expected index 85243196a39..c436e675b99 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest2.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest2.expected @@ -1,23 +1,27 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:20:34:25 | access to local variable result : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:34:20:34:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:34:20:34:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:34:29:34:69 | call to method ExecuteQuery : String | semmle.label | call to method ExecuteQuery : String | | Test.cs:37:42:37:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest3.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest3.expected index a499529d57d..b6de356c3e9 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest3.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest3.expected @@ -1,29 +1,37 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:37:42:37:96 | ... + ... | provenance | | -| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:46:42:46:96 | ... + ... | provenance | | -| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:34:20:34:25 | access to local variable result : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:34:20:34:25 | access to local variable result : String | provenance | | +| Test.cs:43:20:43:25 | access to local variable result : String | Test.cs:46:42:46:96 | ... + ... | provenance | | +| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:43:20:43:25 | access to local variable result : String | provenance | | +| Test.cs:62:20:62:25 | access to local variable result : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:62:20:62:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:34:20:34:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:34:29:34:69 | call to method ExecuteQuery : String | semmle.label | call to method ExecuteQuery : String | | Test.cs:37:42:37:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:43:20:43:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:43:29:43:50 | call to method ReadEnv : String | semmle.label | call to method ReadEnv : String | | Test.cs:46:42:46:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:62:20:62:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:62:29:62:48 | call to method GetCliArg : String | semmle.label | call to method GetCliArg : String | | Test.cs:65:42:65:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest4.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest4.expected index 53b70178511..df99e1a39a5 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest4.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest4.expected @@ -1,32 +1,42 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:37:42:37:96 | ... + ... | provenance | | -| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:46:42:46:96 | ... + ... | provenance | | -| Test.cs:53:29:53:52 | call to method GetCustom : String | Test.cs:56:42:56:96 | ... + ... | provenance | | -| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:34:20:34:25 | access to local variable result : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:34:20:34:25 | access to local variable result : String | provenance | | +| Test.cs:43:20:43:25 | access to local variable result : String | Test.cs:46:42:46:96 | ... + ... | provenance | | +| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:43:20:43:25 | access to local variable result : String | provenance | | +| Test.cs:53:20:53:25 | access to local variable result : String | Test.cs:56:42:56:96 | ... + ... | provenance | | +| Test.cs:53:29:53:52 | call to method GetCustom : String | Test.cs:53:20:53:25 | access to local variable result : String | provenance | | +| Test.cs:62:20:62:25 | access to local variable result : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:62:20:62:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:34:20:34:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:34:29:34:69 | call to method ExecuteQuery : String | semmle.label | call to method ExecuteQuery : String | | Test.cs:37:42:37:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:43:20:43:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:43:29:43:50 | call to method ReadEnv : String | semmle.label | call to method ReadEnv : String | | Test.cs:46:42:46:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:53:20:53:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:53:29:53:52 | call to method GetCustom : String | semmle.label | call to method GetCustom : String | | Test.cs:56:42:56:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:62:20:62:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:62:29:62:48 | call to method GetCliArg : String | semmle.label | call to method GetCliArg : String | | Test.cs:65:42:65:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest5.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest5.expected index 184c4722f80..cf14d14c794 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest5.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest5.expected @@ -1,26 +1,32 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:46:42:46:96 | ... + ... | provenance | | -| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:43:20:43:25 | access to local variable result : String | Test.cs:46:42:46:96 | ... + ... | provenance | | +| Test.cs:43:29:43:50 | call to method ReadEnv : String | Test.cs:43:20:43:25 | access to local variable result : String | provenance | | +| Test.cs:62:20:62:25 | access to local variable result : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:62:20:62:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:43:20:43:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:43:29:43:50 | call to method ReadEnv : String | semmle.label | call to method ReadEnv : String | | Test.cs:46:42:46:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:62:20:62:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:62:29:62:48 | call to method GetCliArg : String | semmle.label | call to method GetCliArg : String | | Test.cs:65:42:65:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest6.expected b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest6.expected index 72271d08836..e1a6e62f492 100644 --- a/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest6.expected +++ b/csharp/ql/test/library-tests/dataflow/threat-models/threat-models-flowtest6.expected @@ -1,26 +1,32 @@ edges | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | provenance | | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | Test.cs:15:20:15:61 | call to method GetString : String | provenance | | -| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | provenance | | +| Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | provenance | | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | provenance | | | Test.cs:28:85:28:105 | call to method BytesToString : String | Test.cs:28:42:28:111 | ... + ... | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | provenance | | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | Test.cs:28:85:28:105 | call to method BytesToString : String | provenance | | -| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:37:42:37:96 | ... + ... | provenance | | -| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:34:20:34:25 | access to local variable result : String | Test.cs:37:42:37:96 | ... + ... | provenance | | +| Test.cs:34:29:34:69 | call to method ExecuteQuery : String | Test.cs:34:20:34:25 | access to local variable result : String | provenance | | +| Test.cs:62:20:62:25 | access to local variable result : String | Test.cs:65:42:65:96 | ... + ... | provenance | | +| Test.cs:62:29:62:48 | call to method GetCliArg : String | Test.cs:62:20:62:25 | access to local variable result : String | provenance | | nodes | Test.cs:12:45:12:49 | bytes : Byte[] [element] : Object | semmle.label | bytes : Byte[] [element] : Object | | Test.cs:15:20:15:61 | call to method GetString : String | semmle.label | call to method GetString : String | | Test.cs:15:56:15:60 | access to parameter bytes : Byte[] [element] : Object | semmle.label | access to parameter bytes : Byte[] [element] : Object | +| Test.cs:23:33:23:38 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:23:42:23:59 | call to method GetStream : NetworkStream | semmle.label | call to method GetStream : NetworkStream | | Test.cs:25:29:25:34 | access to local variable stream : NetworkStream | semmle.label | access to local variable stream : NetworkStream | | Test.cs:25:41:25:46 | [post] access to local variable buffer : Byte[] [element] : Object | semmle.label | [post] access to local variable buffer : Byte[] [element] : Object | | Test.cs:28:42:28:111 | ... + ... | semmle.label | ... + ... | | Test.cs:28:85:28:105 | call to method BytesToString : String | semmle.label | call to method BytesToString : String | | Test.cs:28:99:28:104 | access to local variable buffer : Byte[] [element] : Object | semmle.label | access to local variable buffer : Byte[] [element] : Object | +| Test.cs:34:20:34:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:34:29:34:69 | call to method ExecuteQuery : String | semmle.label | call to method ExecuteQuery : String | | Test.cs:37:42:37:96 | ... + ... | semmle.label | ... + ... | +| Test.cs:62:20:62:25 | access to local variable result : String | semmle.label | access to local variable result : String | | Test.cs:62:29:62:48 | call to method GetCliArg : String | semmle.label | call to method GetCliArg : String | | Test.cs:65:42:65:96 | ... + ... | semmle.label | ... + ... | subpaths diff --git a/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected index 7a3c03fb060..68a96fa6f5a 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected @@ -1,15 +1,21 @@ +| Tuples.cs:7:13:7:14 | access to local variable o1 | Tuples.cs:7:13:7:34 | SSA def(o1) | | Tuples.cs:7:13:7:34 | SSA def(o1) | Tuples.cs:10:21:10:22 | access to local variable o1 | -| Tuples.cs:7:18:7:34 | call to method Source | Tuples.cs:7:13:7:34 | SSA def(o1) | +| Tuples.cs:7:18:7:34 | call to method Source | Tuples.cs:7:13:7:14 | access to local variable o1 | | Tuples.cs:7:33:7:33 | 1 | Tuples.cs:7:33:7:33 | (...) ... | +| Tuples.cs:8:13:8:14 | access to local variable o2 | Tuples.cs:8:13:8:34 | SSA def(o2) | | Tuples.cs:8:13:8:34 | SSA def(o2) | Tuples.cs:10:29:10:30 | access to local variable o2 | -| Tuples.cs:8:18:8:34 | call to method Source | Tuples.cs:8:13:8:34 | SSA def(o2) | +| Tuples.cs:8:18:8:34 | call to method Source | Tuples.cs:8:13:8:14 | access to local variable o2 | | Tuples.cs:8:33:8:33 | 2 | Tuples.cs:8:33:8:33 | (...) ... | +| Tuples.cs:10:13:10:13 | access to local variable x | Tuples.cs:10:13:10:32 | SSA def(x) | | Tuples.cs:10:13:10:32 | SSA def(x) | Tuples.cs:11:27:11:27 | access to local variable x | | Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item1) | Tuples.cs:26:14:26:20 | access to field Item1 | | Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item2) | Tuples.cs:28:14:28:20 | access to field Item2 | | Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item2.Item1) | Tuples.cs:28:14:28:26 | access to field Item1 | | Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item2.Item2) | Tuples.cs:29:14:29:26 | access to field Item2 | -| Tuples.cs:10:17:10:32 | (..., ...) | Tuples.cs:10:13:10:32 | SSA def(x) | +| Tuples.cs:10:17:10:32 | (..., ...) | Tuples.cs:10:13:10:13 | access to local variable x | +| Tuples.cs:11:9:11:27 | ... = ... | Tuples.cs:11:9:11:27 | SSA def(a) | +| Tuples.cs:11:9:11:27 | ... = ... | Tuples.cs:11:9:11:27 | SSA def(b) | +| Tuples.cs:11:9:11:27 | ... = ... | Tuples.cs:11:9:11:27 | SSA def(c) | | Tuples.cs:11:9:11:27 | SSA def(a) | Tuples.cs:12:14:12:14 | access to local variable a | | Tuples.cs:11:9:11:27 | SSA def(b) | Tuples.cs:13:14:13:14 | access to local variable b | | Tuples.cs:11:9:11:27 | SSA def(c) | Tuples.cs:14:14:14:14 | access to local variable c | @@ -19,9 +25,14 @@ | Tuples.cs:16:9:16:23 | SSA def(a) | Tuples.cs:17:14:17:14 | access to local variable a | | Tuples.cs:16:9:16:23 | SSA def(b) | Tuples.cs:18:14:18:14 | access to local variable b | | Tuples.cs:16:9:16:23 | SSA def(c) | Tuples.cs:19:14:19:14 | access to local variable c | +| Tuples.cs:16:10:16:10 | access to local variable a | Tuples.cs:16:9:16:23 | SSA def(a) | +| Tuples.cs:16:14:16:14 | access to local variable b | Tuples.cs:16:9:16:23 | SSA def(b) | +| Tuples.cs:16:17:16:17 | access to local variable c | Tuples.cs:16:9:16:23 | SSA def(c) | | Tuples.cs:16:23:16:23 | access to local variable x | Tuples.cs:16:9:16:19 | (..., ...) | | Tuples.cs:16:23:16:23 | access to local variable x | Tuples.cs:21:26:21:26 | access to local variable x | | Tuples.cs:18:14:18:14 | access to local variable b | Tuples.cs:18:14:18:14 | (...) ... | +| Tuples.cs:21:9:21:26 | ... = ... | Tuples.cs:21:9:21:26 | SSA def(p) | +| Tuples.cs:21:9:21:26 | ... = ... | Tuples.cs:21:9:21:26 | SSA def(q) | | Tuples.cs:21:9:21:26 | SSA def(p) | Tuples.cs:22:14:22:14 | access to local variable p | | Tuples.cs:21:9:21:26 | SSA def(q) | Tuples.cs:23:14:23:14 | access to local variable q | | Tuples.cs:21:9:21:26 | SSA qualifier def(q.Item1) | Tuples.cs:23:14:23:20 | access to field Item1 | @@ -39,55 +50,65 @@ | Tuples.cs:28:14:28:14 | access to local variable x | Tuples.cs:29:14:29:14 | access to local variable x | | Tuples.cs:28:14:28:20 | access to field Item2 | Tuples.cs:29:14:29:20 | access to field Item2 | | Tuples.cs:28:14:28:26 | access to field Item1 | Tuples.cs:28:14:28:26 | (...) ... | +| Tuples.cs:34:13:34:14 | access to local variable o1 | Tuples.cs:34:13:34:34 | SSA def(o1) | | Tuples.cs:34:13:34:34 | SSA def(o1) | Tuples.cs:37:18:37:19 | access to local variable o1 | -| Tuples.cs:34:18:34:34 | call to method Source | Tuples.cs:34:13:34:34 | SSA def(o1) | +| Tuples.cs:34:18:34:34 | call to method Source | Tuples.cs:34:13:34:14 | access to local variable o1 | | Tuples.cs:34:33:34:33 | 3 | Tuples.cs:34:33:34:33 | (...) ... | +| Tuples.cs:35:13:35:14 | access to local variable o2 | Tuples.cs:35:13:35:34 | SSA def(o2) | | Tuples.cs:35:13:35:34 | SSA def(o2) | Tuples.cs:37:46:37:47 | access to local variable o2 | -| Tuples.cs:35:18:35:34 | call to method Source | Tuples.cs:35:13:35:34 | SSA def(o2) | +| Tuples.cs:35:18:35:34 | call to method Source | Tuples.cs:35:13:35:14 | access to local variable o2 | | Tuples.cs:35:33:35:33 | 4 | Tuples.cs:35:33:35:33 | (...) ... | +| Tuples.cs:37:13:37:13 | access to local variable x | Tuples.cs:37:13:37:48 | SSA def(x) | | Tuples.cs:37:13:37:48 | SSA def(x) | Tuples.cs:38:14:38:14 | access to local variable x | | Tuples.cs:37:13:37:48 | SSA qualifier def(x.Item1) | Tuples.cs:38:14:38:20 | access to field Item1 | | Tuples.cs:37:13:37:48 | SSA qualifier def(x.Item2) | Tuples.cs:39:14:39:20 | access to field Item2 | | Tuples.cs:37:13:37:48 | SSA qualifier def(x.Item10) | Tuples.cs:40:14:40:21 | access to field Item10 | -| Tuples.cs:37:17:37:48 | (..., ...) | Tuples.cs:37:13:37:48 | SSA def(x) | +| Tuples.cs:37:17:37:48 | (..., ...) | Tuples.cs:37:13:37:13 | access to local variable x | | Tuples.cs:38:14:38:14 | [post] access to local variable x | Tuples.cs:39:14:39:14 | access to local variable x | | Tuples.cs:38:14:38:14 | access to local variable x | Tuples.cs:39:14:39:14 | access to local variable x | | Tuples.cs:39:14:39:14 | access to local variable x | Tuples.cs:40:14:40:14 | access to local variable x | | Tuples.cs:39:14:39:20 | access to field Item2 | Tuples.cs:39:14:39:20 | (...) ... | +| Tuples.cs:45:13:45:13 | access to local variable o | Tuples.cs:45:13:45:33 | SSA def(o) | | Tuples.cs:45:13:45:33 | SSA def(o) | Tuples.cs:46:48:46:48 | access to local variable o | -| Tuples.cs:45:17:45:33 | call to method Source | Tuples.cs:45:13:45:33 | SSA def(o) | +| Tuples.cs:45:17:45:33 | call to method Source | Tuples.cs:45:13:45:13 | access to local variable o | | Tuples.cs:45:32:45:32 | 5 | Tuples.cs:45:32:45:32 | (...) ... | +| Tuples.cs:46:13:46:13 | access to local variable x | Tuples.cs:46:13:46:55 | SSA def(x) | | Tuples.cs:46:13:46:55 | SSA def(x) | Tuples.cs:47:14:47:14 | access to local variable x | | Tuples.cs:46:13:46:55 | SSA qualifier def(x.Item1) | Tuples.cs:47:14:47:20 | access to field Item1 | | Tuples.cs:46:13:46:55 | SSA qualifier def(x.Item2) | Tuples.cs:48:14:48:20 | access to field Item2 | -| Tuples.cs:46:17:46:55 | (...) ... | Tuples.cs:46:13:46:55 | SSA def(x) | +| Tuples.cs:46:17:46:55 | (...) ... | Tuples.cs:46:13:46:13 | access to local variable x | | Tuples.cs:46:47:46:55 | (..., ...) | Tuples.cs:46:17:46:55 | (...) ... | | Tuples.cs:46:48:46:48 | access to local variable o | Tuples.cs:50:48:50:48 | access to local variable o | | Tuples.cs:47:14:47:14 | [post] access to local variable x | Tuples.cs:48:14:48:14 | access to local variable x | | Tuples.cs:47:14:47:14 | access to local variable x | Tuples.cs:48:14:48:14 | access to local variable x | | Tuples.cs:48:14:48:20 | access to field Item2 | Tuples.cs:48:14:48:20 | (...) ... | +| Tuples.cs:50:13:50:13 | access to local variable y | Tuples.cs:50:13:50:55 | SSA def(y) | | Tuples.cs:50:13:50:55 | SSA def(y) | Tuples.cs:51:14:51:14 | access to local variable y | | Tuples.cs:50:13:50:55 | SSA qualifier def(y.Item1) | Tuples.cs:51:14:51:20 | access to field Item1 | | Tuples.cs:50:13:50:55 | SSA qualifier def(y.Item2) | Tuples.cs:52:14:52:20 | access to field Item2 | -| Tuples.cs:50:17:50:55 | (...) ... | Tuples.cs:50:13:50:55 | SSA def(y) | +| Tuples.cs:50:17:50:55 | (...) ... | Tuples.cs:50:13:50:13 | access to local variable y | | Tuples.cs:50:47:50:55 | (...) ... | Tuples.cs:50:17:50:55 | (...) ... | | Tuples.cs:50:47:50:55 | (..., ...) | Tuples.cs:50:47:50:55 | (...) ... | | Tuples.cs:51:14:51:14 | [post] access to local variable y | Tuples.cs:52:14:52:14 | access to local variable y | | Tuples.cs:51:14:51:14 | access to local variable y | Tuples.cs:52:14:52:14 | access to local variable y | | Tuples.cs:52:14:52:20 | access to field Item2 | Tuples.cs:52:14:52:20 | (...) ... | | Tuples.cs:55:27:55:27 | s | Tuples.cs:75:18:75:18 | access to parameter s | +| Tuples.cs:57:13:57:14 | access to local variable o1 | Tuples.cs:57:13:57:34 | SSA def(o1) | | Tuples.cs:57:13:57:34 | SSA def(o1) | Tuples.cs:59:18:59:19 | access to local variable o1 | -| Tuples.cs:57:18:57:34 | call to method Source | Tuples.cs:57:13:57:34 | SSA def(o1) | +| Tuples.cs:57:18:57:34 | call to method Source | Tuples.cs:57:13:57:14 | access to local variable o1 | | Tuples.cs:57:33:57:33 | 6 | Tuples.cs:57:33:57:33 | (...) ... | +| Tuples.cs:58:13:58:14 | access to local variable o2 | Tuples.cs:58:13:58:34 | SSA def(o2) | | Tuples.cs:58:13:58:34 | SSA def(o2) | Tuples.cs:59:26:59:27 | access to local variable o2 | -| Tuples.cs:58:18:58:34 | call to method Source | Tuples.cs:58:13:58:34 | SSA def(o2) | +| Tuples.cs:58:18:58:34 | call to method Source | Tuples.cs:58:13:58:14 | access to local variable o2 | | Tuples.cs:58:33:58:33 | 7 | Tuples.cs:58:33:58:33 | (...) ... | +| Tuples.cs:59:13:59:13 | access to local variable x | Tuples.cs:59:13:59:32 | SSA def(x) | | Tuples.cs:59:13:59:32 | SSA def(x) | Tuples.cs:60:17:60:17 | access to local variable x | -| Tuples.cs:59:17:59:32 | (..., ...) | Tuples.cs:59:13:59:32 | SSA def(x) | -| Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:62:18:62:57 | SSA def(t) | +| Tuples.cs:59:17:59:32 | (..., ...) | Tuples.cs:59:13:59:13 | access to local variable x | +| Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:62:18:62:57 | (String,(Int32,String),Int32) t | | Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:67:18:67:35 | (..., ...) | | Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:67:18:67:35 | (..., ...) | | Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:87:13:87:13 | access to local variable x | +| Tuples.cs:62:18:62:57 | (String,(Int32,String),Int32) t | Tuples.cs:62:18:62:57 | SSA def(t) | | Tuples.cs:62:18:62:57 | SSA def(t) | Tuples.cs:62:64:62:64 | access to local variable t | | Tuples.cs:62:18:62:57 | SSA qualifier def(t.Item1) | Tuples.cs:63:22:63:28 | access to field Item1 | | Tuples.cs:62:18:62:57 | SSA qualifier def(t.Item2) | Tuples.cs:64:22:64:28 | access to field Item2 | @@ -103,24 +124,32 @@ | Tuples.cs:64:22:64:28 | access to field Item2 | Tuples.cs:65:22:65:28 | access to field Item2 | | Tuples.cs:65:22:65:34 | access to field Item1 | Tuples.cs:65:22:65:34 | (...) ... | | Tuples.cs:67:23:67:23 | SSA def(a) | Tuples.cs:68:22:68:22 | access to local variable a | +| Tuples.cs:67:23:67:23 | String a | Tuples.cs:67:23:67:23 | SSA def(a) | +| Tuples.cs:67:27:67:27 | Int32 b | Tuples.cs:67:27:67:27 | SSA def(b) | | Tuples.cs:67:27:67:27 | SSA def(b) | Tuples.cs:70:22:70:22 | access to local variable b | | Tuples.cs:67:30:67:30 | SSA def(c) | Tuples.cs:69:22:69:22 | access to local variable c | +| Tuples.cs:67:30:67:30 | String c | Tuples.cs:67:30:67:30 | SSA def(c) | | Tuples.cs:70:22:70:22 | access to local variable b | Tuples.cs:70:22:70:22 | (...) ... | +| Tuples.cs:74:13:74:14 | access to local variable o3 | Tuples.cs:74:13:74:34 | SSA def(o3) | | Tuples.cs:74:13:74:34 | SSA def(o3) | Tuples.cs:78:51:78:52 | access to local variable o3 | -| Tuples.cs:74:18:74:34 | call to method Source | Tuples.cs:74:13:74:34 | SSA def(o3) | +| Tuples.cs:74:18:74:34 | call to method Source | Tuples.cs:74:13:74:14 | access to local variable o3 | | Tuples.cs:74:33:74:33 | 8 | Tuples.cs:74:33:74:33 | (...) ... | +| Tuples.cs:75:13:75:13 | access to local variable y | Tuples.cs:75:13:75:30 | SSA def(y) | | Tuples.cs:75:13:75:30 | SSA def(y) | Tuples.cs:76:17:76:17 | access to local variable y | | Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item1) | Tuples.cs:79:22:79:28 | access to field Item1 | | Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item2) | Tuples.cs:80:22:80:28 | access to field Item2 | | Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item2.Item1) | Tuples.cs:82:22:82:34 | access to field Item1 | | Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item2.Item2) | Tuples.cs:80:22:80:34 | access to field Item2 | -| Tuples.cs:75:17:75:30 | (..., ...) | Tuples.cs:75:13:75:30 | SSA def(y) | +| Tuples.cs:75:17:75:30 | (..., ...) | Tuples.cs:75:13:75:13 | access to local variable y | | Tuples.cs:75:18:75:18 | access to parameter s | Tuples.cs:75:25:75:25 | access to parameter s | | Tuples.cs:76:17:76:17 | access to local variable y | Tuples.cs:78:26:78:35 | (..., ...) | | Tuples.cs:76:17:76:17 | access to local variable y | Tuples.cs:79:22:79:22 | access to local variable y | | Tuples.cs:78:19:78:23 | SSA def(a) | Tuples.cs:78:46:78:46 | access to local variable a | +| Tuples.cs:78:19:78:23 | String a | Tuples.cs:78:19:78:23 | SSA def(a) | +| Tuples.cs:78:31:78:31 | Int32 b | Tuples.cs:78:31:78:31 | SSA def(b) | | Tuples.cs:78:31:78:31 | SSA def(b) | Tuples.cs:83:22:83:22 | access to local variable b | | Tuples.cs:78:34:78:34 | SSA def(c) | Tuples.cs:81:22:81:22 | access to local variable c | +| Tuples.cs:78:34:78:34 | String c | Tuples.cs:78:34:78:34 | SSA def(c) | | Tuples.cs:79:22:79:22 | [post] access to local variable y | Tuples.cs:80:22:80:22 | access to local variable y | | Tuples.cs:79:22:79:22 | access to local variable y | Tuples.cs:80:22:80:22 | access to local variable y | | Tuples.cs:80:22:80:22 | [post] access to local variable y | Tuples.cs:82:22:82:22 | access to local variable y | @@ -132,20 +161,27 @@ | Tuples.cs:87:13:87:13 | access to local variable x | Tuples.cs:87:18:87:35 | (..., ...) | | Tuples.cs:87:13:87:13 | access to local variable x | Tuples.cs:87:18:87:35 | (..., ...) | | Tuples.cs:87:23:87:23 | SSA def(p) | Tuples.cs:89:18:89:18 | access to local variable p | +| Tuples.cs:87:23:87:23 | String p | Tuples.cs:87:23:87:23 | SSA def(p) | +| Tuples.cs:87:27:87:27 | Int32 q | Tuples.cs:87:27:87:27 | SSA def(q) | | Tuples.cs:87:27:87:27 | SSA def(q) | Tuples.cs:91:18:91:18 | access to local variable q | | Tuples.cs:87:30:87:30 | SSA def(r) | Tuples.cs:90:18:90:18 | access to local variable r | +| Tuples.cs:87:30:87:30 | String r | Tuples.cs:87:30:87:30 | SSA def(r) | | Tuples.cs:91:18:91:18 | access to local variable q | Tuples.cs:91:18:91:18 | (...) ... | | Tuples.cs:95:12:95:13 | this | Tuples.cs:95:22:95:22 | this | | Tuples.cs:95:22:95:22 | [post] this | Tuples.cs:95:29:95:29 | this | | Tuples.cs:95:22:95:22 | this | Tuples.cs:95:29:95:29 | this | +| Tuples.cs:99:13:99:13 | access to local variable o | Tuples.cs:99:13:99:33 | SSA def(o) | | Tuples.cs:99:13:99:33 | SSA def(o) | Tuples.cs:100:24:100:24 | access to local variable o | -| Tuples.cs:99:17:99:33 | call to method Source | Tuples.cs:99:13:99:33 | SSA def(o) | +| Tuples.cs:99:17:99:33 | call to method Source | Tuples.cs:99:13:99:13 | access to local variable o | | Tuples.cs:99:32:99:32 | 9 | Tuples.cs:99:32:99:32 | (...) ... | +| Tuples.cs:100:13:100:13 | access to local variable r | Tuples.cs:100:13:100:28 | SSA def(r) | | Tuples.cs:100:13:100:28 | SSA def(r) | Tuples.cs:101:14:101:14 | access to local variable r | | Tuples.cs:100:13:100:28 | SSA qualifier def(r.i) | Tuples.cs:101:14:101:16 | access to property i | -| Tuples.cs:100:17:100:28 | object creation of type R1 | Tuples.cs:100:13:100:28 | SSA def(r) | +| Tuples.cs:100:17:100:28 | object creation of type R1 | Tuples.cs:100:13:100:13 | access to local variable r | | Tuples.cs:101:14:101:14 | [post] access to local variable r | Tuples.cs:103:22:103:22 | access to local variable r | | Tuples.cs:101:14:101:14 | access to local variable r | Tuples.cs:103:22:103:22 | access to local variable r | +| Tuples.cs:103:9:103:22 | ... = ... | Tuples.cs:103:9:103:22 | SSA def(a) | +| Tuples.cs:103:9:103:22 | ... = ... | Tuples.cs:103:9:103:22 | SSA def(b) | | Tuples.cs:103:9:103:22 | SSA def(a) | Tuples.cs:104:14:104:14 | access to local variable a | | Tuples.cs:103:9:103:22 | SSA def(b) | Tuples.cs:105:14:105:14 | access to local variable b | | Tuples.cs:103:22:103:22 | access to local variable r | Tuples.cs:103:9:103:18 | (..., ...) | @@ -153,23 +189,38 @@ | Tuples.cs:105:14:105:14 | access to local variable b | Tuples.cs:105:14:105:14 | (...) ... | | Tuples.cs:107:17:107:17 | access to local variable r | Tuples.cs:109:18:109:27 | (..., ...) | | Tuples.cs:109:23:109:23 | SSA def(x) | Tuples.cs:110:22:110:22 | access to local variable x | +| Tuples.cs:109:23:109:23 | String x | Tuples.cs:109:23:109:23 | SSA def(x) | +| Tuples.cs:109:26:109:26 | Int32 y | Tuples.cs:109:26:109:26 | SSA def(y) | | Tuples.cs:109:26:109:26 | SSA def(y) | Tuples.cs:111:22:111:22 | access to local variable y | | Tuples.cs:111:22:111:22 | access to local variable y | Tuples.cs:111:22:111:22 | (...) ... | +| Tuples.cs:118:13:118:13 | access to local variable o | Tuples.cs:118:13:118:33 | SSA def(o) | | Tuples.cs:118:13:118:33 | SSA def(o) | Tuples.cs:121:28:121:28 | access to local variable o | -| Tuples.cs:118:17:118:33 | call to method Source | Tuples.cs:118:13:118:33 | SSA def(o) | +| Tuples.cs:118:17:118:33 | call to method Source | Tuples.cs:118:13:118:13 | access to local variable o | | Tuples.cs:118:32:118:32 | 9 | Tuples.cs:118:32:118:32 | (...) ... | +| Tuples.cs:120:18:120:18 | 0 | Tuples.cs:120:13:120:14 | access to local variable y1 | +| Tuples.cs:121:9:121:32 | ... = ... | Tuples.cs:121:9:121:32 | SSA def(x1) | | Tuples.cs:121:9:121:32 | SSA def(x1) | Tuples.cs:122:14:122:15 | access to local variable x1 | | Tuples.cs:121:27:121:32 | (..., ...) | Tuples.cs:121:9:121:23 | (..., ...) | -| Tuples.cs:121:28:121:28 | access to local variable o | Tuples.cs:121:9:121:32 | SSA def(x1) | +| Tuples.cs:121:28:121:28 | access to local variable o | Tuples.cs:121:9:121:32 | ... = ... | | Tuples.cs:121:28:121:28 | access to local variable o | Tuples.cs:125:25:125:25 | access to local variable o | +| Tuples.cs:121:31:121:31 | 1 | Tuples.cs:121:21:121:22 | access to local variable y1 | +| Tuples.cs:124:18:124:29 | object creation of type Object | Tuples.cs:124:13:124:14 | access to local variable x2 | | Tuples.cs:125:9:125:29 | SSA def(x2) | Tuples.cs:126:14:126:15 | access to local variable x2 | +| Tuples.cs:125:10:125:11 | access to local variable x2 | Tuples.cs:125:9:125:29 | SSA def(x2) | | Tuples.cs:125:24:125:29 | (..., ...) | Tuples.cs:125:9:125:20 | (..., ...) | -| Tuples.cs:125:25:125:25 | access to local variable o | Tuples.cs:125:9:125:29 | SSA def(x2) | +| Tuples.cs:125:25:125:25 | access to local variable o | Tuples.cs:125:10:125:11 | access to local variable x2 | | Tuples.cs:125:25:125:25 | access to local variable o | Tuples.cs:129:31:129:31 | access to local variable o | +| Tuples.cs:125:28:125:28 | 1 | Tuples.cs:125:9:125:29 | ... = ... | +| Tuples.cs:128:18:128:18 | 0 | Tuples.cs:128:13:128:14 | access to local variable x3 | +| Tuples.cs:129:9:129:32 | ... = ... | Tuples.cs:129:9:129:32 | SSA def(y3) | | Tuples.cs:129:9:129:32 | SSA def(y3) | Tuples.cs:130:14:130:15 | access to local variable y3 | | Tuples.cs:129:27:129:32 | (..., ...) | Tuples.cs:129:9:129:23 | (..., ...) | -| Tuples.cs:129:31:129:31 | access to local variable o | Tuples.cs:129:9:129:32 | SSA def(y3) | +| Tuples.cs:129:28:129:28 | 1 | Tuples.cs:129:10:129:11 | access to local variable x3 | +| Tuples.cs:129:31:129:31 | access to local variable o | Tuples.cs:129:9:129:32 | ... = ... | | Tuples.cs:129:31:129:31 | access to local variable o | Tuples.cs:133:28:133:28 | access to local variable o | +| Tuples.cs:132:18:132:29 | object creation of type Object | Tuples.cs:132:13:132:14 | access to local variable y4 | | Tuples.cs:133:9:133:29 | SSA def(y4) | Tuples.cs:134:14:134:15 | access to local variable y4 | +| Tuples.cs:133:18:133:19 | access to local variable y4 | Tuples.cs:133:9:133:29 | SSA def(y4) | | Tuples.cs:133:24:133:29 | (..., ...) | Tuples.cs:133:9:133:20 | (..., ...) | -| Tuples.cs:133:28:133:28 | access to local variable o | Tuples.cs:133:9:133:29 | SSA def(y4) | +| Tuples.cs:133:25:133:25 | 1 | Tuples.cs:133:9:133:29 | ... = ... | +| Tuples.cs:133:28:133:28 | access to local variable o | Tuples.cs:133:18:133:19 | access to local variable y4 | diff --git a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected index ef98026832c..e1036342255 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected @@ -1,61 +1,61 @@ testFailures edges -| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | provenance | | -| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | provenance | | -| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | provenance | | -| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | -| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:7:13:7:14 | access to local variable o1 : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | provenance | | +| Tuples.cs:7:13:7:14 | access to local variable o1 : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | provenance | | +| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:7:13:7:14 | access to local variable o1 : Object | provenance | | +| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:7:13:7:14 | access to local variable o1 : Object | provenance | | +| Tuples.cs:8:13:8:14 | access to local variable o2 : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | provenance | | +| Tuples.cs:8:13:8:14 | access to local variable o2 : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | provenance | | +| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:8:13:8:14 | access to local variable o2 : Object | provenance | | +| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:8:13:8:14 | access to local variable o2 : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | +| Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | provenance | | | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | | Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | | Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | provenance | | | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | Tuples.cs:10:25:10:31 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:11:9:11:27 | SSA def(c) : Object | provenance | | -| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:11:9:11:27 | SSA def(c) : Object | provenance | | -| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:27 | SSA def(a) : Object | provenance | | -| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:11:9:11:27 | SSA def(a) : Object | provenance | | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:14:14:14:14 | access to local variable c | provenance | | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:14:14:14:14 | access to local variable c | provenance | | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:12:14:12:14 | access to local variable a | provenance | | +| Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:12:14:12:14 | access to local variable a | provenance | | | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:11:9:11:27 | SSA def(a) : Object | Tuples.cs:12:14:12:14 | access to local variable a | provenance | | -| Tuples.cs:11:9:11:27 | SSA def(a) : Object | Tuples.cs:12:14:12:14 | access to local variable a | provenance | | -| Tuples.cs:11:9:11:27 | SSA def(c) : Object | Tuples.cs:14:14:14:14 | access to local variable c | provenance | | -| Tuples.cs:11:9:11:27 | SSA def(c) : Object | Tuples.cs:14:14:14:14 | access to local variable c | provenance | | -| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:23 | SSA def(a) : Object | provenance | | -| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:9:16:23 | SSA def(a) : Object | provenance | | +| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:10:16:10 | access to local variable a : Object | provenance | | +| Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:16:10:16:10 | access to local variable a : Object | provenance | | | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:16:9:16:23 | SSA def(a) : Object | Tuples.cs:17:14:17:14 | access to local variable a | provenance | | -| Tuples.cs:16:9:16:23 | SSA def(a) : Object | Tuples.cs:17:14:17:14 | access to local variable a | provenance | | -| Tuples.cs:16:9:16:23 | SSA def(c) : Object | Tuples.cs:19:14:19:14 | access to local variable c | provenance | | -| Tuples.cs:16:9:16:23 | SSA def(c) : Object | Tuples.cs:19:14:19:14 | access to local variable c | provenance | | -| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:16:9:16:23 | SSA def(c) : Object | provenance | | -| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:16:9:16:23 | SSA def(c) : Object | provenance | | -| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:26 | SSA def(p) : Object | provenance | | -| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:21:9:21:26 | SSA def(p) : Object | provenance | | -| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:21:9:21:26 | SSA def(p) : Object | Tuples.cs:22:14:22:14 | access to local variable p | provenance | | -| Tuples.cs:21:9:21:26 | SSA def(p) : Object | Tuples.cs:22:14:22:14 | access to local variable p | provenance | | -| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | provenance | | +| Tuples.cs:16:10:16:10 | access to local variable a : Object | Tuples.cs:17:14:17:14 | access to local variable a | provenance | | +| Tuples.cs:16:10:16:10 | access to local variable a : Object | Tuples.cs:17:14:17:14 | access to local variable a | provenance | | +| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:16:17:16:17 | access to local variable c : Object | provenance | | +| Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:16:17:16:17 | access to local variable c : Object | provenance | | +| Tuples.cs:16:17:16:17 | access to local variable c : Object | Tuples.cs:19:14:19:14 | access to local variable c | provenance | | +| Tuples.cs:16:17:16:17 | access to local variable c : Object | Tuples.cs:19:14:19:14 | access to local variable c | provenance | | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:22:14:22:14 | access to local variable p | provenance | | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:22:14:22:14 | access to local variable p | provenance | | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | provenance | | +| Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:20 | access to field Item2 | provenance | | | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | Tuples.cs:24:14:24:20 | access to field Item2 | provenance | | | Tuples.cs:26:14:26:14 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:26:14:26:20 | access to field Item1 | provenance | | @@ -66,14 +66,22 @@ edges | Tuples.cs:29:14:29:14 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | Tuples.cs:29:14:29:26 | access to field Item2 | provenance | | | Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | Tuples.cs:29:14:29:26 | access to field Item2 | provenance | | -| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | provenance | | -| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | provenance | | -| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | provenance | | -| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | provenance | | -| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | -| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | -| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | +| Tuples.cs:34:13:34:14 | access to local variable o1 : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | provenance | | +| Tuples.cs:34:13:34:14 | access to local variable o1 : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | provenance | | +| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:34:13:34:14 | access to local variable o1 : Object | provenance | | +| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:34:13:34:14 | access to local variable o1 : Object | provenance | | +| Tuples.cs:35:13:35:14 | access to local variable o2 : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | provenance | | +| Tuples.cs:35:13:35:14 | access to local variable o2 : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | provenance | | +| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:35:13:35:14 | access to local variable o2 : Object | provenance | | +| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:35:13:35:14 | access to local variable o2 : Object | provenance | | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | provenance | | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | +| Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | provenance | | | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | provenance | | | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | provenance | | @@ -82,131 +90,141 @@ edges | Tuples.cs:38:14:38:14 | access to local variable x : ValueTuple> [field Item1] : Object | Tuples.cs:38:14:38:20 | access to field Item1 | provenance | | | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:21 | access to field Item10 | provenance | | | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | Tuples.cs:40:14:40:21 | access to field Item10 | provenance | | -| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:46:48:46:48 | access to local variable o : String | provenance | | -| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:46:48:46:48 | access to local variable o : String | provenance | | -| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | provenance | | -| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | provenance | | +| Tuples.cs:45:13:45:13 | access to local variable o : String | Tuples.cs:46:48:46:48 | access to local variable o : String | provenance | | +| Tuples.cs:45:13:45:13 | access to local variable o : String | Tuples.cs:46:48:46:48 | access to local variable o : String | provenance | | +| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:45:13:45:13 | access to local variable o : String | provenance | | +| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:45:13:45:13 | access to local variable o : String | provenance | | +| Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | provenance | | +| Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | provenance | | +| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | provenance | | +| Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:46:48:46:48 | access to local variable o : String | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:46:48:46:48 | access to local variable o : String | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | provenance | | | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:20 | access to field Item1 | provenance | | | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | Tuples.cs:47:14:47:20 | access to field Item1 | provenance | | -| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | provenance | | -| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | provenance | | -| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | provenance | | -| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:57:13:57:14 | access to local variable o1 : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | provenance | | +| Tuples.cs:57:13:57:14 | access to local variable o1 : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | provenance | | +| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:57:13:57:14 | access to local variable o1 : String | provenance | | +| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:57:13:57:14 | access to local variable o1 : String | provenance | | +| Tuples.cs:58:13:58:14 | access to local variable o2 : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | provenance | | +| Tuples.cs:58:13:58:14 | access to local variable o2 : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | provenance | | +| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:58:13:58:14 | access to local variable o2 : String | provenance | | +| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:58:13:58:14 | access to local variable o2 : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | provenance | | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | +| Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | | Tuples.cs:59:18:59:19 | access to local variable o1 : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | | Tuples.cs:59:18:59:19 | access to local variable o1 : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | provenance | | | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | | Tuples.cs:59:26:59:27 | access to local variable o2 : String | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:59:26:59:27 | access to local variable o2 : String | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | provenance | | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | provenance | | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | provenance | | | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:28 | access to field Item1 | provenance | | | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | Tuples.cs:63:22:63:28 | access to field Item1 | provenance | | | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:64:22:64:22 | access to local variable t : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | Tuples.cs:64:22:64:34 | access to field Item2 | provenance | | | Tuples.cs:64:22:64:28 | access to field Item2 : ValueTuple [field Item2] : String | Tuples.cs:64:22:64:34 | access to field Item2 | provenance | | -| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:67:30:67:30 | SSA def(c) : String | provenance | | -| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:67:30:67:30 | SSA def(c) : String | provenance | | -| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:23:67:23 | SSA def(a) : String | provenance | | -| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:67:23:67:23 | SSA def(a) : String | provenance | | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:69:22:69:22 | access to local variable c | provenance | | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:69:22:69:22 | access to local variable c | provenance | | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:68:22:68:22 | access to local variable a | provenance | | +| Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:68:22:68:22 | access to local variable a | provenance | | | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple [field Item2] : String | provenance | | -| Tuples.cs:67:23:67:23 | SSA def(a) : String | Tuples.cs:68:22:68:22 | access to local variable a | provenance | | -| Tuples.cs:67:23:67:23 | SSA def(a) : String | Tuples.cs:68:22:68:22 | access to local variable a | provenance | | -| Tuples.cs:67:30:67:30 | SSA def(c) : String | Tuples.cs:69:22:69:22 | access to local variable c | provenance | | -| Tuples.cs:67:30:67:30 | SSA def(c) : String | Tuples.cs:69:22:69:22 | access to local variable c | provenance | | -| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:87:30:87:30 | SSA def(r) : String | provenance | | -| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:87:30:87:30 | SSA def(r) : String | provenance | | -| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:23:87:23 | SSA def(p) : String | provenance | | -| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:87:23:87:23 | SSA def(p) : String | provenance | | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:90:18:90:18 | access to local variable r | provenance | | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | Tuples.cs:90:18:90:18 | access to local variable r | provenance | | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:89:18:89:18 | access to local variable p | provenance | | +| Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | Tuples.cs:89:18:89:18 | access to local variable p | provenance | | | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | provenance | | | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple [field Item2] : String | provenance | | -| Tuples.cs:87:23:87:23 | SSA def(p) : String | Tuples.cs:89:18:89:18 | access to local variable p | provenance | | -| Tuples.cs:87:23:87:23 | SSA def(p) : String | Tuples.cs:89:18:89:18 | access to local variable p | provenance | | -| Tuples.cs:87:30:87:30 | SSA def(r) : String | Tuples.cs:90:18:90:18 | access to local variable r | provenance | | -| Tuples.cs:87:30:87:30 | SSA def(r) : String | Tuples.cs:90:18:90:18 | access to local variable r | provenance | | -| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:100:24:100:24 | access to local variable o : String | provenance | | -| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:100:24:100:24 | access to local variable o : String | provenance | | -| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | -| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:99:13:99:13 | access to local variable o : String | Tuples.cs:100:24:100:24 | access to local variable o : String | provenance | | +| Tuples.cs:99:13:99:13 | access to local variable o : String | Tuples.cs:100:24:100:24 | access to local variable o : String | provenance | | +| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:99:13:99:13 | access to local variable o : String | provenance | | +| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:99:13:99:13 | access to local variable o : String | provenance | | +| Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | provenance | | +| Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | provenance | | | Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | provenance | | | Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:95:22:95:22 | i : String | provenance | | | Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | provenance | | | Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | provenance | | | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:16 | access to property i | provenance | | | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | Tuples.cs:101:14:101:16 | access to property i | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | -| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | -| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | provenance | | -| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | provenance | | -| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | -| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:125:10:125:11 | access to local variable x2 : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:125:10:125:11 | access to local variable x2 : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:133:18:133:19 | access to local variable y4 : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:133:18:133:19 | access to local variable y4 : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | provenance | | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | provenance | | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:118:13:118:13 | access to local variable o : Object | provenance | | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:118:13:118:13 | access to local variable o : Object | provenance | | +| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | +| Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | provenance | | | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:121:28:121:28 | access to local variable o : Object | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:121:28:121:28 | access to local variable o : Object | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | -| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | provenance | | -| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | provenance | | -| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | -| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | +| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:10:125:11 | access to local variable x2 : Object | provenance | | +| Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:10:125:11 | access to local variable x2 : Object | provenance | | +| Tuples.cs:125:10:125:11 | access to local variable x2 : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | +| Tuples.cs:125:10:125:11 | access to local variable x2 : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | provenance | | | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:125:25:125:25 | access to local variable o : Object | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | | Tuples.cs:125:25:125:25 | access to local variable o : Object | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | provenance | | -| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | provenance | | -| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | provenance | | -| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | -| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | +| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | +| Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | provenance | | | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:129:31:129:31 | access to local variable o : Object | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:129:31:129:31 | access to local variable o : Object | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | -| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | provenance | | -| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | provenance | | -| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | -| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | +| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:18:133:19 | access to local variable y4 : Object | provenance | | +| Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:18:133:19 | access to local variable y4 : Object | provenance | | +| Tuples.cs:133:18:133:19 | access to local variable y4 : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | +| Tuples.cs:133:18:133:19 | access to local variable y4 : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | provenance | | | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:133:28:133:28 | access to local variable o : Object | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | | Tuples.cs:133:28:133:28 | access to local variable o : Object | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | provenance | | nodes +| Tuples.cs:7:13:7:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Tuples.cs:7:13:7:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | | Tuples.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:8:13:8:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Tuples.cs:8:13:8:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | | Tuples.cs:8:18:8:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:8:18:8:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | semmle.label | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | +| Tuples.cs:10:13:10:13 | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | semmle.label | access to local variable x : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:10:17:10:32 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | @@ -223,10 +241,6 @@ nodes | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:11:9:11:23 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | -| Tuples.cs:11:9:11:27 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | -| Tuples.cs:11:9:11:27 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | -| Tuples.cs:11:9:11:27 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | -| Tuples.cs:11:9:11:27 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | | Tuples.cs:12:14:12:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:12:14:12:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:14:14:14:14 | access to local variable c | semmle.label | access to local variable c | @@ -235,12 +249,12 @@ nodes | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:16:9:16:19 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | -| Tuples.cs:16:9:16:23 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | -| Tuples.cs:16:9:16:23 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | -| Tuples.cs:16:9:16:23 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | -| Tuples.cs:16:9:16:23 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | +| Tuples.cs:16:10:16:10 | access to local variable a : Object | semmle.label | access to local variable a : Object | +| Tuples.cs:16:10:16:10 | access to local variable a : Object | semmle.label | access to local variable a : Object | | Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:16:13:16:18 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | +| Tuples.cs:16:17:16:17 | access to local variable c : Object | semmle.label | access to local variable c : Object | +| Tuples.cs:16:17:16:17 | access to local variable c : Object | semmle.label | access to local variable c : Object | | Tuples.cs:17:14:17:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:17:14:17:14 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:19:14:19:14 | access to local variable c | semmle.label | access to local variable c | @@ -249,10 +263,6 @@ nodes | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | | Tuples.cs:21:9:21:22 | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | semmle.label | (..., ...) : ValueTuple> [field Item2, field Item2] : Object | -| Tuples.cs:21:9:21:26 | SSA def(p) : Object | semmle.label | SSA def(p) : Object | -| Tuples.cs:21:9:21:26 | SSA def(p) : Object | semmle.label | SSA def(p) : Object | -| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | semmle.label | SSA def(q) : ValueTuple [field Item2] : Object | -| Tuples.cs:21:9:21:26 | SSA def(q) : ValueTuple [field Item2] : Object | semmle.label | SSA def(q) : ValueTuple [field Item2] : Object | | Tuples.cs:22:14:22:14 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:22:14:22:14 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:24:14:24:14 | access to local variable q : ValueTuple [field Item2] : Object | semmle.label | access to local variable q : ValueTuple [field Item2] : Object | @@ -273,10 +283,18 @@ nodes | Tuples.cs:29:14:29:20 | access to field Item2 : ValueTuple [field Item2] : Object | semmle.label | access to field Item2 : ValueTuple [field Item2] : Object | | Tuples.cs:29:14:29:26 | access to field Item2 | semmle.label | access to field Item2 | | Tuples.cs:29:14:29:26 | access to field Item2 | semmle.label | access to field Item2 | +| Tuples.cs:34:13:34:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Tuples.cs:34:13:34:14 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | | Tuples.cs:34:18:34:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:34:18:34:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:35:13:35:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Tuples.cs:35:13:35:14 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | | Tuples.cs:35:18:35:34 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:35:18:35:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item1] : Object | semmle.label | access to local variable x : ValueTuple> [field Item1] : Object | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | semmle.label | access to local variable x : ValueTuple> [field Item10] : Object | +| Tuples.cs:37:13:37:13 | access to local variable x : ValueTuple> [field Item10] : Object | semmle.label | access to local variable x : ValueTuple> [field Item10] : Object | | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item1] : Object | semmle.label | (..., ...) : ValueTuple> [field Item1] : Object | | Tuples.cs:37:17:37:48 | (..., ...) : ValueTuple> [field Item10] : Object | semmle.label | (..., ...) : ValueTuple> [field Item10] : Object | @@ -293,8 +311,12 @@ nodes | Tuples.cs:40:14:40:14 | access to local variable x : ValueTuple> [field Item10] : Object | semmle.label | access to local variable x : ValueTuple> [field Item10] : Object | | Tuples.cs:40:14:40:21 | access to field Item10 | semmle.label | access to field Item10 | | Tuples.cs:40:14:40:21 | access to field Item10 | semmle.label | access to field Item10 | +| Tuples.cs:45:13:45:13 | access to local variable o : String | semmle.label | access to local variable o : String | +| Tuples.cs:45:13:45:13 | access to local variable o : String | semmle.label | access to local variable o : String | | Tuples.cs:45:17:45:33 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:45:17:45:33 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | semmle.label | access to local variable x : ValueTuple [field Item1] : String | +| Tuples.cs:46:13:46:13 | access to local variable x : ValueTuple [field Item1] : String | semmle.label | access to local variable x : ValueTuple [field Item1] : String | | Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | semmle.label | (...) ... : ValueTuple [field Item1] : String | | Tuples.cs:46:17:46:55 | (...) ... : ValueTuple [field Item1] : String | semmle.label | (...) ... : ValueTuple [field Item1] : String | | Tuples.cs:46:47:46:55 | (..., ...) : ValueTuple [field Item1] : String | semmle.label | (..., ...) : ValueTuple [field Item1] : String | @@ -305,10 +327,18 @@ nodes | Tuples.cs:47:14:47:14 | access to local variable x : ValueTuple [field Item1] : String | semmle.label | access to local variable x : ValueTuple [field Item1] : String | | Tuples.cs:47:14:47:20 | access to field Item1 | semmle.label | access to field Item1 | | Tuples.cs:47:14:47:20 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:57:13:57:14 | access to local variable o1 : String | semmle.label | access to local variable o1 : String | +| Tuples.cs:57:13:57:14 | access to local variable o1 : String | semmle.label | access to local variable o1 : String | | Tuples.cs:57:18:57:34 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:57:18:57:34 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:58:13:58:14 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | +| Tuples.cs:58:13:58:14 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | | Tuples.cs:58:18:58:34 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:58:18:58:34 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | semmle.label | access to local variable x : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item1] : String | semmle.label | access to local variable x : ValueTuple,Int32> [field Item1] : String | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | +| Tuples.cs:59:13:59:13 | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | access to local variable x : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:59:17:59:32 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | @@ -319,10 +349,6 @@ nodes | Tuples.cs:59:22:59:28 | (..., ...) : ValueTuple [field Item2] : String | semmle.label | (..., ...) : ValueTuple [field Item2] : String | | Tuples.cs:59:26:59:27 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | | Tuples.cs:59:26:59:27 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item1] : String | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item1] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item1] : String | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | -| Tuples.cs:62:18:62:57 | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | SSA def(t) : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | semmle.label | access to local variable t : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:63:22:63:22 | access to local variable t : ValueTuple,Int32> [field Item1] : String | semmle.label | access to local variable t : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:63:22:63:28 | access to field Item1 | semmle.label | access to field Item1 | @@ -339,10 +365,6 @@ nodes | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:67:18:67:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | -| Tuples.cs:67:23:67:23 | SSA def(a) : String | semmle.label | SSA def(a) : String | -| Tuples.cs:67:23:67:23 | SSA def(a) : String | semmle.label | SSA def(a) : String | -| Tuples.cs:67:30:67:30 | SSA def(c) : String | semmle.label | SSA def(c) : String | -| Tuples.cs:67:30:67:30 | SSA def(c) : String | semmle.label | SSA def(c) : String | | Tuples.cs:68:22:68:22 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:68:22:68:22 | access to local variable a | semmle.label | access to local variable a | | Tuples.cs:69:22:69:22 | access to local variable c | semmle.label | access to local variable c | @@ -353,18 +375,18 @@ nodes | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item1] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item1] : String | | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | | Tuples.cs:87:18:87:35 | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | semmle.label | (..., ...) : ValueTuple,Int32> [field Item2, field Item2] : String | -| Tuples.cs:87:23:87:23 | SSA def(p) : String | semmle.label | SSA def(p) : String | -| Tuples.cs:87:23:87:23 | SSA def(p) : String | semmle.label | SSA def(p) : String | -| Tuples.cs:87:30:87:30 | SSA def(r) : String | semmle.label | SSA def(r) : String | -| Tuples.cs:87:30:87:30 | SSA def(r) : String | semmle.label | SSA def(r) : String | | Tuples.cs:89:18:89:18 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:89:18:89:18 | access to local variable p | semmle.label | access to local variable p | | Tuples.cs:90:18:90:18 | access to local variable r | semmle.label | access to local variable r | | Tuples.cs:90:18:90:18 | access to local variable r | semmle.label | access to local variable r | | Tuples.cs:95:22:95:22 | i : String | semmle.label | i : String | | Tuples.cs:95:22:95:22 | i : String | semmle.label | i : String | +| Tuples.cs:99:13:99:13 | access to local variable o : String | semmle.label | access to local variable o : String | +| Tuples.cs:99:13:99:13 | access to local variable o : String | semmle.label | access to local variable o : String | | Tuples.cs:99:17:99:33 | call to method Source : String | semmle.label | call to method Source : String | | Tuples.cs:99:17:99:33 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | semmle.label | access to local variable r : R1 [property i] : String | +| Tuples.cs:100:13:100:13 | access to local variable r : R1 [property i] : String | semmle.label | access to local variable r : R1 [property i] : String | | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | semmle.label | object creation of type R1 : R1 [property i] : String | | Tuples.cs:100:17:100:28 | object creation of type R1 : R1 [property i] : String | semmle.label | object creation of type R1 : R1 [property i] : String | | Tuples.cs:100:24:100:24 | access to local variable o : String | semmle.label | access to local variable o : String | @@ -373,12 +395,12 @@ nodes | Tuples.cs:101:14:101:14 | access to local variable r : R1 [property i] : String | semmle.label | access to local variable r : R1 [property i] : String | | Tuples.cs:101:14:101:16 | access to property i | semmle.label | access to property i | | Tuples.cs:101:14:101:16 | access to property i | semmle.label | access to property i | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:118:13:118:13 | access to local variable o : Object | semmle.label | access to local variable o : Object | | Tuples.cs:118:17:118:33 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:118:17:118:33 | call to method Source : Object | semmle.label | call to method Source : Object | | Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:121:9:121:23 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | -| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | semmle.label | SSA def(x1) : Object | -| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | semmle.label | SSA def(x1) : Object | | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:121:27:121:32 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:121:28:121:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -387,8 +409,8 @@ nodes | Tuples.cs:122:14:122:15 | access to local variable x1 | semmle.label | access to local variable x1 | | Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:125:9:125:20 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | -| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | semmle.label | SSA def(x2) : Object | -| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | semmle.label | SSA def(x2) : Object | +| Tuples.cs:125:10:125:11 | access to local variable x2 : Object | semmle.label | access to local variable x2 : Object | +| Tuples.cs:125:10:125:11 | access to local variable x2 : Object | semmle.label | access to local variable x2 : Object | | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:125:24:125:29 | (..., ...) : ValueTuple [field Item1] : Object | semmle.label | (..., ...) : ValueTuple [field Item1] : Object | | Tuples.cs:125:25:125:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -397,8 +419,6 @@ nodes | Tuples.cs:126:14:126:15 | access to local variable x2 | semmle.label | access to local variable x2 | | Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:129:9:129:23 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | -| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | semmle.label | SSA def(y3) : Object | -| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | semmle.label | SSA def(y3) : Object | | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:129:27:129:32 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:129:31:129:31 | access to local variable o : Object | semmle.label | access to local variable o : Object | @@ -407,8 +427,8 @@ nodes | Tuples.cs:130:14:130:15 | access to local variable y3 | semmle.label | access to local variable y3 | | Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:133:9:133:20 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | -| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | semmle.label | SSA def(y4) : Object | -| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | semmle.label | SSA def(y4) : Object | +| Tuples.cs:133:18:133:19 | access to local variable y4 : Object | semmle.label | access to local variable y4 : Object | +| Tuples.cs:133:18:133:19 | access to local variable y4 : Object | semmle.label | access to local variable y4 : Object | | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:133:24:133:29 | (..., ...) : ValueTuple [field Item2] : Object | semmle.label | (..., ...) : ValueTuple [field Item2] : Object | | Tuples.cs:133:28:133:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | diff --git a/csharp/ql/test/library-tests/dataflow/typeflow-dispatch/TypeFlowDispatch.expected b/csharp/ql/test/library-tests/dataflow/typeflow-dispatch/TypeFlowDispatch.expected index cb7792957a8..d71043a4667 100644 --- a/csharp/ql/test/library-tests/dataflow/typeflow-dispatch/TypeFlowDispatch.expected +++ b/csharp/ql/test/library-tests/dataflow/typeflow-dispatch/TypeFlowDispatch.expected @@ -16,8 +16,10 @@ edges | TypeFlowDispatch.cs:29:37:29:37 | l : List [element] : String | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | provenance | | | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:39:34:39:34 | x : String | provenance | | | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:39:34:39:34 | x : String | provenance | | -| TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | provenance | | -| TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | provenance | | | TypeFlowDispatch.cs:36:42:36:52 | call to method Source : String | TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | provenance | | | TypeFlowDispatch.cs:36:42:36:52 | call to method Source : String | TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | provenance | | | TypeFlowDispatch.cs:39:25:39:31 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:29:37:29:37 | l : List [element] : String | provenance | | @@ -38,18 +40,18 @@ edges | TypeFlowDispatch.cs:57:38:57:48 | call to method Source : String | TypeFlowDispatch.cs:47:46:47:46 | x : String | provenance | | | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | provenance | | | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | provenance | | -| TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | provenance | | -| TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | provenance | | -| TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | provenance | | -| TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | provenance | | +| TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | provenance | | +| TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | provenance | | | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | TypeFlowDispatch.cs:52:32:52:32 | t : String | provenance | | | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | TypeFlowDispatch.cs:52:32:52:32 | t : String | provenance | | | TypeFlowDispatch.cs:67:33:67:33 | l : List [element] : String | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | provenance | | | TypeFlowDispatch.cs:67:33:67:33 | l : List [element] : String | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | provenance | | | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | provenance | | | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | provenance | | -| TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | provenance | | -| TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | provenance | | +| TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | provenance | | | TypeFlowDispatch.cs:74:42:74:52 | call to method Source : String | TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | provenance | | | TypeFlowDispatch.cs:74:42:74:52 | call to method Source : String | TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | provenance | | | TypeFlowDispatch.cs:77:21:77:27 | access to local variable tainted : List [element] : String | TypeFlowDispatch.cs:67:33:67:33 | l : List [element] : String | provenance | | @@ -73,6 +75,8 @@ nodes | TypeFlowDispatch.cs:29:37:29:37 | l : List [element] : String | semmle.label | l : List [element] : String | | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | | TypeFlowDispatch.cs:31:9:31:9 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | +| TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | semmle.label | access to local variable tainted : List [element] : String | +| TypeFlowDispatch.cs:36:13:36:19 | access to local variable tainted : List [element] : String | semmle.label | access to local variable tainted : List [element] : String | | TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | semmle.label | object creation of type List : List [element] : String | | TypeFlowDispatch.cs:36:23:36:54 | object creation of type List : List [element] : String | semmle.label | object creation of type List : List [element] : String | | TypeFlowDispatch.cs:36:42:36:52 | call to method Source : String | semmle.label | call to method Source : String | @@ -99,8 +103,6 @@ nodes | TypeFlowDispatch.cs:57:38:57:48 | call to method Source : String | semmle.label | call to method Source : String | | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | semmle.label | l : List [element] : String | | TypeFlowDispatch.cs:61:29:61:29 | l : List [element] : String | semmle.label | l : List [element] : String | -| TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | -| TypeFlowDispatch.cs:63:22:63:22 | SSA def(x) : String | semmle.label | SSA def(x) : String | | TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | | TypeFlowDispatch.cs:63:27:63:27 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | | TypeFlowDispatch.cs:64:15:64:15 | access to local variable x : String | semmle.label | access to local variable x : String | @@ -109,6 +111,8 @@ nodes | TypeFlowDispatch.cs:67:33:67:33 | l : List [element] : String | semmle.label | l : List [element] : String | | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | | TypeFlowDispatch.cs:69:17:69:17 | access to parameter l : List [element] : String | semmle.label | access to parameter l : List [element] : String | +| TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | semmle.label | access to local variable tainted : List [element] : String | +| TypeFlowDispatch.cs:74:13:74:19 | access to local variable tainted : List [element] : String | semmle.label | access to local variable tainted : List [element] : String | | TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | semmle.label | object creation of type List : List [element] : String | | TypeFlowDispatch.cs:74:23:74:54 | object creation of type List : List [element] : String | semmle.label | object creation of type List : List [element] : String | | TypeFlowDispatch.cs:74:42:74:52 | call to method Source : String | semmle.label | call to method Source : String | diff --git a/csharp/ql/test/library-tests/dataflow/types/Types.expected b/csharp/ql/test/library-tests/dataflow/types/Types.expected index 1c35152bc26..5d085ceb823 100644 --- a/csharp/ql/test/library-tests/dataflow/types/Types.expected +++ b/csharp/ql/test/library-tests/dataflow/types/Types.expected @@ -16,11 +16,10 @@ edges | Types.cs:38:12:38:18 | object creation of type D : D | Types.cs:67:25:67:25 | x : D | provenance | | | Types.cs:39:12:39:18 | object creation of type D : D | Types.cs:69:25:69:25 | x : D | provenance | | | Types.cs:40:12:40:18 | object creation of type D : D | Types.cs:71:25:71:25 | x : D | provenance | | -| Types.cs:43:20:43:23 | null : null | Types.cs:44:14:44:14 | access to local variable o | provenance | | -| Types.cs:47:22:47:22 | a : C | Types.cs:49:18:49:20 | SSA def(c) : C | provenance | | -| Types.cs:49:18:49:20 | SSA def(c) : C | Types.cs:50:18:50:18 | access to local variable c | provenance | | -| Types.cs:53:22:53:22 | a : D | Types.cs:57:18:57:20 | SSA def(d) : D | provenance | | -| Types.cs:57:18:57:20 | SSA def(d) : D | Types.cs:58:22:58:22 | access to local variable d | provenance | | +| Types.cs:43:16:43:16 | access to local variable o : null | Types.cs:44:14:44:14 | access to local variable o | provenance | | +| Types.cs:43:20:43:23 | null : null | Types.cs:43:16:43:16 | access to local variable o : null | provenance | | +| Types.cs:47:22:47:22 | a : C | Types.cs:50:18:50:18 | access to local variable c | provenance | | +| Types.cs:53:22:53:22 | a : D | Types.cs:58:22:58:22 | access to local variable d | provenance | | | Types.cs:63:22:63:22 | a : C | Types.cs:63:33:63:36 | (...) ... | provenance | | | Types.cs:65:25:65:25 | x : C | Types.cs:65:36:65:36 | access to parameter x | provenance | | | Types.cs:65:25:65:25 | x : D | Types.cs:65:36:65:36 | access to parameter x | provenance | | @@ -29,10 +28,10 @@ edges | Types.cs:69:25:69:25 | x : C | Types.cs:69:52:69:52 | access to parameter x | provenance | | | Types.cs:69:25:69:25 | x : D | Types.cs:69:52:69:52 | access to parameter x | provenance | | | Types.cs:71:25:71:25 | x : D | Types.cs:73:21:73:21 | (...) ... : D | provenance | | -| Types.cs:73:21:73:21 | (...) ... : D | Types.cs:74:9:74:9 | access to local variable d : D | provenance | | +| Types.cs:73:17:73:17 | access to local variable d : D | Types.cs:74:9:74:9 | access to local variable d : D | provenance | | +| Types.cs:73:21:73:21 | (...) ... : D | Types.cs:73:17:73:17 | access to local variable d : D | provenance | | | Types.cs:74:9:74:9 | access to local variable d : D | Types.cs:16:30:16:30 | this : D | provenance | | -| Types.cs:77:22:77:22 | a : C | Types.cs:79:18:79:25 | SSA def(b) : C | provenance | | -| Types.cs:79:18:79:25 | SSA def(b) : C | Types.cs:80:18:80:18 | access to local variable b | provenance | | +| Types.cs:77:22:77:22 | a : C | Types.cs:80:18:80:18 | access to local variable b | provenance | | | Types.cs:90:22:90:22 | e : Types+E.E2 | Types.cs:92:26:92:26 | access to parameter e : Types+E.E2 | provenance | | | Types.cs:92:13:92:16 | [post] this access : Types+E [field Field] : Types+E.E2 | Types.cs:93:13:93:16 | this access : Types+E [field Field] : Types+E.E2 | provenance | | | Types.cs:92:26:92:26 | access to parameter e : Types+E.E2 | Types.cs:92:13:92:16 | [post] this access : Types+E [field Field] : Types+E.E2 | provenance | | @@ -40,8 +39,10 @@ edges | Types.cs:110:25:110:32 | object creation of type E2 : Types+E.E2 | Types.cs:90:22:90:22 | e : Types+E.E2 | provenance | | | Types.cs:113:34:113:34 | this : Types+E [field Field] : Types+E.E2 | Types.cs:115:22:115:25 | this access : Types+E [field Field] : Types+E.E2 | provenance | | | Types.cs:115:22:115:25 | this access : Types+E [field Field] : Types+E.E2 | Types.cs:115:22:115:31 | access to field Field | provenance | | -| Types.cs:120:25:120:31 | object creation of type A : A | Types.cs:122:30:122:30 | access to local variable a : A | provenance | | -| Types.cs:121:26:121:33 | object creation of type E2 : Types+E.E2 | Types.cs:123:30:123:31 | access to local variable e2 : Types+E.E2 | provenance | | +| Types.cs:120:21:120:21 | access to local variable a : A | Types.cs:122:30:122:30 | access to local variable a : A | provenance | | +| Types.cs:120:25:120:31 | object creation of type A : A | Types.cs:120:21:120:21 | access to local variable a : A | provenance | | +| Types.cs:121:21:121:22 | access to local variable e2 : Types+E.E2 | Types.cs:123:30:123:31 | access to local variable e2 : Types+E.E2 | provenance | | +| Types.cs:121:26:121:33 | object creation of type E2 : Types+E.E2 | Types.cs:121:21:121:22 | access to local variable e2 : Types+E.E2 | provenance | | | Types.cs:122:30:122:30 | access to local variable a : A | Types.cs:122:22:122:31 | call to method Through | provenance | | | Types.cs:122:30:122:30 | access to local variable a : A | Types.cs:130:34:130:34 | x : A | provenance | | | Types.cs:123:30:123:31 | access to local variable e2 : Types+E.E2 | Types.cs:123:22:123:32 | call to method Through | provenance | | @@ -76,13 +77,12 @@ nodes | Types.cs:38:12:38:18 | object creation of type D : D | semmle.label | object creation of type D : D | | Types.cs:39:12:39:18 | object creation of type D : D | semmle.label | object creation of type D : D | | Types.cs:40:12:40:18 | object creation of type D : D | semmle.label | object creation of type D : D | +| Types.cs:43:16:43:16 | access to local variable o : null | semmle.label | access to local variable o : null | | Types.cs:43:20:43:23 | null : null | semmle.label | null : null | | Types.cs:44:14:44:14 | access to local variable o | semmle.label | access to local variable o | | Types.cs:47:22:47:22 | a : C | semmle.label | a : C | -| Types.cs:49:18:49:20 | SSA def(c) : C | semmle.label | SSA def(c) : C | | Types.cs:50:18:50:18 | access to local variable c | semmle.label | access to local variable c | | Types.cs:53:22:53:22 | a : D | semmle.label | a : D | -| Types.cs:57:18:57:20 | SSA def(d) : D | semmle.label | SSA def(d) : D | | Types.cs:58:22:58:22 | access to local variable d | semmle.label | access to local variable d | | Types.cs:63:22:63:22 | a : C | semmle.label | a : C | | Types.cs:63:33:63:36 | (...) ... | semmle.label | (...) ... | @@ -96,10 +96,10 @@ nodes | Types.cs:69:25:69:25 | x : D | semmle.label | x : D | | Types.cs:69:52:69:52 | access to parameter x | semmle.label | access to parameter x | | Types.cs:71:25:71:25 | x : D | semmle.label | x : D | +| Types.cs:73:17:73:17 | access to local variable d : D | semmle.label | access to local variable d : D | | Types.cs:73:21:73:21 | (...) ... : D | semmle.label | (...) ... : D | | Types.cs:74:9:74:9 | access to local variable d : D | semmle.label | access to local variable d : D | | Types.cs:77:22:77:22 | a : C | semmle.label | a : C | -| Types.cs:79:18:79:25 | SSA def(b) : C | semmle.label | SSA def(b) : C | | Types.cs:80:18:80:18 | access to local variable b | semmle.label | access to local variable b | | Types.cs:90:22:90:22 | e : Types+E.E2 | semmle.label | e : Types+E.E2 | | Types.cs:92:13:92:16 | [post] this access : Types+E [field Field] : Types+E.E2 | semmle.label | [post] this access : Types+E [field Field] : Types+E.E2 | @@ -109,7 +109,9 @@ nodes | Types.cs:113:34:113:34 | this : Types+E [field Field] : Types+E.E2 | semmle.label | this : Types+E [field Field] : Types+E.E2 | | Types.cs:115:22:115:25 | this access : Types+E [field Field] : Types+E.E2 | semmle.label | this access : Types+E [field Field] : Types+E.E2 | | Types.cs:115:22:115:31 | access to field Field | semmle.label | access to field Field | +| Types.cs:120:21:120:21 | access to local variable a : A | semmle.label | access to local variable a : A | | Types.cs:120:25:120:31 | object creation of type A : A | semmle.label | object creation of type A : A | +| Types.cs:121:21:121:22 | access to local variable e2 : Types+E.E2 | semmle.label | access to local variable e2 : Types+E.E2 | | Types.cs:121:26:121:33 | object creation of type E2 : Types+E.E2 | semmle.label | object creation of type E2 : Types+E.E2 | | Types.cs:122:22:122:31 | call to method Through | semmle.label | call to method Through | | Types.cs:122:30:122:30 | access to local variable a : A | semmle.label | access to local variable a : A | diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected b/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected index b4b4cf6f129..5af67fea01b 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/Dataflow.expected @@ -1,23 +1,28 @@ edges -| EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:58:17:58:18 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:58:17:58:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFramework.cs:61:24:61:32 | "tainted" : String | EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:68:13:68:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFramework.cs:66:13:66:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:66:13:66:23 | [post] access to property Persons : DbSet [element, property Name] : String | provenance | | | EntityFramework.cs:68:13:68:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | provenance | | -| EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:80:17:80:18 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:80:17:80:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFramework.cs:83:24:83:32 | "tainted" : String | EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:90:19:90:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFramework.cs:88:13:88:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:88:13:88:23 | [post] access to property Persons : DbSet [element, property Name] : String | provenance | | | EntityFramework.cs:90:19:90:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFramework.cs:204:18:204:28 | access to property Persons : DbSet [element, property Name] : String | provenance | | -| EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:102:17:102:18 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:102:17:102:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFramework.cs:105:24:105:32 | "tainted" : String | EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:193:35:193:35 | p : Person [property Name] : String | provenance | | -| EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | provenance | | +| EntityFramework.cs:121:17:121:18 | access to local variable p1 : Person [property Title] : String | EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | provenance | | +| EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | EntityFramework.cs:121:17:121:18 | access to local variable p1 : Person [property Title] : String | provenance | | | EntityFramework.cs:124:25:124:33 | "tainted" : String | EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | provenance | | | EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | EntityFramework.cs:129:18:129:25 | access to property Title | provenance | | -| EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFramework.cs:149:29:149:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | +| EntityFramework.cs:140:17:140:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | EntityFramework.cs:149:29:149:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | +| EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFramework.cs:140:17:140:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:142:29:147:17 | array creation of type Address[] : null [element, property Street] : String | EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:142:35:147:17 | { ..., ... } : null [element, property Street] : String | EntityFramework.cs:142:29:147:17 | array creation of type Address[] : null [element, property Street] : String | provenance | | | EntityFramework.cs:143:21:146:21 | object creation of type Address : Address [property Street] : String | EntityFramework.cs:142:35:147:17 | { ..., ... } : null [element, property Street] : String | provenance | | @@ -33,7 +38,8 @@ edges | EntityFramework.cs:150:13:150:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | provenance | | | EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | -| EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:161:31:161:32 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFramework.cs:156:17:156:18 | access to local variable a1 : Address [property Street] : String | EntityFramework.cs:161:31:161:32 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:156:17:156:18 | access to local variable a1 : Address [property Street] : String | provenance | | | EntityFramework.cs:159:26:159:34 | "tainted" : String | EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | provenance | | | EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | provenance | | @@ -47,12 +53,16 @@ edges | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:212:18:212:30 | access to property Addresses : DbSet
    [element, property Street] : String | provenance | | | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | -| EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:172:17:172:18 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | EntityFramework.cs:172:17:172:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFramework.cs:175:24:175:32 | "tainted" : String | EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | provenance | | -| EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:182:85:182:86 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFramework.cs:177:17:177:18 | access to local variable a1 : Address [property Street] : String | EntityFramework.cs:182:85:182:86 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | EntityFramework.cs:177:17:177:18 | access to local variable a1 : Address [property Street] : String | provenance | | | EntityFramework.cs:180:26:180:34 | "tainted" : String | EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | provenance | | -| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | -| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | +| EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | +| EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | EntityFramework.cs:183:37:183:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | +| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | +| EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | | EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | provenance | | | EntityFramework.cs:182:85:182:86 | access to local variable a1 : Address [property Street] : String | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | provenance | | | EntityFramework.cs:183:13:183:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFramework.cs:184:13:184:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | provenance | | @@ -82,33 +92,39 @@ edges | EntityFramework.cs:219:18:219:36 | call to method First : Person [property Addresses, element, property Street] : String | EntityFramework.cs:219:18:219:46 | access to property Addresses : ICollection
    [element, property Street] : String | provenance | | | EntityFramework.cs:219:18:219:46 | access to property Addresses : ICollection
    [element, property Street] : String | EntityFramework.cs:219:18:219:54 | call to method First
    : Address [property Street] : String | provenance | | | EntityFramework.cs:219:18:219:54 | call to method First
    : Address [property Street] : String | EntityFramework.cs:219:18:219:61 | access to property Street | provenance | | -| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | provenance | | -| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | provenance | | -| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | provenance | | -| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | provenance | | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | provenance | | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | provenance | | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | provenance | | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | provenance | | +| EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | provenance | | | EntityFrameworkCore.cs:84:18:84:46 | object creation of type RawSqlString : RawSqlString | EntityFrameworkCore.cs:84:18:84:46 | (...) ... | provenance | | | EntityFrameworkCore.cs:84:35:84:45 | access to local variable taintSource : String | EntityFrameworkCore.cs:84:18:84:46 | object creation of type RawSqlString : RawSqlString | provenance | | | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | provenance | | | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | provenance | | -| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:91:17:91:18 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:91:17:91:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons : DbSet [element, property Name] : String | provenance | | | EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | provenance | | -| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:113:17:113:18 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:113:17:113:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons : DbSet [element, property Name] : String | EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | provenance | | | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons : DbSet [element, property Name] : String | provenance | | | EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | EntityFrameworkCore.cs:237:18:237:28 | access to property Persons : DbSet [element, property Name] : String | provenance | | -| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:135:17:135:18 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:135:17:135:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:226:35:226:35 | p : Person [property Name] : String | provenance | | -| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | provenance | | +| EntityFrameworkCore.cs:154:17:154:18 | access to local variable p1 : Person [property Title] : String | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | provenance | | +| EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | EntityFrameworkCore.cs:154:17:154:18 | access to local variable p1 : Person [property Title] : String | provenance | | | EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | provenance | | | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | EntityFrameworkCore.cs:162:18:162:25 | access to property Title | provenance | | -| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | +| EntityFrameworkCore.cs:173:17:173:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | +| EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:173:17:173:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] : null [element, property Street] : String | EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } : null [element, property Street] : String | EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] : null [element, property Street] : String | provenance | | | EntityFrameworkCore.cs:176:21:179:21 | object creation of type Address : Address [property Street] : String | EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } : null [element, property Street] : String | provenance | | @@ -124,7 +140,8 @@ edges | EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | provenance | | | EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | -| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFrameworkCore.cs:189:17:189:18 | access to local variable a1 : Address [property Street] : String | EntityFrameworkCore.cs:194:31:194:32 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:189:17:189:18 | access to local variable a1 : Address [property Street] : String | provenance | | | EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | provenance | | | EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | provenance | | @@ -138,12 +155,16 @@ edges | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:245:18:245:30 | access to property Addresses : DbSet
    [element, property Street] : String | provenance | | | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | EntityFrameworkCore.cs:252:18:252:28 | access to property Persons : DbSet [element, property Addresses, element, property Street] : String | provenance | | -| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:205:17:205:18 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | provenance | | +| EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | EntityFrameworkCore.cs:205:17:205:18 | access to local variable p1 : Person [property Name] : String | provenance | | | EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | provenance | | -| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFrameworkCore.cs:210:17:210:18 | access to local variable a1 : Address [property Street] : String | EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 : Address [property Street] : String | provenance | | +| EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | EntityFrameworkCore.cs:210:17:210:18 | access to local variable a1 : Address [property Street] : String | provenance | | | EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | provenance | | -| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | -| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | +| EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | +| EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | EntityFrameworkCore.cs:216:37:216:53 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | provenance | | +| EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | provenance | | | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | provenance | | | EntityFrameworkCore.cs:215:85:215:86 | access to local variable a1 : Address [property Street] : String | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | provenance | | | EntityFrameworkCore.cs:216:13:216:15 | [post] access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | EntityFrameworkCore.cs:217:13:217:15 | access to local variable ctx : MyContext [property PersonAddresses, element, property Address, property Street] : String | provenance | | @@ -174,25 +195,30 @@ edges | EntityFrameworkCore.cs:252:18:252:46 | access to property Addresses : ICollection
    [element, property Street] : String | EntityFrameworkCore.cs:252:18:252:54 | call to method First
    : Address [property Street] : String | provenance | | | EntityFrameworkCore.cs:252:18:252:54 | call to method First
    : Address [property Street] : String | EntityFrameworkCore.cs:252:18:252:61 | access to property Street | provenance | | nodes +| EntityFramework.cs:58:17:58:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:59:13:62:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:61:24:61:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:66:13:66:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | | EntityFramework.cs:66:13:66:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | | EntityFramework.cs:66:29:66:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:68:13:68:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:80:17:80:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:81:13:84:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:83:24:83:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:88:13:88:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | | EntityFramework.cs:88:13:88:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | | EntityFramework.cs:88:29:88:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:90:19:90:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFramework.cs:102:17:102:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:103:13:106:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:105:24:105:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:109:27:109:28 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFramework.cs:121:17:121:18 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFramework.cs:122:13:125:13 | { ..., ... } : Person [property Title] : String | semmle.label | { ..., ... } : Person [property Title] : String | | EntityFramework.cs:124:25:124:33 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:129:18:129:19 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFramework.cs:129:18:129:25 | access to property Title | semmle.label | access to property Title | +| EntityFramework.cs:140:17:140:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | | EntityFramework.cs:141:13:148:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | semmle.label | { ..., ... } : Person [property Addresses, element, property Street] : String | | EntityFramework.cs:142:29:147:17 | array creation of type Address[] : null [element, property Street] : String | semmle.label | array creation of type Address[] : null [element, property Street] : String | | EntityFramework.cs:142:35:147:17 | { ..., ... } : null [element, property Street] : String | semmle.label | { ..., ... } : null [element, property Street] : String | @@ -204,6 +230,7 @@ nodes | EntityFramework.cs:149:29:149:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | | EntityFramework.cs:150:13:150:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | | EntityFramework.cs:154:13:154:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:156:17:156:18 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | | EntityFramework.cs:157:13:160:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFramework.cs:159:26:159:34 | "tainted" : String | semmle.label | "tainted" : String | | EntityFramework.cs:161:13:161:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | @@ -213,10 +240,14 @@ nodes | EntityFramework.cs:162:13:162:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | | EntityFramework.cs:166:13:166:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFramework.cs:172:17:172:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFramework.cs:173:13:176:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFramework.cs:175:24:175:32 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFramework.cs:177:17:177:18 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | | EntityFramework.cs:178:13:181:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFramework.cs:180:26:180:34 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | +| EntityFramework.cs:182:17:182:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | semmle.label | { ..., ... } : PersonAddressMap [property Address, property Street] : String | | EntityFramework.cs:182:60:182:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | semmle.label | { ..., ... } : PersonAddressMap [property Person, property Name] : String | | EntityFramework.cs:182:71:182:72 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | @@ -247,6 +278,7 @@ nodes | EntityFramework.cs:219:18:219:46 | access to property Addresses : ICollection
    [element, property Street] : String | semmle.label | access to property Addresses : ICollection
    [element, property Street] : String | | EntityFramework.cs:219:18:219:54 | call to method First
    : Address [property Street] : String | semmle.label | call to method First
    : Address [property Street] : String | | EntityFramework.cs:219:18:219:61 | access to property Street | semmle.label | access to property Street | +| EntityFrameworkCore.cs:82:17:82:27 | access to local variable taintSource : String | semmle.label | access to local variable taintSource : String | | EntityFrameworkCore.cs:82:31:82:39 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:83:18:83:28 | access to local variable taintSource | semmle.label | access to local variable taintSource | | EntityFrameworkCore.cs:84:18:84:46 | (...) ... | semmle.label | (...) ... | @@ -255,25 +287,30 @@ nodes | EntityFrameworkCore.cs:85:18:85:42 | (...) ... | semmle.label | (...) ... | | EntityFrameworkCore.cs:85:18:85:42 | call to operator implicit conversion : RawSqlString | semmle.label | call to operator implicit conversion : RawSqlString | | EntityFrameworkCore.cs:85:32:85:42 | access to local variable taintSource : String | semmle.label | access to local variable taintSource : String | +| EntityFrameworkCore.cs:91:17:91:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:92:13:95:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:94:24:94:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:99:13:99:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | | EntityFrameworkCore.cs:99:13:99:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | | EntityFrameworkCore.cs:99:29:99:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:101:13:101:15 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:113:17:113:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:114:13:117:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:116:24:116:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:121:13:121:15 | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | [post] access to local variable ctx : MyContext [property Persons, element, property Name] : String | | EntityFrameworkCore.cs:121:13:121:23 | [post] access to property Persons : DbSet [element, property Name] : String | semmle.label | [post] access to property Persons : DbSet [element, property Name] : String | | EntityFrameworkCore.cs:121:29:121:30 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:123:19:123:21 | access to local variable ctx : MyContext [property Persons, element, property Name] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Name] : String | +| EntityFrameworkCore.cs:135:17:135:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:136:13:139:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:138:24:138:32 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:142:27:142:28 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | +| EntityFrameworkCore.cs:154:17:154:18 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFrameworkCore.cs:155:13:158:13 | { ..., ... } : Person [property Title] : String | semmle.label | { ..., ... } : Person [property Title] : String | | EntityFrameworkCore.cs:157:25:157:33 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:162:18:162:19 | access to local variable p1 : Person [property Title] : String | semmle.label | access to local variable p1 : Person [property Title] : String | | EntityFrameworkCore.cs:162:18:162:25 | access to property Title | semmle.label | access to property Title | +| EntityFrameworkCore.cs:173:17:173:18 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:174:13:181:13 | { ..., ... } : Person [property Addresses, element, property Street] : String | semmle.label | { ..., ... } : Person [property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:175:29:180:17 | array creation of type Address[] : null [element, property Street] : String | semmle.label | array creation of type Address[] : null [element, property Street] : String | | EntityFrameworkCore.cs:175:35:180:17 | { ..., ... } : null [element, property Street] : String | semmle.label | { ..., ... } : null [element, property Street] : String | @@ -285,6 +322,7 @@ nodes | EntityFrameworkCore.cs:182:29:182:30 | access to local variable p1 : Person [property Addresses, element, property Street] : String | semmle.label | access to local variable p1 : Person [property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:183:13:183:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:187:13:187:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:189:17:189:18 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | | EntityFrameworkCore.cs:190:13:193:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFrameworkCore.cs:192:26:192:34 | "tainted" : String | semmle.label | "tainted" : String | | EntityFrameworkCore.cs:194:13:194:15 | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | [post] access to local variable ctx : MyContext [property Addresses, element, property Street] : String | @@ -294,10 +332,14 @@ nodes | EntityFrameworkCore.cs:195:13:195:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Addresses, element, property Street] : String | | EntityFrameworkCore.cs:199:13:199:15 | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | semmle.label | access to local variable ctx : MyContext [property Persons, element, property Addresses, element, property Street] : String | +| EntityFrameworkCore.cs:205:17:205:18 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | | EntityFrameworkCore.cs:206:13:209:13 | { ..., ... } : Person [property Name] : String | semmle.label | { ..., ... } : Person [property Name] : String | | EntityFrameworkCore.cs:208:24:208:32 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:210:17:210:18 | access to local variable a1 : Address [property Street] : String | semmle.label | access to local variable a1 : Address [property Street] : String | | EntityFrameworkCore.cs:211:13:214:13 | { ..., ... } : Address [property Street] : String | semmle.label | { ..., ... } : Address [property Street] : String | | EntityFrameworkCore.cs:213:26:213:34 | "tainted" : String | semmle.label | "tainted" : String | +| EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Address, property Street] : String | +| EntityFrameworkCore.cs:215:17:215:33 | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | semmle.label | access to local variable personAddressMap1 : PersonAddressMap [property Person, property Name] : String | | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Address, property Street] : String | semmle.label | { ..., ... } : PersonAddressMap [property Address, property Street] : String | | EntityFrameworkCore.cs:215:60:215:88 | { ..., ... } : PersonAddressMap [property Person, property Name] : String | semmle.label | { ..., ... } : PersonAddressMap [property Person, property Name] : String | | EntityFrameworkCore.cs:215:71:215:72 | access to local variable p1 : Person [property Name] : String | semmle.label | access to local variable p1 : Person [property Name] : String | diff --git a/csharp/ql/test/query-tests/Likely Bugs/UnsafeYearConstruction/UnsafeYearConstruction.expected b/csharp/ql/test/query-tests/Likely Bugs/UnsafeYearConstruction/UnsafeYearConstruction.expected index 5ff0ff32c21..72846a3bea1 100644 --- a/csharp/ql/test/query-tests/Likely Bugs/UnsafeYearConstruction/UnsafeYearConstruction.expected +++ b/csharp/ql/test/query-tests/Likely Bugs/UnsafeYearConstruction/UnsafeYearConstruction.expected @@ -1,9 +1,11 @@ edges -| Program.cs:15:27:15:38 | ... + ... : Int32 | Program.cs:17:37:17:43 | access to local variable endYear | provenance | | +| Program.cs:15:17:15:23 | access to local variable endYear : Int32 | Program.cs:17:37:17:43 | access to local variable endYear | provenance | | +| Program.cs:15:27:15:38 | ... + ... : Int32 | Program.cs:15:17:15:23 | access to local variable endYear : Int32 | provenance | | | Program.cs:23:31:23:34 | year : Int32 | Program.cs:26:39:26:42 | access to parameter year | provenance | | | Program.cs:33:18:33:29 | ... - ... : Int32 | Program.cs:23:31:23:34 | year : Int32 | provenance | | nodes | Program.cs:13:39:13:50 | ... - ... | semmle.label | ... - ... | +| Program.cs:15:17:15:23 | access to local variable endYear : Int32 | semmle.label | access to local variable endYear : Int32 | | Program.cs:15:27:15:38 | ... + ... : Int32 | semmle.label | ... + ... : Int32 | | Program.cs:17:37:17:43 | access to local variable endYear | semmle.label | access to local variable endYear | | Program.cs:23:31:23:34 | year : Int32 | semmle.label | year : Int32 | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected b/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected index 10a233c2c82..5c6dad11f8b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-020/UntrustedDataToExternalAPI.expected @@ -1,8 +1,10 @@ edges +| UntrustedData.cs:9:13:9:16 | access to local variable name : String | UntrustedData.cs:13:28:13:31 | access to local variable name | provenance | | +| UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | UntrustedData.cs:9:13:9:16 | access to local variable name : String | provenance | | | UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | UntrustedData.cs:9:20:9:50 | access to indexer : String | provenance | | -| UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | UntrustedData.cs:13:28:13:31 | access to local variable name | provenance | | -| UntrustedData.cs:9:20:9:50 | access to indexer : String | UntrustedData.cs:13:28:13:31 | access to local variable name | provenance | | +| UntrustedData.cs:9:20:9:50 | access to indexer : String | UntrustedData.cs:9:13:9:16 | access to local variable name : String | provenance | | nodes +| UntrustedData.cs:9:13:9:16 | access to local variable name : String | semmle.label | access to local variable name : String | | UntrustedData.cs:9:20:9:30 | access to property Request | semmle.label | access to property Request | | UntrustedData.cs:9:20:9:42 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UntrustedData.cs:9:20:9:50 | access to indexer : String | semmle.label | access to indexer : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected b/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected index e3bc1c2dd1b..7369d77178b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-022/TaintedPath/TaintedPath.expected @@ -1,26 +1,24 @@ edges +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:12:50:12:53 | access to local variable path | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:17:51:17:54 | access to local variable path | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:25:30:25:33 | access to local variable path | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:31:30:31:33 | access to local variable path | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:35:16:35:22 | access to local variable badPath : String | provenance | | +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | TaintedPath.cs:51:26:51:29 | access to local variable path | provenance | | +| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:10:16:10:19 | access to local variable path : String | provenance | | | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:10:23:10:53 | access to indexer : String | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:12:50:12:53 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:17:51:17:54 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:25:30:25:33 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:31:30:31:33 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:36:25:36:31 | access to local variable badPath | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:38:49:38:55 | access to local variable badPath | provenance | | -| TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | TaintedPath.cs:51:26:51:29 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:12:50:12:53 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:17:51:17:54 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:25:30:25:33 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:31:30:31:33 | access to local variable path | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:36:25:36:31 | access to local variable badPath | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:38:49:38:55 | access to local variable badPath | provenance | | -| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:51:26:51:29 | access to local variable path | provenance | | +| TaintedPath.cs:10:23:10:53 | access to indexer : String | TaintedPath.cs:10:16:10:19 | access to local variable path : String | provenance | | +| TaintedPath.cs:35:16:35:22 | access to local variable badPath : String | TaintedPath.cs:36:25:36:31 | access to local variable badPath | provenance | | +| TaintedPath.cs:35:16:35:22 | access to local variable badPath : String | TaintedPath.cs:38:49:38:55 | access to local variable badPath | provenance | | nodes +| TaintedPath.cs:10:16:10:19 | access to local variable path : String | semmle.label | access to local variable path : String | | TaintedPath.cs:10:23:10:45 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | TaintedPath.cs:10:23:10:53 | access to indexer : String | semmle.label | access to indexer : String | | TaintedPath.cs:12:50:12:53 | access to local variable path | semmle.label | access to local variable path | | TaintedPath.cs:17:51:17:54 | access to local variable path | semmle.label | access to local variable path | | TaintedPath.cs:25:30:25:33 | access to local variable path | semmle.label | access to local variable path | | TaintedPath.cs:31:30:31:33 | access to local variable path | semmle.label | access to local variable path | +| TaintedPath.cs:35:16:35:22 | access to local variable badPath : String | semmle.label | access to local variable badPath : String | | TaintedPath.cs:36:25:36:31 | access to local variable badPath | semmle.label | access to local variable badPath | | TaintedPath.cs:38:49:38:55 | access to local variable badPath | semmle.label | access to local variable badPath | | TaintedPath.cs:51:26:51:29 | access to local variable path | semmle.label | access to local variable path | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected b/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected index 3443ea23f8e..69bd71e4401 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-022/ZipSlip/ZipSlip.expected @@ -1,44 +1,58 @@ edges -| ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | ZipSlip.cs:30:71:30:78 | access to local variable fullPath : String | provenance | | -| ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | ZipSlip.cs:38:81:38:88 | access to local variable fullPath : String | provenance | | +| ZipSlip.cs:15:24:15:31 | access to local variable fullPath : String | ZipSlip.cs:30:71:30:78 | access to local variable fullPath : String | provenance | | +| ZipSlip.cs:15:24:15:31 | access to local variable fullPath : String | ZipSlip.cs:38:81:38:88 | access to local variable fullPath : String | provenance | | +| ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | ZipSlip.cs:15:24:15:31 | access to local variable fullPath : String | provenance | | | ZipSlip.cs:15:52:15:65 | access to property FullName : String | ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | provenance | | -| ZipSlip.cs:18:31:18:44 | access to property FullName : String | ZipSlip.cs:22:71:22:74 | access to local variable file : String | provenance | | -| ZipSlip.cs:22:43:22:75 | call to method Combine : String | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | provenance | | +| ZipSlip.cs:18:24:18:27 | access to local variable file : String | ZipSlip.cs:22:71:22:74 | access to local variable file : String | provenance | | +| ZipSlip.cs:18:31:18:44 | access to property FullName : String | ZipSlip.cs:18:24:18:27 | access to local variable file : String | provenance | | +| ZipSlip.cs:22:28:22:39 | access to local variable destFileName : String | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | provenance | | +| ZipSlip.cs:22:43:22:75 | call to method Combine : String | ZipSlip.cs:22:28:22:39 | access to local variable destFileName : String | provenance | | | ZipSlip.cs:22:71:22:74 | access to local variable file : String | ZipSlip.cs:22:43:22:75 | call to method Combine : String | provenance | | -| ZipSlip.cs:30:43:30:79 | call to method Combine : String | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | provenance | | -| ZipSlip.cs:30:43:30:79 | call to method Combine : String | ZipSlip.cs:35:45:35:56 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:30:28:30:39 | access to local variable destFilePath : String | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:30:28:30:39 | access to local variable destFilePath : String | ZipSlip.cs:35:45:35:56 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:30:43:30:79 | call to method Combine : String | ZipSlip.cs:30:28:30:39 | access to local variable destFilePath : String | provenance | | | ZipSlip.cs:30:71:30:78 | access to local variable fullPath : String | ZipSlip.cs:30:43:30:79 | call to method Combine : String | provenance | | -| ZipSlip.cs:38:36:38:90 | call to method GetFullPath : String | ZipSlip.cs:39:41:39:52 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:38:21:38:32 | access to local variable destFilePath : String | ZipSlip.cs:39:41:39:52 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:38:36:38:90 | call to method GetFullPath : String | ZipSlip.cs:38:21:38:32 | access to local variable destFilePath : String | provenance | | | ZipSlip.cs:38:53:38:89 | call to method Combine : String | ZipSlip.cs:38:36:38:90 | call to method GetFullPath : String | provenance | | | ZipSlip.cs:38:81:38:88 | access to local variable fullPath : String | ZipSlip.cs:38:53:38:89 | call to method Combine : String | provenance | | -| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:68:74:68:85 | access to local variable destFilePath | provenance | | -| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:75:71:75:82 | access to local variable destFilePath | provenance | | -| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:82:57:82:68 | access to local variable destFilePath | provenance | | -| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:90:58:90:69 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | ZipSlip.cs:68:74:68:85 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | ZipSlip.cs:75:71:75:82 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | ZipSlip.cs:82:57:82:68 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | ZipSlip.cs:90:58:90:69 | access to local variable destFilePath | provenance | | +| ZipSlip.cs:61:47:61:86 | call to method Combine : String | ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | provenance | | | ZipSlip.cs:61:72:61:85 | access to property FullName : String | ZipSlip.cs:61:47:61:86 | call to method Combine : String | provenance | | -| ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | provenance | | +| ZipSlipBad.cs:9:16:9:27 | access to local variable destFileName : String | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | provenance | | +| ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | ZipSlipBad.cs:9:16:9:27 | access to local variable destFileName : String | provenance | | | ZipSlipBad.cs:9:59:9:72 | access to property FullName : String | ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | provenance | | nodes +| ZipSlip.cs:15:24:15:31 | access to local variable fullPath : String | semmle.label | access to local variable fullPath : String | | ZipSlip.cs:15:35:15:66 | call to method GetFullPath : String | semmle.label | call to method GetFullPath : String | | ZipSlip.cs:15:52:15:65 | access to property FullName : String | semmle.label | access to property FullName : String | +| ZipSlip.cs:18:24:18:27 | access to local variable file : String | semmle.label | access to local variable file : String | | ZipSlip.cs:18:31:18:44 | access to property FullName : String | semmle.label | access to property FullName : String | +| ZipSlip.cs:22:28:22:39 | access to local variable destFileName : String | semmle.label | access to local variable destFileName : String | | ZipSlip.cs:22:43:22:75 | call to method Combine : String | semmle.label | call to method Combine : String | | ZipSlip.cs:22:71:22:74 | access to local variable file : String | semmle.label | access to local variable file : String | | ZipSlip.cs:23:41:23:52 | access to local variable destFileName | semmle.label | access to local variable destFileName | +| ZipSlip.cs:30:28:30:39 | access to local variable destFilePath : String | semmle.label | access to local variable destFilePath : String | | ZipSlip.cs:30:43:30:79 | call to method Combine : String | semmle.label | call to method Combine : String | | ZipSlip.cs:30:71:30:78 | access to local variable fullPath : String | semmle.label | access to local variable fullPath : String | | ZipSlip.cs:31:41:31:52 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | | ZipSlip.cs:35:45:35:56 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlip.cs:38:21:38:32 | access to local variable destFilePath : String | semmle.label | access to local variable destFilePath : String | | ZipSlip.cs:38:36:38:90 | call to method GetFullPath : String | semmle.label | call to method GetFullPath : String | | ZipSlip.cs:38:53:38:89 | call to method Combine : String | semmle.label | call to method Combine : String | | ZipSlip.cs:38:81:38:88 | access to local variable fullPath : String | semmle.label | access to local variable fullPath : String | | ZipSlip.cs:39:41:39:52 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlip.cs:61:32:61:43 | access to local variable destFilePath : String | semmle.label | access to local variable destFilePath : String | | ZipSlip.cs:61:47:61:86 | call to method Combine : String | semmle.label | call to method Combine : String | | ZipSlip.cs:61:72:61:85 | access to property FullName : String | semmle.label | access to property FullName : String | | ZipSlip.cs:68:74:68:85 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | | ZipSlip.cs:75:71:75:82 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | | ZipSlip.cs:82:57:82:68 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | | ZipSlip.cs:90:58:90:69 | access to local variable destFilePath | semmle.label | access to local variable destFilePath | +| ZipSlipBad.cs:9:16:9:27 | access to local variable destFileName : String | semmle.label | access to local variable destFileName : String | | ZipSlipBad.cs:9:31:9:73 | call to method Combine : String | semmle.label | call to method Combine : String | | ZipSlipBad.cs:9:59:9:72 | access to property FullName : String | semmle.label | access to property FullName : String | | ZipSlipBad.cs:10:29:10:40 | access to local variable destFileName | semmle.label | access to local variable destFileName | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected index fc1da3ba7c6..11b83a0ae20 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-078/CommandInjection.expected @@ -1,18 +1,20 @@ edges +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:26:27:26:47 | ... + ... | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:26:50:26:66 | ... + ... | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput | provenance | | +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput : String | provenance | | | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | CommandInjection.cs:25:32:25:51 | access to property Text : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:26:27:26:47 | ... + ... | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:26:50:26:66 | ... + ... | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:28:74:28:82 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:32:39:32:47 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:33:40:33:48 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput | provenance | | -| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:34:47:34:55 | access to local variable userInput : String | provenance | | -| CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | CommandInjection.cs:29:27:29:35 | access to local variable startInfo | provenance | | +| CommandInjection.cs:25:32:25:51 | access to property Text : String | CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | provenance | | +| CommandInjection.cs:28:30:28:38 | access to local variable startInfo : ProcessStartInfo | CommandInjection.cs:29:27:29:35 | access to local variable startInfo | provenance | | +| CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | CommandInjection.cs:28:30:28:38 | access to local variable startInfo : ProcessStartInfo | provenance | | | CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | provenance | | | CommandInjection.cs:28:74:28:82 | access to local variable userInput : String | CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | provenance | | | CommandInjection.cs:32:13:32:26 | [post] access to local variable startInfoProps : ProcessStartInfo | CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | provenance | | @@ -22,10 +24,12 @@ edges | CommandInjection.cs:34:13:34:26 | [post] access to local variable startInfoProps : ProcessStartInfo | CommandInjection.cs:35:27:35:40 | access to local variable startInfoProps | provenance | | | CommandInjection.cs:34:47:34:55 | access to local variable userInput : String | CommandInjection.cs:34:13:34:26 | [post] access to local variable startInfoProps : ProcessStartInfo | provenance | | nodes +| CommandInjection.cs:25:20:25:28 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | | CommandInjection.cs:25:32:25:46 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox | | CommandInjection.cs:25:32:25:51 | access to property Text : String | semmle.label | access to property Text : String | | CommandInjection.cs:26:27:26:47 | ... + ... | semmle.label | ... + ... | | CommandInjection.cs:26:50:26:66 | ... + ... | semmle.label | ... + ... | +| CommandInjection.cs:28:30:28:38 | access to local variable startInfo : ProcessStartInfo | semmle.label | access to local variable startInfo : ProcessStartInfo | | CommandInjection.cs:28:42:28:83 | object creation of type ProcessStartInfo : ProcessStartInfo | semmle.label | object creation of type ProcessStartInfo : ProcessStartInfo | | CommandInjection.cs:28:63:28:71 | access to local variable userInput | semmle.label | access to local variable userInput | | CommandInjection.cs:28:63:28:71 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected index 1e1c6258c89..759128d0670 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected @@ -1,10 +1,11 @@ edges -| Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | Index.cshtml:14:16:14:22 | call to operator implicit conversion | provenance | | +| Index.cshtml:5:9:5:15 | access to local variable message : StringValues | Index.cshtml:14:16:14:22 | call to operator implicit conversion | provenance | | +| Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | Index.cshtml:5:9:5:15 | access to local variable message : StringValues | provenance | | +| XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | provenance | | +| XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | provenance | | +| XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | provenance | | | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:19:25:19:52 | access to indexer : String | provenance | | -| XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | provenance | | -| XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | provenance | | -| XSSAspNet.cs:19:25:19:52 | access to indexer : String | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | provenance | | -| XSSAspNet.cs:19:25:19:52 | access to indexer : String | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | provenance | | +| XSSAspNet.cs:19:25:19:52 | access to indexer : String | XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | provenance | | | XSSAspNet.cs:43:28:43:46 | access to property QueryString : NameValueCollection | XSSAspNet.cs:43:28:43:55 | access to indexer | provenance | | | XSSAspNetCore.cs:21:52:21:64 | access to property Query : IQueryCollection | XSSAspNetCore.cs:21:52:21:76 | call to operator implicit conversion | provenance | | | XSSAspNetCore.cs:40:56:40:58 | foo : String | XSSAspNetCore.cs:44:51:44:53 | access to parameter foo | provenance | | @@ -15,8 +16,10 @@ edges | XSSAspNetCore.cs:61:44:61:63 | access to indexer : StringValues | XSSAspNetCore.cs:61:44:61:66 | access to indexer | provenance | | | XSSAspNetCore.cs:72:51:72:65 | access to property Headers : IHeaderDictionary | XSSAspNetCore.cs:72:51:72:72 | call to operator implicit conversion | provenance | | nodes +| Index.cshtml:5:9:5:15 | access to local variable message : StringValues | semmle.label | access to local variable message : StringValues | | Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | semmle.label | access to property Query : IQueryCollection | | Index.cshtml:14:16:14:22 | call to operator implicit conversion | semmle.label | call to operator implicit conversion | +| XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | semmle.label | access to local variable sayHi : String | | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSSAspNet.cs:19:25:19:52 | access to indexer : String | semmle.label | access to indexer : String | | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | semmle.label | access to local variable sayHi | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/XSSAsp/XSS.expected b/csharp/ql/test/query-tests/Security Features/CWE-079/XSSAsp/XSS.expected index e3c29b08316..d04a3ae03ed 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-079/XSSAsp/XSS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/XSSAsp/XSS.expected @@ -7,24 +7,29 @@ edges | XSS.cs:26:32:26:40 | access to local variable userInput : StringBuilder | XSS.cs:26:32:26:51 | call to method ToString | provenance | | | XSS.cs:27:29:27:37 | access to local variable userInput : StringBuilder | XSS.cs:27:29:27:48 | call to method ToString | provenance | | | XSS.cs:28:26:28:34 | access to local variable userInput : StringBuilder | XSS.cs:28:26:28:45 | call to method ToString | provenance | | +| XSS.cs:37:20:37:23 | access to local variable name : String | XSS.cs:38:36:38:39 | access to local variable name | provenance | | +| XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:37:20:37:23 | access to local variable name : String | provenance | | | XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:37:27:37:61 | access to indexer : String | provenance | | -| XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | XSS.cs:38:36:38:39 | access to local variable name | provenance | | -| XSS.cs:37:27:37:61 | access to indexer : String | XSS.cs:38:36:38:39 | access to local variable name | provenance | | +| XSS.cs:37:27:37:61 | access to indexer : String | XSS.cs:37:20:37:23 | access to local variable name : String | provenance | | +| XSS.cs:57:20:57:23 | access to local variable name : String | XSS.cs:59:22:59:25 | access to local variable name | provenance | | +| XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | XSS.cs:57:20:57:23 | access to local variable name : String | provenance | | | XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | XSS.cs:57:27:57:73 | access to indexer : String | provenance | | -| XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | XSS.cs:59:22:59:25 | access to local variable name | provenance | | -| XSS.cs:57:27:57:73 | access to indexer : String | XSS.cs:59:22:59:25 | access to local variable name | provenance | | +| XSS.cs:57:27:57:73 | access to indexer : String | XSS.cs:57:20:57:23 | access to local variable name : String | provenance | | +| XSS.cs:75:20:75:23 | access to local variable name : String | XSS.cs:76:36:76:39 | access to local variable name | provenance | | +| XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | XSS.cs:75:20:75:23 | access to local variable name : String | provenance | | | XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | XSS.cs:75:27:75:61 | access to indexer : String | provenance | | -| XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | XSS.cs:76:36:76:39 | access to local variable name | provenance | | -| XSS.cs:75:27:75:61 | access to indexer : String | XSS.cs:76:36:76:39 | access to local variable name | provenance | | -| XSS.cs:78:28:78:42 | access to property Request : HttpRequestBase | XSS.cs:79:36:79:40 | access to local variable name2 | provenance | | +| XSS.cs:75:27:75:61 | access to indexer : String | XSS.cs:75:20:75:23 | access to local variable name : String | provenance | | +| XSS.cs:78:20:78:24 | access to local variable name2 : String | XSS.cs:79:36:79:40 | access to local variable name2 | provenance | | +| XSS.cs:78:28:78:42 | access to property Request : HttpRequestBase | XSS.cs:78:20:78:24 | access to local variable name2 : String | provenance | | +| XSS.cs:85:20:85:23 | access to local variable name : String | XSS.cs:86:28:86:31 | access to local variable name | provenance | | +| XSS.cs:85:20:85:23 | access to local variable name : String | XSS.cs:87:31:87:34 | access to local variable name | provenance | | +| XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:85:20:85:23 | access to local variable name : String | provenance | | | XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:85:27:85:61 | access to indexer : String | provenance | | -| XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:86:28:86:31 | access to local variable name | provenance | | -| XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | XSS.cs:87:31:87:34 | access to local variable name | provenance | | -| XSS.cs:85:27:85:61 | access to indexer : String | XSS.cs:86:28:86:31 | access to local variable name | provenance | | -| XSS.cs:85:27:85:61 | access to indexer : String | XSS.cs:87:31:87:34 | access to local variable name | provenance | | +| XSS.cs:85:27:85:61 | access to indexer : String | XSS.cs:85:20:85:23 | access to local variable name : String | provenance | | +| XSS.cs:94:20:94:23 | access to local variable name : String | XSS.cs:95:31:95:34 | access to local variable name | provenance | | +| XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | XSS.cs:94:20:94:23 | access to local variable name : String | provenance | | | XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | XSS.cs:94:27:94:61 | access to indexer : String | provenance | | -| XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | XSS.cs:95:31:95:34 | access to local variable name | provenance | | -| XSS.cs:94:27:94:61 | access to indexer : String | XSS.cs:95:31:95:34 | access to local variable name | provenance | | +| XSS.cs:94:27:94:61 | access to indexer : String | XSS.cs:94:20:94:23 | access to local variable name : String | provenance | | | script.aspx:12:1:12:14 | <%= ... %> | script.aspx:12:1:12:14 | <%= ... %> | provenance | | | script.aspx:16:1:16:34 | <%= ... %> | script.aspx:16:1:16:34 | <%= ... %> | provenance | | | script.aspx:20:1:20:41 | <%= ... %> | script.aspx:20:1:20:41 | <%= ... %> | provenance | | @@ -38,21 +43,27 @@ nodes | XSS.cs:27:29:27:48 | call to method ToString | semmle.label | call to method ToString | | XSS.cs:28:26:28:34 | access to local variable userInput : StringBuilder | semmle.label | access to local variable userInput : StringBuilder | | XSS.cs:28:26:28:45 | call to method ToString | semmle.label | call to method ToString | +| XSS.cs:37:20:37:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:37:27:37:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:37:27:37:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:38:36:38:39 | access to local variable name | semmle.label | access to local variable name | +| XSS.cs:57:20:57:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:57:27:57:65 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:57:27:57:73 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:59:22:59:25 | access to local variable name | semmle.label | access to local variable name | +| XSS.cs:75:20:75:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:75:27:75:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:75:27:75:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:76:36:76:39 | access to local variable name | semmle.label | access to local variable name | +| XSS.cs:78:20:78:24 | access to local variable name2 : String | semmle.label | access to local variable name2 : String | | XSS.cs:78:28:78:42 | access to property Request : HttpRequestBase | semmle.label | access to property Request : HttpRequestBase | | XSS.cs:79:36:79:40 | access to local variable name2 | semmle.label | access to local variable name2 | +| XSS.cs:85:20:85:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:85:27:85:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:85:27:85:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:86:28:86:31 | access to local variable name | semmle.label | access to local variable name | | XSS.cs:87:31:87:34 | access to local variable name | semmle.label | access to local variable name | +| XSS.cs:94:20:94:23 | access to local variable name : String | semmle.label | access to local variable name : String | | XSS.cs:94:27:94:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSS.cs:94:27:94:61 | access to indexer : String | semmle.label | access to indexer : String | | XSS.cs:95:31:95:34 | access to local variable name | semmle.label | access to local variable name | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-089/SecondOrderSqlInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-089/SecondOrderSqlInjection.expected index c2ce4a209f6..fccccdb3c73 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-089/SecondOrderSqlInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-089/SecondOrderSqlInjection.expected @@ -1,35 +1,51 @@ edges | SecondOrderSqlInjection.cs:25:119:25:145 | call to method GetString : String | SecondOrderSqlInjection.cs:25:71:25:145 | ... + ... | provenance | | -| SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | provenance | | -| SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | provenance | | +| SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | provenance | | +| SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | provenance | | +| SecondOrderSqlInjection.cs:35:37:35:38 | access to local variable sr : StreamReader | SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | provenance | | +| SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | SecondOrderSqlInjection.cs:35:37:35:38 | access to local variable sr : StreamReader | provenance | | | SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | provenance | | +| SecondOrderSqlInjection.cs:38:29:38:31 | access to local variable sql : String | SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | provenance | | | SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | provenance | | -| SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | provenance | | +| SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | SecondOrderSqlInjection.cs:38:29:38:31 | access to local variable sql : String | provenance | | +| SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | provenance | | | SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | provenance | | -| SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | provenance | | -| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | provenance | | -| SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | provenance | | +| SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | provenance | | +| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | provenance | | +| SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | provenance | | +| SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | provenance | | | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | provenance | | +| SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | provenance | | | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | provenance | | -| SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | | | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | provenance | | -| SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | | +| SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | provenance | | nodes | SecondOrderSqlInjection.cs:25:71:25:145 | ... + ... | semmle.label | ... + ... | | SecondOrderSqlInjection.cs:25:119:25:145 | call to method GetString : String | semmle.label | call to method GetString : String | +| SecondOrderSqlInjection.cs:33:31:33:32 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | | SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | semmle.label | object creation of type FileStream : FileStream | +| SecondOrderSqlInjection.cs:35:37:35:38 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SecondOrderSqlInjection.cs:35:42:35:76 | object creation of type StreamReader : StreamReader | semmle.label | object creation of type StreamReader : StreamReader | | SecondOrderSqlInjection.cs:35:59:35:60 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | +| SecondOrderSqlInjection.cs:38:29:38:31 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SecondOrderSqlInjection.cs:38:35:38:36 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SecondOrderSqlInjection.cs:38:35:38:47 | call to method ReadLine : String | semmle.label | call to method ReadLine : String | +| SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | semmle.label | call to method Trim : String | | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | semmle.label | access to local variable sql | +| SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | | SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | semmle.label | object creation of type FileStream : FileStream | +| SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | semmle.label | object creation of type StreamReader : StreamReader | | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | +| SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | semmle.label | call to method ReadLine : String | +| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | semmle.label | call to method Trim : String | | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | semmle.label | access to local variable sql | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected index 9ef1a073fbe..4b4da20c97a 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.expected @@ -1,68 +1,98 @@ edges +| SqlInjection.cs:32:21:32:26 | access to local variable query1 : String | SqlInjection.cs:34:50:34:55 | access to local variable query1 | provenance | | | SqlInjection.cs:33:21:33:35 | access to field categoryTextBox : TextBox | SqlInjection.cs:33:21:33:40 | access to property Text : String | provenance | | -| SqlInjection.cs:33:21:33:40 | access to property Text : String | SqlInjection.cs:34:50:34:55 | access to local variable query1 | provenance | | +| SqlInjection.cs:33:21:33:40 | access to property Text : String | SqlInjection.cs:32:21:32:26 | access to local variable query1 : String | provenance | | +| SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | SqlInjection.cs:69:56:69:61 | access to local variable query1 | provenance | | +| SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | SqlInjection.cs:70:55:70:60 | access to local variable query1 | provenance | | | SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:68:33:68:52 | access to property Text : String | provenance | | -| SqlInjection.cs:68:33:68:52 | access to property Text : String | SqlInjection.cs:69:56:69:61 | access to local variable query1 | provenance | | -| SqlInjection.cs:68:33:68:52 | access to property Text : String | SqlInjection.cs:70:55:70:60 | access to local variable query1 | provenance | | -| SqlInjection.cs:82:21:82:29 | access to property Text : String | SqlInjection.cs:83:50:83:55 | access to local variable query1 | provenance | | -| SqlInjection.cs:92:21:92:29 | access to property Text : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString | provenance | | -| SqlInjection.cs:92:21:92:29 | access to property Text : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | provenance | | -| SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:94:50:94:52 | access to local variable cmd | provenance | | +| SqlInjection.cs:68:33:68:52 | access to property Text : String | SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | provenance | | +| SqlInjection.cs:81:21:81:26 | access to local variable query1 : String | SqlInjection.cs:83:50:83:55 | access to local variable query1 | provenance | | +| SqlInjection.cs:82:21:82:29 | access to property Text : String | SqlInjection.cs:81:21:81:26 | access to local variable query1 : String | provenance | | +| SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString | provenance | | +| SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | provenance | | +| SqlInjection.cs:92:21:92:29 | access to property Text : String | SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | provenance | | +| SqlInjection.cs:93:21:93:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:94:50:94:52 | access to local variable cmd | provenance | | +| SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:93:21:93:23 | access to local variable cmd : SqlCommand | provenance | | | SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | provenance | | -| SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:29:86:29:94 | access to property Text : String | SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:38:86:38:94 | access to property Text : String | SqlInjectionDapper.cs:39:63:39:67 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:47:86:47:94 | access to property Text : String | SqlInjectionDapper.cs:49:47:49:51 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:57:86:57:94 | access to property Text : String | SqlInjectionDapper.cs:58:42:58:46 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:66:86:66:94 | access to property Text : String | SqlInjectionDapper.cs:67:42:67:46 | access to local variable query | provenance | | -| SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:29:21:29:25 | access to local variable query : String | SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:29:86:29:94 | access to property Text : String | SqlInjectionDapper.cs:29:21:29:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:38:21:38:25 | access to local variable query : String | SqlInjectionDapper.cs:39:63:39:67 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:38:86:38:94 | access to property Text : String | SqlInjectionDapper.cs:38:21:38:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:47:21:47:25 | access to local variable query : String | SqlInjectionDapper.cs:49:47:49:51 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:47:86:47:94 | access to property Text : String | SqlInjectionDapper.cs:47:21:47:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:57:21:57:25 | access to local variable query : String | SqlInjectionDapper.cs:58:42:58:46 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:57:86:57:94 | access to property Text : String | SqlInjectionDapper.cs:57:21:57:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:66:21:66:25 | access to local variable query : String | SqlInjectionDapper.cs:67:42:67:46 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:66:86:66:94 | access to property Text : String | SqlInjectionDapper.cs:66:21:66:25 | access to local variable query : String | provenance | | +| SqlInjectionDapper.cs:75:21:75:25 | access to local variable query : String | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | provenance | | +| SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | SqlInjectionDapper.cs:75:21:75:25 | access to local variable query : String | provenance | | | SqlInjectionSqlite.cs:19:51:19:63 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:19:51:19:68 | access to property Text | provenance | | -| SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | SqlInjectionSqlite.cs:44:45:44:47 | access to local variable cmd | provenance | | +| SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | SqlInjectionSqlite.cs:44:45:44:47 | access to local variable cmd | provenance | | +| SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | provenance | | | SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text | provenance | | | SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text : String | provenance | | | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text : String | SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | provenance | | | SqlInjectionSqlite.cs:33:49:33:61 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:33:49:33:66 | access to property Text | provenance | | | SqlInjectionSqlite.cs:39:45:39:57 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:39:45:39:62 | access to property Text | provenance | | -| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | provenance | | +| SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | provenance | | +| SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | provenance | | | SqlInjectionSqlite.cs:49:51:49:63 | access to field untrustedData : TextBox | SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | provenance | | | SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | provenance | | -| SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | provenance | | +| SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | provenance | | +| SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | provenance | | | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | provenance | | +| SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | provenance | | | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | provenance | | -| SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | provenance | | +| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | | | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | provenance | | -| SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | provenance | | +| SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | provenance | | nodes +| SqlInjection.cs:32:21:32:26 | access to local variable query1 : String | semmle.label | access to local variable query1 : String | | SqlInjection.cs:33:21:33:35 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox | | SqlInjection.cs:33:21:33:40 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjection.cs:34:50:34:55 | access to local variable query1 | semmle.label | access to local variable query1 | +| SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | semmle.label | access to local variable query1 : String | | SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox | | SqlInjection.cs:68:33:68:52 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjection.cs:69:56:69:61 | access to local variable query1 | semmle.label | access to local variable query1 | | SqlInjection.cs:70:55:70:60 | access to local variable query1 | semmle.label | access to local variable query1 | +| SqlInjection.cs:81:21:81:26 | access to local variable query1 : String | semmle.label | access to local variable query1 : String | | SqlInjection.cs:82:21:82:29 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjection.cs:83:50:83:55 | access to local variable query1 | semmle.label | access to local variable query1 | +| SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | semmle.label | access to local variable queryString : String | | SqlInjection.cs:92:21:92:29 | access to property Text : String | semmle.label | access to property Text : String | +| SqlInjection.cs:93:21:93:23 | access to local variable cmd : SqlCommand | semmle.label | access to local variable cmd : SqlCommand | | SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | semmle.label | object creation of type SqlCommand : SqlCommand | | SqlInjection.cs:93:42:93:52 | access to local variable queryString | semmle.label | access to local variable queryString | | SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | semmle.label | access to local variable queryString : String | | SqlInjection.cs:94:50:94:52 | access to local variable cmd | semmle.label | access to local variable cmd | +| SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:29:21:29:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:29:86:29:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:38:21:38:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:38:86:38:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:39:63:39:67 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:47:21:47:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:47:86:47:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:49:47:49:51 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:57:21:57:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:57:86:57:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:58:42:58:46 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:66:21:66:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:66:86:66:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:67:42:67:46 | access to local variable query | semmle.label | access to local variable query | +| SqlInjectionDapper.cs:75:21:75:25 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlInjectionDapper.cs:75:86:75:94 | access to property Text : String | semmle.label | access to property Text : String | | SqlInjectionDapper.cs:77:52:77:56 | access to local variable query | semmle.label | access to local variable query | | SqlInjectionSqlite.cs:19:51:19:63 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | | SqlInjectionSqlite.cs:19:51:19:68 | access to property Text | semmle.label | access to property Text | +| SqlInjectionSqlite.cs:24:17:24:19 | access to local variable cmd : SQLiteCommand | semmle.label | access to local variable cmd : SQLiteCommand | | SqlInjectionSqlite.cs:24:23:24:71 | object creation of type SQLiteCommand : SQLiteCommand | semmle.label | object creation of type SQLiteCommand : SQLiteCommand | | SqlInjectionSqlite.cs:24:41:24:53 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | | SqlInjectionSqlite.cs:24:41:24:58 | access to property Text | semmle.label | access to property Text | @@ -72,13 +102,17 @@ nodes | SqlInjectionSqlite.cs:39:45:39:57 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | | SqlInjectionSqlite.cs:39:45:39:62 | access to property Text | semmle.label | access to property Text | | SqlInjectionSqlite.cs:44:45:44:47 | access to local variable cmd | semmle.label | access to local variable cmd | +| SqlInjectionSqlite.cs:49:31:49:32 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | | SqlInjectionSqlite.cs:49:36:49:84 | object creation of type FileStream : FileStream | semmle.label | object creation of type FileStream : FileStream | | SqlInjectionSqlite.cs:49:51:49:63 | access to field untrustedData : TextBox | semmle.label | access to field untrustedData : TextBox | | SqlInjectionSqlite.cs:49:51:49:68 | access to property Text : String | semmle.label | access to property Text : String | +| SqlInjectionSqlite.cs:51:37:51:38 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SqlInjectionSqlite.cs:51:42:51:76 | object creation of type StreamReader : StreamReader | semmle.label | object creation of type StreamReader : StreamReader | | SqlInjectionSqlite.cs:51:59:51:60 | access to local variable fs : FileStream | semmle.label | access to local variable fs : FileStream | +| SqlInjectionSqlite.cs:54:29:54:31 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:54:35:54:36 | access to local variable sr : StreamReader | semmle.label | access to local variable sr : StreamReader | | SqlInjectionSqlite.cs:54:35:54:47 | call to method ReadLine : String | semmle.label | call to method ReadLine : String | +| SqlInjectionSqlite.cs:56:25:56:27 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:56:31:56:33 | access to local variable sql : String | semmle.label | access to local variable sql : String | | SqlInjectionSqlite.cs:56:31:56:40 | call to method Trim : String | semmle.label | call to method Trim : String | | SqlInjectionSqlite.cs:61:53:61:55 | access to local variable sql | semmle.label | access to local variable sql | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected index ec812749311..59be23198dc 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-090/LDAPInjection.expected @@ -1,18 +1,15 @@ edges +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:14:54:14:78 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:16:21:16:45 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:23:21:23:45 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:24:53:24:77 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:27:48:27:70 | ... + ... | provenance | | +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | LDAPInjection.cs:29:20:29:42 | ... + ... | provenance | | +| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | provenance | | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:11:27:11:61 | access to indexer : String | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:14:54:14:78 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:16:21:16:45 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:23:21:23:45 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:24:53:24:77 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:27:48:27:70 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | LDAPInjection.cs:29:20:29:42 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:14:54:14:78 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:16:21:16:45 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:23:21:23:45 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:24:53:24:77 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:27:48:27:70 | ... + ... | provenance | | -| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:29:20:29:42 | ... + ... | provenance | | +| LDAPInjection.cs:11:27:11:61 | access to indexer : String | LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | provenance | | nodes +| LDAPInjection.cs:11:16:11:23 | access to local variable userName : String | semmle.label | access to local variable userName : String | | LDAPInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | LDAPInjection.cs:11:27:11:61 | access to indexer : String | semmle.label | access to indexer : String | | LDAPInjection.cs:14:54:14:78 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected index 028af79c5df..6902d6f063d 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-091/XMLInjection/XMLInjection.expected @@ -1,8 +1,10 @@ edges +| Test.cs:8:12:8:23 | access to local variable employeeName : String | Test.cs:15:25:15:80 | ... + ... | provenance | | +| Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | Test.cs:8:12:8:23 | access to local variable employeeName : String | provenance | | | Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | Test.cs:8:27:8:65 | access to indexer : String | provenance | | -| Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | Test.cs:15:25:15:80 | ... + ... | provenance | | -| Test.cs:8:27:8:65 | access to indexer : String | Test.cs:15:25:15:80 | ... + ... | provenance | | +| Test.cs:8:27:8:65 | access to indexer : String | Test.cs:8:12:8:23 | access to local variable employeeName : String | provenance | | nodes +| Test.cs:8:12:8:23 | access to local variable employeeName : String | semmle.label | access to local variable employeeName : String | | Test.cs:8:27:8:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | Test.cs:8:27:8:65 | access to indexer : String | semmle.label | access to indexer : String | | Test.cs:15:25:15:80 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected index f247e97bc35..fe49b9ddb65 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-094/CodeInjection.expected @@ -1,10 +1,11 @@ edges +| CodeInjection.cs:23:16:23:19 | access to local variable code : String | CodeInjection.cs:29:64:29:67 | access to local variable code | provenance | | +| CodeInjection.cs:23:16:23:19 | access to local variable code : String | CodeInjection.cs:40:36:40:39 | access to local variable code | provenance | | +| CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:23:16:23:19 | access to local variable code : String | provenance | | | CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:23:23:23:53 | access to indexer : String | provenance | | -| CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:29:64:29:67 | access to local variable code | provenance | | -| CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | CodeInjection.cs:40:36:40:39 | access to local variable code | provenance | | -| CodeInjection.cs:23:23:23:53 | access to indexer : String | CodeInjection.cs:29:64:29:67 | access to local variable code | provenance | | -| CodeInjection.cs:23:23:23:53 | access to indexer : String | CodeInjection.cs:40:36:40:39 | access to local variable code | provenance | | +| CodeInjection.cs:23:23:23:53 | access to indexer : String | CodeInjection.cs:23:16:23:19 | access to local variable code : String | provenance | | nodes +| CodeInjection.cs:23:16:23:19 | access to local variable code : String | semmle.label | access to local variable code : String | | CodeInjection.cs:23:23:23:45 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | CodeInjection.cs:23:23:23:53 | access to indexer : String | semmle.label | access to indexer : String | | CodeInjection.cs:29:64:29:67 | access to local variable code | semmle.label | access to local variable code | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected index cc089c9898b..29ce3c2ba18 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-099/ResourceInjection.expected @@ -1,12 +1,15 @@ edges +| ResourceInjection.cs:8:16:8:23 | access to local variable userName : String | ResourceInjection.cs:9:16:9:31 | access to local variable connectionString : String | provenance | | +| ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:8:16:8:23 | access to local variable userName : String | provenance | | | ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:8:27:8:61 | access to indexer : String | provenance | | -| ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | provenance | | -| ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | provenance | | -| ResourceInjection.cs:8:27:8:61 | access to indexer : String | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | provenance | | -| ResourceInjection.cs:8:27:8:61 | access to indexer : String | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | provenance | | +| ResourceInjection.cs:8:27:8:61 | access to indexer : String | ResourceInjection.cs:8:16:8:23 | access to local variable userName : String | provenance | | +| ResourceInjection.cs:9:16:9:31 | access to local variable connectionString : String | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | provenance | | +| ResourceInjection.cs:9:16:9:31 | access to local variable connectionString : String | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | provenance | | nodes +| ResourceInjection.cs:8:16:8:23 | access to local variable userName : String | semmle.label | access to local variable userName : String | | ResourceInjection.cs:8:27:8:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | ResourceInjection.cs:8:27:8:61 | access to indexer : String | semmle.label | access to indexer : String | +| ResourceInjection.cs:9:16:9:31 | access to local variable connectionString : String | semmle.label | access to local variable connectionString : String | | ResourceInjection.cs:11:57:11:72 | access to local variable connectionString | semmle.label | access to local variable connectionString | | ResourceInjection.cs:13:42:13:57 | access to local variable connectionString | semmle.label | access to local variable connectionString | subpaths diff --git a/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected index 72d5d497820..ab1522a27d1 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected @@ -1,21 +1,19 @@ edges +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | provenance | | | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | provenance | | -| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | provenance | | +| MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | provenance | | | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:16:26:16:58 | object creation of type StringReader | provenance | | | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:21:26:21:58 | object creation of type StringReader | provenance | | | MissingXMLValidation.cs:27:43:27:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:27:26:27:58 | object creation of type StringReader | provenance | | | MissingXMLValidation.cs:35:43:35:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:35:26:35:58 | object creation of type StringReader | provenance | | | MissingXMLValidation.cs:45:43:45:57 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:45:26:45:58 | object creation of type StringReader | provenance | | nodes +| MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | semmle.label | access to local variable userProvidedXml : String | | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | MissingXMLValidation.cs:12:34:12:75 | access to indexer : String | semmle.label | access to indexer : String | | MissingXMLValidation.cs:16:26:16:58 | object creation of type StringReader | semmle.label | object creation of type StringReader | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-114/AssemblyPathInjection/AssemblyPathInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-114/AssemblyPathInjection/AssemblyPathInjection.expected index a13b0d64004..066dec77c67 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-114/AssemblyPathInjection/AssemblyPathInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-114/AssemblyPathInjection/AssemblyPathInjection.expected @@ -1,8 +1,10 @@ edges +| Test.cs:7:12:7:22 | access to local variable libraryName : String | Test.cs:10:36:10:46 | access to local variable libraryName | provenance | | +| Test.cs:7:26:7:48 | access to property QueryString : NameValueCollection | Test.cs:7:12:7:22 | access to local variable libraryName : String | provenance | | | Test.cs:7:26:7:48 | access to property QueryString : NameValueCollection | Test.cs:7:26:7:63 | access to indexer : String | provenance | | -| Test.cs:7:26:7:48 | access to property QueryString : NameValueCollection | Test.cs:10:36:10:46 | access to local variable libraryName | provenance | | -| Test.cs:7:26:7:63 | access to indexer : String | Test.cs:10:36:10:46 | access to local variable libraryName | provenance | | +| Test.cs:7:26:7:63 | access to indexer : String | Test.cs:7:12:7:22 | access to local variable libraryName : String | provenance | | nodes +| Test.cs:7:12:7:22 | access to local variable libraryName : String | semmle.label | access to local variable libraryName : String | | Test.cs:7:26:7:48 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | Test.cs:7:26:7:63 | access to indexer : String | semmle.label | access to indexer : String | | Test.cs:10:36:10:46 | access to local variable libraryName | semmle.label | access to local variable libraryName | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected b/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected index b01941c6d39..c3cfcd6f5f6 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-117/LogForging.expected @@ -1,13 +1,13 @@ edges +| LogForging.cs:18:16:18:23 | access to local variable username : String | LogForging.cs:21:21:21:43 | ... + ... | provenance | | +| LogForging.cs:18:16:18:23 | access to local variable username : String | LogForging.cs:29:50:29:72 | ... + ... | provenance | | +| LogForging.cs:18:16:18:23 | access to local variable username : String | LogForging.cs:33:26:33:33 | access to local variable username | provenance | | +| LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:18:16:18:23 | access to local variable username : String | provenance | | | LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:18:27:18:61 | access to indexer : String | provenance | | -| LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:21:21:21:43 | ... + ... | provenance | | -| LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:29:50:29:72 | ... + ... | provenance | | -| LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | LogForging.cs:33:26:33:33 | access to local variable username | provenance | | -| LogForging.cs:18:27:18:61 | access to indexer : String | LogForging.cs:21:21:21:43 | ... + ... | provenance | | -| LogForging.cs:18:27:18:61 | access to indexer : String | LogForging.cs:29:50:29:72 | ... + ... | provenance | | -| LogForging.cs:18:27:18:61 | access to indexer : String | LogForging.cs:33:26:33:33 | access to local variable username | provenance | | +| LogForging.cs:18:27:18:61 | access to indexer : String | LogForging.cs:18:16:18:23 | access to local variable username : String | provenance | | | LogForgingAsp.cs:8:32:8:39 | username : String | LogForgingAsp.cs:12:21:12:43 | ... + ... | provenance | | nodes +| LogForging.cs:18:16:18:23 | access to local variable username : String | semmle.label | access to local variable username : String | | LogForging.cs:18:27:18:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | LogForging.cs:18:27:18:61 | access to indexer : String | semmle.label | access to indexer : String | | LogForging.cs:21:21:21:43 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected b/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected index 9ae706885f6..1446b3700dd 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-134/UncontrolledFormatString.expected @@ -1,21 +1,26 @@ edges -| ConsoleUncontrolledFormatString.cs:8:22:8:39 | call to method ReadLine : String | ConsoleUncontrolledFormatString.cs:11:31:11:36 | access to local variable format | provenance | | +| ConsoleUncontrolledFormatString.cs:8:13:8:18 | access to local variable format : String | ConsoleUncontrolledFormatString.cs:11:31:11:36 | access to local variable format | provenance | | +| ConsoleUncontrolledFormatString.cs:8:22:8:39 | call to method ReadLine : String | ConsoleUncontrolledFormatString.cs:8:13:8:18 | access to local variable format : String | provenance | | +| UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | provenance | | +| UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | provenance | | +| UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | provenance | | | UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | provenance | | -| UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | provenance | | -| UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | provenance | | -| UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | provenance | | -| UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | provenance | | +| UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | provenance | | +| UncontrolledFormatStringBad.cs:9:16:9:21 | access to local variable format : String | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | provenance | | +| UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | UncontrolledFormatStringBad.cs:9:16:9:21 | access to local variable format : String | provenance | | | UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | provenance | | -| UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | provenance | | -| UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | provenance | | +| UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | UncontrolledFormatStringBad.cs:9:16:9:21 | access to local variable format : String | provenance | | nodes +| ConsoleUncontrolledFormatString.cs:8:13:8:18 | access to local variable format : String | semmle.label | access to local variable format : String | | ConsoleUncontrolledFormatString.cs:8:22:8:39 | call to method ReadLine : String | semmle.label | call to method ReadLine : String | | ConsoleUncontrolledFormatString.cs:11:31:11:36 | access to local variable format | semmle.label | access to local variable format | +| UncontrolledFormatString.cs:9:16:9:19 | access to local variable path : String | semmle.label | access to local variable path : String | | UncontrolledFormatString.cs:9:23:9:45 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UncontrolledFormatString.cs:9:23:9:53 | access to indexer : String | semmle.label | access to indexer : String | | UncontrolledFormatString.cs:12:23:12:26 | access to local variable path | semmle.label | access to local variable path | | UncontrolledFormatString.cs:15:46:15:49 | access to local variable path | semmle.label | access to local variable path | | UncontrolledFormatString.cs:32:23:32:31 | access to property Text | semmle.label | access to property Text | +| UncontrolledFormatStringBad.cs:9:16:9:21 | access to local variable format : String | semmle.label | access to local variable format : String | | UncontrolledFormatStringBad.cs:9:25:9:47 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UncontrolledFormatStringBad.cs:9:25:9:61 | access to indexer : String | semmle.label | access to indexer : String | | UncontrolledFormatStringBad.cs:12:39:12:44 | access to local variable format | semmle.label | access to local variable format | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-201/ExposureInTransmittedData/ExposureInTransmittedData.expected b/csharp/ql/test/query-tests/Security Features/CWE-201/ExposureInTransmittedData/ExposureInTransmittedData.expected index 9a1d6036ad7..e7e720e70fb 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-201/ExposureInTransmittedData/ExposureInTransmittedData.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-201/ExposureInTransmittedData/ExposureInTransmittedData.expected @@ -1,9 +1,10 @@ edges | ExposureInTransmittedData.cs:24:32:24:38 | access to property Data : IDictionary | ExposureInTransmittedData.cs:24:32:24:50 | access to indexer | provenance | | -| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:31:53:31:53 | access to local variable p | provenance | | -| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:31:56:31:56 | access to local variable p | provenance | | -| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:32:24:32:52 | ... + ... | provenance | | -| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:33:27:33:27 | access to local variable p | provenance | | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | ExposureInTransmittedData.cs:31:53:31:53 | access to local variable p | provenance | | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | ExposureInTransmittedData.cs:31:56:31:56 | access to local variable p | provenance | | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | ExposureInTransmittedData.cs:32:24:32:52 | ... + ... | provenance | | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | ExposureInTransmittedData.cs:33:27:33:27 | access to local variable p | provenance | | +| ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | provenance | | nodes | ExposureInTransmittedData.cs:14:32:14:39 | access to local variable password | semmle.label | access to local variable password | | ExposureInTransmittedData.cs:18:32:18:44 | call to method ToString | semmle.label | call to method ToString | @@ -11,6 +12,7 @@ nodes | ExposureInTransmittedData.cs:23:32:23:44 | call to method ToString | semmle.label | call to method ToString | | ExposureInTransmittedData.cs:24:32:24:38 | access to property Data : IDictionary | semmle.label | access to property Data : IDictionary | | ExposureInTransmittedData.cs:24:32:24:50 | access to indexer | semmle.label | access to indexer | +| ExposureInTransmittedData.cs:30:13:30:13 | access to local variable p : String | semmle.label | access to local variable p : String | | ExposureInTransmittedData.cs:30:17:30:36 | call to method GetField : String | semmle.label | call to method GetField : String | | ExposureInTransmittedData.cs:31:53:31:53 | access to local variable p | semmle.label | access to local variable p | | ExposureInTransmittedData.cs:31:56:31:56 | access to local variable p | semmle.label | access to local variable p | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-321/HardcodedSymmetricEncryptionKey/HardcodedSymmetricEncryptionKey.expected b/csharp/ql/test/query-tests/Security Features/CWE-321/HardcodedSymmetricEncryptionKey/HardcodedSymmetricEncryptionKey.expected index 8fcc865b54c..9e8afbc2b3a 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-321/HardcodedSymmetricEncryptionKey/HardcodedSymmetricEncryptionKey.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-321/HardcodedSymmetricEncryptionKey/HardcodedSymmetricEncryptionKey.expected @@ -1,9 +1,12 @@ edges -| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:31:21:31:21 | access to local variable d | provenance | | -| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:36:37:36:37 | access to local variable d : Byte[] | provenance | | -| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:41:50:41:50 | access to local variable c : Byte[] | provenance | | -| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:50:35:50:35 | access to local variable c : Byte[] | provenance | | -| HardcodedSymmetricEncryptionKey.cs:28:39:28:116 | call to method GetBytes : Byte[] | HardcodedSymmetricEncryptionKey.cs:44:51:44:69 | access to local variable byteArrayFromString : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | HardcodedSymmetricEncryptionKey.cs:26:17:26:17 | access to local variable d : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | HardcodedSymmetricEncryptionKey.cs:41:50:41:50 | access to local variable c : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | HardcodedSymmetricEncryptionKey.cs:50:35:50:35 | access to local variable c : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:26:17:26:17 | access to local variable d : Byte[] | HardcodedSymmetricEncryptionKey.cs:31:21:31:21 | access to local variable d | provenance | | +| HardcodedSymmetricEncryptionKey.cs:26:17:26:17 | access to local variable d : Byte[] | HardcodedSymmetricEncryptionKey.cs:36:37:36:37 | access to local variable d : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:28:17:28:35 | access to local variable byteArrayFromString : Byte[] | HardcodedSymmetricEncryptionKey.cs:44:51:44:69 | access to local variable byteArrayFromString : Byte[] | provenance | | +| HardcodedSymmetricEncryptionKey.cs:28:39:28:116 | call to method GetBytes : Byte[] | HardcodedSymmetricEncryptionKey.cs:28:17:28:35 | access to local variable byteArrayFromString : Byte[] | provenance | | | HardcodedSymmetricEncryptionKey.cs:28:62:28:115 | "Hello, world: here is a very bad way to create a key" : String | HardcodedSymmetricEncryptionKey.cs:28:39:28:116 | call to method GetBytes : Byte[] | provenance | | | HardcodedSymmetricEncryptionKey.cs:36:37:36:37 | access to local variable d : Byte[] | HardcodedSymmetricEncryptionKey.cs:103:57:103:59 | key : Byte[] | provenance | | | HardcodedSymmetricEncryptionKey.cs:41:50:41:50 | access to local variable c : Byte[] | HardcodedSymmetricEncryptionKey.cs:112:63:112:65 | key : Byte[] | provenance | | @@ -15,7 +18,10 @@ edges nodes | HardcodedSymmetricEncryptionKey.cs:17:21:17:97 | array creation of type Byte[] | semmle.label | array creation of type Byte[] | | HardcodedSymmetricEncryptionKey.cs:22:23:22:99 | array creation of type Byte[] | semmle.label | array creation of type Byte[] | +| HardcodedSymmetricEncryptionKey.cs:25:17:25:17 | access to local variable c : Byte[] | semmle.label | access to local variable c : Byte[] | | HardcodedSymmetricEncryptionKey.cs:25:21:25:97 | array creation of type Byte[] : Byte[] | semmle.label | array creation of type Byte[] : Byte[] | +| HardcodedSymmetricEncryptionKey.cs:26:17:26:17 | access to local variable d : Byte[] | semmle.label | access to local variable d : Byte[] | +| HardcodedSymmetricEncryptionKey.cs:28:17:28:35 | access to local variable byteArrayFromString : Byte[] | semmle.label | access to local variable byteArrayFromString : Byte[] | | HardcodedSymmetricEncryptionKey.cs:28:39:28:116 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] | | HardcodedSymmetricEncryptionKey.cs:28:62:28:115 | "Hello, world: here is a very bad way to create a key" : String | semmle.label | "Hello, world: here is a very bad way to create a key" : String | | HardcodedSymmetricEncryptionKey.cs:31:21:31:21 | access to local variable d | semmle.label | access to local variable d | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-327/DontInstallRootCert/DontInstallRootCert.expected b/csharp/ql/test/query-tests/Security Features/CWE-327/DontInstallRootCert/DontInstallRootCert.expected index 616fe890da8..a6c8142e7d9 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-327/DontInstallRootCert/DontInstallRootCert.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-327/DontInstallRootCert/DontInstallRootCert.expected @@ -1,12 +1,18 @@ edges -| Test.cs:15:31:15:59 | object creation of type X509Store : X509Store | Test.cs:18:13:18:17 | access to local variable store | provenance | | -| Test.cs:25:31:25:86 | object creation of type X509Store : X509Store | Test.cs:28:13:28:17 | access to local variable store | provenance | | -| Test.cs:70:31:70:86 | object creation of type X509Store : X509Store | Test.cs:73:13:73:17 | access to local variable store | provenance | | +| Test.cs:15:23:15:27 | access to local variable store : X509Store | Test.cs:18:13:18:17 | access to local variable store | provenance | | +| Test.cs:15:31:15:59 | object creation of type X509Store : X509Store | Test.cs:15:23:15:27 | access to local variable store : X509Store | provenance | | +| Test.cs:25:23:25:27 | access to local variable store : X509Store | Test.cs:28:13:28:17 | access to local variable store | provenance | | +| Test.cs:25:31:25:86 | object creation of type X509Store : X509Store | Test.cs:25:23:25:27 | access to local variable store : X509Store | provenance | | +| Test.cs:70:23:70:27 | access to local variable store : X509Store | Test.cs:73:13:73:17 | access to local variable store | provenance | | +| Test.cs:70:31:70:86 | object creation of type X509Store : X509Store | Test.cs:70:23:70:27 | access to local variable store : X509Store | provenance | | nodes +| Test.cs:15:23:15:27 | access to local variable store : X509Store | semmle.label | access to local variable store : X509Store | | Test.cs:15:31:15:59 | object creation of type X509Store : X509Store | semmle.label | object creation of type X509Store : X509Store | | Test.cs:18:13:18:17 | access to local variable store | semmle.label | access to local variable store | +| Test.cs:25:23:25:27 | access to local variable store : X509Store | semmle.label | access to local variable store : X509Store | | Test.cs:25:31:25:86 | object creation of type X509Store : X509Store | semmle.label | object creation of type X509Store : X509Store | | Test.cs:28:13:28:17 | access to local variable store | semmle.label | access to local variable store | +| Test.cs:70:23:70:27 | access to local variable store : X509Store | semmle.label | access to local variable store : X509Store | | Test.cs:70:31:70:86 | object creation of type X509Store : X509Store | semmle.label | object creation of type X509Store : X509Store | | Test.cs:73:13:73:17 | access to local variable store | semmle.label | access to local variable store | subpaths 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 fc657fcde1d..28246bd0067 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 @@ -1,10 +1,14 @@ 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 | provenance | | -| 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 | provenance | | +| InsecureSQLConnection.cs:43:20:43:32 | access to local variable connectString : String | InsecureSQLConnection.cs:46:81:46:93 | access to local variable connectString | provenance | | +| InsecureSQLConnection.cs:44:17:44:64 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" : String | InsecureSQLConnection.cs:43:20:43:32 | access to local variable connectString : String | provenance | | +| InsecureSQLConnection.cs:52:20:52:32 | access to local variable connectString : String | InsecureSQLConnection.cs:55:81:55:93 | access to local variable connectString | provenance | | +| InsecureSQLConnection.cs:53:17:53:78 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" : String | InsecureSQLConnection.cs:52:20:52:32 | access to local variable connectString : String | provenance | | 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:43:20:43:32 | access to local variable connectString : String | semmle.label | access to local variable connectString : String | | 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:52:20:52:32 | access to local variable connectString : String | semmle.label | access to local variable connectString : String | | 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 | subpaths 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 b0c0dbae40f..8d1619156bb 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 @@ -7,11 +7,15 @@ edges | InsecureRandomness.cs:29:57:29:60 | access to local variable data : Byte[] [element] : Byte | InsecureRandomness.cs:29:27:29:61 | call to method GetString : String | provenance | | | InsecureRandomness.cs:31:16:31:21 | access to local variable result : StringBuilder | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | provenance | | | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | InsecureRandomness.cs:12:27:12:50 | call to method InsecureRandomString | provenance | | -| InsecureRandomness.cs:60:23:60:40 | access to array element : String | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:60:23:60:40 | access to array element : String | InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | provenance | | | InsecureRandomness.cs:60:31:60:39 | call to method Next : Int32 | InsecureRandomness.cs:60:23:60:40 | access to array element : String | provenance | | | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | InsecureRandomness.cs:62:16:62:32 | call to method ToString : String | provenance | | | InsecureRandomness.cs:62:16:62:32 | call to method ToString : String | InsecureRandomness.cs:13:20:13:56 | call to method InsecureRandomStringFromSelection | provenance | | -| InsecureRandomness.cs:72:23:72:40 | access to indexer : String | InsecureRandomness.cs:74:16:74:21 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | InsecureRandomness.cs:74:16:74:21 | access to local variable result : String | provenance | | +| InsecureRandomness.cs:72:23:72:40 | access to indexer : String | InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | provenance | | | InsecureRandomness.cs:72:31:72:39 | call to method Next : Int32 | InsecureRandomness.cs:72:23:72:40 | access to indexer : String | provenance | | | InsecureRandomness.cs:74:16:74:21 | access to local variable result : String | InsecureRandomness.cs:14:20:14:54 | call to method InsecureRandomStringFromIndexer | provenance | | nodes @@ -26,10 +30,12 @@ nodes | InsecureRandomness.cs:29:57:29:60 | access to local variable data : Byte[] [element] : Byte | semmle.label | access to local variable data : Byte[] [element] : Byte | | InsecureRandomness.cs:31:16:31:21 | access to local variable result : StringBuilder | semmle.label | access to local variable result : StringBuilder | | InsecureRandomness.cs:31:16:31:32 | call to method ToString : String | semmle.label | call to method ToString : String | +| InsecureRandomness.cs:60:13:60:18 | access to local variable result : String | semmle.label | access to local variable result : String | | InsecureRandomness.cs:60:23:60:40 | access to array element : String | semmle.label | access to array element : String | | InsecureRandomness.cs:60:31:60:39 | call to method Next : Int32 | semmle.label | call to method Next : Int32 | | InsecureRandomness.cs:62:16:62:21 | access to local variable result : String | semmle.label | access to local variable result : String | | InsecureRandomness.cs:62:16:62:32 | call to method ToString : String | semmle.label | call to method ToString : String | +| InsecureRandomness.cs:72:13:72:18 | access to local variable result : String | semmle.label | access to local variable result : String | | InsecureRandomness.cs:72:23:72:40 | access to indexer : String | semmle.label | access to indexer : 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 | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected b/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected index b36b30253e0..b539b019f39 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-601/UrlRedirect/UrlRedirect.expected @@ -1,17 +1,14 @@ edges | UrlRedirect2.cs:14:31:14:53 | access to property QueryString : NameValueCollection | UrlRedirect2.cs:14:31:14:61 | access to indexer | provenance | | | UrlRedirect.cs:13:31:13:53 | access to property QueryString : NameValueCollection | UrlRedirect.cs:13:31:13:61 | access to indexer | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:48:29:48:31 | access to local variable url | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:64:31:64:52 | $"..." | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:70:66:70:68 | access to local variable url : String | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:76:69:76:71 | access to local variable url : String | provenance | | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | UrlRedirect.cs:76:74:76:76 | access to local variable url : String | provenance | | +| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:23:16:23:18 | access to local variable url : String | provenance | | | UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:23:22:23:52 | access to indexer : String | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:48:29:48:31 | access to local variable url | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:64:31:64:52 | $"..." | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:70:66:70:68 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:76:69:76:71 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | UrlRedirect.cs:76:74:76:76 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:48:29:48:31 | access to local variable url | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:64:31:64:52 | $"..." | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:70:66:70:68 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:76:69:76:71 | access to local variable url : String | provenance | | -| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:76:74:76:76 | access to local variable url : String | provenance | | +| UrlRedirect.cs:23:22:23:52 | access to indexer : String | UrlRedirect.cs:23:16:23:18 | access to local variable url : String | provenance | | | UrlRedirect.cs:38:44:38:66 | access to property QueryString : NameValueCollection | UrlRedirect.cs:38:44:38:74 | access to indexer | provenance | | | UrlRedirect.cs:39:47:39:69 | access to property QueryString : NameValueCollection | UrlRedirect.cs:39:47:39:77 | access to indexer | provenance | | | UrlRedirect.cs:70:66:70:68 | access to local variable url : String | UrlRedirect.cs:70:31:70:69 | call to method Format | provenance | | @@ -33,6 +30,7 @@ nodes | UrlRedirect2.cs:14:31:14:61 | access to indexer | semmle.label | access to indexer | | UrlRedirect.cs:13:31:13:53 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UrlRedirect.cs:13:31:13:61 | access to indexer | semmle.label | access to indexer | +| UrlRedirect.cs:23:16:23:18 | access to local variable url : String | semmle.label | access to local variable url : String | | UrlRedirect.cs:23:22:23:44 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | UrlRedirect.cs:23:22:23:52 | access to indexer : String | semmle.label | access to indexer : String | | UrlRedirect.cs:38:44:38:66 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-643/StoredXPathInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-643/StoredXPathInjection.expected index daaca6c5d3a..0b963f38d7b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-643/StoredXPathInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-643/StoredXPathInjection.expected @@ -1,10 +1,14 @@ edges -| StoredXPathInjection.cs:22:39:22:65 | call to method GetString : String | StoredXPathInjection.cs:25:45:25:148 | ... + ... | provenance | | -| StoredXPathInjection.cs:22:39:22:65 | call to method GetString : String | StoredXPathInjection.cs:28:41:28:144 | ... + ... | provenance | | -| StoredXPathInjection.cs:23:39:23:65 | call to method GetString : String | StoredXPathInjection.cs:25:45:25:148 | ... + ... | provenance | | -| StoredXPathInjection.cs:23:39:23:65 | call to method GetString : String | StoredXPathInjection.cs:28:41:28:144 | ... + ... | provenance | | +| StoredXPathInjection.cs:22:28:22:35 | access to local variable userName : String | StoredXPathInjection.cs:25:45:25:148 | ... + ... | provenance | | +| StoredXPathInjection.cs:22:28:22:35 | access to local variable userName : String | StoredXPathInjection.cs:28:41:28:144 | ... + ... | provenance | | +| StoredXPathInjection.cs:22:39:22:65 | call to method GetString : String | StoredXPathInjection.cs:22:28:22:35 | access to local variable userName : String | provenance | | +| StoredXPathInjection.cs:23:28:23:35 | access to local variable password : String | StoredXPathInjection.cs:25:45:25:148 | ... + ... | provenance | | +| StoredXPathInjection.cs:23:28:23:35 | access to local variable password : String | StoredXPathInjection.cs:28:41:28:144 | ... + ... | provenance | | +| StoredXPathInjection.cs:23:39:23:65 | call to method GetString : String | StoredXPathInjection.cs:23:28:23:35 | access to local variable password : String | provenance | | nodes +| StoredXPathInjection.cs:22:28:22:35 | access to local variable userName : String | semmle.label | access to local variable userName : String | | StoredXPathInjection.cs:22:39:22:65 | call to method GetString : String | semmle.label | call to method GetString : String | +| StoredXPathInjection.cs:23:28:23:35 | access to local variable password : String | semmle.label | access to local variable password : String | | StoredXPathInjection.cs:23:39:23:65 | call to method GetString : String | semmle.label | call to method GetString : String | | StoredXPathInjection.cs:25:45:25:148 | ... + ... | semmle.label | ... + ... | | StoredXPathInjection.cs:28:41:28:144 | ... + ... | semmle.label | ... + ... | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected index 78652e8ea9d..f722ab15f6b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-643/XPathInjection.expected @@ -1,39 +1,27 @@ edges +| XPathInjection.cs:10:16:10:23 | access to local variable userName : String | XPathInjection.cs:13:13:13:13 | access to local variable s : String | provenance | | +| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:10:16:10:23 | access to local variable userName : String | provenance | | | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:10:27:10:61 | access to indexer : String | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | -| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | +| XPathInjection.cs:10:27:10:61 | access to indexer : String | XPathInjection.cs:10:16:10:23 | access to local variable userName : String | provenance | | +| XPathInjection.cs:11:16:11:23 | access to local variable password : String | XPathInjection.cs:13:13:13:13 | access to local variable s : String | provenance | | +| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:11:16:11:23 | access to local variable password : String | provenance | | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:11:27:11:61 | access to indexer : String | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | -| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | +| XPathInjection.cs:11:27:11:61 | access to indexer : String | XPathInjection.cs:11:16:11:23 | access to local variable password : String | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:16:33:16:33 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:19:29:19:29 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:28:20:28:20 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:34:30:34:30 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:40:21:40:21 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:46:22:46:22 | access to local variable s | provenance | | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | XPathInjection.cs:52:21:52:21 | access to local variable s | provenance | | nodes +| XPathInjection.cs:10:16:10:23 | access to local variable userName : String | semmle.label | access to local variable userName : String | | XPathInjection.cs:10:27:10:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XPathInjection.cs:10:27:10:61 | access to indexer : String | semmle.label | access to indexer : String | +| XPathInjection.cs:11:16:11:23 | access to local variable password : String | semmle.label | access to local variable password : String | | XPathInjection.cs:11:27:11:49 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XPathInjection.cs:11:27:11:61 | access to indexer : String | semmle.label | access to indexer : String | +| XPathInjection.cs:13:13:13:13 | access to local variable s : String | semmle.label | access to local variable s : String | | XPathInjection.cs:16:33:16:33 | access to local variable s | semmle.label | access to local variable s | | XPathInjection.cs:19:29:19:29 | access to local variable s | semmle.label | access to local variable s | | XPathInjection.cs:28:20:28:20 | access to local variable s | semmle.label | access to local variable s | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected index ed14c44e2af..8edaf59b831 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoS/ReDoS.expected @@ -1,16 +1,14 @@ edges +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:16:42:16:50 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:19:139:19:147 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:22:43:22:51 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | ExponentialRegex.cs:24:21:24:29 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | provenance | | | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:11:28:11:63 | access to indexer : String | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:16:42:16:50 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:19:139:19:147 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:22:43:22:51 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:24:21:24:29 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:16:42:16:50 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:19:139:19:147 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:22:43:22:51 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:24:21:24:29 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:11:28:11:63 | access to indexer : String | ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | provenance | | nodes +| ExponentialRegex.cs:11:16:11:24 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | | ExponentialRegex.cs:11:28:11:50 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | ExponentialRegex.cs:11:28:11:63 | access to indexer : String | semmle.label | access to indexer : String | | ExponentialRegex.cs:15:40:15:48 | access to local variable userInput | semmle.label | access to local variable userInput | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected index 989d0648f48..da9cf11906c 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-730/ReDoSGlobalTimeout/ReDoS.expected @@ -1,8 +1,10 @@ edges +| ExponentialRegex.cs:13:16:13:24 | access to local variable userInput : String | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:13:16:13:24 | access to local variable userInput : String | provenance | | | ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:13:28:13:63 | access to indexer : String | provenance | | -| ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | provenance | | -| ExponentialRegex.cs:13:28:13:63 | access to indexer : String | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | provenance | | +| ExponentialRegex.cs:13:28:13:63 | access to indexer : String | ExponentialRegex.cs:13:16:13:24 | access to local variable userInput : String | provenance | | nodes +| ExponentialRegex.cs:13:16:13:24 | access to local variable userInput : String | semmle.label | access to local variable userInput : String | | ExponentialRegex.cs:13:28:13:50 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | ExponentialRegex.cs:13:28:13:63 | access to indexer : String | semmle.label | access to indexer : String | | ExponentialRegex.cs:16:40:16:48 | access to local variable userInput | semmle.label | access to local variable userInput | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected b/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected index 7fa9f7428f4..51f0d59dec0 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-730/RegexInjection/RegexInjection.expected @@ -1,8 +1,10 @@ edges +| RegexInjection.cs:10:16:10:20 | access to local variable regex : String | RegexInjection.cs:14:19:14:23 | access to local variable regex | provenance | | +| RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | RegexInjection.cs:10:16:10:20 | access to local variable regex : String | provenance | | | RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | RegexInjection.cs:10:24:10:55 | access to indexer : String | provenance | | -| RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | RegexInjection.cs:14:19:14:23 | access to local variable regex | provenance | | -| RegexInjection.cs:10:24:10:55 | access to indexer : String | RegexInjection.cs:14:19:14:23 | access to local variable regex | provenance | | +| RegexInjection.cs:10:24:10:55 | access to indexer : String | RegexInjection.cs:10:16:10:20 | access to local variable regex : String | provenance | | nodes +| RegexInjection.cs:10:16:10:20 | access to local variable regex : String | semmle.label | access to local variable regex : String | | RegexInjection.cs:10:24:10:46 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | RegexInjection.cs:10:24:10:55 | access to indexer : String | semmle.label | access to indexer : String | | RegexInjection.cs:14:19:14:23 | access to local variable regex | semmle.label | access to local variable regex | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected b/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected index 5c707971384..f6768445fe8 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected @@ -1,9 +1,11 @@ edges -| HardcodedCredentials.cs:48:30:48:60 | array creation of type Byte[] : Byte[] | HardcodedCredentials.cs:51:13:51:23 | access to local variable rawCertData | provenance | | +| HardcodedCredentials.cs:48:16:48:26 | access to local variable rawCertData : Byte[] | HardcodedCredentials.cs:51:13:51:23 | access to local variable rawCertData | provenance | | +| HardcodedCredentials.cs:48:30:48:60 | array creation of type Byte[] : Byte[] | HardcodedCredentials.cs:48:16:48:26 | access to local variable rawCertData : Byte[] | provenance | | nodes | HardcodedCredentials.cs:16:25:16:36 | "myPa55word" | semmle.label | "myPa55word" | | HardcodedCredentials.cs:32:19:32:28 | "username" | semmle.label | "username" | | HardcodedCredentials.cs:46:39:46:53 | "myNewPa55word" | semmle.label | "myNewPa55word" | +| HardcodedCredentials.cs:48:16:48:26 | access to local variable rawCertData : Byte[] | semmle.label | access to local variable rawCertData : Byte[] | | HardcodedCredentials.cs:48:30:48:60 | array creation of type Byte[] : Byte[] | semmle.label | array creation of type Byte[] : Byte[] | | HardcodedCredentials.cs:51:13:51:23 | access to local variable rawCertData | semmle.label | access to local variable rawCertData | | HardcodedCredentials.cs:52:13:52:24 | "myPa55word" | semmle.label | "myPa55word" | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected b/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected index 86f4167bd75..7a86377ccb8 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-807/ConditionalBypass.expected @@ -1,28 +1,35 @@ edges +| ConditionalBypass.cs:12:16:12:22 | access to local variable isAdmin : String | ConditionalBypass.cs:16:13:16:30 | ... == ... | provenance | | +| ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | ConditionalBypass.cs:12:16:12:22 | access to local variable isAdmin : String | provenance | | | ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | ConditionalBypass.cs:12:26:12:59 | access to indexer : String | provenance | | -| ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | ConditionalBypass.cs:16:13:16:30 | ... == ... | provenance | | -| ConditionalBypass.cs:12:26:12:59 | access to indexer : String | ConditionalBypass.cs:16:13:16:30 | ... == ... | provenance | | -| ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | provenance | | -| ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:27:13:27:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:12:26:12:59 | access to indexer : String | ConditionalBypass.cs:12:16:12:22 | access to local variable isAdmin : String | provenance | | +| ConditionalBypass.cs:19:20:19:30 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:19:20:19:30 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:27:13:27:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:19:20:19:30 | access to local variable adminCookie : HttpCookie | provenance | | | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:22:13:22:29 | access to property Value : String | provenance | | | ConditionalBypass.cs:22:13:22:29 | access to property Value : String | ConditionalBypass.cs:22:13:22:45 | call to method Equals | provenance | | | ConditionalBypass.cs:27:13:27:23 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:27:13:27:29 | access to property Value : String | provenance | | | ConditionalBypass.cs:27:13:27:29 | access to property Value : String | ConditionalBypass.cs:27:13:27:40 | ... == ... | provenance | | -| ConditionalBypass.cs:42:32:42:66 | call to method GetHostByAddress : IPHostEntry | ConditionalBypass.cs:44:13:44:20 | access to local variable hostInfo : IPHostEntry | provenance | | -| ConditionalBypass.cs:42:32:42:66 | call to method GetHostByAddress : IPHostEntry | ConditionalBypass.cs:49:13:49:20 | access to local variable hostInfo : IPHostEntry | provenance | | +| ConditionalBypass.cs:42:21:42:28 | access to local variable hostInfo : IPHostEntry | ConditionalBypass.cs:44:13:44:20 | access to local variable hostInfo : IPHostEntry | provenance | | +| ConditionalBypass.cs:42:21:42:28 | access to local variable hostInfo : IPHostEntry | ConditionalBypass.cs:49:13:49:20 | access to local variable hostInfo : IPHostEntry | provenance | | +| ConditionalBypass.cs:42:32:42:66 | call to method GetHostByAddress : IPHostEntry | ConditionalBypass.cs:42:21:42:28 | access to local variable hostInfo : IPHostEntry | provenance | | | ConditionalBypass.cs:44:13:44:20 | access to local variable hostInfo : IPHostEntry | ConditionalBypass.cs:44:13:44:29 | access to property HostName : String | provenance | | | ConditionalBypass.cs:44:13:44:29 | access to property HostName : String | ConditionalBypass.cs:44:13:44:46 | ... == ... | provenance | | | ConditionalBypass.cs:49:13:49:20 | access to local variable hostInfo : IPHostEntry | ConditionalBypass.cs:49:13:49:29 | access to property HostName | provenance | | -| ConditionalBypass.cs:70:34:70:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:72:13:72:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:70:20:70:30 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:72:13:72:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:70:34:70:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:70:20:70:30 | access to local variable adminCookie : HttpCookie | provenance | | | ConditionalBypass.cs:72:13:72:23 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:72:13:72:29 | access to property Value : String | provenance | | | ConditionalBypass.cs:72:13:72:29 | access to property Value : String | ConditionalBypass.cs:72:13:72:40 | ... == ... | provenance | | -| ConditionalBypass.cs:83:34:83:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:84:13:84:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:83:20:83:30 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:84:13:84:23 | access to local variable adminCookie : HttpCookie | provenance | | +| ConditionalBypass.cs:83:34:83:52 | access to property Cookies : HttpCookieCollection | ConditionalBypass.cs:83:20:83:30 | access to local variable adminCookie : HttpCookie | provenance | | | ConditionalBypass.cs:84:13:84:23 | access to local variable adminCookie : HttpCookie | ConditionalBypass.cs:84:13:84:29 | access to property Value : String | provenance | | | ConditionalBypass.cs:84:13:84:29 | access to property Value : String | ConditionalBypass.cs:84:13:84:40 | ... == ... | provenance | | nodes +| ConditionalBypass.cs:12:16:12:22 | access to local variable isAdmin : String | semmle.label | access to local variable isAdmin : String | | ConditionalBypass.cs:12:26:12:48 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | ConditionalBypass.cs:12:26:12:59 | access to indexer : String | semmle.label | access to indexer : String | | ConditionalBypass.cs:16:13:16:30 | ... == ... | semmle.label | ... == ... | +| ConditionalBypass.cs:19:20:19:30 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:19:34:19:52 | access to property Cookies : HttpCookieCollection | semmle.label | access to property Cookies : HttpCookieCollection | | ConditionalBypass.cs:22:13:22:23 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:22:13:22:29 | access to property Value : String | semmle.label | access to property Value : String | @@ -30,16 +37,19 @@ nodes | ConditionalBypass.cs:27:13:27:23 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:27:13:27:29 | access to property Value : String | semmle.label | access to property Value : String | | ConditionalBypass.cs:27:13:27:40 | ... == ... | semmle.label | ... == ... | +| ConditionalBypass.cs:42:21:42:28 | access to local variable hostInfo : IPHostEntry | semmle.label | access to local variable hostInfo : IPHostEntry | | ConditionalBypass.cs:42:32:42:66 | call to method GetHostByAddress : IPHostEntry | semmle.label | call to method GetHostByAddress : IPHostEntry | | ConditionalBypass.cs:44:13:44:20 | access to local variable hostInfo : IPHostEntry | semmle.label | access to local variable hostInfo : IPHostEntry | | ConditionalBypass.cs:44:13:44:29 | access to property HostName : String | semmle.label | access to property HostName : String | | ConditionalBypass.cs:44:13:44:46 | ... == ... | semmle.label | ... == ... | | ConditionalBypass.cs:49:13:49:20 | access to local variable hostInfo : IPHostEntry | semmle.label | access to local variable hostInfo : IPHostEntry | | ConditionalBypass.cs:49:13:49:29 | access to property HostName | semmle.label | access to property HostName | +| ConditionalBypass.cs:70:20:70:30 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:70:34:70:52 | access to property Cookies : HttpCookieCollection | semmle.label | access to property Cookies : HttpCookieCollection | | ConditionalBypass.cs:72:13:72:23 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:72:13:72:29 | access to property Value : String | semmle.label | access to property Value : String | | ConditionalBypass.cs:72:13:72:40 | ... == ... | semmle.label | ... == ... | +| ConditionalBypass.cs:83:20:83:30 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:83:34:83:52 | access to property Cookies : HttpCookieCollection | semmle.label | access to property Cookies : HttpCookieCollection | | ConditionalBypass.cs:84:13:84:23 | access to local variable adminCookie : HttpCookie | semmle.label | access to local variable adminCookie : HttpCookie | | ConditionalBypass.cs:84:13:84:29 | access to property Value : String | semmle.label | access to property Value : String | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-838/InappropriateEncoding.expected b/csharp/ql/test/query-tests/Security Features/CWE-838/InappropriateEncoding.expected index 4958966f788..8bde8b3631e 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-838/InappropriateEncoding.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-838/InappropriateEncoding.expected @@ -1,30 +1,40 @@ edges | HtmlEncode.cs:10:40:10:65 | call to method UrlEncode : String | HtmlEncode.cs:10:28:10:65 | ... + ... | provenance | | -| InappropriateEncoding.cs:13:28:13:40 | call to method Encode : String | InappropriateEncoding.cs:18:46:18:51 | access to local variable query1 | provenance | | -| InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | InappropriateEncoding.cs:35:32:35:43 | access to local variable encodedValue | provenance | | -| InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | InappropriateEncoding.cs:36:22:36:59 | ... + ... | provenance | | -| InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | InappropriateEncoding.cs:37:59:37:70 | access to local variable encodedValue : String | provenance | | +| InappropriateEncoding.cs:13:13:13:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:16:17:16:22 | access to local variable query1 : String | provenance | | +| InappropriateEncoding.cs:13:28:13:40 | call to method Encode : String | InappropriateEncoding.cs:13:13:13:24 | access to local variable encodedValue : String | provenance | | +| InappropriateEncoding.cs:16:17:16:22 | access to local variable query1 : String | InappropriateEncoding.cs:18:46:18:51 | access to local variable query1 | provenance | | +| InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:35:32:35:43 | access to local variable encodedValue | provenance | | +| InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:36:22:36:59 | ... + ... | provenance | | +| InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:37:59:37:70 | access to local variable encodedValue : String | provenance | | +| InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | provenance | | | InappropriateEncoding.cs:37:59:37:70 | access to local variable encodedValue : String | InappropriateEncoding.cs:37:22:37:71 | call to method Format | provenance | | -| InappropriateEncoding.cs:55:28:55:56 | call to method HtmlEncode : String | InappropriateEncoding.cs:56:31:56:42 | access to local variable encodedValue | provenance | | +| InappropriateEncoding.cs:55:13:55:24 | access to local variable encodedValue : String | InappropriateEncoding.cs:56:31:56:42 | access to local variable encodedValue | provenance | | +| InappropriateEncoding.cs:55:28:55:56 | call to method HtmlEncode : String | InappropriateEncoding.cs:55:13:55:24 | access to local variable encodedValue : String | provenance | | | InappropriateEncoding.cs:66:16:66:42 | call to method Replace : String | InappropriateEncoding.cs:13:28:13:40 | call to method Encode : String | provenance | | -| SqlEncode.cs:14:62:14:87 | call to method Replace : String | SqlEncode.cs:15:46:15:50 | access to local variable query | provenance | | +| SqlEncode.cs:14:17:14:21 | access to local variable query : String | SqlEncode.cs:15:46:15:50 | access to local variable query | provenance | | +| SqlEncode.cs:14:62:14:87 | call to method Replace : String | SqlEncode.cs:14:17:14:21 | access to local variable query : String | provenance | | | UrlEncode.cs:10:43:10:69 | call to method HtmlEncode : String | UrlEncode.cs:10:31:10:69 | ... + ... | provenance | | nodes | HtmlEncode.cs:10:28:10:65 | ... + ... | semmle.label | ... + ... | | HtmlEncode.cs:10:40:10:65 | call to method UrlEncode : String | semmle.label | call to method UrlEncode : String | +| InappropriateEncoding.cs:13:13:13:24 | access to local variable encodedValue : String | semmle.label | access to local variable encodedValue : String | | InappropriateEncoding.cs:13:28:13:40 | call to method Encode : String | semmle.label | call to method Encode : String | +| InappropriateEncoding.cs:16:17:16:22 | access to local variable query1 : String | semmle.label | access to local variable query1 : String | | InappropriateEncoding.cs:18:46:18:51 | access to local variable query1 | semmle.label | access to local variable query1 | | InappropriateEncoding.cs:31:22:31:34 | call to method Encode | semmle.label | call to method Encode | | InappropriateEncoding.cs:32:22:32:49 | call to method UrlEncode | semmle.label | call to method UrlEncode | | InappropriateEncoding.cs:33:22:33:73 | call to method UrlEncode | semmle.label | call to method UrlEncode | +| InappropriateEncoding.cs:34:13:34:24 | access to local variable encodedValue : String | semmle.label | access to local variable encodedValue : String | | InappropriateEncoding.cs:34:28:34:55 | call to method UrlEncode : String | semmle.label | call to method UrlEncode : String | | InappropriateEncoding.cs:35:32:35:43 | access to local variable encodedValue | semmle.label | access to local variable encodedValue | | InappropriateEncoding.cs:36:22:36:59 | ... + ... | semmle.label | ... + ... | | InappropriateEncoding.cs:37:22:37:71 | call to method Format | semmle.label | call to method Format | | InappropriateEncoding.cs:37:59:37:70 | access to local variable encodedValue : String | semmle.label | access to local variable encodedValue : String | +| InappropriateEncoding.cs:55:13:55:24 | access to local variable encodedValue : String | semmle.label | access to local variable encodedValue : String | | InappropriateEncoding.cs:55:28:55:56 | call to method HtmlEncode : String | semmle.label | call to method HtmlEncode : String | | InappropriateEncoding.cs:56:31:56:42 | access to local variable encodedValue | semmle.label | access to local variable encodedValue | | InappropriateEncoding.cs:66:16:66:42 | call to method Replace : String | semmle.label | call to method Replace : String | +| SqlEncode.cs:14:17:14:21 | access to local variable query : String | semmle.label | access to local variable query : String | | SqlEncode.cs:14:62:14:87 | call to method Replace : String | semmle.label | call to method Replace : String | | SqlEncode.cs:15:46:15:50 | access to local variable query | semmle.label | access to local variable query | | UrlEncode.cs:10:31:10:69 | ... + ... | semmle.label | ... + ... | From b2b5aa18b26236f3403a475e40c6a8b046acc793 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Feb 2024 00:16:49 +0000 Subject: [PATCH 130/207] Add changed framework coverage reports --- .../library-coverage/coverage.csv | 209 ++++++++++-------- .../library-coverage/coverage.rst | 13 +- 2 files changed, 123 insertions(+), 99 deletions(-) diff --git a/go/documentation/library-coverage/coverage.csv b/go/documentation/library-coverage/coverage.csv index 8997dec7b3a..6c515f12eed 100644 --- a/go/documentation/library-coverage/coverage.csv +++ b/go/documentation/library-coverage/coverage.csv @@ -1,97 +1,112 @@ -package,source,summary,source:remote,summary:taint,summary:value -,,2,,,2 -archive/tar,,5,,5, -archive/zip,,6,,6, -bufio,,17,,17, -bytes,,43,,43, -compress/bzip2,,1,,1, -compress/flate,,4,,4, -compress/gzip,,3,,3, -compress/lzw,,1,,1, -compress/zlib,,4,,4, -container/heap,,5,,5, -container/list,,20,,20, -container/ring,,5,,5, -context,,5,,5, -crypto,,1,,1, -crypto/cipher,,3,,3, -crypto/rsa,,2,,2, -crypto/tls,,3,,3, -crypto/x509,,1,,1, -database/sql,,7,,7, -database/sql/driver,,4,,4, -encoding,,4,,4, -encoding/ascii85,,2,,2, -encoding/asn1,,8,,8, -encoding/base32,,3,,3, -encoding/base64,,3,,3, -encoding/binary,,2,,2, -encoding/csv,,5,,5, -encoding/gob,,7,,7, -encoding/hex,,3,,3, -encoding/json,,14,,14, -encoding/pem,,3,,3, -encoding/xml,,23,,23, -errors,,3,,3, -expvar,,6,,6, -fmt,,16,,16, -github.com/astaxie/beego,,7,,7, -github.com/astaxie/beego/context,,1,,1, -github.com/astaxie/beego/utils,,13,,13, -github.com/beego/beego/core/utils,,13,,13, -github.com/beego/beego/server/web,,7,,7, -github.com/beego/beego/server/web/context,,1,,1, -github.com/couchbase/gocb,,18,,18, -github.com/couchbaselabs/gocb,,18,,18, -github.com/elazarl/goproxy,,2,,2, -github.com/evanphx/json-patch,,12,,12, -github.com/gin-gonic/gin,,2,,2, -github.com/go-pg/pg/$ANYVERSION/orm,,6,,6, -github.com/golang/protobuf/$ANYVERSION/proto,,4,,4, -github.com/json-iterator/go,,4,,4, -github.com/labstack/echo,,2,,2, -github.com/revel/revel,,10,,10, -github.com/robfig/revel,,10,,10, -github.com/sendgrid/sendgrid-go/$ANYVERSION/helpers/mail,,1,,1, -github.com/valyala/fasthttp,,5,,5, -go.uber.org/zap,,11,,11, -golang.org/x/net/$ANYVERSION/html,,16,,16, -golang.org/x/net/context,,5,,5, -google.golang.org/protobuf/$ANYVERSION/internal/encoding/text,,1,,1, -google.golang.org/protobuf/$ANYVERSION/internal/impl,,2,,2, -google.golang.org/protobuf/$ANYVERSION/proto,,8,,8, -google.golang.org/protobuf/$ANYVERSION/reflect/protoreflect,,1,,1, -gopkg.in/couchbase/gocb,,18,,18, -gopkg.in/macaron,,1,,1, -gopkg.in/yaml,,9,,9, -html,,2,,2, -html/template,,6,,6, -io,,19,,19, -io/fs,,12,,12, -io/ioutil,,2,,2, -k8s.io/api/core,,10,,10, -k8s.io/apimachinery/$ANYVERSION/pkg/runtime,,47,,47, -log,,3,,3, -mime,,5,,5, -mime/multipart,,8,,8, -mime/quotedprintable,,1,,1, -net,,20,,20, -net/http,8,22,8,22, -net/http/httputil,,10,,10, -net/mail,,6,,6, -net/textproto,,19,,19, -net/url,,23,,23, -os,,4,,4, -path,,5,,5, -path/filepath,,13,,13, -reflect,,37,,37, -regexp,,20,,20, -sort,,1,,1, -strconv,,9,,9, -strings,,34,,34, -sync,,10,,10, -sync/atomic,,24,,24, -syscall,,8,,8, -text/scanner,,3,,3, -text/tabwriter,,1,,1, -text/template,,6,,6, +package,sink,source,summary,sink:credentials-key,sink:jwt,source:remote,summary:taint,summary:value +,,,2,,,,,2 +archive/tar,,,5,,,,5, +archive/zip,,,6,,,,6, +bufio,,,17,,,,17, +bytes,,,43,,,,43, +compress/bzip2,,,1,,,,1, +compress/flate,,,4,,,,4, +compress/gzip,,,3,,,,3, +compress/lzw,,,1,,,,1, +compress/zlib,,,4,,,,4, +container/heap,,,5,,,,5, +container/list,,,20,,,,20, +container/ring,,,5,,,,5, +context,,,5,,,,5, +crypto,,,1,,,,1, +crypto/cipher,,,3,,,,3, +crypto/rsa,,,2,,,,2, +crypto/tls,,,3,,,,3, +crypto/x509,,,1,,,,1, +database/sql,,,7,,,,7, +database/sql/driver,,,4,,,,4, +encoding,,,4,,,,4, +encoding/ascii85,,,2,,,,2, +encoding/asn1,,,8,,,,8, +encoding/base32,,,3,,,,3, +encoding/base64,,,3,,,,3, +encoding/binary,,,2,,,,2, +encoding/csv,,,5,,,,5, +encoding/gob,,,7,,,,7, +encoding/hex,,,3,,,,3, +encoding/json,,,14,,,,14, +encoding/pem,,,3,,,,3, +encoding/xml,,,23,,,,23, +errors,,,3,,,,3, +expvar,,,6,,,,6, +fmt,,,16,,,,16, +github.com/astaxie/beego,,,7,,,,7, +github.com/astaxie/beego/context,,,1,,,,1, +github.com/astaxie/beego/utils,,,13,,,,13, +github.com/beego/beego/core/utils,,,13,,,,13, +github.com/beego/beego/server/web,,,7,,,,7, +github.com/beego/beego/server/web/context,,,1,,,,1, +github.com/couchbase/gocb,,,18,,,,18, +github.com/couchbaselabs/gocb,,,18,,,,18, +github.com/cristalhq/jwt,1,,,1,,,, +github.com/dgrijalva/jwt-go,3,,9,2,1,,9, +github.com/elazarl/goproxy,,,2,,,,2, +github.com/evanphx/json-patch,,,12,,,,12, +github.com/form3tech-oss/jwt-go,2,,,2,,,, +github.com/gin-gonic/gin,,,2,,,,2, +github.com/go-chi/jwtauth,1,,,1,,,, +github.com/go-jose/go-jose/$ANYVERSION/jwt,1,,4,,1,,4, +github.com/go-kit/kit/auth/jwt,1,,,1,,,, +github.com/go-pg/pg/$ANYVERSION/orm,,,6,,,,6, +github.com/golang-jwt/jwt,3,,11,2,1,,11, +github.com/golang/protobuf/$ANYVERSION/proto,,,4,,,,4, +github.com/json-iterator/go,,,4,,,,4, +github.com/kataras/iris/$ANYVERSION/middleware/jwt,1,,,1,,,, +github.com/kataras/jwt,5,,,5,,,, +github.com/labstack/echo,,,2,,,,2, +github.com/lestrrat-go/jwx,1,,,1,,,, +github.com/lestrrat-go/jwx/$ANYVERSION/jwk,1,,,1,,,, +github.com/lestrrat/go-jwx/jwk,1,,,1,,,, +github.com/ory/fosite/token/jwt,2,,,2,,,, +github.com/revel/revel,,,10,,,,10, +github.com/robfig/revel,,,10,,,,10, +github.com/sendgrid/sendgrid-go/$ANYVERSION/helpers/mail,,,1,,,,1, +github.com/valyala/fasthttp,,,5,,,,5, +go.uber.org/zap,,,11,,,,11, +golang.org/x/net/$ANYVERSION/html,,,16,,,,16, +golang.org/x/net/context,,,5,,,,5, +google.golang.org/protobuf/$ANYVERSION/internal/encoding/text,,,1,,,,1, +google.golang.org/protobuf/$ANYVERSION/internal/impl,,,2,,,,2, +google.golang.org/protobuf/$ANYVERSION/proto,,,8,,,,8, +google.golang.org/protobuf/$ANYVERSION/reflect/protoreflect,,,1,,,,1, +gopkg.in/couchbase/gocb,,,18,,,,18, +gopkg.in/macaron,,,1,,,,1, +gopkg.in/square/go-jose.v2/jwt,1,,4,,1,,4, +gopkg.in/yaml,,,9,,,,9, +html,,,2,,,,2, +html/template,,,6,,,,6, +io,,,19,,,,19, +io/fs,,,12,,,,12, +io/ioutil,,,2,,,,2, +k8s.io/api/core,,,10,,,,10, +k8s.io/apimachinery/$ANYVERSION/pkg/runtime,,,47,,,,47, +log,,,3,,,,3, +math/big,,,1,,,,1, +mime,,,5,,,,5, +mime/multipart,,,8,,,,8, +mime/quotedprintable,,,1,,,,1, +net,,,20,,,,20, +net/http,,8,22,,,8,22, +net/http/httputil,,,10,,,,10, +net/mail,,,6,,,,6, +net/textproto,,,19,,,,19, +net/url,,,23,,,,23, +os,,,4,,,,4, +path,,,5,,,,5, +path/filepath,,,13,,,,13, +reflect,,,37,,,,37, +regexp,,,20,,,,20, +sort,,,1,,,,1, +strconv,,,9,,,,9, +strings,,,34,,,,34, +sync,,,10,,,,10, +sync/atomic,,,24,,,,24, +syscall,,,8,,,,8, +text/scanner,,,3,,,,3, +text/tabwriter,,,1,,,,1, +text/template,,,6,,,,6, diff --git a/go/documentation/library-coverage/coverage.rst b/go/documentation/library-coverage/coverage.rst index 2de6fe0121e..63c408d82fc 100644 --- a/go/documentation/library-coverage/coverage.rst +++ b/go/documentation/library-coverage/coverage.rst @@ -10,21 +10,30 @@ Go framework & library support `Couchbase official client(gocb) `_,"``github.com/couchbase/gocb*``, ``gopkg.in/couchbase/gocb*``",,36, `Couchbase unofficial client `_,``github.com/couchbaselabs/gocb*``,,18, `Echo `_,``github.com/labstack/echo*``,,2, + `Fosite `_,``github.com/ory/fosite*``,,,2 `Gin `_,``github.com/gin-gonic/gin*``,,2, + `Go kit `_,``github.com/go-kit/kit*``,,,1 + `Iris `_,``github.com/kataras/iris*``,,,1 `Kubernetes `_,"``k8s.io/api*``, ``k8s.io/apimachinery*``",,57, `Macaron `_,``gopkg.in/macaron*``,,1, `Revel `_,"``github.com/revel/revel*``, ``github.com/robfig/revel*``",,20, `SendGrid `_,``github.com/sendgrid/sendgrid-go*``,,1, - `Standard library `_,"````, ``archive/*``, ``bufio``, ``bytes``, ``cmp``, ``compress/*``, ``container/*``, ``context``, ``crypto``, ``crypto/*``, ``database/*``, ``debug/*``, ``embed``, ``encoding``, ``encoding/*``, ``errors``, ``expvar``, ``flag``, ``fmt``, ``go/*``, ``hash``, ``hash/*``, ``html``, ``html/*``, ``image``, ``image/*``, ``index/*``, ``io``, ``io/*``, ``log``, ``log/*``, ``maps``, ``math``, ``math/*``, ``mime``, ``mime/*``, ``net``, ``net/*``, ``os``, ``os/*``, ``path``, ``path/*``, ``plugin``, ``reflect``, ``reflect/*``, ``regexp``, ``regexp/*``, ``slices``, ``sort``, ``strconv``, ``strings``, ``sync``, ``sync/*``, ``syscall``, ``syscall/*``, ``testing``, ``testing/*``, ``text/*``, ``time``, ``time/*``, ``unicode``, ``unicode/*``, ``unsafe``",8,577, + `Standard library `_,"````, ``archive/*``, ``bufio``, ``bytes``, ``cmp``, ``compress/*``, ``container/*``, ``context``, ``crypto``, ``crypto/*``, ``database/*``, ``debug/*``, ``embed``, ``encoding``, ``encoding/*``, ``errors``, ``expvar``, ``flag``, ``fmt``, ``go/*``, ``hash``, ``hash/*``, ``html``, ``html/*``, ``image``, ``image/*``, ``index/*``, ``io``, ``io/*``, ``log``, ``log/*``, ``maps``, ``math``, ``math/*``, ``mime``, ``mime/*``, ``net``, ``net/*``, ``os``, ``os/*``, ``path``, ``path/*``, ``plugin``, ``reflect``, ``reflect/*``, ``regexp``, ``regexp/*``, ``slices``, ``sort``, ``strconv``, ``strings``, ``sync``, ``sync/*``, ``syscall``, ``syscall/*``, ``testing``, ``testing/*``, ``text/*``, ``time``, ``time/*``, ``unicode``, ``unicode/*``, ``unsafe``",8,578, `beego `_,"``github.com/astaxie/beego*``, ``github.com/beego/beego*``",,42, + `cristalhq/jwt `_,``github.com/cristalhq/jwt*``,,,1 `fasthttp `_,``github.com/valyala/fasthttp*``,,5, `go-pg `_,``github.com/go-pg/pg*``,,6, `golang.org/x/net `_,``golang.org/x/net*``,,21, `goproxy `_,``github.com/elazarl/goproxy*``,,2, `json-iterator `_,``github.com/json-iterator/go*``,,4, `jsonpatch `_,``github.com/evanphx/json-patch*``,,12, + `jwt-go `_,"``github.com/golang-jwt/jwt*``, ``github.com/form3tech-oss/jwt-go*``, ``github.com/dgrijalva/jwt-go*``",,20,8 + `jwtauth `_,``github.com/go-chi/jwtauth*``,,,1 + `kataras/jwt `_,``github.com/kataras/jwt*``,,,5 + `lestrrat-go/jwx `_,"``github.com/lestrrat-go/jwx*``, ``github.com/lestrrat/go-jwx*``",,,3 `protobuf `_,"``github.com/golang/protobuf*``, ``google.golang.org/protobuf*``",,16, `yaml `_,``gopkg.in/yaml*``,,9, `zap `_,``go.uber.org/zap*``,,11, - Totals,,8,842, + Others,"``github.com/go-jose/go-jose/$ANYVERSION/jwt``, ``gopkg.in/square/go-jose.v2/jwt``",,8,2 + Totals,,8,871,24 From 20f795c03a509b474a4b27c392c694c1d1778ba1 Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Fri, 23 Feb 2024 11:20:15 +0100 Subject: [PATCH 131/207] Code quality improvements --- .../Semmle.Autobuild.CSharp/Constants.cs | 8 +++++++ .../Semmle.Autobuild.CSharp/DotNetRule.cs | 21 +++++++------------ .../StandaloneBuildRule.cs | 3 +-- 3 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 csharp/autobuilder/Semmle.Autobuild.CSharp/Constants.cs diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/Constants.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/Constants.cs new file mode 100644 index 00000000000..6e0f0ded7a4 --- /dev/null +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/Constants.cs @@ -0,0 +1,8 @@ +namespace Semmle.Autobuild.CSharp +{ + internal static class Constants + { + // The version number should be kept in sync with the version .NET version used for building the application. + public const string LatestDotNetSdkVersion = "8.0.101"; + } +} diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs index af00e8dba70..f5e519b1f90 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs @@ -85,27 +85,23 @@ namespace Semmle.Autobuild.CSharp var installScript = DownloadDotNet(builder, installDir, ensureDotNetAvailable); return BuildScript.Bind(installScript, installed => { - Dictionary? env; + var env = new Dictionary + { + { "DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true" }, + { "MSBUILDDISABLENODEREUSE", "1" } + }; if (installed == 0) { // The installation succeeded, so use the newly installed .NET Core var path = builder.Actions.GetEnvironmentVariable("PATH"); var delim = builder.Actions.IsWindows() ? ";" : ":"; - env = new Dictionary{ - { "DOTNET_MULTILEVEL_LOOKUP", "false" }, // prevent look up of other .NET Core SDKs - { "DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true" }, - { "MSBUILDDISABLENODEREUSE", "1" }, - { "PATH", installDir + delim + path } - }; + env.Add("DOTNET_MULTILEVEL_LOOKUP", "false"); // prevent look up of other .NET Core SDKs + env.Add("PATH", installDir + delim + path); } else { // The .NET SDK was not installed, either because the installation failed or because it was already installed. installDir = null; - env = new Dictionary { - { "DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true" }, - { "MSBUILDDISABLENODEREUSE", "1" } - }; } return f(installDir, env); @@ -163,8 +159,7 @@ namespace Semmle.Autobuild.CSharp if (ensureDotNetAvailable) { - const string latestDotNetSdkVersion = "8.0.101"; - return DownloadDotNetVersion(builder, installDir, latestDotNetSdkVersion, needExactVersion: false); + return DownloadDotNetVersion(builder, installDir, Constants.LatestDotNetSdkVersion, needExactVersion: false); } return BuildScript.Failure; diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs index b58b0fb2fce..0279c6af01c 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs @@ -16,8 +16,7 @@ namespace Semmle.Autobuild.CSharp public BuildScript Analyse(IAutobuilder builder, bool auto) { - if (!builder.Options.Buildless - || builder.CodeQLExtractorLangRoot is null + if (builder.CodeQLExtractorLangRoot is null || builder.CodeQlPlatform is null) { return BuildScript.Failure; From 62b16c0fa3414b4bba79a0b591639593460cda09 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 23 Feb 2024 11:18:51 +0100 Subject: [PATCH 132/207] Share `getFileBySourceArchiveName` implementation --- config/identical-files.json | 7 -- cpp/ql/lib/IDEContextual.qll | 11 +- csharp/ql/lib/IDEContextual.qll | 11 +- go/ql/lib/ideContextual.qll | 11 +- java/ql/lib/IDEContextual.qll | 11 +- javascript/ql/lib/IDEContextual.qll | 11 +- python/ql/lib/analysis/IDEContextual.qll | 11 +- ql/ql/src/codeql/IDEContextual.qll | 11 +- ruby/ql/lib/codeql/IDEContextual.qll | 15 +-- shared/util/codeql/util/FileSystem.qll | 137 +++++++++++++++++++++++ 10 files changed, 157 insertions(+), 79 deletions(-) diff --git a/config/identical-files.json b/config/identical-files.json index cde68f43caf..a24b5a3a618 100644 --- a/config/identical-files.json +++ b/config/identical-files.json @@ -431,13 +431,6 @@ "java/ql/src/experimental/Security/CWE/CWE-400/LocalThreadResourceAbuse.qhelp", "java/ql/src/experimental/Security/CWE/CWE-400/ThreadResourceAbuse.qhelp" ], - "IDE Contextual Queries": [ - "cpp/ql/lib/IDEContextual.qll", - "csharp/ql/lib/IDEContextual.qll", - "java/ql/lib/IDEContextual.qll", - "javascript/ql/lib/IDEContextual.qll", - "python/ql/lib/analysis/IDEContextual.qll" - ], "CryptoAlgorithms Python/JS/Ruby": [ "javascript/ql/lib/semmle/javascript/security/CryptoAlgorithms.qll", "python/ql/lib/semmle/python/concepts/CryptoAlgorithms.qll", diff --git a/cpp/ql/lib/IDEContextual.qll b/cpp/ql/lib/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/cpp/ql/lib/IDEContextual.qll +++ b/cpp/ql/lib/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/csharp/ql/lib/IDEContextual.qll b/csharp/ql/lib/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/csharp/ql/lib/IDEContextual.qll +++ b/csharp/ql/lib/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/go/ql/lib/ideContextual.qll b/go/ql/lib/ideContextual.qll index b729aa81c8f..b28a23a6e00 100644 --- a/go/ql/lib/ideContextual.qll +++ b/go/ql/lib/ideContextual.qll @@ -4,6 +4,7 @@ */ import go +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -11,13 +12,5 @@ import go */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/java/ql/lib/IDEContextual.qll b/java/ql/lib/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/java/ql/lib/IDEContextual.qll +++ b/java/ql/lib/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/javascript/ql/lib/IDEContextual.qll b/javascript/ql/lib/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/javascript/ql/lib/IDEContextual.qll +++ b/javascript/ql/lib/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/python/ql/lib/analysis/IDEContextual.qll b/python/ql/lib/analysis/IDEContextual.qll index f4e6267fdcf..f26956bcca0 100644 --- a/python/ql/lib/analysis/IDEContextual.qll +++ b/python/ql/lib/analysis/IDEContextual.qll @@ -3,6 +3,7 @@ */ import semmle.files.FileSystem +private import codeql.util.FileSystem /** * Returns the `File` matching the given source file name as encoded by the VS @@ -10,13 +11,5 @@ import semmle.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/ql/ql/src/codeql/IDEContextual.qll b/ql/ql/src/codeql/IDEContextual.qll index 0e58b1d878b..1c267d8f164 100644 --- a/ql/ql/src/codeql/IDEContextual.qll +++ b/ql/ql/src/codeql/IDEContextual.qll @@ -1,4 +1,5 @@ private import codeql.files.FileSystem +private import codeql.util.FileSystem /** * Returns an appropriately encoded version of a filename `name` @@ -7,13 +8,5 @@ private import codeql.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/ruby/ql/lib/codeql/IDEContextual.qll b/ruby/ql/lib/codeql/IDEContextual.qll index 0e58b1d878b..3b8486b4526 100644 --- a/ruby/ql/lib/codeql/IDEContextual.qll +++ b/ruby/ql/lib/codeql/IDEContextual.qll @@ -1,4 +1,9 @@ +/** + * Provides shared predicates related to contextual queries in the code viewer. + */ + private import codeql.files.FileSystem +private import codeql.util.FileSystem /** * Returns an appropriately encoded version of a filename `name` @@ -7,13 +12,5 @@ private import codeql.files.FileSystem */ cached File getFileBySourceArchiveName(string name) { - // The name provided for a file in the source archive by the VS Code extension - // has some differences from the absolute path in the database: - // 1. colons are replaced by underscores - // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> - // "/C_/foo/bar" - // 3. double slashes in UNC prefixes are replaced with a single slash - // We can handle 2 and 3 together by unconditionally adding a leading slash - // before replacing double slashes. - name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + result = IdeContextual::getFileBySourceArchiveName(name) } diff --git a/shared/util/codeql/util/FileSystem.qll b/shared/util/codeql/util/FileSystem.qll index e742ad87c40..a9eb21279b6 100644 --- a/shared/util/codeql/util/FileSystem.qll +++ b/shared/util/codeql/util/FileSystem.qll @@ -219,3 +219,140 @@ module Make { override string getURL() { result = "file://" + this.getAbsolutePath() + ":0:0:0:0" } } } + +/** A file. */ +signature class FileSig { + /** + * Gets the absolute, canonical path of this container, using forward slashes + * as path separator. + * + * The path starts with a _root prefix_ followed by zero or more _path + * segments_ separated by forward slashes. + * + * The root prefix is of one of the following forms: + * + * 1. A single forward slash `/` (Unix-style) + * 2. An upper-case drive letter followed by a colon and a forward slash, + * such as `C:/` (Windows-style) + * 3. Two forward slashes, a computer name, and then another forward slash, + * such as `//FileServer/` (UNC-style) + * + * Path segments are never empty (that is, absolute paths never contain two + * contiguous slashes, except as part of a UNC-style root prefix). Also, path + * segments never contain forward slashes, and no path segment is of the + * form `.` (one dot) or `..` (two dots). + * + * Note that an absolute path never ends with a forward slash, except if it is + * a bare root prefix, that is, the path has no path segments. A container + * whose absolute path has no segments is always a `Folder`, not a `File`. + */ + string getAbsolutePath(); + + /** + * Gets the base name of this container including extension, that is, the last + * segment of its absolute path, or the empty string if it has no segments. + * + * Here are some examples of absolute paths and the corresponding base names + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + * + *
    Absolute pathBase name
    "/tmp/tst.txt""tst.txt"
    "C:/Program Files (x86)""Program Files (x86)"
    "/"""
    "C:/"""
    "D:/"""
    "//FileServer/"""
    + */ + string getBaseName(); + + /** + * Gets the extension of this container, that is, the suffix of its base name + * after the last dot character, if any. + * + * In particular, + * + * - if the name does not include a dot, there is no extension, so this + * predicate has no result; + * - if the name ends in a dot, the extension is the empty string; + * - if the name contains multiple dots, the extension follows the last dot. + * + * Here are some examples of absolute paths and the corresponding extensions + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathExtension
    "/tmp/tst.txt""txt"
    "/tmp/.classpath""classpath"
    "/bin/bash"not defined
    "/tmp/tst2."""
    "/tmp/x.tar.gz""gz"
    + */ + string getExtension(); + + /** + * Gets the relative path of this file or folder from the root folder of the + * analyzed source location. The relative path of the root folder itself is + * the empty string. + * + * This has no result if the container is outside the source root, that is, + * if the root folder is not a reflexive, transitive parent of this container. + */ + string getRelativePath(); + + /** + * Gets the stem of this container, that is, the prefix of its base name up to + * (but not including) the last dot character if there is one, or the entire + * base name if there is not. + * + * Here are some examples of absolute paths and the corresponding stems + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathStem
    "/tmp/tst.txt""tst"
    "/tmp/.classpath"""
    "/bin/bash""bash"
    "/tmp/tst2.""tst2"
    "/tmp/x.tar.gz""x.tar"
    + */ + string getStem(); + + /** + * Gets a URL representing the location of this container. + * + * For more information see https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/#providing-urls. + */ + string getURL(); + + /** + * Gets a textual representation of the path of this container. + * + * This is the absolute path of the container. + */ + string toString(); +} + +/** + * Provides shared predicates related to contextual queries in the code viewer. + */ +module IdeContextual { + /** + * Returns the `File` matching the given source file name as encoded by the VS + * Code extension. + */ + File getFileBySourceArchiveName(string name) { + // The name provided for a file in the source archive by the VS Code extension + // has some differences from the absolute path in the database: + // 1. colons are replaced by underscores + // 2. there's a leading slash, even for Windows paths: "C:/foo/bar" -> + // "/C_/foo/bar" + // 3. double slashes in UNC prefixes are replaced with a single slash + // We can handle 2 and 3 together by unconditionally adding a leading slash + // before replacing double slashes. + name = ("/" + result.getAbsolutePath().replaceAll(":", "_")).replaceAll("//", "/") + } +} From dd97584eff2c65edcf6579060efd3ec7043eddbf Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Fri, 23 Feb 2024 16:19:34 +0000 Subject: [PATCH 133/207] C++: fix for duplicated parent of ReturnVoid statements --- .../raw/internal/TranslatedElement.qll | 2 +- .../raw/internal/TranslatedStmt.qll | 2 +- .../library-tests/ir/ir/PrintAST.expected | 20 +++ .../library-tests/ir/ir/aliased_ir.expected | 115 +++++++++++------- cpp/ql/test/library-tests/ir/ir/ir.cpp | 5 + .../ir/ir/operand_locations.expected | 55 +++++---- .../test/library-tests/ir/ir/raw_ir.expected | 91 ++++++++------ 7 files changed, 188 insertions(+), 102 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 8136ac96908..70dae0cfacf 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -616,7 +616,7 @@ newtype TTranslatedElement = exists(ArrayOrVectorAggregateLiteral initList | initList.getAnElementExpr(_).getFullyConverted() = expr ) or - exists(ReturnStmt returnStmt | returnStmt.getExpr().getFullyConverted() = expr) or + exists(ReturnStmt returnStmt | returnStmt.getExpr().getFullyConverted() = expr and hasReturnValue(returnStmt.getEnclosingFunction())) or exists(ConstructorFieldInit fieldInit | fieldInit.getExpr().getFullyConverted() = expr) or exists(NewExpr newExpr | newExpr.getInitializer().getFullyConverted() = expr) or exists(ThrowExpr throw | throw.getExpr().getFullyConverted() = expr) or diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index b825c563850..048e8457c28 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -474,7 +474,7 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { override Instruction getALastInstructionInternal() { if this.hasAnImplicitDestructorCall() then - result = this.getChildInternal(max(int id | exists(this.getChild(id)))).getALastInstruction() + result = this.getChild(max(int id | exists(this.getChild(id)))).getALastInstruction() else result = this.getInstruction(OnlyInstructionTag()) } diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 11e6b8cd65b..81190351b3f 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -17895,6 +17895,26 @@ ir.cpp: # 2292| getQualifier(): [VariableAccess] s # 2292| Type = [Struct] String # 2292| ValueCategory = lvalue +# 2294| [TopLevelFunction] void VoidReturnDestructors() +# 2294| : +# 2294| getEntryPoint(): [BlockStmt] { ... } +# 2295| getStmt(0): [DeclStmt] declaration +# 2295| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2295| Type = [Struct] String +# 2295| getVariable().getInitializer(): [Initializer] initializer for s +# 2295| getExpr(): [ConstructorCall] call to String +# 2295| Type = [VoidType] void +# 2295| ValueCategory = prvalue +# 2296| getStmt(1): [ReturnStmt] return ... +# 2296| getExpr(): [FunctionCall] call to VoidFunc +# 2296| Type = [VoidType] void +# 2296| ValueCategory = prvalue +# 2297| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2297| Type = [VoidType] void +# 2297| ValueCategory = prvalue +# 2297| getQualifier(): [VariableAccess] s +# 2297| Type = [Struct] String +# 2297| ValueCategory = lvalue perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index b1a82467e47..77f36ffa2e4 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -14268,65 +14268,61 @@ ir.cpp: # 2277| r2277_1(glval) = VariableAddress[b] : # 2277| r2277_2(bool) = Load[b] : &:r2277_1, m2275_6 # 2277| v2277_3(void) = ConditionalBranch : r2277_2 -#-----| False -> Block 4 -#-----| True -> Block 3 +#-----| False -> Block 3 +#-----| True -> Block 2 # 2275| Block 1 -# 2275| m2275_7(unknown) = Phi : from 2:~m2284_21, from 2:~m2284_5, from 5:~m2284_21, from 5:~m2284_5, from 3:~m2284_13, from 2:~m2284_21, from 2:~m2284_5, from 5:~m2284_21, from 5:~m2284_5, from 6:~m2284_30 +# 2275| m2275_7(unknown) = Phi : from 2:~m2284_5, from 4:~m2284_13, from 5:~m2284_22 # 2275| v2275_8(void) = ReturnVoid : # 2275| v2275_9(void) = AliasedUse : ~m2275_7 # 2275| v2275_10(void) = ExitFunction : -# 2278| Block 3 -# 2278| v2278_1(void) = NoOp : +# 2278| Block 2 +# 2278| v2278_1(void) = NoOp : +# 2284| r2284_1(glval) = VariableAddress[s] : +# 2284| r2284_2(glval) = FunctionAddress[~String] : +# 2284| v2284_3(void) = Call[~String] : func:r2284_2, this:r2284_1 +# 2284| m2284_4(unknown) = ^CallSideEffect : ~m2276_6 +# 2284| m2284_5(unknown) = Chi : total:m2276_6, partial:m2284_4 +# 2284| v2284_6(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, m2276_8 +# 2284| m2284_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1 +# 2284| m2284_8(String) = Chi : total:m2276_8, partial:m2284_7 +#-----| Goto -> Block 1 + +# 2280| Block 3 +# 2280| r2280_1(glval) = VariableAddress[b] : +# 2280| r2280_2(bool) = Load[b] : &:r2280_1, m2275_6 +# 2280| v2280_3(void) = ConditionalBranch : r2280_2 +#-----| False -> Block 5 +#-----| True -> Block 4 + +# 2281| Block 4 +# 2281| r2281_1(glval) = FunctionAddress[VoidFunc] : +# 2281| v2281_2(void) = Call[VoidFunc] : func:r2281_1 +# 2281| m2281_3(unknown) = ^CallSideEffect : ~m2276_6 +# 2281| m2281_4(unknown) = Chi : total:m2276_6, partial:m2281_3 +# 2281| v2281_5(void) = NoOp : # 2284| r2284_9(glval) = VariableAddress[s] : # 2284| r2284_10(glval) = FunctionAddress[~String] : # 2284| v2284_11(void) = Call[~String] : func:r2284_10, this:r2284_9 -# 2284| m2284_12(unknown) = ^CallSideEffect : ~m2276_6 -# 2284| m2284_13(unknown) = Chi : total:m2276_6, partial:m2284_12 +# 2284| m2284_12(unknown) = ^CallSideEffect : ~m2281_4 +# 2284| m2284_13(unknown) = Chi : total:m2281_4, partial:m2284_12 # 2284| v2284_14(void) = ^IndirectReadSideEffect[-1] : &:r2284_9, m2276_8 # 2284| m2284_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_9 # 2284| m2284_16(String) = Chi : total:m2276_8, partial:m2284_15 #-----| Goto -> Block 1 -# 2280| Block 4 -# 2280| r2280_1(glval) = VariableAddress[b] : -# 2280| r2280_2(bool) = Load[b] : &:r2280_1, m2275_6 -# 2280| v2280_3(void) = ConditionalBranch : r2280_2 -#-----| False -> Block 6 -#-----| True -> Block 5 -#-----| True -> Block 5 - -# 2281| Block 5 -# 2281| r2281_6(glval) = FunctionAddress[VoidFunc] : -# 2281| v2281_7(void) = Call[VoidFunc] : func:r2281_1, func:r2281_6 -# 2281| m2281_8(unknown) = ^CallSideEffect : ~m2276_6 -# 2281| m2281_9(unknown) = Chi : total:m2276_6, partial:m2281_3, partial:m2281_8 -# 2281| v2281_5(void) = NoOp : -# 2284| r2284_1(glval) = VariableAddress[s] : -# 2284| r2284_2(glval) = FunctionAddress[~String] : -# 2284| v2284_3(void) = Call[~String] : func:r2284_18, func:r2284_2, this:r2284_1, this:r2284_17 -# 2284| m2284_4(unknown) = ^CallSideEffect : ~m2281_4, ~m2281_9 -# 2284| m2284_5(unknown) = Chi : total:m2281_4, total:m2281_9, partial:m2284_20, partial:m2284_4 -# 2284| v2284_6(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, &:r2284_17, m2276_8 -# 2284| m2284_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1, &:r2284_17 -# 2284| m2284_8(String) = Chi : total:m2276_8, partial:m2284_23, partial:m2284_7 -#-----| Goto -> Block 1 - -# 2281| Block 5 -#-----| Goto -> Block 1 - -# 2283| Block 6 +# 2283| Block 5 # 2283| r2283_1(glval) = VariableAddress[s] : -# 2284| v2284_25(void) = NoOp : -# 2284| r2284_26(glval) = VariableAddress[s] : -# 2284| r2284_27(glval) = FunctionAddress[~String] : -# 2284| v2284_28(void) = Call[~String] : func:r2284_27, this:r2284_26 -# 2284| m2284_29(unknown) = ^CallSideEffect : ~m2276_6 -# 2284| m2284_30(unknown) = Chi : total:m2276_6, partial:m2284_29 -# 2284| v2284_31(void) = ^IndirectReadSideEffect[-1] : &:r2284_26, m2276_8 -# 2284| m2284_32(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_26 -# 2284| m2284_33(String) = Chi : total:m2276_8, partial:m2284_32 +# 2284| v2284_17(void) = NoOp : +# 2284| r2284_18(glval) = VariableAddress[s] : +# 2284| r2284_19(glval) = FunctionAddress[~String] : +# 2284| v2284_20(void) = Call[~String] : func:r2284_19, this:r2284_18 +# 2284| m2284_21(unknown) = ^CallSideEffect : ~m2276_6 +# 2284| m2284_22(unknown) = Chi : total:m2276_6, partial:m2284_21 +# 2284| v2284_23(void) = ^IndirectReadSideEffect[-1] : &:r2284_18, m2276_8 +# 2284| m2284_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_18 +# 2284| m2284_25(String) = Chi : total:m2276_8, partial:m2284_24 #-----| Goto -> Block 1 # 2286| int IfReturnDestructors3(bool) @@ -14387,6 +14383,37 @@ ir.cpp: # 2292| m2292_16(String) = Chi : total:m2287_8, partial:m2292_15 #-----| Goto -> Block 1 +# 2294| void VoidReturnDestructors() +# 2294| Block 0 +# 2294| v2294_1(void) = EnterFunction : +# 2294| m2294_2(unknown) = AliasedDefinition : +# 2294| m2294_3(unknown) = InitializeNonLocal : +# 2294| m2294_4(unknown) = Chi : total:m2294_2, partial:m2294_3 +# 2295| r2295_1(glval) = VariableAddress[s] : +# 2295| m2295_2(String) = Uninitialized[s] : &:r2295_1 +# 2295| r2295_3(glval) = FunctionAddress[String] : +# 2295| v2295_4(void) = Call[String] : func:r2295_3, this:r2295_1 +# 2295| m2295_5(unknown) = ^CallSideEffect : ~m2294_4 +# 2295| m2295_6(unknown) = Chi : total:m2294_4, partial:m2295_5 +# 2295| m2295_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2295_1 +# 2295| m2295_8(String) = Chi : total:m2295_2, partial:m2295_7 +# 2296| r2296_1(glval) = FunctionAddress[VoidFunc] : +# 2296| v2296_2(void) = Call[VoidFunc] : func:r2296_1 +# 2296| m2296_3(unknown) = ^CallSideEffect : ~m2295_6 +# 2296| m2296_4(unknown) = Chi : total:m2295_6, partial:m2296_3 +# 2296| v2296_5(void) = NoOp : +# 2297| r2297_1(glval) = VariableAddress[s] : +# 2297| r2297_2(glval) = FunctionAddress[~String] : +# 2297| v2297_3(void) = Call[~String] : func:r2297_2, this:r2297_1 +# 2297| m2297_4(unknown) = ^CallSideEffect : ~m2296_4 +# 2297| m2297_5(unknown) = Chi : total:m2296_4, partial:m2297_4 +# 2297| v2297_6(void) = ^IndirectReadSideEffect[-1] : &:r2297_1, m2295_8 +# 2297| m2297_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2297_1 +# 2297| m2297_8(String) = Chi : total:m2295_8, partial:m2297_7 +# 2294| v2294_5(void) = ReturnVoid : +# 2294| v2294_6(void) = AliasedUse : ~m2297_5 +# 2294| v2294_7(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 95c39eb3b6a..2863fc97919 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2291,4 +2291,9 @@ int IfReturnDestructors3(bool b) { return 0; } +void VoidReturnDestructors() { + String s; + return VoidFunc(); +} + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index e4cfcfe6ed1..76a54d828be 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -11765,11 +11765,8 @@ | ir.cpp:2275:6:2275:24 | ChiPartial | partial:m2275_3 | | ir.cpp:2275:6:2275:24 | ChiTotal | total:m2275_2 | | ir.cpp:2275:6:2275:24 | Phi | from 2:~m2284_5 | -| ir.cpp:2275:6:2275:24 | Phi | from 2:~m2284_21 | -| ir.cpp:2275:6:2275:24 | Phi | from 3:~m2284_13 | -| ir.cpp:2275:6:2275:24 | Phi | from 5:~m2284_5 | -| ir.cpp:2275:6:2275:24 | Phi | from 5:~m2284_21 | -| ir.cpp:2275:6:2275:24 | Phi | from 6:~m2284_30 | +| ir.cpp:2275:6:2275:24 | Phi | from 4:~m2284_13 | +| ir.cpp:2275:6:2275:24 | Phi | from 5:~m2284_22 | | ir.cpp:2275:6:2275:24 | SideEffect | ~m2275_7 | | ir.cpp:2275:31:2275:31 | Address | &:r2275_5 | | ir.cpp:2276:12:2276:12 | Address | &:r2276_1 | @@ -11788,49 +11785,39 @@ | ir.cpp:2280:8:2280:8 | Condition | r2280_2 | | ir.cpp:2280:8:2280:8 | Load | m2275_6 | | ir.cpp:2281:16:2281:23 | CallTarget | func:r2281_1 | -| ir.cpp:2281:16:2281:23 | CallTarget | func:r2281_6 | | ir.cpp:2281:16:2281:23 | ChiPartial | partial:m2281_3 | -| ir.cpp:2281:16:2281:23 | ChiPartial | partial:m2281_8 | | ir.cpp:2281:16:2281:23 | ChiTotal | total:m2276_6 | | ir.cpp:2281:16:2281:23 | SideEffect | ~m2276_6 | | ir.cpp:2284:1:2284:1 | Address | &:r2284_1 | | ir.cpp:2284:1:2284:1 | Address | &:r2284_1 | | ir.cpp:2284:1:2284:1 | Address | &:r2284_9 | | ir.cpp:2284:1:2284:1 | Address | &:r2284_9 | -| ir.cpp:2284:1:2284:1 | Address | &:r2284_17 | -| ir.cpp:2284:1:2284:1 | Address | &:r2284_17 | -| ir.cpp:2284:1:2284:1 | Address | &:r2284_26 | -| ir.cpp:2284:1:2284:1 | Address | &:r2284_26 | +| ir.cpp:2284:1:2284:1 | Address | &:r2284_18 | +| ir.cpp:2284:1:2284:1 | Address | &:r2284_18 | | ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_1 | | ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_9 | -| ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_17 | -| ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_26 | +| ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_18 | | ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_2 | | ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_10 | -| ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_18 | -| ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_27 | +| ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_19 | | ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_4 | | ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_7 | | ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_12 | | ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_15 | -| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_20 | -| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_23 | -| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_29 | -| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_32 | +| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_21 | +| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_24 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_6 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_6 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_8 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_8 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_8 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2281_4 | -| ir.cpp:2284:1:2284:1 | ChiTotal | total:m2281_9 | | ir.cpp:2284:1:2284:1 | SideEffect | m2276_8 | | ir.cpp:2284:1:2284:1 | SideEffect | m2276_8 | | ir.cpp:2284:1:2284:1 | SideEffect | m2276_8 | | ir.cpp:2284:1:2284:1 | SideEffect | ~m2276_6 | | ir.cpp:2284:1:2284:1 | SideEffect | ~m2276_6 | | ir.cpp:2284:1:2284:1 | SideEffect | ~m2281_4 | -| ir.cpp:2284:1:2284:1 | SideEffect | ~m2281_9 | | ir.cpp:2286:5:2286:24 | Address | &:r2286_9 | | ir.cpp:2286:5:2286:24 | ChiPartial | partial:m2286_3 | | ir.cpp:2286:5:2286:24 | ChiTotal | total:m2286_2 | @@ -11877,6 +11864,32 @@ | ir.cpp:2292:1:2292:1 | SideEffect | m2287_8 | | ir.cpp:2292:1:2292:1 | SideEffect | ~m2287_6 | | ir.cpp:2292:1:2292:1 | SideEffect | ~m2287_6 | +| ir.cpp:2294:6:2294:26 | ChiPartial | partial:m2294_3 | +| ir.cpp:2294:6:2294:26 | ChiTotal | total:m2294_2 | +| ir.cpp:2294:6:2294:26 | SideEffect | ~m2297_5 | +| ir.cpp:2295:12:2295:12 | Address | &:r2295_1 | +| ir.cpp:2295:12:2295:12 | Address | &:r2295_1 | +| ir.cpp:2295:12:2295:12 | Arg(this) | this:r2295_1 | +| ir.cpp:2295:12:2295:12 | CallTarget | func:r2295_3 | +| ir.cpp:2295:12:2295:12 | ChiPartial | partial:m2295_5 | +| ir.cpp:2295:12:2295:12 | ChiPartial | partial:m2295_7 | +| ir.cpp:2295:12:2295:12 | ChiTotal | total:m2294_4 | +| ir.cpp:2295:12:2295:12 | ChiTotal | total:m2295_2 | +| ir.cpp:2295:12:2295:12 | SideEffect | ~m2294_4 | +| ir.cpp:2296:12:2296:19 | CallTarget | func:r2296_1 | +| ir.cpp:2296:12:2296:19 | ChiPartial | partial:m2296_3 | +| ir.cpp:2296:12:2296:19 | ChiTotal | total:m2295_6 | +| ir.cpp:2296:12:2296:19 | SideEffect | ~m2295_6 | +| ir.cpp:2297:1:2297:1 | Address | &:r2297_1 | +| ir.cpp:2297:1:2297:1 | Address | &:r2297_1 | +| ir.cpp:2297:1:2297:1 | Arg(this) | this:r2297_1 | +| ir.cpp:2297:1:2297:1 | CallTarget | func:r2297_2 | +| ir.cpp:2297:1:2297:1 | ChiPartial | partial:m2297_4 | +| ir.cpp:2297:1:2297:1 | ChiPartial | partial:m2297_7 | +| ir.cpp:2297:1:2297:1 | ChiTotal | total:m2295_8 | +| ir.cpp:2297:1:2297:1 | ChiTotal | total:m2296_4 | +| ir.cpp:2297:1:2297:1 | SideEffect | m2295_8 | +| ir.cpp:2297:1:2297:1 | SideEffect | ~m2296_4 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 1a0f8e83651..4c5ec0061a5 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -13242,16 +13242,36 @@ ir.cpp: # 2277| r2277_1(glval) = VariableAddress[b] : # 2277| r2277_2(bool) = Load[b] : &:r2277_1, ~m? # 2277| v2277_3(void) = ConditionalBranch : r2277_2 -#-----| False -> Block 4 -#-----| True -> Block 3 +#-----| False -> Block 3 +#-----| True -> Block 2 # 2275| Block 1 # 2275| v2275_6(void) = ReturnVoid : # 2275| v2275_7(void) = AliasedUse : ~m? # 2275| v2275_8(void) = ExitFunction : -# 2278| Block 3 +# 2278| Block 2 # 2278| v2278_1(void) = NoOp : +# 2284| r2284_1(glval) = VariableAddress[s] : +# 2284| r2284_2(glval) = FunctionAddress[~String] : +# 2284| v2284_3(void) = Call[~String] : func:r2284_2, this:r2284_1 +# 2284| mu2284_4(unknown) = ^CallSideEffect : ~m? +# 2284| v2284_5(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, ~m? +# 2284| mu2284_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1 +#-----| Goto -> Block 1 + +# 2280| Block 3 +# 2280| r2280_1(glval) = VariableAddress[b] : +# 2280| r2280_2(bool) = Load[b] : &:r2280_1, ~m? +# 2280| v2280_3(void) = ConditionalBranch : r2280_2 +#-----| False -> Block 5 +#-----| True -> Block 4 + +# 2281| Block 4 +# 2281| r2281_1(glval) = FunctionAddress[VoidFunc] : +# 2281| v2281_2(void) = Call[VoidFunc] : func:r2281_1 +# 2281| mu2281_3(unknown) = ^CallSideEffect : ~m? +# 2281| v2281_4(void) = NoOp : # 2284| r2284_7(glval) = VariableAddress[s] : # 2284| r2284_8(glval) = FunctionAddress[~String] : # 2284| v2284_9(void) = Call[~String] : func:r2284_8, this:r2284_7 @@ -13260,39 +13280,15 @@ ir.cpp: # 2284| mu2284_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_7 #-----| Goto -> Block 1 -# 2280| Block 4 -# 2280| r2280_1(glval) = VariableAddress[b] : -# 2280| r2280_2(bool) = Load[b] : &:r2280_1, ~m? -# 2280| v2280_3(void) = ConditionalBranch : r2280_2 -#-----| False -> Block 6 -#-----| True -> Block 5 -#-----| True -> Block 5 - -# 2281| Block 5 -# 2281| r2281_5(glval) = FunctionAddress[VoidFunc] : -# 2281| v2281_6(void) = Call[VoidFunc] : func:r2281_1, func:r2281_5 -# 2281| mu2281_7(unknown) = ^CallSideEffect : ~m? -# 2281| v2281_8(void) = NoOp : -# 2284| r2284_13(glval) = VariableAddress[s] : -# 2284| r2284_14(glval) = FunctionAddress[~String] : -# 2284| v2284_3(void) = Call[~String] : func:r2284_14, func:r2284_2, this:r2284_1, this:r2284_13 -# 2284| mu2284_4(unknown) = ^CallSideEffect : ~m? -# 2284| v2284_5(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, &:r2284_13, ~m? -# 2284| mu2284_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1, &:r2284_13 -#-----| Goto -> Block 1 - -# 2281| Block 5 -#-----| Goto -> Block 1 - -# 2283| Block 6 +# 2283| Block 5 # 2283| r2283_1(glval) = VariableAddress[s] : -# 2284| v2284_19(void) = NoOp : -# 2284| r2284_20(glval) = VariableAddress[s] : -# 2284| r2284_21(glval) = FunctionAddress[~String] : -# 2284| v2284_22(void) = Call[~String] : func:r2284_21, this:r2284_20 -# 2284| mu2284_23(unknown) = ^CallSideEffect : ~m? -# 2284| v2284_24(void) = ^IndirectReadSideEffect[-1] : &:r2284_20, ~m? -# 2284| mu2284_25(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_20 +# 2284| v2284_13(void) = NoOp : +# 2284| r2284_14(glval) = VariableAddress[s] : +# 2284| r2284_15(glval) = FunctionAddress[~String] : +# 2284| v2284_16(void) = Call[~String] : func:r2284_15, this:r2284_14 +# 2284| mu2284_17(unknown) = ^CallSideEffect : ~m? +# 2284| v2284_18(void) = ^IndirectReadSideEffect[-1] : &:r2284_14, ~m? +# 2284| mu2284_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_14 #-----| Goto -> Block 1 # 2286| int IfReturnDestructors3(bool) @@ -13344,6 +13340,31 @@ ir.cpp: # 2292| mu2292_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2292_7 #-----| Goto -> Block 1 +# 2294| void VoidReturnDestructors() +# 2294| Block 0 +# 2294| v2294_1(void) = EnterFunction : +# 2294| mu2294_2(unknown) = AliasedDefinition : +# 2294| mu2294_3(unknown) = InitializeNonLocal : +# 2295| r2295_1(glval) = VariableAddress[s] : +# 2295| mu2295_2(String) = Uninitialized[s] : &:r2295_1 +# 2295| r2295_3(glval) = FunctionAddress[String] : +# 2295| v2295_4(void) = Call[String] : func:r2295_3, this:r2295_1 +# 2295| mu2295_5(unknown) = ^CallSideEffect : ~m? +# 2295| mu2295_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2295_1 +# 2296| r2296_1(glval) = FunctionAddress[VoidFunc] : +# 2296| v2296_2(void) = Call[VoidFunc] : func:r2296_1 +# 2296| mu2296_3(unknown) = ^CallSideEffect : ~m? +# 2296| v2296_4(void) = NoOp : +# 2297| r2297_1(glval) = VariableAddress[s] : +# 2297| r2297_2(glval) = FunctionAddress[~String] : +# 2297| v2297_3(void) = Call[~String] : func:r2297_2, this:r2297_1 +# 2297| mu2297_4(unknown) = ^CallSideEffect : ~m? +# 2297| v2297_5(void) = ^IndirectReadSideEffect[-1] : &:r2297_1, ~m? +# 2297| mu2297_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2297_1 +# 2294| v2294_4(void) = ReturnVoid : +# 2294| v2294_5(void) = AliasedUse : ~m? +# 2294| v2294_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 From da5e3d64acc96bb9fb446f56d2c3c4b9bbf92dce Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Fri, 23 Feb 2024 16:20:42 +0000 Subject: [PATCH 134/207] C++: autoformat --- .../raw/internal/TranslatedElement.qll | 27 +++++++++++++------ .../raw/internal/TranslatedStmt.qll | 3 +-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 70dae0cfacf..8d2242df4ab 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -611,16 +611,27 @@ newtype TTranslatedElement = TTranslatedInitialization(Expr expr) { not ignoreExpr(expr) and ( - exists(Initializer init | init.getExpr().getFullyConverted() = expr) or - exists(ClassAggregateLiteral initList | initList.getAFieldExpr(_).getFullyConverted() = expr) or + exists(Initializer init | init.getExpr().getFullyConverted() = expr) + or + exists(ClassAggregateLiteral initList | initList.getAFieldExpr(_).getFullyConverted() = expr) + or exists(ArrayOrVectorAggregateLiteral initList | initList.getAnElementExpr(_).getFullyConverted() = expr - ) or - exists(ReturnStmt returnStmt | returnStmt.getExpr().getFullyConverted() = expr and hasReturnValue(returnStmt.getEnclosingFunction())) or - exists(ConstructorFieldInit fieldInit | fieldInit.getExpr().getFullyConverted() = expr) or - exists(NewExpr newExpr | newExpr.getInitializer().getFullyConverted() = expr) or - exists(ThrowExpr throw | throw.getExpr().getFullyConverted() = expr) or - exists(TemporaryObjectExpr temp | temp.getExpr() = expr) or + ) + or + exists(ReturnStmt returnStmt | + returnStmt.getExpr().getFullyConverted() = expr and + hasReturnValue(returnStmt.getEnclosingFunction()) + ) + or + exists(ConstructorFieldInit fieldInit | fieldInit.getExpr().getFullyConverted() = expr) + or + exists(NewExpr newExpr | newExpr.getInitializer().getFullyConverted() = expr) + or + exists(ThrowExpr throw | throw.getExpr().getFullyConverted() = expr) + or + exists(TemporaryObjectExpr temp | temp.getExpr() = expr) + or exists(LambdaExpression lambda | lambda.getInitializer().getFullyConverted() = expr) ) } or diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 048e8457c28..d8ec66a2ee7 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -473,8 +473,7 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { override Instruction getALastInstructionInternal() { if this.hasAnImplicitDestructorCall() - then - result = this.getChild(max(int id | exists(this.getChild(id)))).getALastInstruction() + then result = this.getChild(max(int id | exists(this.getChild(id)))).getALastInstruction() else result = this.getInstruction(OnlyInstructionTag()) } From d57160db5cc2be3d045f9f155d4e6e759878d64e Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Fri, 23 Feb 2024 16:37:26 +0000 Subject: [PATCH 135/207] Direct map stores via a post-update node --- go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll index a864b6a4d03..e6a21a06dec 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll @@ -41,11 +41,11 @@ predicate containerStoreStep(Node node1, Node node2, Content c) { or c instanceof MapKeyContent and node2.getType() instanceof MapType and - exists(Write w | w.writesElement(node2, node1, _)) + exists(Write w | w.writesElement(node2.(PostUpdateNode).getPreUpdateNode(), node1, _)) or c instanceof MapValueContent and node2.getType() instanceof MapType and - exists(Write w | w.writesElement(node2, _, node1)) + exists(Write w | w.writesElement(node2.(PostUpdateNode).getPreUpdateNode(), _, node1)) } /** From 12213a0a0814131fdfe0f5a2922261726f223629 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Fri, 23 Feb 2024 18:39:16 +0000 Subject: [PATCH 136/207] Add test --- .../dataflow/MapReadsAndStores/Flows.expected | 0 .../go/dataflow/MapReadsAndStores/Flows.ql | 3 +++ .../go/dataflow/MapReadsAndStores/test.go | 17 +++++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.expected create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.ql create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go diff --git a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.expected b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.ql b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.ql new file mode 100644 index 00000000000..1b27b27d6dc --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/Flows.ql @@ -0,0 +1,3 @@ +import go +import TestUtilities.InlineFlowTest +import DefaultFlowTest diff --git a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go new file mode 100644 index 00000000000..b27443a6d89 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go @@ -0,0 +1,17 @@ +package main + +func source() string { + return "untrusted data" +} + +func sink(any) { +} + +func main() { + var someMap map[string]string = map[string]string{} + someMap["someKey"] = source() + + for _, val := range someMap { + sink(val) // $ hasValueFlow="val" + } +} From 7197c64e2d01cbc9a78fdfe1c12131b562ef137e Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 12 Feb 2024 13:49:15 +0100 Subject: [PATCH 137/207] C#: Add more variable capture tests --- .../library-tests/dataflow/global/Capture.cs | 155 ++++++++++++++++- .../dataflow/global/DataFlow.expected | 25 ++- .../dataflow/global/DataFlowPath.expected | 158 +++++++++++++----- .../dataflow/global/GetAnOutNode.expected | 39 ++--- .../dataflow/global/TaintTracking.expected | 25 ++- .../global/TaintTrackingPath.expected | 158 +++++++++++++----- 6 files changed, 441 insertions(+), 119 deletions(-) diff --git a/csharp/ql/test/library-tests/dataflow/global/Capture.cs b/csharp/ql/test/library-tests/dataflow/global/Capture.cs index bfa0da36c90..7c6c1d8a04c 100644 --- a/csharp/ql/test/library-tests/dataflow/global/Capture.cs +++ b/csharp/ql/test/library-tests/dataflow/global/Capture.cs @@ -111,10 +111,12 @@ class Capture string sink40 = ""; void CaptureOutMultipleLambdas() { - RunAction(() => { + RunAction(() => + { sink40 = "taint source"; }); - RunAction(() => { + RunAction(() => + { nonSink0 = "not tainted"; }); }; @@ -197,10 +199,159 @@ class Capture Check(nonSink0); } + void M1(string s) + { + Action a = () => + { + Check(s); + }; + a(); + } + + void M2() => M1("taint source"); + + Action M3(string s) + { + return () => + { + Check(s); // missing flow from lines 221 and 223 + }; + } + + void M4() => M3("taint source")(); + + void M5() => RunAction(M3("taint source")); + + void M6() + { + List xs = new List { 0, 1, 2 }; + var x = "taint source"; + xs.ForEach(_ => + { + Check(x); + x = "taint source"; + }); + Check(x); + } + + public string Field; + + void M7() + { + var c = new Capture(); + c.Field = "taint source"; + + Action a = () => + { + Check(c.Field); // missing flow from line 242 + c.Field = "taint source"; + }; + a(); + + Check(c.Field); // missing flow from line 247 + } + + void M7(bool b) + { + var c = new Capture(); + if (b) + { + c = null; + } + + Action a = () => + { + c.Field = "taint source"; + }; + a(); + + Check(c.Field); // missing flow from line 264 + } + + void M8() + { + RunAction(x => Check(x), "taint source"); + } + + void M9() + { + var x = "taint source"; + + Action middle = () => + { + Action inner = () => + { + Check(x); + x = "taint source"; + }; + inner(); + }; + + middle(); + + Check(x); + } + + void M10() + { + this.Field = "taint source"; + + Action a = () => + { + Check(this.Field); // missing flow from line 297 + this.Field = "taint source"; + }; + a(); + + Check(this.Field); // missing flow from line 302 + } + + void M11() + { + var x = "taint source"; + Check(x); + x = "safe"; + Check(x); + + Action a = () => + { + x = "taint source"; + Check(x); + x = "safe"; + Check(x); + }; + a(); + } + + void M12() + { + var x = "taint source"; + + void CapturedLocalFunction() => Check(x); // missing flow from line 328 + + void CapturingLocalFunction() => CapturedLocalFunction(); + } + + void M13() + { + var x = "taint source"; + + Action capturedLambda = () => Check(x); + + Action capturingLambda = () => capturedLambda(); + + capturingLambda(); + } + static void Check(T x) { } static void RunAction(Action a) { a.Invoke(); } + + static void RunAction(Action a, T x) + { + a(x); + } } diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected index c57da19dc66..b2244abaa60 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected @@ -5,13 +5,24 @@ | Capture.cs:72:15:72:20 | access to local variable sink30 | | Capture.cs:84:15:84:20 | access to local variable sink31 | | Capture.cs:93:15:93:20 | access to local variable sink32 | -| Capture.cs:122:15:122:20 | access to local variable sink40 | -| Capture.cs:133:15:133:20 | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | -| Capture.cs:161:15:161:20 | access to local variable sink36 | -| Capture.cs:169:15:169:20 | access to local variable sink37 | -| Capture.cs:195:15:195:20 | access to local variable sink38 | +| Capture.cs:124:15:124:20 | access to local variable sink40 | +| Capture.cs:135:15:135:20 | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | +| Capture.cs:163:15:163:20 | access to local variable sink36 | +| Capture.cs:171:15:171:20 | access to local variable sink37 | +| Capture.cs:197:15:197:20 | access to local variable sink38 | +| Capture.cs:206:19:206:19 | access to parameter s | +| Capture.cs:231:19:231:19 | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | +| Capture.cs:251:15:251:21 | access to field Field | +| Capture.cs:273:30:273:30 | access to parameter x | +| Capture.cs:284:23:284:23 | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | +| Capture.cs:306:15:306:24 | access to field Field | +| Capture.cs:312:15:312:15 | access to local variable x | +| Capture.cs:319:19:319:19 | access to local variable x | +| Capture.cs:339:45:339:45 | access to local variable x | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | | GlobalDataFlow.cs:45:50:45:59 | access to parameter sinkParam2 | diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected index 3e7fca0c3e3..6cea5180e89 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected @@ -14,22 +14,48 @@ edges | Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:22 | access to local variable sink31 : String | provenance | | | Capture.cs:89:13:89:18 | access to local variable sink32 : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | | Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:18 | access to local variable sink32 : String | provenance | | -| Capture.cs:115:17:115:22 | access to local variable sink40 : String | Capture.cs:122:15:122:20 | access to local variable sink40 | provenance | | -| Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:115:17:115:22 | access to local variable sink40 : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:168:25:168:31 | access to parameter tainted : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:194:25:194:31 | access to parameter tainted : String | provenance | | -| Capture.cs:160:13:160:18 | access to local variable sink36 : String | Capture.cs:161:15:161:20 | access to local variable sink36 | provenance | | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | Capture.cs:160:13:160:18 | access to local variable sink36 : String | provenance | | -| Capture.cs:168:25:168:31 | access to parameter tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | provenance | | -| Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | provenance | | -| Capture.cs:194:13:194:18 | access to local variable sink38 : String | Capture.cs:195:15:195:20 | access to local variable sink38 | provenance | | -| Capture.cs:194:22:194:32 | call to local function Id : String | Capture.cs:194:13:194:18 | access to local variable sink38 : String | provenance | | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | provenance | | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:194:22:194:32 | call to local function Id : String | provenance | | +| Capture.cs:116:17:116:22 | access to local variable sink40 : String | Capture.cs:124:15:124:20 | access to local variable sink40 | provenance | | +| Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:116:17:116:22 | access to local variable sink40 : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:135:15:135:20 | access to local variable sink33 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:147:15:147:20 | access to local variable sink34 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:156:15:156:20 | access to local variable sink35 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:170:25:170:31 | access to parameter tainted : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:196:25:196:31 | access to parameter tainted : String | provenance | | +| Capture.cs:162:13:162:18 | access to local variable sink36 : String | Capture.cs:163:15:163:20 | access to local variable sink36 | provenance | | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | Capture.cs:162:13:162:18 | access to local variable sink36 : String | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:171:15:171:20 | access to local variable sink37 | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | provenance | | +| Capture.cs:196:13:196:18 | access to local variable sink38 : String | Capture.cs:197:15:197:20 | access to local variable sink38 | provenance | | +| Capture.cs:196:22:196:32 | call to local function Id : String | Capture.cs:196:13:196:18 | access to local variable sink38 : String | provenance | | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | provenance | | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:196:22:196:32 | call to local function Id : String | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:202:20:202:20 | s : String | provenance | | +| Capture.cs:228:13:228:13 | access to local variable x : String | Capture.cs:231:19:231:19 | access to local variable x | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:228:13:228:13 | access to local variable x : String | provenance | | +| Capture.cs:232:13:232:13 | access to local variable x : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:232:13:232:13 | access to local variable x : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:21 | access to field Field | provenance | | +| Capture.cs:273:19:273:19 | x : String | Capture.cs:273:30:273:30 | access to parameter x | provenance | | +| Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:353:45:353:45 | x : String | provenance | | +| Capture.cs:278:13:278:13 | access to local variable x : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:278:13:278:13 | access to local variable x : String | provenance | | +| Capture.cs:285:17:285:17 | access to local variable x : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:285:17:285:17 | access to local variable x : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | Capture.cs:306:15:306:24 | access to field Field | provenance | | +| Capture.cs:311:13:311:13 | access to local variable x : String | Capture.cs:312:15:312:15 | access to local variable x | provenance | | +| Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:311:13:311:13 | access to local variable x : String | provenance | | +| Capture.cs:318:13:318:13 | access to local variable x : String | Capture.cs:319:19:319:19 | access to local variable x | provenance | | +| Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:318:13:318:13 | access to local variable x : String | provenance | | +| Capture.cs:337:13:337:13 | access to local variable x : String | Capture.cs:339:45:339:45 | access to local variable x | provenance | | +| Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:337:13:337:13 | access to local variable x : String | provenance | | +| Capture.cs:353:45:353:45 | x : String | Capture.cs:355:11:355:11 | access to parameter x : String | provenance | | +| Capture.cs:355:11:355:11 | access to parameter x : String | Capture.cs:273:19:273:19 | x : String | provenance | | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | provenance | | @@ -399,24 +425,61 @@ nodes | Capture.cs:89:13:89:18 | access to local variable sink32 : String | semmle.label | access to local variable sink32 : String | | Capture.cs:89:22:89:35 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:93:15:93:20 | access to local variable sink32 | semmle.label | access to local variable sink32 | -| Capture.cs:115:17:115:22 | access to local variable sink40 : String | semmle.label | access to local variable sink40 : String | -| Capture.cs:115:26:115:39 | "taint source" : String | semmle.label | "taint source" : String | -| Capture.cs:122:15:122:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | -| Capture.cs:125:25:125:31 | tainted : String | semmle.label | tainted : String | -| Capture.cs:133:15:133:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | -| Capture.cs:160:13:160:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | -| Capture.cs:161:15:161:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | -| Capture.cs:168:25:168:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:169:15:169:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | -| Capture.cs:188:26:188:26 | s : String | semmle.label | s : String | -| Capture.cs:191:20:191:22 | call to local function M : String | semmle.label | call to local function M : String | -| Capture.cs:194:13:194:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | -| Capture.cs:194:22:194:32 | call to local function Id : String | semmle.label | call to local function Id : String | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:195:15:195:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| Capture.cs:116:17:116:22 | access to local variable sink40 : String | semmle.label | access to local variable sink40 : String | +| Capture.cs:116:26:116:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:124:15:124:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | +| Capture.cs:127:25:127:31 | tainted : String | semmle.label | tainted : String | +| Capture.cs:135:15:135:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | +| Capture.cs:162:13:162:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | +| Capture.cs:163:15:163:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | +| Capture.cs:171:15:171:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | +| Capture.cs:190:26:190:26 | s : String | semmle.label | s : String | +| Capture.cs:193:20:193:22 | call to local function M : String | semmle.label | call to local function M : String | +| Capture.cs:196:13:196:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | +| Capture.cs:196:22:196:32 | call to local function Id : String | semmle.label | call to local function Id : String | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | +| Capture.cs:197:15:197:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| Capture.cs:202:20:202:20 | s : String | semmle.label | s : String | +| Capture.cs:206:19:206:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:211:21:211:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:228:13:228:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:228:17:228:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:231:19:231:19 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:232:13:232:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:232:17:232:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:234:15:234:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:242:19:242:32 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:251:15:251:21 | access to field Field | semmle.label | access to field Field | +| Capture.cs:273:19:273:19 | x : String | semmle.label | x : String | +| Capture.cs:273:30:273:30 | access to parameter x | semmle.label | access to parameter x | +| Capture.cs:273:34:273:47 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:278:13:278:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:278:17:278:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:284:23:284:23 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:285:17:285:17 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:285:21:285:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:292:15:292:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | +| Capture.cs:297:22:297:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | +| Capture.cs:306:15:306:24 | access to field Field | semmle.label | access to field Field | +| Capture.cs:311:13:311:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:311:17:311:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:312:15:312:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:318:13:318:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:318:17:318:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:319:19:319:19 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:337:13:337:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:337:17:337:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:339:45:339:45 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:353:45:353:45 | x : String | semmle.label | x : String | +| Capture.cs:355:11:355:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | semmle.label | access to field SinkField0 : String | | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | semmle.label | access to field SinkField0 | @@ -720,7 +783,7 @@ nodes | Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s | | Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s | subpaths -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | Capture.cs:194:22:194:32 | call to local function Id : String | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | Capture.cs:196:22:196:32 | call to local function Id : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | @@ -745,6 +808,8 @@ subpaths | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | [b (line 24): true] access to local variable x | | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | [b (line 3): false] access to local variable x | | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | [b (line 3): true] access to local variable x | +| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:306:15:306:24 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | access to field SinkField0 | | GlobalDataFlow.cs:491:15:491:22 | access to field field | GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:491:15:491:22 | access to field field | access to field field | | GlobalDataFlow.cs:492:15:492:22 | access to field field | GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:492:15:492:22 | access to field field | access to field field | @@ -785,14 +850,14 @@ subpaths | Capture.cs:72:15:72:20 | access to local variable sink30 | Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:72:15:72:20 | access to local variable sink30 | access to local variable sink30 | | Capture.cs:84:15:84:20 | access to local variable sink31 | Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:84:15:84:20 | access to local variable sink31 | access to local variable sink31 | | Capture.cs:93:15:93:20 | access to local variable sink32 | Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:93:15:93:20 | access to local variable sink32 | access to local variable sink32 | -| Capture.cs:133:15:133:20 | access to local variable sink33 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | access to local variable sink35 | -| Capture.cs:161:15:161:20 | access to local variable sink36 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:161:15:161:20 | access to local variable sink36 | access to local variable sink36 | -| Capture.cs:169:15:169:20 | access to local variable sink37 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | access to local variable sink37 | -| Capture.cs:195:15:195:20 | access to local variable sink38 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:195:15:195:20 | access to local variable sink38 | access to local variable sink38 | +| Capture.cs:135:15:135:20 | access to local variable sink33 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:135:15:135:20 | access to local variable sink33 | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:147:15:147:20 | access to local variable sink34 | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:156:15:156:20 | access to local variable sink35 | access to local variable sink35 | +| Capture.cs:163:15:163:20 | access to local variable sink36 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:163:15:163:20 | access to local variable sink36 | access to local variable sink36 | +| Capture.cs:171:15:171:20 | access to local variable sink37 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:171:15:171:20 | access to local variable sink37 | access to local variable sink37 | +| Capture.cs:197:15:197:20 | access to local variable sink38 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:197:15:197:20 | access to local variable sink38 | access to local variable sink38 | | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:140:15:140:19 | access to local variable sink4 | access to local variable sink4 | -| Capture.cs:122:15:122:20 | access to local variable sink40 | Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:122:15:122:20 | access to local variable sink40 | access to local variable sink40 | +| Capture.cs:124:15:124:20 | access to local variable sink40 | Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:124:15:124:20 | access to local variable sink40 | access to local variable sink40 | | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:243:15:243:20 | access to local variable sink41 | access to local variable sink41 | | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | GlobalDataFlow.cs:241:35:241:48 | "taint source" : String | GlobalDataFlow.cs:245:15:245:20 | access to local variable sink42 | access to local variable sink42 | | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | GlobalDataFlow.cs:457:35:457:48 | "taint source" : String | GlobalDataFlow.cs:461:15:461:20 | access to local variable sink45 | access to local variable sink45 | @@ -801,8 +866,16 @@ subpaths | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | GlobalDataFlow.cs:346:13:346:26 | "taint source" : String | GlobalDataFlow.cs:161:15:161:19 | access to local variable sink7 | access to local variable sink7 | | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | access to local variable sink8 | | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | access to local variable sink9 | +| Capture.cs:231:19:231:19 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:231:19:231:19 | access to local variable x | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | +| Capture.cs:284:23:284:23 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:284:23:284:23 | access to local variable x | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | +| Capture.cs:312:15:312:15 | access to local variable x | Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | access to local variable x | +| Capture.cs:319:19:319:19 | access to local variable x | Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | access to local variable x | +| Capture.cs:339:45:339:45 | access to local variable x | Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:45:339:45 | access to local variable x | access to local variable x | | Splitting.cs:11:19:11:19 | access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:11:19:11:19 | access to local variable x | access to local variable x | | Splitting.cs:34:19:34:19 | access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:34:19:34:19 | access to local variable x | access to local variable x | +| Capture.cs:206:19:206:19 | access to parameter s | Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:206:19:206:19 | access to parameter s | access to parameter s | | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | GlobalDataFlow.cs:473:28:473:41 | "taint source" : String | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | access to parameter s | | Capture.cs:57:27:57:32 | access to parameter sink39 | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:57:27:57:32 | access to parameter sink39 | access to parameter sink39 | | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | access to parameter sinkParam0 | @@ -817,5 +890,6 @@ subpaths | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:290:15:290:24 | access to parameter sinkParam7 | access to parameter sinkParam7 | | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:317:15:317:24 | access to parameter sinkParam8 | access to parameter sinkParam8 | | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | GlobalDataFlow.cs:211:46:211:59 | "taint source" : String | GlobalDataFlow.cs:323:15:323:24 | access to parameter sinkParam9 | access to parameter sinkParam9 | +| Capture.cs:273:30:273:30 | access to parameter x | Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:273:30:273:30 | access to parameter x | access to parameter x | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | access to property SinkProperty0 | | Splitting.cs:21:21:21:33 | call to method Return | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:21:21:21:33 | call to method Return | call to method Return | diff --git a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected index 8f6175b67ce..76416668e22 100644 --- a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected +++ b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected @@ -1,4 +1,3 @@ -| Capture.cs:5:7:5:13 | call to constructor Object | normal | Capture.cs:5:7:5:13 | call to constructor Object | | Capture.cs:33:9:33:40 | call to method Select | normal | Capture.cs:33:9:33:40 | call to method Select | | Capture.cs:33:9:33:50 | call to method ToArray | normal | Capture.cs:33:9:33:50 | call to method ToArray | | Capture.cs:71:9:71:21 | call to local function CaptureOut1 | captured sink30 | Capture.cs:71:9:71:21 | SSA call def(sink30) | @@ -6,19 +5,26 @@ | Capture.cs:92:9:92:41 | [transitive] call to method Select | captured sink32 | Capture.cs:92:9:92:41 | SSA call def(sink32) | | Capture.cs:92:9:92:41 | call to method Select | normal | Capture.cs:92:9:92:41 | call to method Select | | Capture.cs:92:9:92:51 | call to method ToArray | normal | Capture.cs:92:9:92:51 | call to method ToArray | -| Capture.cs:121:9:121:35 | [transitive] call to local function CaptureOutMultipleLambdas | captured nonSink0 | Capture.cs:121:9:121:35 | SSA call def(nonSink0) | -| Capture.cs:121:9:121:35 | [transitive] call to local function CaptureOutMultipleLambdas | captured sink40 | Capture.cs:121:9:121:35 | SSA call def(sink40) | -| Capture.cs:132:9:132:25 | call to local function CaptureThrough1 | captured sink33 | Capture.cs:132:9:132:25 | SSA call def(sink33) | -| Capture.cs:144:9:144:25 | [transitive] call to local function CaptureThrough2 | captured sink34 | Capture.cs:144:9:144:25 | SSA call def(sink34) | -| Capture.cs:153:9:153:45 | [transitive] call to method Select | captured sink35 | Capture.cs:153:9:153:45 | SSA call def(sink35) | -| Capture.cs:153:9:153:45 | call to method Select | normal | Capture.cs:153:9:153:45 | call to method Select | -| Capture.cs:153:9:153:55 | call to method ToArray | normal | Capture.cs:153:9:153:55 | call to method ToArray | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 | normal | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 | -| Capture.cs:168:9:168:32 | call to local function CaptureThrough5 | captured sink37 | Capture.cs:168:9:168:32 | SSA call def(sink37) | -| Capture.cs:191:20:191:22 | call to local function M | normal | Capture.cs:191:20:191:22 | call to local function M | -| Capture.cs:194:22:194:32 | call to local function Id | normal | Capture.cs:194:22:194:32 | call to local function Id | -| Capture.cs:196:20:196:25 | call to local function Id | normal | Capture.cs:196:20:196:25 | call to local function Id | -| GlobalDataFlow.cs:13:14:13:21 | call to constructor Object | normal | GlobalDataFlow.cs:13:14:13:21 | call to constructor Object | +| Capture.cs:123:9:123:35 | [transitive] call to local function CaptureOutMultipleLambdas | captured nonSink0 | Capture.cs:123:9:123:35 | SSA call def(nonSink0) | +| Capture.cs:123:9:123:35 | [transitive] call to local function CaptureOutMultipleLambdas | captured sink40 | Capture.cs:123:9:123:35 | SSA call def(sink40) | +| Capture.cs:134:9:134:25 | call to local function CaptureThrough1 | captured sink33 | Capture.cs:134:9:134:25 | SSA call def(sink33) | +| Capture.cs:146:9:146:25 | [transitive] call to local function CaptureThrough2 | captured sink34 | Capture.cs:146:9:146:25 | SSA call def(sink34) | +| Capture.cs:155:9:155:45 | [transitive] call to method Select | captured sink35 | Capture.cs:155:9:155:45 | SSA call def(sink35) | +| Capture.cs:155:9:155:45 | call to method Select | normal | Capture.cs:155:9:155:45 | call to method Select | +| Capture.cs:155:9:155:55 | call to method ToArray | normal | Capture.cs:155:9:155:55 | call to method ToArray | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 | normal | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 | +| Capture.cs:170:9:170:32 | call to local function CaptureThrough5 | captured sink37 | Capture.cs:170:9:170:32 | SSA call def(sink37) | +| Capture.cs:193:20:193:22 | call to local function M | normal | Capture.cs:193:20:193:22 | call to local function M | +| Capture.cs:196:22:196:32 | call to local function Id | normal | Capture.cs:196:22:196:32 | call to local function Id | +| Capture.cs:198:20:198:25 | call to local function Id | normal | Capture.cs:198:20:198:25 | call to local function Id | +| Capture.cs:221:18:221:35 | call to method M3 | normal | Capture.cs:221:18:221:35 | call to method M3 | +| Capture.cs:223:28:223:45 | call to method M3 | normal | Capture.cs:223:28:223:45 | call to method M3 | +| Capture.cs:227:24:227:48 | object creation of type List | normal | Capture.cs:227:24:227:48 | object creation of type List | +| Capture.cs:229:9:233:10 | [transitive] call to method ForEach | captured x | Capture.cs:229:9:233:10 | SSA call def(x) | +| Capture.cs:241:17:241:29 | object creation of type Capture | normal | Capture.cs:241:17:241:29 | object creation of type Capture | +| Capture.cs:256:17:256:29 | object creation of type Capture | normal | Capture.cs:256:17:256:29 | object creation of type Capture | +| Capture.cs:290:9:290:16 | [transitive] delegate call | captured x | Capture.cs:290:9:290:16 | SSA call def(x) | +| Capture.cs:323:9:323:11 | delegate call | captured x | Capture.cs:323:9:323:11 | SSA call def(x) | | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | | GlobalDataFlow.cs:30:9:30:29 | access to property NonSinkProperty0 | normal | GlobalDataFlow.cs:30:9:30:29 | access to property NonSinkProperty0 | @@ -149,20 +155,17 @@ | GlobalDataFlow.cs:249:24:249:34 | access to property Result | normal | GlobalDataFlow.cs:249:24:249:34 | access to property Result | | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc | normal | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc | | GlobalDataFlow.cs:389:16:389:19 | delegate call | normal | GlobalDataFlow.cs:389:16:389:19 | delegate call | -| GlobalDataFlow.cs:415:11:415:14 | call to constructor Object | normal | GlobalDataFlow.cs:415:11:415:14 | call to constructor Object | | GlobalDataFlow.cs:448:22:448:65 | call to method Join | normal | GlobalDataFlow.cs:448:22:448:65 | call to method Join | | GlobalDataFlow.cs:451:23:451:65 | call to method Join | normal | GlobalDataFlow.cs:451:23:451:65 | call to method Join | | GlobalDataFlow.cs:457:20:457:49 | call to method Run | normal | GlobalDataFlow.cs:457:20:457:49 | call to method Run | | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait | normal | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait | | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter | normal | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter | | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult | normal | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult | -| GlobalDataFlow.cs:476:18:476:28 | call to constructor Object | normal | GlobalDataFlow.cs:476:18:476:28 | call to constructor Object | | GlobalDataFlow.cs:488:18:488:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:488:18:488:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:489:18:489:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:489:18:489:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:494:18:494:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:494:18:494:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:495:18:495:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:495:18:495:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:496:18:496:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:496:18:496:34 | object creation of type SimpleClass | -| GlobalDataFlow.cs:503:19:503:32 | call to constructor SimpleClass | normal | GlobalDataFlow.cs:503:19:503:32 | call to constructor SimpleClass | | GlobalDataFlow.cs:507:17:507:36 | object creation of type SubSimpleClass | normal | GlobalDataFlow.cs:507:17:507:36 | object creation of type SubSimpleClass | | GlobalDataFlow.cs:514:17:514:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:514:17:514:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:522:17:522:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:522:17:522:33 | object creation of type SimpleClass | @@ -170,7 +173,6 @@ | GlobalDataFlow.cs:524:17:524:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:524:17:524:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:545:17:545:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:545:17:545:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:558:44:558:47 | delegate call | normal | GlobalDataFlow.cs:558:44:558:47 | delegate call | -| GlobalDataFlowStringBuilder.cs:13:14:13:34 | call to constructor Object | normal | GlobalDataFlowStringBuilder.cs:13:14:13:34 | call to constructor Object | | GlobalDataFlowStringBuilder.cs:19:9:19:20 | call to method Append | normal | GlobalDataFlowStringBuilder.cs:19:9:19:20 | call to method Append | | GlobalDataFlowStringBuilder.cs:24:9:24:27 | call to method Append | normal | GlobalDataFlowStringBuilder.cs:24:9:24:27 | call to method Append | | GlobalDataFlowStringBuilder.cs:29:18:29:36 | object creation of type StringBuilder | normal | GlobalDataFlowStringBuilder.cs:29:18:29:36 | object creation of type StringBuilder | @@ -184,7 +186,6 @@ | GlobalDataFlowStringBuilder.cs:44:9:44:18 | call to method Clear | normal | GlobalDataFlowStringBuilder.cs:44:9:44:18 | call to method Clear | | GlobalDataFlowStringBuilder.cs:45:23:45:35 | call to method ToString | normal | GlobalDataFlowStringBuilder.cs:45:23:45:35 | call to method ToString | | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString | normal | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString | -| Splitting.cs:1:7:1:15 | call to constructor Object | normal | Splitting.cs:1:7:1:15 | call to constructor Object | | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return | normal | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return | | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return | normal | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return | | Splitting.cs:20:22:20:30 | call to method Return | normal | Splitting.cs:20:22:20:30 | call to method Return | diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected index 9a2ea6bd3da..a17520910af 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected @@ -5,13 +5,24 @@ | Capture.cs:72:15:72:20 | access to local variable sink30 | | Capture.cs:84:15:84:20 | access to local variable sink31 | | Capture.cs:93:15:93:20 | access to local variable sink32 | -| Capture.cs:122:15:122:20 | access to local variable sink40 | -| Capture.cs:133:15:133:20 | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | -| Capture.cs:161:15:161:20 | access to local variable sink36 | -| Capture.cs:169:15:169:20 | access to local variable sink37 | -| Capture.cs:195:15:195:20 | access to local variable sink38 | +| Capture.cs:124:15:124:20 | access to local variable sink40 | +| Capture.cs:135:15:135:20 | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | +| Capture.cs:163:15:163:20 | access to local variable sink36 | +| Capture.cs:171:15:171:20 | access to local variable sink37 | +| Capture.cs:197:15:197:20 | access to local variable sink38 | +| Capture.cs:206:19:206:19 | access to parameter s | +| Capture.cs:231:19:231:19 | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | +| Capture.cs:251:15:251:21 | access to field Field | +| Capture.cs:273:30:273:30 | access to parameter x | +| Capture.cs:284:23:284:23 | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | +| Capture.cs:306:15:306:24 | access to field Field | +| Capture.cs:312:15:312:15 | access to local variable x | +| Capture.cs:319:19:319:19 | access to local variable x | +| Capture.cs:339:45:339:45 | access to local variable x | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | | GlobalDataFlow.cs:45:50:45:59 | access to parameter sinkParam2 | diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected index 1a8330776ab..42883e2b533 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected @@ -14,22 +14,48 @@ edges | Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:22 | access to local variable sink31 : String | provenance | | | Capture.cs:89:13:89:18 | access to local variable sink32 : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | | Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:18 | access to local variable sink32 : String | provenance | | -| Capture.cs:115:17:115:22 | access to local variable sink40 : String | Capture.cs:122:15:122:20 | access to local variable sink40 | provenance | | -| Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:115:17:115:22 | access to local variable sink40 : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:168:25:168:31 | access to parameter tainted : String | provenance | | -| Capture.cs:125:25:125:31 | tainted : String | Capture.cs:194:25:194:31 | access to parameter tainted : String | provenance | | -| Capture.cs:160:13:160:18 | access to local variable sink36 : String | Capture.cs:161:15:161:20 | access to local variable sink36 | provenance | | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | Capture.cs:160:13:160:18 | access to local variable sink36 : String | provenance | | -| Capture.cs:168:25:168:31 | access to parameter tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | provenance | | -| Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | provenance | | -| Capture.cs:194:13:194:18 | access to local variable sink38 : String | Capture.cs:195:15:195:20 | access to local variable sink38 | provenance | | -| Capture.cs:194:22:194:32 | call to local function Id : String | Capture.cs:194:13:194:18 | access to local variable sink38 : String | provenance | | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | provenance | | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:194:22:194:32 | call to local function Id : String | provenance | | +| Capture.cs:116:17:116:22 | access to local variable sink40 : String | Capture.cs:124:15:124:20 | access to local variable sink40 | provenance | | +| Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:116:17:116:22 | access to local variable sink40 : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:135:15:135:20 | access to local variable sink33 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:147:15:147:20 | access to local variable sink34 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:156:15:156:20 | access to local variable sink35 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:170:25:170:31 | access to parameter tainted : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:196:25:196:31 | access to parameter tainted : String | provenance | | +| Capture.cs:162:13:162:18 | access to local variable sink36 : String | Capture.cs:163:15:163:20 | access to local variable sink36 | provenance | | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | Capture.cs:162:13:162:18 | access to local variable sink36 : String | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:171:15:171:20 | access to local variable sink37 | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | provenance | | +| Capture.cs:196:13:196:18 | access to local variable sink38 : String | Capture.cs:197:15:197:20 | access to local variable sink38 | provenance | | +| Capture.cs:196:22:196:32 | call to local function Id : String | Capture.cs:196:13:196:18 | access to local variable sink38 : String | provenance | | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | provenance | | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:196:22:196:32 | call to local function Id : String | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:202:20:202:20 | s : String | provenance | | +| Capture.cs:228:13:228:13 | access to local variable x : String | Capture.cs:231:19:231:19 | access to local variable x | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:228:13:228:13 | access to local variable x : String | provenance | | +| Capture.cs:232:13:232:13 | access to local variable x : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:232:13:232:13 | access to local variable x : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:21 | access to field Field | provenance | | +| Capture.cs:273:19:273:19 | x : String | Capture.cs:273:30:273:30 | access to parameter x | provenance | | +| Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:353:45:353:45 | x : String | provenance | | +| Capture.cs:278:13:278:13 | access to local variable x : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:278:13:278:13 | access to local variable x : String | provenance | | +| Capture.cs:285:17:285:17 | access to local variable x : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:285:17:285:17 | access to local variable x : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | Capture.cs:306:15:306:24 | access to field Field | provenance | | +| Capture.cs:311:13:311:13 | access to local variable x : String | Capture.cs:312:15:312:15 | access to local variable x | provenance | | +| Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:311:13:311:13 | access to local variable x : String | provenance | | +| Capture.cs:318:13:318:13 | access to local variable x : String | Capture.cs:319:19:319:19 | access to local variable x | provenance | | +| Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:318:13:318:13 | access to local variable x : String | provenance | | +| Capture.cs:337:13:337:13 | access to local variable x : String | Capture.cs:339:45:339:45 | access to local variable x | provenance | | +| Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:337:13:337:13 | access to local variable x : String | provenance | | +| Capture.cs:353:45:353:45 | x : String | Capture.cs:355:11:355:11 | access to parameter x : String | provenance | | +| Capture.cs:355:11:355:11 | access to parameter x : String | Capture.cs:273:19:273:19 | x : String | provenance | | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 : String | provenance | | | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | provenance | | @@ -449,24 +475,61 @@ nodes | Capture.cs:89:13:89:18 | access to local variable sink32 : String | semmle.label | access to local variable sink32 : String | | Capture.cs:89:22:89:35 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:93:15:93:20 | access to local variable sink32 | semmle.label | access to local variable sink32 | -| Capture.cs:115:17:115:22 | access to local variable sink40 : String | semmle.label | access to local variable sink40 : String | -| Capture.cs:115:26:115:39 | "taint source" : String | semmle.label | "taint source" : String | -| Capture.cs:122:15:122:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | -| Capture.cs:125:25:125:31 | tainted : String | semmle.label | tainted : String | -| Capture.cs:133:15:133:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | -| Capture.cs:160:13:160:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | -| Capture.cs:160:22:160:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | -| Capture.cs:161:15:161:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | -| Capture.cs:168:25:168:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:169:15:169:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | -| Capture.cs:188:26:188:26 | s : String | semmle.label | s : String | -| Capture.cs:191:20:191:22 | call to local function M : String | semmle.label | call to local function M : String | -| Capture.cs:194:13:194:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | -| Capture.cs:194:22:194:32 | call to local function Id : String | semmle.label | call to local function Id : String | -| Capture.cs:194:25:194:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:195:15:195:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| Capture.cs:116:17:116:22 | access to local variable sink40 : String | semmle.label | access to local variable sink40 : String | +| Capture.cs:116:26:116:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:124:15:124:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | +| Capture.cs:127:25:127:31 | tainted : String | semmle.label | tainted : String | +| Capture.cs:135:15:135:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | +| Capture.cs:162:13:162:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | +| Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | +| Capture.cs:163:15:163:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | +| Capture.cs:171:15:171:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | +| Capture.cs:190:26:190:26 | s : String | semmle.label | s : String | +| Capture.cs:193:20:193:22 | call to local function M : String | semmle.label | call to local function M : String | +| Capture.cs:196:13:196:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | +| Capture.cs:196:22:196:32 | call to local function Id : String | semmle.label | call to local function Id : String | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | +| Capture.cs:197:15:197:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | +| Capture.cs:202:20:202:20 | s : String | semmle.label | s : String | +| Capture.cs:206:19:206:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:211:21:211:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:228:13:228:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:228:17:228:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:231:19:231:19 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:232:13:232:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:232:17:232:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:234:15:234:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:242:19:242:32 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:251:15:251:21 | access to field Field | semmle.label | access to field Field | +| Capture.cs:273:19:273:19 | x : String | semmle.label | x : String | +| Capture.cs:273:30:273:30 | access to parameter x | semmle.label | access to parameter x | +| Capture.cs:273:34:273:47 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:278:13:278:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:278:17:278:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:284:23:284:23 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:285:17:285:17 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:285:21:285:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:292:15:292:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | +| Capture.cs:297:22:297:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | +| Capture.cs:306:15:306:24 | access to field Field | semmle.label | access to field Field | +| Capture.cs:311:13:311:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:311:17:311:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:312:15:312:15 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:318:13:318:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:318:17:318:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:319:19:319:19 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:337:13:337:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:337:17:337:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:339:45:339:45 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:353:45:353:45 | x : String | semmle.label | x : String | +| Capture.cs:355:11:355:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | semmle.label | access to field SinkField0 : String | | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | semmle.label | "taint source" : String | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | semmle.label | access to field SinkField0 | @@ -823,7 +886,7 @@ nodes | Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s | | Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s | subpaths -| Capture.cs:194:25:194:31 | access to parameter tainted : String | Capture.cs:188:26:188:26 | s : String | Capture.cs:191:20:191:22 | call to local function M : String | Capture.cs:194:22:194:32 | call to local function Id : String | +| Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | Capture.cs:196:22:196:32 | call to local function Id : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | @@ -853,13 +916,24 @@ subpaths | Capture.cs:72:15:72:20 | access to local variable sink30 | Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:72:15:72:20 | access to local variable sink30 | access to local variable sink30 | | Capture.cs:84:15:84:20 | access to local variable sink31 | Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:84:15:84:20 | access to local variable sink31 | access to local variable sink31 | | Capture.cs:93:15:93:20 | access to local variable sink32 | Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:93:15:93:20 | access to local variable sink32 | access to local variable sink32 | -| Capture.cs:122:15:122:20 | access to local variable sink40 | Capture.cs:115:26:115:39 | "taint source" : String | Capture.cs:122:15:122:20 | access to local variable sink40 | access to local variable sink40 | -| Capture.cs:133:15:133:20 | access to local variable sink33 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:133:15:133:20 | access to local variable sink33 | access to local variable sink33 | -| Capture.cs:145:15:145:20 | access to local variable sink34 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:145:15:145:20 | access to local variable sink34 | access to local variable sink34 | -| Capture.cs:154:15:154:20 | access to local variable sink35 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:154:15:154:20 | access to local variable sink35 | access to local variable sink35 | -| Capture.cs:161:15:161:20 | access to local variable sink36 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:161:15:161:20 | access to local variable sink36 | access to local variable sink36 | -| Capture.cs:169:15:169:20 | access to local variable sink37 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:169:15:169:20 | access to local variable sink37 | access to local variable sink37 | -| Capture.cs:195:15:195:20 | access to local variable sink38 | Capture.cs:125:25:125:31 | tainted : String | Capture.cs:195:15:195:20 | access to local variable sink38 | access to local variable sink38 | +| Capture.cs:124:15:124:20 | access to local variable sink40 | Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:124:15:124:20 | access to local variable sink40 | access to local variable sink40 | +| Capture.cs:135:15:135:20 | access to local variable sink33 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:135:15:135:20 | access to local variable sink33 | access to local variable sink33 | +| Capture.cs:147:15:147:20 | access to local variable sink34 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:147:15:147:20 | access to local variable sink34 | access to local variable sink34 | +| Capture.cs:156:15:156:20 | access to local variable sink35 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:156:15:156:20 | access to local variable sink35 | access to local variable sink35 | +| Capture.cs:163:15:163:20 | access to local variable sink36 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:163:15:163:20 | access to local variable sink36 | access to local variable sink36 | +| Capture.cs:171:15:171:20 | access to local variable sink37 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:171:15:171:20 | access to local variable sink37 | access to local variable sink37 | +| Capture.cs:197:15:197:20 | access to local variable sink38 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:197:15:197:20 | access to local variable sink38 | access to local variable sink38 | +| Capture.cs:206:19:206:19 | access to parameter s | Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:206:19:206:19 | access to parameter s | access to parameter s | +| Capture.cs:231:19:231:19 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:231:19:231:19 | access to local variable x | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | +| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:273:30:273:30 | access to parameter x | Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:273:30:273:30 | access to parameter x | access to parameter x | +| Capture.cs:284:23:284:23 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:284:23:284:23 | access to local variable x | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | +| Capture.cs:306:15:306:24 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | +| Capture.cs:312:15:312:15 | access to local variable x | Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | access to local variable x | +| Capture.cs:319:19:319:19 | access to local variable x | Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | access to local variable x | +| Capture.cs:339:45:339:45 | access to local variable x | Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:45:339:45 | access to local variable x | access to local variable x | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | access to field SinkField0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | access to property SinkProperty0 | | GlobalDataFlow.cs:45:50:45:59 | access to parameter sinkParam2 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:45:50:45:59 | access to parameter sinkParam2 | access to parameter sinkParam2 | From acd52192d15387ddb786fe1711dc8369228ca921 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 12 Feb 2024 14:26:02 +0100 Subject: [PATCH 138/207] C#: Adopt shared variable capture library --- .../DataFlowConsistency.ql | 4 - .../VariableCaptureConsistency.ql | 17 + .../csharp/controlflow/internal/PreSsa.qll | 102 +-- .../semmle/code/csharp/dataflow/Nullness.qll | 24 +- .../lib/semmle/code/csharp/dataflow/SSA.qll | 22 +- .../code/csharp/dataflow/internal/BaseSSA.qll | 32 +- .../dataflow/internal/DataFlowDispatch.qll | 111 +-- .../dataflow/internal/DataFlowPrivate.qll | 724 ++++++++++++------ .../dataflow/internal/DataFlowPublic.qll | 11 + .../code/csharp/dataflow/internal/SsaImpl.qll | 440 +---------- csharp/ql/src/Dead Code/DeadStoreOfLocal.ql | 2 + .../csharp7/LocalTaintFlow.expected | 7 - .../dataflow/defuse/defUseEquivalence.ql | 5 +- .../defuse/parameterUseEquivalence.ql | 4 +- .../dataflow/defuse/useUseEquivalence.ql | 5 +- .../library-tests/dataflow/global/Capture.cs | 12 +- .../dataflow/global/DataFlow.expected | 5 + .../dataflow/global/DataFlowPath.expected | 299 ++++++-- .../dataflow/global/GetAnOutNode.expected | 19 +- .../dataflow/global/TaintTracking.expected | 5 + .../global/TaintTrackingPath.expected | 299 ++++++-- .../dataflow/local/DataFlowStep.expected | 16 - .../dataflow/local/TaintTrackingStep.expected | 16 - .../dataflow/ssa/DefAdjacentRead.expected | 20 - .../dataflow/ssa/ReadAdjacentRead.expected | 4 - .../dataflow/ssa/SSAPhi.expected | 1 - .../ssa/SsaCapturedVariableDef.expected | 45 -- .../dataflow/ssa/SsaCapturedVariableDef.ql | 12 - .../dataflow/ssa/SsaDef.expected | 78 -- .../dataflow/ssa/SsaDefElement.expected | 77 -- .../dataflow/ssa/SsaDefLastRead.expected | 39 - .../dataflow/ssa/SsaExplicitDef.expected | 53 -- .../dataflow/ssa/SsaImplicitCall.expected | 17 - .../dataflow/ssa/SsaRead.expected | 43 -- .../dataflow/ssa/SsaUltimateDef.expected | 96 --- csharp/ql/test/query-tests/Nullness/E.cs | 4 +- .../query-tests/Nullness/NullMaybe.expected | 8 + 37 files changed, 1190 insertions(+), 1488 deletions(-) create mode 100644 csharp/ql/consistency-queries/VariableCaptureConsistency.ql delete mode 100644 csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.expected delete mode 100644 csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.ql diff --git a/csharp/ql/consistency-queries/DataFlowConsistency.ql b/csharp/ql/consistency-queries/DataFlowConsistency.ql index 0e442236ac5..59e5953f31f 100644 --- a/csharp/ql/consistency-queries/DataFlowConsistency.ql +++ b/csharp/ql/consistency-queries/DataFlowConsistency.ql @@ -47,8 +47,6 @@ private module Input implements InputSig { or not exists(LocalFlow::getAPostUpdateNodeForArg(n.getControlFlowNode())) or - n instanceof ImplicitCapturedArgumentNode - or n instanceof ParamsArgumentNode or n.asExpr() instanceof CIL::Expr @@ -104,8 +102,6 @@ private module Input implements InputSig { not split = cfn.getASplit() ) or - call instanceof TransitiveCapturedDataFlowCall - or call.(NonDelegateDataFlowCall).getDispatchCall().isReflection() ) } diff --git a/csharp/ql/consistency-queries/VariableCaptureConsistency.ql b/csharp/ql/consistency-queries/VariableCaptureConsistency.ql new file mode 100644 index 00000000000..927741f07bf --- /dev/null +++ b/csharp/ql/consistency-queries/VariableCaptureConsistency.ql @@ -0,0 +1,17 @@ +import csharp +import semmle.code.csharp.dataflow.internal.DataFlowPrivate::VariableCapture::Flow::ConsistencyChecks +private import semmle.code.csharp.dataflow.internal.DataFlowPrivate::VariableCapture::Flow::ConsistencyChecks as ConsistencyChecks +private import semmle.code.csharp.controlflow.BasicBlocks +private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl + +query predicate uniqueEnclosingCallable(BasicBlock bb, string msg) { + ConsistencyChecks::uniqueEnclosingCallable(bb, msg) and + getNodeCfgScope(bb.getFirstNode()) instanceof Callable +} + +query predicate consistencyOverview(string msg, int n) { none() } + +query predicate uniqueCallableLocation(Callable c, string msg) { + ConsistencyChecks::uniqueCallableLocation(c, msg) and + count(c.getBody()) = 1 +} diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll index 42d9c21102a..c7c1de2308b 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll @@ -31,9 +31,52 @@ module PreSsa { } predicate implicitEntryDef(Callable c, SsaInput::BasicBlock bb, SsaInput::SourceVariable v) { - not v instanceof LocalScopeVariable and c = v.getACallable() and - scopeFirst(c, bb) + scopeFirst(c, bb) and + ( + not v instanceof LocalScopeVariable + or + v.(SimpleLocalScopeVariable).isReadonlyCapturedBy(c) + ) + } + + /** Holds if `a` is assigned in callable `c`. */ + pragma[nomagic] + private predicate assignableDefinition(Assignable a, Callable c) { + exists(AssignableDefinition def | + def.getTarget() = a and + c = def.getEnclosingCallable() + | + not c instanceof Constructor or + a instanceof LocalScopeVariable + ) + } + + pragma[nomagic] + private predicate assignableUniqueWriter(Assignable a, Callable c) { + c = unique(Callable c0 | assignableDefinition(a, c0) | c0) + } + + /** Holds if `a` is accessed in callable `c`. */ + pragma[nomagic] + private predicate assignableAccess(Assignable a, Callable c) { + exists(AssignableAccess aa | aa.getTarget() = a | c = aa.getEnclosingCallable()) + } + + /** + * A local scope variable that is amenable to SSA analysis. + * + * This is either a local variable that is not captured, or one + * where all writes happen in the defining callable. + */ + class SimpleLocalScopeVariable extends LocalScopeVariable { + SimpleLocalScopeVariable() { assignableUniqueWriter(this, this.getCallable()) } + + /** Holds if this local scope variable is read-only captured by `c`. */ + predicate isReadonlyCapturedBy(Callable c) { + assignableAccess(this, c) and + c != this.getCallable() + } } module SsaInput implements SsaImplCommon::InputSig { @@ -47,40 +90,6 @@ module PreSsa { ExitBasicBlock() { scopeLast(_, this.getLastElement(), _) } } - /** Holds if `a` is assigned in non-constructor callable `c`. */ - pragma[nomagic] - private predicate assignableDefinition(Assignable a, Callable c) { - exists(AssignableDefinition def | def.getTarget() = a | - c = def.getEnclosingCallable() and - not c instanceof Constructor - ) - } - - /** Holds if `a` is accessed in callable `c`. */ - pragma[nomagic] - private predicate assignableAccess(Assignable a, Callable c) { - exists(AssignableAccess aa | aa.getTarget() = a | c = aa.getEnclosingCallable()) - } - - pragma[nomagic] - private predicate assignableNoCapturing(Assignable a, Callable c) { - assignableAccess(a, c) and - /* - * The code below is equivalent to - * ```ql - * not exists(Callable other | assignableDefinition(a, other) | other != c) - * ``` - * but it avoids a Cartesian product in the compiler generated antijoin - * predicate. - */ - - ( - not assignableDefinition(a, _) - or - c = unique(Callable c0 | assignableDefinition(a, c0) | c0) - ) - } - pragma[noinline] private predicate assignableNoComplexQualifiers(Assignable a) { forall(QualifiableExpr qe | qe.(AssignableAccess).getTarget() = a | qe.targetIsThisInstance()) @@ -94,15 +103,22 @@ module PreSsa { private Callable c; SourceVariable() { + assignableAccess(this, c) and ( - this instanceof LocalScopeVariable + this instanceof SimpleLocalScopeVariable or - this = any(Field f | not f.isVolatile()) - or - this = any(TrivialProperty tp | not tp.isOverridableOrImplementable()) - ) and - assignableNoCapturing(this, c) and - assignableNoComplexQualifiers(this) + ( + this = any(Field f | not f.isVolatile()) + or + this = any(TrivialProperty tp | not tp.isOverridableOrImplementable()) + ) and + ( + not assignableDefinition(this, _) + or + assignableUniqueWriter(this, c) + ) and + assignableNoComplexQualifiers(this) + ) } /** Gets a callable in which this simple assignable can be analyzed. */ diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll index a281c21b657..53ee9181ec5 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll @@ -218,19 +218,6 @@ private predicate isNullDefaultArgument(Ssa::ExplicitDefinition def, AlwaysNullE ) } -/** - * Holds if `edef` is an implicit entry definition for a captured variable that - * may be guarded, because a call to the capturing callable is guarded. - */ -private predicate isMaybeGuardedCapturedDef(Ssa::ImplicitEntryDefinition edef) { - exists(Ssa::ExplicitDefinition def, ControlFlow::Nodes::ElementNode c, G::Guard g, NullValue nv | - def.isCapturedVariableDefinitionFlowIn(edef, c, _) and - g = def.getARead() and - g.controlsNode(c, nv) and - nv.isNonNull() - ) -} - /** Holds if `def` is an SSA definition that may be `null`. */ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason) { not nonNullDef(def) and @@ -268,7 +255,6 @@ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason) exists(Dereference d | dereferenceAt(_, _, def, d) | d.hasNullableType() and not def instanceof Ssa::PhiNode and - not isMaybeGuardedCapturedDef(def) and reason = def.getSourceVariable().getAssignable() and msg = "because it has a nullable type" ) @@ -583,14 +569,8 @@ class Dereference extends G::DereferenceableExpr { */ predicate isAlwaysNull(Ssa::SourceVariable v) { this = v.getAnAccess() and - // Exclude fields, properties, and captured variables, as they may not have an - // accurate SSA representation - v.getAssignable() = - any(LocalScopeVariable lsv | - strictcount(Callable c | - c = any(AssignableDefinition ad | ad.getTarget() = lsv).getEnclosingCallable() - ) = 1 - ) and + // Exclude fields and properties, as they may not have an accurate SSA representation + v.getAssignable() instanceof LocalScopeVariable and ( forex(Ssa::Definition def0 | this = def0.getARead() | this.isAlwaysNull0(def0)) or diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll index f77e5f7fd98..673bd1a5638 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll @@ -447,6 +447,8 @@ module Ssa { final AssignableDefinition getADefinition() { result = SsaImpl::getADefinition(this) } /** + * DEPRECATED. + * * Holds if this definition updates a captured local scope variable, and the updated * value may be read from the implicit entry definition `def` using one or more calls * (as indicated by `additionalCalls`), starting from call `c`. @@ -467,13 +469,15 @@ module Ssa { * If this definition is the update of `i` on line 5, then the value may be read inside * `M2` via the call on line 6. */ - final predicate isCapturedVariableDefinitionFlowIn( + deprecated final predicate isCapturedVariableDefinitionFlowIn( ImplicitEntryDefinition def, ControlFlow::Nodes::ElementNode c, boolean additionalCalls ) { - SsaImpl::isCapturedVariableDefinitionFlowIn(this, def, c, additionalCalls) + none() } /** + * DEPRECATED. + * * Holds if this definition updates a captured local scope variable, and the updated * value may be read from the implicit call definition `cdef` using one or more calls * (as indicated by `additionalCalls`). @@ -494,10 +498,10 @@ module Ssa { * If this definition is the update of `i` on line 4, then the value may be read outside * of `M2` via the call on line 5. */ - final predicate isCapturedVariableDefinitionFlowOut( + deprecated final predicate isCapturedVariableDefinitionFlowOut( ImplicitCallDefinition cdef, boolean additionalCalls ) { - SsaImpl::isCapturedVariableDefinitionFlowOut(this, cdef, additionalCalls) + none() } override Element getElement() { result = ad.getElement() } @@ -526,8 +530,6 @@ module Ssa { or SsaImpl::updatesNamedFieldOrProp(bb, i, _, v, _) or - SsaImpl::updatesCapturedVariable(bb, i, _, v, _, _) - or SsaImpl::variableWriteQualifier(bb, i, v, _) ) } @@ -572,10 +574,9 @@ module Ssa { private Call c; ImplicitCallDefinition() { - exists(ControlFlow::BasicBlock bb, SourceVariable v, int i | this.definesAt(v, bb, i) | + exists(ControlFlow::BasicBlock bb, SourceVariable v, int i | + this.definesAt(v, bb, i) and SsaImpl::updatesNamedFieldOrProp(bb, i, c, v, _) - or - SsaImpl::updatesCapturedVariable(bb, i, c, v, _, _) ) } @@ -593,9 +594,6 @@ module Ssa { result.getEnclosingCallable() = setter and result.getTarget() = this.getSourceVariable().getAssignable() ) - or - SsaImpl::updatesCapturedVariable(_, _, this.getCall(), _, result, _) and - result.getTarget() = this.getSourceVariable().getAssignable() } override string toString() { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll index 0933559347e..f30b1769107 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll @@ -24,7 +24,16 @@ module BaseSsa { ) } + private predicate implicitEntryDef( + Callable c, ControlFlow::BasicBlocks::EntryBlock bb, SsaInput::SourceVariable v + ) { + v.isReadonlyCapturedBy(c) and + c = bb.getCallable() + } + private module SsaInput implements SsaImplCommon::InputSig { + private import semmle.code.csharp.controlflow.internal.PreSsa + class BasicBlock = ControlFlow::BasicBlock; BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { @@ -35,20 +44,17 @@ module BaseSsa { class ExitBasicBlock = ControlFlow::BasicBlocks::ExitBlock; - pragma[noinline] - private Callable getAnAssigningCallable(LocalScopeVariable v) { - result = any(AssignableDefinition def | def.getTarget() = v).getEnclosingCallable() - } - - class SourceVariable extends LocalScopeVariable { - SourceVariable() { not getAnAssigningCallable(this) != getAnAssigningCallable(this) } - } + class SourceVariable = PreSsa::SimpleLocalScopeVariable; predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) { exists(AssignableDefinition def | definitionAt(def, bb, i, v) and if def.isCertain() then certain = true else certain = false ) + or + implicitEntryDef(_, bb, v) and + i = -1 and + certain = true } predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) { @@ -87,7 +93,15 @@ module BaseSsa { not result instanceof PhiNode } - Location getLocation() { result = this.getDefinition().getLocation() } + Location getLocation() { + result = this.getDefinition().getLocation() + or + exists(Callable c, SsaInput::BasicBlock bb, SsaInput::SourceVariable v | + this.definesAt(v, bb, -1) and + implicitEntryDef(c, bb, v) and + result = c.getLocation() + ) + } } class PhiNode extends SsaImpl::PhiNode, Definition { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll index d69327cdfb9..c4b3b3261d4 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll @@ -40,35 +40,10 @@ DotNet::Callable getCallableForDataFlow(DotNet::Callable c) { ) } -/** - * Holds if `cfn` corresponds to a call that can reach callable `c` using - * additional calls, and `c` is a callable that either reads or writes to - * a captured variable. - */ -private predicate transitiveCapturedCallTarget(ControlFlow::Nodes::ElementNode cfn, Callable c) { - exists(Ssa::ExplicitDefinition def | - exists(Ssa::ImplicitEntryDefinition edef | - def.isCapturedVariableDefinitionFlowIn(edef, cfn, true) - | - c = edef.getCallable() - ) - or - exists(Ssa::ImplicitCallDefinition cdef | def.isCapturedVariableDefinitionFlowOut(cdef, true) | - cfn = cdef.getControlFlowNode() and - c = def.getEnclosingCallable() - ) - ) -} - newtype TReturnKind = TNormalReturnKind() or TOutReturnKind(int i) { i = any(Parameter p | p.isOut()).getPosition() } or - TRefReturnKind(int i) { i = any(Parameter p | p.isRef()).getPosition() } or - TImplicitCapturedReturnKind(LocalScopeVariable v) { - exists(Ssa::ExplicitDefinition def | def.isCapturedVariableDefinitionFlowOut(_, _) | - v = def.getSourceVariable().getAssignable() - ) - } + TRefReturnKind(int i) { i = any(Parameter p | p.isRef()).getPosition() } /** * A summarized callable where the summary should be used for dataflow analysis. @@ -94,7 +69,8 @@ private module Cached { newtype TDataFlowCallable = TDotNetCallable(DotNet::Callable c) { c.isUnboundDeclaration() } or TSummarizedCallable(DataFlowSummarizedCallable sc) or - TFieldOrProperty(FieldOrProperty f) + TFieldOrPropertyCallable(FieldOrProperty f) or + TCapturedVariableCallable(LocalScopeVariable v) { v.isCaptured() } cached newtype TDataFlowCall = @@ -105,9 +81,6 @@ private module Cached { TExplicitDelegateLikeCall(ControlFlow::Nodes::ElementNode cfn, DelegateLikeCall dc) { cfn.getAstNode() = dc } or - TTransitiveCapturedCall(ControlFlow::Nodes::ElementNode cfn) { - transitiveCapturedCallTarget(cfn, _) - } or TCilCall(CIL::Call call) { // No need to include calls that are compiled from source not call.getImplementation().getMethod().compiledFromSource() @@ -120,24 +93,16 @@ private module Cached { cached DataFlowCallable viableCallable(DataFlowCall call) { result = call.getARuntimeTarget() } - private predicate capturedWithFlowIn(LocalScopeVariable v) { - exists(Ssa::ExplicitDefinition def | def.isCapturedVariableDefinitionFlowIn(_, _, _) | - v = def.getSourceVariable().getAssignable() - ) - } - cached newtype TParameterPosition = TPositionalParameterPosition(int i) { i = any(Parameter p).getPosition() } or TThisParameterPosition() or - TImplicitCapturedParameterPosition(LocalScopeVariable v) { capturedWithFlowIn(v) } or TDelegateSelfParameterPosition() cached newtype TArgumentPosition = TPositionalArgumentPosition(int i) { i = any(Parameter p).getPosition() } or TQualifierArgumentPosition() or - TImplicitCapturedArgumentPosition(LocalScopeVariable v) { capturedWithFlowIn(v) } or TDelegateSelfArgumentPosition() } @@ -229,18 +194,6 @@ class RefReturnKind extends OutRefReturnKind, TRefReturnKind { override string toString() { result = "ref parameter " + pos } } -/** A value implicitly returned from a callable using a captured variable. */ -class ImplicitCapturedReturnKind extends ReturnKind, TImplicitCapturedReturnKind { - private LocalScopeVariable v; - - ImplicitCapturedReturnKind() { this = TImplicitCapturedReturnKind(v) } - - /** Gets the captured variable. */ - LocalScopeVariable getVariable() { result = v } - - override string toString() { result = "captured " + v } -} - /** A callable used for data flow. */ class DataFlowCallable extends TDataFlowCallable { /** Gets the underlying source code callable, if any. */ @@ -250,7 +203,9 @@ class DataFlowCallable extends TDataFlowCallable { FlowSummary::SummarizedCallable asSummarizedCallable() { this = TSummarizedCallable(result) } /** Gets the underlying field or property, if any. */ - FieldOrProperty asFieldOrProperty() { this = TFieldOrProperty(result) } + FieldOrProperty asFieldOrProperty() { this = TFieldOrPropertyCallable(result) } + + LocalScopeVariable asCapturedVariable() { this = TCapturedVariableCallable(result) } /** Gets the underlying callable. */ DotNet::Callable getUnderlyingCallable() { @@ -262,6 +217,8 @@ class DataFlowCallable extends TDataFlowCallable { result = this.getUnderlyingCallable().toString() or result = this.asFieldOrProperty().toString() + or + result = this.asCapturedVariable().toString() } /** Get the location of this dataflow callable. */ @@ -269,6 +226,8 @@ class DataFlowCallable extends TDataFlowCallable { result = this.getUnderlyingCallable().getLocation() or result = this.asFieldOrProperty().getLocation() + or + result = this.asCapturedVariable().getLocation() } } @@ -389,33 +348,6 @@ class ExplicitDelegateLikeDataFlowCall extends DelegateDataFlowCall, TExplicitDe override Location getLocation() { result = cfn.getLocation() } } -/** - * A call that can reach a callable, using one or more additional calls, which - * reads or updates a captured variable. We model such a chain of calls as just - * a single call for performance reasons. - */ -class TransitiveCapturedDataFlowCall extends DataFlowCall, TTransitiveCapturedCall { - private ControlFlow::Nodes::ElementNode cfn; - - TransitiveCapturedDataFlowCall() { this = TTransitiveCapturedCall(cfn) } - - override DataFlowCallable getARuntimeTarget() { - transitiveCapturedCallTarget(cfn, result.asCallable()) - } - - override ControlFlow::Nodes::ElementNode getControlFlowNode() { result = cfn } - - override DataFlow::ExprNode getNode() { none() } - - override DataFlowCallable getEnclosingCallable() { - result.asCallable() = cfn.getEnclosingCallable() - } - - override string toString() { result = "[transitive] " + cfn.toString() } - - override Location getLocation() { result = cfn.getLocation() } -} - /** A CIL call relevant for data flow. */ class CilDataFlowCall extends DataFlowCall, TCilCall { private CIL::Call call; @@ -482,11 +414,6 @@ class ParameterPosition extends TParameterPosition { /** Holds if this position represents a `this` parameter. */ predicate isThisParameter() { this = TThisParameterPosition() } - /** Holds if this position is used to model flow through captured variables. */ - predicate isImplicitCapturedParameterPosition(LocalScopeVariable v) { - this = TImplicitCapturedParameterPosition(v) - } - /** * Holds if this position represents a reference to a delegate itself. * @@ -501,10 +428,6 @@ class ParameterPosition extends TParameterPosition { or this.isThisParameter() and result = "this" or - exists(LocalScopeVariable v | - this.isImplicitCapturedParameterPosition(v) and result = "captured " + v - ) - or this.isDelegateSelf() and result = "delegate self" } @@ -518,11 +441,6 @@ class ArgumentPosition extends TArgumentPosition { /** Holds if this position represents a qualifier. */ predicate isQualifier() { this = TQualifierArgumentPosition() } - /** Holds if this position is used to model flow through captured variables. */ - predicate isImplicitCapturedArgumentPosition(LocalScopeVariable v) { - this = TImplicitCapturedArgumentPosition(v) - } - /** * Holds if this position represents a reference to a delegate itself. * @@ -537,10 +455,6 @@ class ArgumentPosition extends TArgumentPosition { or this.isQualifier() and result = "qualifier" or - exists(LocalScopeVariable v | - this.isImplicitCapturedArgumentPosition(v) and result = "captured " + v - ) - or this.isDelegateSelf() and result = "delegate self" } @@ -552,10 +466,5 @@ predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { or ppos.isThisParameter() and apos.isQualifier() or - exists(LocalScopeVariable v | - ppos.isImplicitCapturedParameterPosition(v) and - apos.isImplicitCapturedArgumentPosition(v) - ) - or ppos.isDelegateSelf() and apos.isDelegateSelf() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 09041d0c3d6..64274defca3 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -129,29 +129,74 @@ private class ExprNodeImpl extends ExprNode, NodeImpl { } } +/** + * A node that represents the creation of a local function. + * + * Needed for flow through captured variables, where we treat local functions + * as if they were lambdas. + */ +abstract private class LocalFunctionCreationNode extends NodeImpl, TLocalFunctionCreationNode { + ControlFlow::Nodes::ElementNode cfn; + LocalFunction function; + boolean isPostUpdate; + + LocalFunctionCreationNode() { + this = TLocalFunctionCreationNode(cfn, isPostUpdate) and + function = cfn.getAstNode().(LocalFunctionStmt).getLocalFunction() + } + + LocalFunction getFunction() { result = function } + + ExprNode getAnAccess(boolean inSameCallable) { + result.getExpr().(LocalFunctionAccess).getTarget() = this.getFunction() and + if result.getEnclosingCallable() = this.getEnclosingCallable() + then inSameCallable = true + else inSameCallable = false + } + + override DataFlowCallable getEnclosingCallableImpl() { + result.asCallable() = cfn.getEnclosingCallable() + } + + override Type getTypeImpl() { none() } + + override DataFlowType getDataFlowType() { result.asDelegate() = function } + + override ControlFlow::Nodes::ElementNode getControlFlowNodeImpl() { none() } + + ControlFlow::Nodes::ElementNode getUnderlyingControlFlowNode() { result = cfn } + + override Location getLocationImpl() { result = cfn.getLocation() } +} + +private class LocalFunctionCreationPreNode extends LocalFunctionCreationNode { + LocalFunctionCreationPreNode() { isPostUpdate = false } + + override string toStringImpl() { result = cfn.toString() } +} + /** Calculation of the relative order in which `this` references are read. */ private module ThisFlow { private class BasicBlock = ControlFlow::BasicBlock; + /** Holds if `e` is a `this` access. */ + predicate thisAccessExpr(Expr e) { e instanceof ThisAccess or e instanceof BaseAccess } + /** Holds if `n` is a `this` access at control flow node `cfn`. */ private predicate thisAccess(Node n, ControlFlow::Node cfn) { n.(InstanceParameterNode).getCallable() = cfn.(ControlFlow::Nodes::EntryNode).getCallable() or - n.asExprAtNode(cfn) = any(Expr e | e instanceof ThisAccess or e instanceof BaseAccess) + thisAccessExpr(n.asExprAtNode(cfn)) or - n = - any(InstanceParameterAccessNode pan | - pan.getUnderlyingControlFlowNode() = cfn and pan.isPreUpdate() - ) + cfn = n.(InstanceParameterAccessPreNode).getUnderlyingControlFlowNode() } private predicate thisAccess(Node n, BasicBlock bb, int i) { thisAccess(n, bb.getNode(i)) or - exists(Parameter p | n.(PrimaryConstructorThisAccessNode).getParameter() = p | + exists(Parameter p | n.(PrimaryConstructorThisAccessPreNode).getParameter() = p | bb.getCallable() = p.getCallable() and - i = p.getPosition() + 1 and - not n instanceof PostUpdateNode + i = p.getPosition() + 1 ) } @@ -221,6 +266,234 @@ CIL::DataFlowNode asCilDataFlowNode(Node node) { result = node.asExpr() } +/** Provides logic related to captured variables. */ +module VariableCapture { + private import codeql.dataflow.VariableCapture as Shared + + private predicate closureFlowStep(ControlFlow::Nodes::ExprNode e1, ControlFlow::Nodes::ExprNode e2) { + e1 = LocalFlow::getALastEvalNode(e2) + or + exists(Ssa::Definition def | + LocalFlow::ssaDefAssigns(def.getAnUltimateDefinition(), e1) and + exists(def.getAReadAtNode(e2)) + ) + } + + private module CaptureInput implements Shared::InputSig { + private import csharp as Cs + private import semmle.code.csharp.controlflow.ControlFlowGraph + private import semmle.code.csharp.controlflow.BasicBlocks as BasicBlocks + private import TaintTrackingPrivate as TaintTrackingPrivate + + class BasicBlock extends BasicBlocks::BasicBlock { + Callable getEnclosingCallable() { result = super.getCallable() } + } + + BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { + result = bb.getImmediateDominator() + } + + BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } + + private predicate thisAccess(ControlFlow::Node cfn, InstanceCallable c) { + ThisFlow::thisAccessExpr(cfn.getAstNode()) and + cfn.getEnclosingCallable().getEnclosingCallable*() = c + } + + private predicate capturedThisAccess(ControlFlow::Node cfn, InstanceCallable c) { + thisAccess(cfn, c) and + cfn.getEnclosingCallable() != c + } + + private newtype TCapturedVariable = + TCapturedLocalScopeVariable(LocalScopeVariable v) { + v.isCaptured() and not v.(Parameter).getCallable() instanceof PrimaryConstructor + } or + TCapturedThis(Callable c) { capturedThisAccess(_, c) } + + /** A captured local scope variable. Includes captured `this` variables. */ + class CapturedVariable extends TCapturedVariable { + LocalScopeVariable asLocalScopeVariable() { this = TCapturedLocalScopeVariable(result) } + + Callable asThis() { this = TCapturedThis(result) } + + Callable getCallable() { + result = this.asLocalScopeVariable().getCallable() + or + result = this.asThis() + } + + Type getType() { + result = this.asLocalScopeVariable().getType() + or + result = this.asThis().getDeclaringType() + } + + string toString() { + result = this.asLocalScopeVariable().toString() + or + result = "this in " + this.asThis() + } + + Location getLocation() { + result = this.asLocalScopeVariable().getLocation() + or + result = this.asThis().getLocation() + } + } + + abstract class CapturedParameter extends CapturedVariable { + abstract ParameterNodeImpl getParameterNode(); + } + + private class CapturedExplicitParameter extends CapturedParameter, TCapturedLocalScopeVariable { + private Parameter p; + + CapturedExplicitParameter() { p = this.asLocalScopeVariable() } + + override ExplicitParameterNode getParameterNode() { result.asParameter() = p } + } + + private class CapturedThisParameter extends CapturedParameter, TCapturedThis { + override InstanceParameterNode getParameterNode() { + result = TInstanceParameterNode(this.asThis()) + } + } + + class Expr extends ControlFlow::Node { + predicate hasCfgNode(BasicBlock bb, int i) { this = bb.getNode(i) } + } + + class VariableWrite extends Expr { + CapturedVariable v; + AssignableDefinition def; + + VariableWrite() { + def.getTarget() = v.asLocalScopeVariable() and + this = def.getAControlFlowNode() and + // the shared variable capture library inserts implicit parameter definitions + not def instanceof AssignableDefinitions::ImplicitParameterDefinition + } + + ControlFlow::Node getRhs() { LocalFlow::defAssigns(def, this, result) } + + CapturedVariable getVariable() { result = v } + } + + class VariableRead extends Expr { + CapturedVariable v; + + VariableRead() { + this.getAstNode().(AssignableRead).getTarget() = v.asLocalScopeVariable() + or + thisAccess(this, v.asThis()) + } + + CapturedVariable getVariable() { result = v } + } + + class ClosureExpr extends Expr { + Callable c; + + ClosureExpr() { lambdaCreationExpr(this.getAstNode(), c) } + + predicate hasBody(Callable body) { body = c } + + predicate hasAliasedAccess(Expr f) { closureFlowStep+(this, f) and not closureFlowStep(f, _) } + } + + class Callable extends Cs::Callable { + predicate isConstructor() { this instanceof Constructor } + } + } + + class CapturedVariable = CaptureInput::CapturedVariable; + + class ClosureExpr = CaptureInput::ClosureExpr; + + module Flow = Shared::Flow; + + private Flow::ClosureNode asClosureNode(Node n) { + result = n.(CaptureNode).getSynthesizedCaptureNode() + or + result.(Flow::ExprNode).getExpr() = + [ + n.(ExprNode).getControlFlowNode(), + n.(LocalFunctionCreationPreNode).getUnderlyingControlFlowNode() + ] + or + result.(Flow::VariableWriteSourceNode).getVariableWrite().getRhs() = + n.(ExprNode).getControlFlowNode() + or + result.(Flow::ExprPostUpdateNode).getExpr() = + [ + n.(PostUpdateNode).getPreUpdateNode().(ExprNode).getControlFlowNode(), + n.(LocalFunctionCreationPostUpdateNode).getUnderlyingControlFlowNode() + ] + or + result.(Flow::ParameterNode).getParameter().getParameterNode() = n + or + result.(Flow::ThisParameterNode).getCallable() = n.(DelegateSelfReferenceNode).getCallable() + } + + CapturedVariable getCapturedVariableContent(CapturedVariableContent c) { + c = TCapturedVariableContent(result) + } + + predicate storeStep(Node node1, CapturedVariableContent c, Node node2) { + Flow::storeStep(asClosureNode(node1), getCapturedVariableContent(c), asClosureNode(node2)) + } + + predicate readStep(Node node1, CapturedVariableContent c, Node node2) { + Flow::readStep(asClosureNode(node1), getCapturedVariableContent(c), asClosureNode(node2)) + } + + predicate valueStep(Node node1, Node node2) { + Flow::localFlowStep(asClosureNode(node1), asClosureNode(node2)) + } + + predicate clearsContent(Node node, CapturedVariableContent c) { + Flow::clearsContent(asClosureNode(node), getCapturedVariableContent(c)) + } + + class CapturedSsaDefinitionExt extends SsaImpl::DefinitionExt { + CapturedSsaDefinitionExt() { + this.getSourceVariable().getAssignable() = any(CapturedVariable v).asLocalScopeVariable() + } + } + + private predicate flowInsensitiveWriteStep( + ExprNode node1, FlowInsensitiveCapturedVariableNode node2, LocalScopeVariable v + ) { + exists(AssignableDefinition def | + def.getSource() = node1.getExpr() and + def.getTarget() = v and + node2.getVariable() = v + ) + } + + private predicate flowInsensitiveReadStep( + FlowInsensitiveCapturedVariableNode node1, ExprNode node2, LocalScopeVariable v + ) { + node1.getVariable() = v and + node2.getExpr().(VariableRead).getTarget() = v + } + + /** + * Holds if there is control-flow insensitive data-flow from `node1` to `node2` + * involving a captured variable. Only used in lambda flow. + */ + predicate flowInsensitiveStep(Node node1, Node node2) { + exists(LocalScopeVariable v | + flowInsensitiveWriteStep(node1, node2, v) and + flowInsensitiveReadStep(_, _, v) + or + flowInsensitiveReadStep(node1, node2, v) and + flowInsensitiveWriteStep(_, _, v) + ) + } +} + /** Provides predicates related to local data flow. */ module LocalFlow { class LocalExprStepConfiguration extends ControlFlowReachabilityConfiguration { @@ -342,6 +615,18 @@ module LocalFlow { } } + predicate defAssigns(AssignableDefinition def, ControlFlow::Node cfnDef, ControlFlow::Node value) { + any(LocalExprStepConfiguration x).hasDefPath(_, value, def, cfnDef) + } + + predicate ssaDefAssigns(Ssa::ExplicitDefinition ssaDef, ControlFlow::Nodes::ExprNode value) { + exists(AssignableDefinition def, ControlFlow::Node cfnDef | + any(LocalExprStepConfiguration conf).hasDefPath(_, value, def, cfnDef) and + ssaDef.getADefinition() = def and + ssaDef.getControlFlowNode() = cfnDef + ) + } + /** * An uncertain SSA definition. Either an uncertain explicit definition or an * uncertain qualifier definition. @@ -442,15 +727,6 @@ module LocalFlow { ) } - predicate localFlowCapturedVarStep(Node nodeFrom, ImplicitCapturedArgumentNode nodeTo) { - // Flow from SSA definition to implicit captured variable argument - exists(Ssa::ExplicitDefinition def, ControlFlow::Nodes::ElementNode call | - def = getSsaDefinitionExt(nodeFrom) and - def.isCapturedVariableDefinitionFlowIn(_, call, _) and - nodeTo = TImplicitCapturedArgumentNode(call, def.getSourceVariable().getAssignable()) - ) - } - private module CilFlow { /** * Holds if `nodeFrom` is a last node referencing SSA definition `def`, which @@ -525,11 +801,6 @@ module LocalFlow { } predicate localFlowStepCommon(Node nodeFrom, Node nodeTo) { - exists(SsaImpl::DefinitionExt def | - localSsaFlowStep(def, nodeFrom, nodeTo) and - not usesInstanceField(def) - ) - or hasNodePath(any(LocalExprStepConfiguration x), nodeFrom, nodeTo) or ThisFlow::adjacentThisRefs(nodeFrom, nodeTo) and @@ -554,14 +825,14 @@ module LocalFlow { */ predicate excludeFromExposedRelations(Node n) { n instanceof FlowSummaryNode or - n instanceof ImplicitCapturedArgumentNode + n instanceof CaptureNode } /** * Gets a node that may execute last in `n`, and which, when it executes last, * will be the value of `n`. */ - private ControlFlow::Nodes::ExprNode getALastEvalNode(ControlFlow::Nodes::ExprNode cfn) { + ControlFlow::Nodes::ExprNode getALastEvalNode(ControlFlow::Nodes::ExprNode cfn) { exists(Expr e | any(LocalExprStepConfiguration x).hasExprPath(_, result, e, cfn) | e instanceof ConditionalExpr or e instanceof Cast or @@ -632,26 +903,32 @@ predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo) { LocalFlow::localFlowStepCommon(nodeFrom, nodeTo) or exists(SsaImpl::DefinitionExt def | + not LocalFlow::usesInstanceField(def) and + not def instanceof VariableCapture::CapturedSsaDefinitionExt + | + LocalFlow::localSsaFlowStep(def, nodeFrom, nodeTo) + or LocalFlow::localSsaFlowStepUseUse(def, nodeFrom, nodeTo) and not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _) and - not LocalFlow::usesInstanceField(def) and nodeFrom != nodeTo - ) - or - // Flow into phi (read)/uncertain SSA definition node from read - exists(Node read | LocalFlow::localFlowSsaInputFromRead(read, _, nodeTo) | - nodeFrom = read and - not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _) or - nodeFrom.(PostUpdateNode).getPreUpdateNode() = read + // Flow into phi (read)/uncertain SSA definition node from read + exists(Node read | LocalFlow::localFlowSsaInputFromRead(read, def, nodeTo) | + nodeFrom = read and + not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _) + or + nodeFrom.(PostUpdateNode).getPreUpdateNode() = read + ) ) or - LocalFlow::localFlowCapturedVarStep(nodeFrom, nodeTo) - or FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom.(FlowSummaryNode).getSummaryNode(), nodeTo.(FlowSummaryNode).getSummaryNode(), true) or nodeTo.(ObjectCreationNode).getPreUpdateNode() = nodeFrom.(ObjectInitializerNode) + or + VariableCapture::valueStep(nodeFrom, nodeTo) + or + nodeTo = nodeFrom.(LocalFunctionCreationNode).getAnAccess(true) } /** @@ -881,6 +1158,18 @@ private Gvn::GvnType getANonTypeParameterSubTypeRestricted(RelevantGvnType t) { result = getANonTypeParameterSubType(t) } +/** A callable with an implicit `this` parameter. */ +private class InstanceCallable extends Callable { + InstanceCallable() { + this = any(DataFlowCallable dfc).asCallable() and + not this.(Modifiable).isStatic() and + // local functions and delegate capture `this` and should therefore + // not have a `this` parameter + not this instanceof LocalFunction and + not this instanceof AnonymousFunctionExpr + } +} + /** A collection of cached types and predicates to be evaluated in the same stage. */ cached private module Cached { @@ -915,22 +1204,17 @@ private module Cached { TExplicitParameterNode(DotNet::Parameter p) { p = any(DataFlowCallable dfc).asCallable().getAParameter() } or - TInstanceParameterNode(Callable c) { - c = any(DataFlowCallable dfc).asCallable() and - not c.(Modifiable).isStatic() - } or + TInstanceParameterNode(InstanceCallable c) or TDelegateSelfReferenceNode(Callable c) { lambdaCreationExpr(_, c) } or + TLocalFunctionCreationNode(ControlFlow::Nodes::ElementNode cfn, Boolean isPostUpdate) { + cfn.getAstNode() instanceof LocalFunctionStmt + } or TYieldReturnNode(ControlFlow::Nodes::ElementNode cfn) { any(Callable c).canYieldReturn(cfn.getAstNode()) } or TAsyncReturnNode(ControlFlow::Nodes::ElementNode cfn) { any(Callable c | c.(Modifiable).isAsync()).canReturn(cfn.getAstNode()) } or - TImplicitCapturedArgumentNode(ControlFlow::Nodes::ElementNode cfn, LocalScopeVariable v) { - exists(Ssa::ExplicitDefinition def | def.isCapturedVariableDefinitionFlowIn(_, cfn, _) | - v = def.getSourceVariable().getAssignable() - ) - } or TMallocNode(ControlFlow::Nodes::ElementNode cfn) { cfn.getAstNode() instanceof ObjectCreation } or TObjectInitializerNode(ControlFlow::Nodes::ElementNode cfn) { cfn.getAstNode().(ObjectCreation).hasInitializer() @@ -953,18 +1237,22 @@ private module Cached { arrayRead(e, read) ) ) + or + lambdaCallExpr(_, cfn) } or TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) or TParamsArgumentNode(ControlFlow::Node callCfn) { callCfn = any(Call c | isParamsArg(c, _, _)).getAControlFlowNode() } or TFlowInsensitiveFieldNode(FieldOrProperty f) { f.isFieldLike() } or + TFlowInsensitiveCapturedVariableNode(LocalScopeVariable v) { v.isCaptured() } or TInstanceParameterAccessNode(ControlFlow::Node cfn, Boolean isPostUpdate) { cfn = getAPrimaryConstructorParameterCfn(_) } or TPrimaryConstructorThisAccessNode(Parameter p, Boolean isPostUpdate) { p.getCallable() instanceof PrimaryConstructor - } + } or + TCaptureNode(VariableCapture::Flow::SynthesizedCaptureNode cn) /** * Holds if data flows from `nodeFrom` to `nodeTo` in exactly one local @@ -977,10 +1265,7 @@ private module Cached { LocalFlow::localSsaFlowStepUseUse(_, nodeFrom, nodeTo) and nodeFrom != nodeTo or - exists(SsaImpl::DefinitionExt def | - LocalFlow::localSsaFlowStep(def, nodeFrom, nodeTo) and - LocalFlow::usesInstanceField(def) - ) + LocalFlow::localSsaFlowStep(_, nodeFrom, nodeTo) or // Flow into phi (read)/uncertain SSA definition node from read exists(Node read | LocalFlow::localFlowSsaInputFromRead(read, _, nodeTo) | @@ -1003,7 +1288,8 @@ private module Cached { TSyntheticFieldContent(SyntheticField f) or TPrimaryConstructorParameterContent(Parameter p) { p.getCallable() instanceof PrimaryConstructor - } + } or + TCapturedVariableContent(VariableCapture::CapturedVariable v) cached newtype TContentApprox = @@ -1013,7 +1299,8 @@ private module Cached { TSyntheticFieldApproxContent() or TPrimaryConstructorParameterApproxContent(string firstChar) { firstChar = approximatePrimaryConstructorParameterContent(_) - } + } or + TCapturedVariableContentApprox(VariableCapture::CapturedVariable v) pragma[nomagic] private predicate commonSubTypeGeneral(DataFlowTypeOrUnifiable t1, RelevantGvnType t2) { @@ -1063,8 +1350,6 @@ predicate nodeIsHidden(Node n) { or n instanceof AsyncReturnNode or - n instanceof ImplicitCapturedArgumentNode - or n instanceof MallocNode or n instanceof FlowSummaryNode @@ -1080,6 +1365,10 @@ predicate nodeIsHidden(Node n) { n instanceof PrimaryConstructorThisAccessNode or n = any(AssignableDefinitionNode def | not exists(def.getDefinition().getTargetAccess())) + or + n instanceof DelegateSelfReferenceNode + or + n instanceof CaptureNode } /** A CIL SSA definition, viewed as a node in a data flow graph. */ @@ -1233,7 +1522,7 @@ private module ParameterNodes { * This is used for improving lambda dispatch, and will eventually also be * used for tracking flow through captured variables. */ - private class DelegateSelfReferenceNode extends ParameterNodeImpl, TDelegateSelfReferenceNode { + class DelegateSelfReferenceNode extends ParameterNodeImpl, TDelegateSelfReferenceNode { private Callable callable; DelegateSelfReferenceNode() { this = TDelegateSelfReferenceNode(callable) } @@ -1266,35 +1555,6 @@ private module ParameterNodes { LocalScopeVariable getVariable() { result = v } } - /** - * The value of an implicit captured variable parameter at function entry, - * viewed as a node in a data flow graph. - * - * An implicit parameter is added in order to be able to track flow into - * capturing callables, as if an explicit `ref` parameter had been used: - * - * ```csharp - * void M() { void M() { - * int i = 0; int i = 0; - * void In() { => void In(ref int i0) { // implicit i0 parameter - * Use(i); Use(i0); - * } } - * In(); In(ref i); - * } } - * ``` - */ - class ImplicitCapturedParameterNode extends ParameterNodeImpl, SsaDefinitionExtNode { - ImplicitCapturedParameterNode() { def instanceof SsaCapturedEntryDefinition } - - /** Gets the captured variable that this implicit parameter models. */ - LocalScopeVariable getVariable() { result = def.(SsaCapturedEntryDefinition).getVariable() } - - override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { - pos.isImplicitCapturedParameterPosition(def.getSourceVariable().getAssignable()) and - c.asCallable() = this.getEnclosingCallable() - } - } - /** A parameter for a library callable with a flow summary. */ class SummaryParameterNode extends ParameterNodeImpl, FlowSummaryNode { private ParameterPosition pos_; @@ -1371,10 +1631,10 @@ private module ArgumentNodes { } /** A data-flow node that represents a delegate passed into itself. */ - class DelegateSelfArgumentNode extends ArgumentNodeImpl { + class DelegateSelfArgumentNode extends ArgumentNodeImpl, ExprNode { private DataFlowCall call_; - DelegateSelfArgumentNode() { lambdaCallExpr(call_, this) } + DelegateSelfArgumentNode() { lambdaCallExpr(call_, this.getControlFlowNode()) } override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { call = call_ and @@ -1382,48 +1642,6 @@ private module ArgumentNodes { } } - /** - * The value of a captured variable as an implicit argument of a call, viewed - * as a node in a data flow graph. - * - * An implicit node is added in order to be able to track flow into capturing - * callables, as if an explicit parameter had been used: - * - * ```csharp - * void M() { void M() { - * int i = 0; int i = 0; - * void Out() { i = 1; } => void Out(ref int i0) { i0 = 1; } - * Out(); Out(ref i); // implicit argument - * Use(i); Use(i) - * } } - * ``` - */ - class ImplicitCapturedArgumentNode extends ArgumentNodeImpl, NodeImpl, - TImplicitCapturedArgumentNode - { - private LocalScopeVariable v; - private ControlFlow::Nodes::ElementNode cfn; - - ImplicitCapturedArgumentNode() { this = TImplicitCapturedArgumentNode(cfn, v) } - - override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { - pos.isImplicitCapturedArgumentPosition(v) and - call.getControlFlowNode() = cfn - } - - override DataFlowCallable getEnclosingCallableImpl() { - result.asCallable() = cfn.getEnclosingCallable() - } - - override Type getTypeImpl() { result = v.getType() } - - override ControlFlow::Node getControlFlowNodeImpl() { none() } - - override Location getLocationImpl() { result = cfn.getLocation() } - - override string toStringImpl() { result = "[implicit argument] " + v } - } - /** * A node that corresponds to the value of an object creation (`new C()`) before * the constructor has run. @@ -1608,45 +1826,6 @@ private module ReturnNodes { override string toStringImpl() { result = expr.toString() } } - /** - * The value of a captured variable as an implicit return from a call, viewed - * as a node in a data flow graph. - * - * An implicit node is added in order to be able to track flow out of capturing - * callables, as if an explicit `ref` parameter had been used: - * - * ```csharp - * void M() { void M() { - * int i = 0; int i = 0; - * void Out() { void Out(ref int i0) { - * i = 1; => i0 = 1; // implicit return - * } } - * Out(); Out(ref i); - * Use(i); Use(i) - * } } - * ``` - */ - class ImplicitCapturedReturnNode extends ReturnNode, SsaDefinitionExtNode { - private Ssa::ExplicitDefinition edef; - - ImplicitCapturedReturnNode() { - edef = this.getDefinitionExt() and - edef.isCapturedVariableDefinitionFlowOut(_, _) - } - - /** - * Holds if the value at this node may flow out to the implicit call definition - * at `node`, using one or more calls. - */ - predicate flowsOutTo(SsaDefinitionExtNode node, boolean additionalCalls) { - edef.isCapturedVariableDefinitionFlowOut(node.getDefinitionExt(), additionalCalls) - } - - override ImplicitCapturedReturnKind getKind() { - result.getVariable() = edef.getSourceVariable().getAssignable() - } - } - private class SummaryReturnNode extends FlowSummaryNode, ReturnNode { private ReturnKind rk; @@ -1741,32 +1920,6 @@ private module OutNodes { } } - /** - * A data-flow node that reads a value returned implicitly by a callable - * using a captured variable. - */ - class CapturedOutNode extends OutNode, SsaDefinitionExtNode { - private DataFlowCall call; - - CapturedOutNode() { - exists(ImplicitCapturedReturnNode n, boolean additionalCalls, ControlFlow::Node cfn | - n.flowsOutTo(this, additionalCalls) and - cfn = this.getDefinitionExt().(Ssa::Definition).getControlFlowNode() - | - additionalCalls = false and call = csharpCall(_, cfn) - or - additionalCalls = true and - call = TTransitiveCapturedCall(cfn) - ) - } - - override DataFlowCall getCall(ReturnKind kind) { - result = call and - kind.(ImplicitCapturedReturnKind).getVariable() = - this.getDefinitionExt().getSourceVariable().getAssignable() - } - } - /** * A data-flow node that reads a value returned by a callable using an * `out` or `ref` parameter. @@ -1841,10 +1994,10 @@ class FlowSummaryNode extends NodeImpl, TFlowSummaryNode { * Both models need a pre-update this node, and the latter need an additional post-update this access, * all of which are represented by an `InstanceParameterAccessNode` node. */ -class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode { - private ControlFlow::Node cfn; - private boolean isPostUpdate; - private Parameter p; +abstract private class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode { + ControlFlow::Node cfn; + boolean isPostUpdate; + Parameter p; InstanceParameterAccessNode() { this = TInstanceParameterAccessNode(cfn, isPostUpdate) and @@ -1861,8 +2014,6 @@ class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode override Location getLocationImpl() { result = cfn.getLocation() } - override string toStringImpl() { result = "this" } - /** * Gets the underlying control flow node. */ @@ -1872,11 +2023,12 @@ class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode * Gets the primary constructor parameter that this is a this access to. */ Parameter getParameter() { result = p } +} - /** - * Holds if the this parameter access node corresponds to a pre-update node. - */ - predicate isPreUpdate() { isPostUpdate = false } +private class InstanceParameterAccessPreNode extends InstanceParameterAccessNode { + InstanceParameterAccessPreNode() { isPostUpdate = false } + + override string toStringImpl() { result = "this" } } /** @@ -1892,9 +2044,11 @@ class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode * ``` * The synthesized (pre/post-update) this access is represented an `PrimaryConstructorThisAccessNode` node. */ -class PrimaryConstructorThisAccessNode extends NodeImpl, TPrimaryConstructorThisAccessNode { - private Parameter p; - private boolean isPostUpdate; +abstract private class PrimaryConstructorThisAccessNode extends NodeImpl, + TPrimaryConstructorThisAccessNode +{ + Parameter p; + boolean isPostUpdate; PrimaryConstructorThisAccessNode() { this = TPrimaryConstructorThisAccessNode(p, isPostUpdate) } @@ -1919,6 +2073,44 @@ class PrimaryConstructorThisAccessNode extends NodeImpl, TPrimaryConstructorThis predicate isPostUpdate() { isPostUpdate = true } } +private class PrimaryConstructorThisAccessPreNode extends PrimaryConstructorThisAccessNode { + PrimaryConstructorThisAccessPreNode() { isPostUpdate = false } + + override string toStringImpl() { result = "this" } +} + +/** + * A synthesized data flow node representing a closure object that tracks + * captured variables. + */ +class CaptureNode extends NodeImpl, TCaptureNode { + VariableCapture::Flow::SynthesizedCaptureNode cn; + + CaptureNode() { this = TCaptureNode(cn) } + + VariableCapture::Flow::SynthesizedCaptureNode getSynthesizedCaptureNode() { result = cn } + + override DataFlowCallable getEnclosingCallableImpl() { + result.asCallable() = cn.getEnclosingCallable() + } + + override Type getTypeImpl() { + exists(VariableCapture::CapturedVariable v | cn.isVariableAccess(v) and result = v.getType()) + } + + override DataFlowType getDataFlowType() { + if cn.isInstanceAccess() + then result.asDelegate() = cn.getEnclosingCallable() + else result = super.getDataFlowType() + } + + override ControlFlow::Node getControlFlowNodeImpl() { none() } + + override Location getLocationImpl() { result = cn.getLocation() } + + override string toStringImpl() { result = cn.toString() } +} + /** A field or a property. */ class FieldOrProperty extends Assignable, Modifiable { FieldOrProperty() { @@ -2004,6 +2196,30 @@ class FlowInsensitiveFieldNode extends NodeImpl, TFlowInsensitiveFieldNode { override string toStringImpl() { result = "[flow-insensitive] " + f } } +/** + * A data flow node used for control-flow insensitive flow through captured + * variables. + * + * Only used in lambda flow. + */ +class FlowInsensitiveCapturedVariableNode extends NodeImpl, TFlowInsensitiveCapturedVariableNode { + private LocalScopeVariable v; + + FlowInsensitiveCapturedVariableNode() { this = TFlowInsensitiveCapturedVariableNode(v) } + + LocalScopeVariable getVariable() { result = v } + + override DataFlowCallable getEnclosingCallableImpl() { result.asCapturedVariable() = v } + + override Type getTypeImpl() { result = v.getType() } + + override ControlFlow::Node getControlFlowNodeImpl() { none() } + + override Location getLocationImpl() { result = v.getLocation() } + + override string toStringImpl() { result = "[flow-insensitive] " + v } +} + /** * Holds if `pred` can flow to `succ`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* @@ -2026,6 +2242,8 @@ predicate jumpStep(Node pred, Node succ) { or FlowSummaryImpl::Private::Steps::summaryJumpStep(pred.(FlowSummaryNode).getSummaryNode(), succ.(FlowSummaryNode).getSummaryNode()) + or + succ = pred.(LocalFunctionCreationNode).getAnAccess(false) } private class StoreStepConfiguration extends ControlFlowReachabilityConfiguration { @@ -2117,6 +2335,8 @@ predicate storeStep(Node node1, ContentSet c, Node node2) { or FlowSummaryImpl::Private::Steps::summaryStoreStep(node1.(FlowSummaryNode).getSummaryNode(), c, node2.(FlowSummaryNode).getSummaryNode()) + or + VariableCapture::storeStep(node1, c, node2) } private class ReadStepConfiguration extends ControlFlowReachabilityConfiguration { @@ -2208,10 +2428,9 @@ predicate readStep(Node node1, ContentSet c, Node node2) { c = getResultContent() or node1 = - any(InstanceParameterAccessNode n | + any(InstanceParameterAccessPreNode n | n.getUnderlyingControlFlowNode() = node2.(ExprNode).getControlFlowNode() and - n.getParameter() = c.(PrimaryConstructorParameterContent).getParameter() and - n.isPreUpdate() + n.getParameter() = c.(PrimaryConstructorParameterContent).getParameter() ) and node2.asExpr() instanceof ParameterRead or @@ -2247,6 +2466,8 @@ predicate readStep(Node node1, ContentSet c, Node node2) { or FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), c, node2.(FlowSummaryNode).getSummaryNode()) + or + VariableCapture::readStep(node1, c, node2) } /** @@ -2277,6 +2498,8 @@ predicate clearsContent(Node n, ContentSet c) { ) or n = any(PostUpdateNode n1 | primaryConstructorParameterStore(_, c, n1)).getPreUpdateNode() + or + VariableCapture::clearsContent(n, c) } /** @@ -2325,7 +2548,7 @@ class DataFlowType extends TDataFlowType { * For methods used as method groups in calls there can be multiple * creations associated with the same type. */ - Expr getADelegateCreation() { + ControlFlowElement getADelegateCreation() { exists(Callable callable | lambdaCreationExpr(result, callable) and this = TDelegateDataFlowType(callable) @@ -2350,7 +2573,10 @@ DataFlowType getNodeType(Node n) { result = getNodeType(arg) ) or - n.asExpr() = result.getADelegateCreation() + [ + n.asExpr().(ControlFlowElement), + n.(LocalFunctionCreationPreNode).getUnderlyingControlFlowNode().getAstNode() + ] = result.getADelegateCreation() } /** Gets a string representation of a `DataFlowType`. */ @@ -2570,11 +2796,11 @@ module PostUpdateNodes { private class InstanceParameterAccessPostUpdateNode extends PostUpdateNode, InstanceParameterAccessNode { - private ControlFlow::Node cfn; + InstanceParameterAccessPostUpdateNode() { isPostUpdate = true } - InstanceParameterAccessPostUpdateNode() { this = TInstanceParameterAccessNode(cfn, true) } - - override Node getPreUpdateNode() { result = TInstanceParameterAccessNode(cfn, false) } + override InstanceParameterAccessPreNode getPreUpdateNode() { + result = TInstanceParameterAccessNode(cfn, false) + } override string toStringImpl() { result = "[post] this" } } @@ -2582,16 +2808,37 @@ module PostUpdateNodes { private class PrimaryConstructorThisAccessPostUpdateNode extends PostUpdateNode, PrimaryConstructorThisAccessNode { - private Parameter p; + PrimaryConstructorThisAccessPostUpdateNode() { isPostUpdate = true } - PrimaryConstructorThisAccessPostUpdateNode() { - this = TPrimaryConstructorThisAccessNode(p, true) + override PrimaryConstructorThisAccessPreNode getPreUpdateNode() { + result = TPrimaryConstructorThisAccessNode(p, false) } - override Node getPreUpdateNode() { result = TPrimaryConstructorThisAccessNode(p, false) } - override string toStringImpl() { result = "[post] this" } } + + class LocalFunctionCreationPostUpdateNode extends LocalFunctionCreationNode, PostUpdateNode { + LocalFunctionCreationPostUpdateNode() { isPostUpdate = true } + + override LocalFunctionCreationPreNode getPreUpdateNode() { + result = TLocalFunctionCreationNode(cfn, false) + } + + override string toStringImpl() { result = "[post] " + cfn } + } + + private class CapturePostUpdateNode extends PostUpdateNode, CaptureNode { + private CaptureNode pre; + + CapturePostUpdateNode() { + VariableCapture::Flow::capturePostUpdateNode(this.getSynthesizedCaptureNode(), + pre.getSynthesizedCaptureNode()) + } + + override CaptureNode getPreUpdateNode() { result = pre } + + override string toStringImpl() { result = "[post] " + cn } + } } private import PostUpdateNodes @@ -2645,12 +2892,13 @@ int accessPathLimit() { result = 5 } */ predicate forceHighPrecision(Content c) { c instanceof ElementContent } -private predicate lambdaCreationExpr(Expr creation, Callable c) { +private predicate lambdaCreationExpr(ControlFlowElement creation, Callable c) { c = [ creation.(AnonymousFunctionExpr), creation.(CallableAccess).getTarget().getUnboundDeclaration(), - creation.(AddressOfExpr).getOperand().(CallableAccess).getTarget().getUnboundDeclaration() + creation.(AddressOfExpr).getOperand().(CallableAccess).getTarget().getUnboundDeclaration(), + creation.(LocalFunctionStmt).getLocalFunction() ] } @@ -2677,19 +2925,32 @@ private class LambdaConfiguration extends ControlFlowReachabilityConfiguration { exactScope = false and scope = e2 and isSuccessor = true + or + e1.(LocalFunctionAccess).getParent() = e2.(LocalFunctionCall) and + exactScope = false and + scope = e2 and + isSuccessor = true } } -private predicate lambdaCallExpr(DataFlowCall call, ExprNode receiver) { +private predicate lambdaCallExpr(DataFlowCall call, ControlFlow::Node receiver) { exists(LambdaConfiguration x, DelegateLikeCall dc | - x.hasExprPath(dc.getExpr(), receiver.getControlFlowNode(), dc, call.getControlFlowNode()) + x.hasExprPath(dc.getExpr(), receiver, dc, call.getControlFlowNode()) + ) + or + // In local function calls, `F()`, we use the local function access `F` + // to represent the receiver. Only needed for flow through captured variables. + exists(LambdaConfiguration x, LocalFunctionCall fc | + x.hasExprPath(fc.getAChild(), receiver, fc, call.getControlFlowNode()) ) } /** Holds if `call` is a lambda call where `receiver` is the lambda expression. */ predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { ( - lambdaCallExpr(call, receiver) + lambdaCallExpr(call, receiver.(ExprNode).getControlFlowNode()) and + // local function calls can be resolved directly without a flow analysis + not call.getControlFlowNode().getAstNode() instanceof LocalFunctionCall or receiver.(FlowSummaryNode).getSummaryNode() = call.(SummaryCall).getReceiver() ) and @@ -2707,8 +2968,11 @@ private predicate delegateCreationStep(Node nodeFrom, Node nodeTo) { predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preservesValue) { exists(SsaImpl::DefinitionExt def | LocalFlow::localSsaFlowStep(def, nodeFrom, nodeTo) and - LocalFlow::usesInstanceField(def) and preservesValue = true + | + LocalFlow::usesInstanceField(def) + or + def instanceof VariableCapture::CapturedSsaDefinitionExt ) or delegateCreationStep(nodeFrom, nodeTo) and @@ -2737,6 +3001,9 @@ predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preserves fa = nodeTo.asExpr() and fa.(FieldOrPropertyRead).hasNonlocalValue() ) + or + VariableCapture::flowInsensitiveStep(nodeFrom, nodeTo) and + preservesValue = true } /** @@ -2751,6 +3018,9 @@ predicate allowParameterReturnInSelf(ParameterNode p) { parameterNode(p, c, pos) and FlowSummaryImpl::Private::summaryAllowParameterReturnInSelf(c.asSummarizedCallable(), pos) ) + or + VariableCapture::Flow::heuristicAllowInstanceParameterReturnInSelf(p.(DelegateSelfReferenceNode) + .getCallable()) } /** An approximated `Content`. */ @@ -2773,6 +3043,10 @@ class ContentApprox extends TContentApprox { this = TPrimaryConstructorParameterApproxContent(firstChar) and result = "approximated parameter field " + firstChar ) + or + exists(VariableCapture::CapturedVariable v | + this = TCapturedVariableContentApprox(v) and result = "captured " + v + ) } } @@ -2807,6 +3081,8 @@ ContentApprox getContentApprox(Content c) { or result = TPrimaryConstructorParameterApproxContent(approximatePrimaryConstructorParameterContent(c)) + or + result = TCapturedVariableContentApprox(VariableCapture::getCapturedVariableContent(c)) } /** diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll index 2147b2f7d41..1f99522b34a 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll @@ -258,6 +258,17 @@ class ElementContent extends Content, TElementContent { override Location getLocation() { result instanceof EmptyLocation } } +/** A captured variable. */ +class CapturedVariableContent extends Content, TCapturedVariableContent { + private VariableCapture::CapturedVariable v; + + CapturedVariableContent() { this = TCapturedVariableContent(v) } + + override string toString() { result = "captured " + v } + + override Location getLocation() { result = v.getLocation() } +} + /** * An entity that represents a set of `Content`s. * diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll index 8b7db48140a..9757121566b 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll @@ -5,6 +5,7 @@ import csharp private import codeql.ssa.Ssa as SsaImplCommon private import AssignableDefinitions +private import semmle.code.csharp.controlflow.internal.PreSsa private module SsaInput implements SsaImplCommon::InputSig { class BasicBlock = ControlFlow::BasicBlock; @@ -30,9 +31,6 @@ private module SsaInput implements SsaImplCommon::InputSig { or updatesNamedFieldOrProp(bb, i, _, v, _) and certain = false - or - updatesCapturedVariable(bb, i, _, v, _, _) and - certain = false } /** @@ -724,401 +722,10 @@ private module FieldOrPropsImpl { } } -/** - * As in the SSA construction for fields and properties, SSA construction - * for captured variables relies on implicit update nodes at every call - * site that conceivably could reach an update of the captured variable. - * For example, there is an implicit update of `v` on line 4 in - * - * ```csharp - * int M() { - * int i = 0; - * Action a = () => { i = 1; }; - * a(); // implicit update of `v` - * return i; - * } - * ``` - * - * We find update paths of the form: - * - * ``` - * Call --(callEdge)-->* Callable(update of v) - * ``` - * - * For simplicity, and for performance reasons, we ignore cases where a path - * goes through the callable that introduces `v`; such a path does not - * represent an actual update, as a new copy of `v` is updated. - */ -private module CapturedVariableImpl { - /** - * A local scope variable that is captured, and updated by at least one capturer. - */ - private class CapturedWrittenLocalScopeVariable extends LocalScopeVariable { - CapturedWrittenLocalScopeVariable() { - exists(AssignableDefinition def | def.getTarget() = this | - def.getEnclosingCallable() != this.getCallable() - ) - } - } - - private class CapturedWrittenLocalScopeSourceVariable extends LocalScopeSourceVariable { - CapturedWrittenLocalScopeSourceVariable() { - this.getAssignable() instanceof CapturedWrittenLocalScopeVariable - } - } - - private class CapturedWrittenLocalScopeVariableDefinition extends AssignableDefinition { - CapturedWrittenLocalScopeVariableDefinition() { - this.getTarget() instanceof CapturedWrittenLocalScopeVariable - } - } - - /** - * Holds if `vdef` is an update of captured variable `v` in callable `c` - * that is relevant for SSA construction. - */ - predicate relevantDefinition( - Callable c, CapturedWrittenLocalScopeVariable v, - CapturedWrittenLocalScopeVariableDefinition vdef - ) { - exists(ControlFlow::BasicBlock bb, CapturedWrittenLocalScopeSourceVariable sv | - vdef.getTarget() = v and - vdef.getEnclosingCallable() = c and - sv.getAssignable() = v and - bb.getNode(_) = vdef.getAControlFlowNode() and - c != v.getCallable() - ) - } - - /** - * Holds if `call` occurs in basic block `bb` at index `i`, captured variable - * `v` has an update somewhere, and `v` is likely to be live in `bb` at index - * `i`. - */ - predicate updateCandidate( - ControlFlow::BasicBlock bb, int i, CapturedWrittenLocalScopeSourceVariable v, Call call - ) { - FieldOrPropsImpl::callAt(bb, i, call) and - call.getEnclosingCallable() = v.getEnclosingCallable() and - exists(Assignable a | - a = v.getAssignable() and - relevantDefinition(_, a, _) and - not exists(AssignableDefinitions::OutRefDefinition def | - def.getCall() = call and - def.getTarget() = a - ) - ) - } - - private predicate source( - Call call, CapturedWrittenLocalScopeSourceVariable v, - CapturedWrittenLocalScopeVariable captured, Callable c, boolean libraryDelegateCall - ) { - updateCandidate(_, _, v, call) and - c = getARuntimeTarget(call, libraryDelegateCall) and - captured = v.getAssignable() and - relevantDefinition(_, captured, _) - } - - /** - * Holds if `c` is a relevant part of the call graph for - * `updatesCapturedVariable` based on following edges in forward direction. - */ - private predicate reachableFromSource(Callable c) { - source(_, _, _, c, _) - or - exists(Callable mid | reachableFromSource(mid) | callEdge(mid, c)) - } - - private predicate sink(Callable c, CapturedWrittenLocalScopeVariable captured) { - reachableFromSource(c) and - relevantDefinition(c, captured, _) - } - - private predicate prunedCallable(Callable c) { - sink(c, _) - or - exists(Callable mid | callEdge(c, mid) and prunedCallable(mid)) - } - - private predicate prunedEdge(Callable c1, Callable c2) { - prunedCallable(c1) and - prunedCallable(c2) and - callEdge(c1, c2) - } - - private predicate edgePlus(Callable c1, Callable c2) = fastTC(prunedEdge/2)(c1, c2) - - /** - * Holds if `call` may change the value of captured variable `v`. The actual - * update occurs in `writer`. That is, `writer` can be reached from `call` - * using zero or more additional calls (as indicated by `additionalCalls`). - * One of the intermediate callables may be the callable that introduces `v`, - * in which case `call` is not an actual update. - */ - pragma[noopt] - predicate updatesCapturedVariableWriter( - Call call, CapturedWrittenLocalScopeSourceVariable v, Callable writer, boolean additionalCalls - ) { - exists(Callable src, CapturedWrittenLocalScopeVariable captured, boolean libraryDelegateCall | - source(call, v, captured, src, libraryDelegateCall) and - sink(writer, captured) and - ( - src = writer and additionalCalls = libraryDelegateCall - or - edgePlus(src, writer) and additionalCalls = true - ) - ) - } - - /** - * Holds if captured local scope variable `v` is written inside the callable - * to which `bb` belongs. - * - * In this case a pseudo-read is inserted at the exit node at index `i` in `bb`, - * in order to make the write live. - * - * Example: - * - * ```csharp - * class C { - * void M1() { - * int i = 0; - * void M2() { i = 2; }; - * M2(); - * System.Console.WriteLine(i); - * } - * } - * ``` - * - * The write to `i` inside `M2` on line 4 is live because of the implicit call - * definition on line 5. - */ - predicate capturedExitRead( - ControlFlow::BasicBlock bb, int i, CapturedWrittenLocalScopeSourceVariable v - ) { - exists(ControlFlow::Nodes::AnnotatedExitNode exit | - exit.isNormal() and - variableDefinition(bb.getAPredecessor*(), _, v, _) and - exit = bb.getNode(i) - ) - } -} - -/** - * Liveness analysis to restrict the size of the SSA representation for - * captured variables. - * - * Example: - * - * ```csharp - * void M() { - * int i = 0; - * void M2() { - * System.Console.WriteLine(i); - * } - * M2(); - * } - * ``` - * - * The definition of `i` on line 2 is live, because of the call to `M2` on - * line 6. However, that call is not a direct read of `i`, so we account - * for that by inserting an implicit read of `i` on line 6. - * - * The predicates in this module follow the same structure as those in - * `CapturedVariableImpl`. - */ -private module CapturedVariableLivenessImpl { - /** - * Holds if `c` is a callable that captures local scope variable `v`, and - * `c` may read the value of the captured variable. - */ - private predicate capturerReads(Callable c, LocalScopeVariable v) { - exists(LocalScopeSourceVariable sv | - c = sv.getEnclosingCallable() and - v = sv.getAssignable() and - v.getCallable() != c - | - variableReadActual(_, _, sv) - or - refReadBeforeWrite(_, _, sv) - ) - } - - /** - * A local scope variable that is captured, and read by at least one capturer. - */ - private class CapturedReadLocalScopeVariable extends LocalScopeVariable { - CapturedReadLocalScopeVariable() { capturerReads(_, this) } - } - - private class CapturedReadLocalScopeSourceVariable extends LocalScopeSourceVariable { - CapturedReadLocalScopeSourceVariable() { - this.getAssignable() instanceof CapturedReadLocalScopeVariable - } - } - - /** - * Holds if a write to captured source variable `v` may be read by a - * callable reachable from the call `c`. - */ - private predicate implicitReadCandidate( - CapturedReadLocalScopeSourceVariable v, ControlFlow::Nodes::ElementNode c - ) { - exists(ControlFlow::BasicBlock bb, int i | variableWriteDirect(bb, i, v, _) | - c = bb.getNode(any(int j | j > i)) - or - c = bb.getASuccessor+().getANode() - ) - } - - private predicate source( - ControlFlow::Nodes::ElementNode call, CapturedReadLocalScopeSourceVariable v, - CapturedReadLocalScopeVariable captured, Callable c, boolean libraryDelegateCall - ) { - implicitReadCandidate(v, call) and - c = getARuntimeTarget(call.getAstNode(), libraryDelegateCall) and - captured = v.getAssignable() and - capturerReads(_, captured) - } - - /** - * Holds if `c` is a relevant part of the call graph for - * `readsCapturedVariable` based on following edges in forward direction. - */ - private predicate reachableFromSource(Callable c) { - source(_, _, _, c, _) - or - exists(Callable mid | reachableFromSource(mid) | callEdge(mid, c)) - } - - private predicate sink(Callable c, CapturedReadLocalScopeVariable captured) { - reachableFromSource(c) and - capturerReads(c, captured) - } - - private predicate prunedCallable(Callable c) { - sink(c, _) - or - exists(Callable mid | callEdge(c, mid) and prunedCallable(mid)) - } - - private predicate prunedEdge(Callable c1, Callable c2) { - prunedCallable(c1) and - prunedCallable(c2) and - callEdge(c1, c2) - } - - private predicate edgePlus(Callable c1, Callable c2) = fastTC(prunedEdge/2)(c1, c2) - - /** - * Holds if `call` may read the value of captured variable `v`. The actual - * read occurs in `reader`. That is, `reader` can be reached from `call` - * using zero or more additional calls (as indicated by `additionalCalls`). - * One of the intermediate callables may be a callable that writes to `v`, - * in which case `call` is not an actual read. - */ - pragma[noopt] - private predicate readsCapturedVariable( - ControlFlow::Nodes::ElementNode call, CapturedReadLocalScopeSourceVariable v, Callable reader, - boolean additionalCalls - ) { - exists(Callable src, CapturedReadLocalScopeVariable captured, boolean libraryDelegateCall | - source(call, v, captured, src, libraryDelegateCall) and - sink(reader, captured) and - ( - src = reader and additionalCalls = libraryDelegateCall - or - edgePlus(src, reader) and additionalCalls = true - ) - ) - } - - /** - * Holds if captured local scope variable `v` is written inside the callable - * to which `bb` belongs, and the value may be read via `call` using zero or - * more additional calls (as indicated by `additionalCalls`). - * - * In this case a pseudo-read is inserted at the exit node at index `i` in `bb`, - * in order to make the write live. - * - * Example: - * - * ```csharp - * class C { - * void M1() { - * int i = 0; - * void M2() { i = 2; }; - * M2(); - * System.Console.WriteLine(i); - * } - * } - * ``` - * - * The write to `i` inside `M2` on line 4 is live because of the implicit call - * definition on line 5. - */ - predicate capturedReadOut( - ControlFlow::BasicBlock bb, int i, LocalScopeSourceVariable v, LocalScopeSourceVariable outer, - Call call, boolean additionalCalls - ) { - exists( - ControlFlow::Nodes::AnnotatedExitNode exit, ControlFlow::BasicBlock pred, - AssignableDefinition adef - | - exit.isNormal() and - variableDefinition(pred, _, v, adef) and - updatesCapturedVariable(_, _, call, outer, adef, additionalCalls) and - pred.getASuccessor*() = bb and - exit = bb.getNode(i) - ) - } - - /** - * Holds if a value written to captured local scope variable `outer` may be - * read as `inner` via `call`, at index `i` in basic block `bb`, using one or - * more calls (as indicated by `additionalCalls`). - * - * Example: - * - * ```csharp - * class C { - * void M1() { - * int i = 0; - * void M2() => System.Console.WriteLine(i); - * i = 1; - * M2(); - * } - * } - * ``` - * - * The write to `i` on line 5 is live because of the call to `M2` on line 6, which - * reaches the entry definition for `i` in `M2` on line 4. - */ - predicate capturedReadIn( - ControlFlow::BasicBlock bb, int i, LocalScopeSourceVariable outer, - LocalScopeSourceVariable inner, ControlFlow::Nodes::ElementNode call, boolean additionalCalls - ) { - exists(Callable reader | - implicitReadCandidate(outer, call) and - readsCapturedVariable(call, outer, reader, additionalCalls) and - reader = inner.getEnclosingCallable() and - outer.getAssignable() = inner.getAssignable() and - call = bb.getNode(i) - ) - } -} - -private import CapturedVariableLivenessImpl - private predicate variableReadPseudo(ControlFlow::BasicBlock bb, int i, Ssa::SourceVariable v) { outRefExitRead(bb, i, v) or refReadBeforeWrite(bb, i, v) - or - CapturedVariableImpl::capturedExitRead(bb, i, v) - or - capturedReadIn(bb, i, v, _, _, _) } pragma[noinline] @@ -1223,7 +830,7 @@ cached private module Cached { cached newtype TSourceVariable = - TLocalVar(Callable c, LocalScopeVariable v) { + TLocalVar(Callable c, PreSsa::SimpleLocalScopeVariable v) { c = v.getCallable() or // Local scope variables can be captured @@ -1297,23 +904,6 @@ private module Cached { FieldOrPropsImpl::updatesNamedFieldOrProp(fp, c, setter) } - /** - * Holds if `call` may change the value of captured variable `v`. The actual - * update occurs in `def`. - */ - cached - predicate updatesCapturedVariable( - ControlFlow::BasicBlock bb, int i, Call call, LocalScopeSourceVariable v, - AssignableDefinition def, boolean additionalCalls - ) { - CapturedVariableImpl::updateCandidate(bb, i, v, call) and - exists(Callable writer | - CapturedVariableImpl::relevantDefinition(writer, v.getAssignable(), def) - | - CapturedVariableImpl::updatesCapturedVariableWriter(call, v, writer, additionalCalls) - ) - } - cached predicate variableWriteQualifier( ControlFlow::BasicBlock bb, int i, QualifiedFieldOrPropSourceVariable v, boolean certain @@ -1327,32 +917,6 @@ private module Cached { not updatesNamedFieldOrProp(bb, i, _, v, _) } - cached - predicate isCapturedVariableDefinitionFlowIn( - Ssa::ExplicitDefinition def, Ssa::ImplicitEntryDefinition edef, - ControlFlow::Nodes::ElementNode c, boolean additionalCalls - ) { - exists(Ssa::SourceVariable v, Ssa::Definition def0, ControlFlow::BasicBlock bb, int i | - v = def.getSourceVariable() and - capturedReadIn(_, _, v, edef.getSourceVariable(), c, additionalCalls) and - def = def0.getAnUltimateDefinition() and - Impl::ssaDefReachesRead(_, def0, bb, i) and - capturedReadIn(bb, i, v, _, _, _) and - c = bb.getNode(i) - ) - } - - cached - predicate isCapturedVariableDefinitionFlowOut( - Ssa::ExplicitDefinition def, Ssa::ImplicitCallDefinition cdef, boolean additionalCalls - ) { - exists(Ssa::Definition def0 | - def = def0.getAnUltimateDefinition() and - capturedReadOut(_, _, def0.getSourceVariable(), cdef.getSourceVariable(), cdef.getCall(), - additionalCalls) - ) - } - cached predicate explicitDefinition(WriteDefinition def, Ssa::SourceVariable v, AssignableDefinition ad) { exists(ControlFlow::BasicBlock bb, int i | diff --git a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql index 4612091743f..2c9ff02349f 100644 --- a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql +++ b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql @@ -91,6 +91,8 @@ class RelevantDefinition extends AssignableDefinition { this = any(Ssa::ExplicitDefinition ssaDef).getADefinition() or mayEscape(v) + or + v.isCaptured() ) } diff --git a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected index d0e636b1258..ec78d10b35f 100644 --- a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected @@ -143,7 +143,6 @@ | CSharp7.cs:137:29:137:38 | (...) => ... | CSharp7.cs:137:24:137:25 | access to local variable f5 | | CSharp7.cs:137:34:137:34 | access to parameter x | CSharp7.cs:137:34:137:38 | ... + ... | | CSharp7.cs:137:38:137:38 | 1 | CSharp7.cs:137:34:137:38 | ... + ... | -| CSharp7.cs:139:9:139:51 | this | CSharp7.cs:139:38:139:39 | this access | | CSharp7.cs:139:20:139:20 | x | CSharp7.cs:139:26:139:26 | access to parameter x | | CSharp7.cs:139:26:139:26 | access to parameter x | CSharp7.cs:139:26:139:30 | ... > ... | | CSharp7.cs:139:26:139:26 | access to parameter x | CSharp7.cs:139:41:139:41 | access to parameter x | @@ -151,24 +150,18 @@ | CSharp7.cs:139:34:139:46 | ... + ... | CSharp7.cs:139:26:139:50 | ... ? ... : ... | | CSharp7.cs:139:38:139:46 | call to local function f7 | CSharp7.cs:139:34:139:46 | ... + ... | | CSharp7.cs:139:50:139:50 | 0 | CSharp7.cs:139:26:139:50 | ... ? ... : ... | -| CSharp7.cs:141:9:141:31 | this | CSharp7.cs:141:26:141:27 | this access | | CSharp7.cs:141:20:141:20 | x | CSharp7.cs:141:29:141:29 | access to parameter x | -| CSharp7.cs:143:9:147:9 | this | CSharp7.cs:146:20:146:21 | this access | -| CSharp7.cs:145:13:145:35 | this | CSharp7.cs:145:30:145:31 | this access | | CSharp7.cs:145:24:145:24 | x | CSharp7.cs:145:33:145:33 | access to parameter x | | CSharp7.cs:149:20:152:9 | (...) => ... | CSharp7.cs:149:16:149:16 | access to local variable a | | CSharp7.cs:157:10:157:17 | this | CSharp7.cs:169:9:169:9 | this access | | CSharp7.cs:160:18:160:18 | t | CSharp7.cs:160:24:160:24 | access to parameter t | -| CSharp7.cs:162:9:167:9 | this | CSharp7.cs:165:13:165:16 | this access | | CSharp7.cs:162:26:162:26 | u | CSharp7.cs:166:22:166:22 | access to parameter u | -| CSharp7.cs:164:13:164:43 | this | CSharp7.cs:164:37:164:40 | this access | | CSharp7.cs:165:13:165:16 | this access | CSharp7.cs:166:20:166:20 | this access | | CSharp7.cs:169:9:169:9 | this access | CSharp7.cs:170:9:170:9 | this access | | CSharp7.cs:173:10:173:19 | this | CSharp7.cs:180:21:180:21 | this access | | CSharp7.cs:175:16:175:18 | access to local variable src | CSharp7.cs:175:16:175:30 | SSA def(src) | | CSharp7.cs:175:16:175:30 | SSA def(src) | CSharp7.cs:180:23:180:25 | access to local variable src | | CSharp7.cs:175:22:175:30 | "tainted" | CSharp7.cs:175:16:175:18 | access to local variable src | -| CSharp7.cs:176:9:176:40 | this | CSharp7.cs:176:31:176:31 | this access | | CSharp7.cs:176:25:176:25 | s | CSharp7.cs:176:33:176:33 | access to parameter s | | CSharp7.cs:176:31:176:34 | call to local function g | CSharp7.cs:176:31:176:39 | ... + ... | | CSharp7.cs:176:38:176:39 | "" | CSharp7.cs:176:31:176:39 | ... + ... | diff --git a/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql index 729d19f6d1e..1ff95c93b22 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql @@ -1,7 +1,10 @@ import csharp +private import semmle.code.csharp.controlflow.internal.PreSsa /** "Naive" def-use implementation. */ -predicate defReaches(AssignableDefinition def, LocalScopeVariable v, ControlFlow::Node cfn) { +predicate defReaches( + AssignableDefinition def, PreSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn +) { def.getTarget() = v and cfn = def.getAControlFlowNode().getASuccessor() or exists(ControlFlow::Node mid | defReaches(def, v, mid) | diff --git a/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql index e83eba4dd7c..79e0e318e7a 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql @@ -1,8 +1,10 @@ import csharp +private import semmle.code.csharp.controlflow.internal.PreSsa /** "Naive" parameter-use implementation. */ predicate parameterReaches(Parameter p, ControlFlow::Node cfn) { - cfn = p.getCallable().getEntryPoint().getASuccessor() + cfn = p.getCallable().getEntryPoint().getASuccessor() and + p instanceof PreSsa::SimpleLocalScopeVariable or exists(ControlFlow::Node mid | parameterReaches(p, mid) | not mid = diff --git a/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql index e09c3d15caa..c32fc80c782 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql @@ -1,7 +1,10 @@ import csharp +private import semmle.code.csharp.controlflow.internal.PreSsa /** "Naive" use-use implementation. */ -predicate useReaches(LocalScopeVariableRead read, LocalScopeVariable v, ControlFlow::Node cfn) { +predicate useReaches( + LocalScopeVariableRead read, PreSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn +) { read.getTarget() = v and cfn = read.getAControlFlowNode().getASuccessor() or exists(ControlFlow::Node mid | useReaches(read, v, mid) | diff --git a/csharp/ql/test/library-tests/dataflow/global/Capture.cs b/csharp/ql/test/library-tests/dataflow/global/Capture.cs index 7c6c1d8a04c..be7ebe9cde6 100644 --- a/csharp/ql/test/library-tests/dataflow/global/Capture.cs +++ b/csharp/ql/test/library-tests/dataflow/global/Capture.cs @@ -214,7 +214,7 @@ class Capture { return () => { - Check(s); // missing flow from lines 221 and 223 + Check(s); }; } @@ -243,12 +243,12 @@ class Capture Action a = () => { - Check(c.Field); // missing flow from line 242 + Check(c.Field); c.Field = "taint source"; }; a(); - Check(c.Field); // missing flow from line 247 + Check(c.Field); } void M7(bool b) @@ -265,7 +265,7 @@ class Capture }; a(); - Check(c.Field); // missing flow from line 264 + Check(c.Field); } void M8() @@ -298,12 +298,12 @@ class Capture Action a = () => { - Check(this.Field); // missing flow from line 297 + Check(this.Field); this.Field = "taint source"; }; a(); - Check(this.Field); // missing flow from line 302 + Check(this.Field); } void M11() diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected index b2244abaa60..427dbd7a7af 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlow.expected @@ -13,15 +13,20 @@ | Capture.cs:171:15:171:20 | access to local variable sink37 | | Capture.cs:197:15:197:20 | access to local variable sink38 | | Capture.cs:206:19:206:19 | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | | Capture.cs:231:19:231:19 | access to local variable x | | Capture.cs:234:15:234:15 | access to local variable x | +| Capture.cs:246:19:246:25 | access to field Field | | Capture.cs:251:15:251:21 | access to field Field | +| Capture.cs:268:15:268:21 | access to field Field | | Capture.cs:273:30:273:30 | access to parameter x | | Capture.cs:284:23:284:23 | access to local variable x | | Capture.cs:292:15:292:15 | access to local variable x | +| Capture.cs:301:19:301:28 | access to field Field | | Capture.cs:306:15:306:24 | access to field Field | | Capture.cs:312:15:312:15 | access to local variable x | | Capture.cs:319:19:319:19 | access to local variable x | +| Capture.cs:330:47:330:47 | access to local variable x | | Capture.cs:339:45:339:45 | access to local variable x | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected index 6cea5180e89..0ed28a45b04 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected @@ -1,59 +1,166 @@ edges -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:11:17:11:22 | access to local variable sink27 : String | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:20:21:20:26 | access to local variable sink28 : String | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:29:17:29:22 | access to local variable sink29 : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | provenance | | | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:61:36:61:42 | access to parameter tainted : String | provenance | | +| Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | provenance | | | Capture.cs:11:17:11:22 | access to local variable sink27 : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | +| Capture.cs:11:26:11:32 | access to parameter tainted : String | Capture.cs:11:17:11:22 | access to local variable sink27 : String | provenance | | +| Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | Capture.cs:11:26:11:32 | access to parameter tainted : String | provenance | | +| Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | provenance | | | Capture.cs:20:21:20:26 | access to local variable sink28 : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | +| Capture.cs:20:30:20:36 | access to parameter tainted : String | Capture.cs:20:21:20:26 | access to local variable sink28 : String | provenance | | +| Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | Capture.cs:20:30:20:36 | access to parameter tainted : String | provenance | | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | provenance | | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | provenance | | +| Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | provenance | | | Capture.cs:29:17:29:22 | access to local variable sink29 : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | -| Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | +| Capture.cs:29:26:29:32 | access to parameter tainted : String | Capture.cs:29:17:29:22 | access to local variable sink29 : String | provenance | | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | Capture.cs:29:26:29:32 | access to parameter tainted : String | provenance | | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | Capture.cs:29:26:29:32 | access to parameter tainted : String | provenance | | +| Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | provenance | | | Capture.cs:61:36:61:42 | access to parameter tainted : String | Capture.cs:50:50:50:55 | sink39 : String | provenance | | -| Capture.cs:69:13:69:18 | access to local variable sink30 : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | -| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:69:13:69:18 | access to local variable sink30 : String | provenance | | -| Capture.cs:79:17:79:22 | access to local variable sink31 : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | -| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:22 | access to local variable sink31 : String | provenance | | -| Capture.cs:89:13:89:18 | access to local variable sink32 : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | -| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:18 | access to local variable sink32 : String | provenance | | -| Capture.cs:116:17:116:22 | access to local variable sink40 : String | Capture.cs:124:15:124:20 | access to local variable sink40 | provenance | | -| Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:116:17:116:22 | access to local variable sink40 : String | provenance | | -| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:135:15:135:20 | access to local variable sink33 | provenance | | -| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:147:15:147:20 | access to local variable sink34 | provenance | | -| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:156:15:156:20 | access to local variable sink35 | provenance | | -| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | provenance | | +| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | provenance | | +| Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | +| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | provenance | | +| Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | provenance | | +| Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | +| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | provenance | | +| Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | +| Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | provenance | | +| Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | provenance | | +| Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | Capture.cs:124:15:124:20 | access to local variable sink40 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | provenance | | | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:170:25:170:31 | access to parameter tainted : String | provenance | | | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:196:25:196:31 | access to parameter tainted : String | provenance | | +| Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | Capture.cs:135:15:135:20 | access to local variable sink33 | provenance | | +| Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | provenance | | +| Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | Capture.cs:147:15:147:20 | access to local variable sink34 | provenance | | +| Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | provenance | | +| Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | Capture.cs:156:15:156:20 | access to local variable sink35 | provenance | | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | provenance | | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | provenance | | +| Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | provenance | | | Capture.cs:162:13:162:18 | access to local variable sink36 : String | Capture.cs:163:15:163:20 | access to local variable sink36 | provenance | | +| Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | provenance | | | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | Capture.cs:162:13:162:18 | access to local variable sink36 : String | provenance | | -| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:171:15:171:20 | access to local variable sink37 | provenance | | -| Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | provenance | | +| Capture.cs:166:37:166:37 | p : String | Capture.cs:168:22:168:22 | access to parameter p : String | provenance | | +| Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | Capture.cs:171:15:171:20 | access to local variable sink37 | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:166:37:166:37 | p : String | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | provenance | | +| Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | provenance | | +| Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | Capture.cs:193:20:193:22 | call to local function M : String | provenance | | | Capture.cs:196:13:196:18 | access to local variable sink38 : String | Capture.cs:197:15:197:20 | access to local variable sink38 | provenance | | | Capture.cs:196:22:196:32 | call to local function Id : String | Capture.cs:196:13:196:18 | access to local variable sink38 : String | provenance | | | Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | provenance | | | Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:196:22:196:32 | call to local function Id : String | provenance | | -| Capture.cs:202:20:202:20 | s : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | provenance | | +| Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | | Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:202:20:202:20 | s : String | provenance | | -| Capture.cs:228:13:228:13 | access to local variable x : String | Capture.cs:231:19:231:19 | access to local variable x | provenance | | -| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:228:13:228:13 | access to local variable x : String | provenance | | -| Capture.cs:232:13:232:13 | access to local variable x : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | -| Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:232:13:232:13 | access to local variable x : String | provenance | | +| Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | provenance | | +| Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | Capture.cs:217:19:217:19 | access to parameter s | provenance | | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | provenance | | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | provenance | | +| Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | provenance | | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:231:19:231:19 | access to local variable x | provenance | | +| Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | provenance | | | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | Capture.cs:246:19:246:25 | access to field Field | provenance | | +| Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:247:23:247:36 | "taint source" : String | Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | provenance | | | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:21 | access to field Field | provenance | | +| Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:264:23:264:36 | "taint source" : String | Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | Capture.cs:268:15:268:21 | access to field Field | provenance | | | Capture.cs:273:19:273:19 | x : String | Capture.cs:273:30:273:30 | access to parameter x | provenance | | | Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:353:45:353:45 | x : String | provenance | | -| Capture.cs:278:13:278:13 | access to local variable x : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | -| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:278:13:278:13 | access to local variable x : String | provenance | | -| Capture.cs:285:17:285:17 | access to local variable x : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | -| Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:285:17:285:17 | access to local variable x : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | provenance | | | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | Capture.cs:301:19:301:28 | access to field Field | provenance | | +| Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:302:26:302:39 | "taint source" : String | Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | provenance | | | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | Capture.cs:306:15:306:24 | access to field Field | provenance | | -| Capture.cs:311:13:311:13 | access to local variable x : String | Capture.cs:312:15:312:15 | access to local variable x | provenance | | -| Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:311:13:311:13 | access to local variable x : String | provenance | | -| Capture.cs:318:13:318:13 | access to local variable x : String | Capture.cs:319:19:319:19 | access to local variable x | provenance | | -| Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:318:13:318:13 | access to local variable x : String | provenance | | -| Capture.cs:337:13:337:13 | access to local variable x : String | Capture.cs:339:45:339:45 | access to local variable x | provenance | | -| Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:337:13:337:13 | access to local variable x : String | provenance | | +| Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | provenance | | +| Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | provenance | | +| Capture.cs:328:17:328:30 | "taint source" : String | Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | provenance | | +| Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | provenance | | +| Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | Capture.cs:330:47:330:47 | access to local variable x | provenance | | +| Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | Capture.cs:339:45:339:45 | access to local variable x | provenance | | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | Capture.cs:217:19:217:19 | access to parameter s | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | | Capture.cs:353:45:353:45 | x : String | Capture.cs:355:11:355:11 | access to parameter x : String | provenance | | | Capture.cs:355:11:355:11 | access to parameter x : String | Capture.cs:273:19:273:19 | x : String | provenance | | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | @@ -407,77 +514,168 @@ edges | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:48:13:48:13 | access to local variable s : String | provenance | | nodes | Capture.cs:7:20:7:26 | tainted : String | semmle.label | tainted : String | +| Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | semmle.label | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | | Capture.cs:11:17:11:22 | access to local variable sink27 : String | semmle.label | access to local variable sink27 : String | +| Capture.cs:11:26:11:32 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:12:19:12:24 | access to local variable sink27 | semmle.label | access to local variable sink27 | +| Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | semmle.label | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | +| Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | semmle.label | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | +| Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | semmle.label | M(...) : M [captured tainted] : String | | Capture.cs:20:21:20:26 | access to local variable sink28 : String | semmle.label | access to local variable sink28 : String | +| Capture.cs:20:30:20:36 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:21:23:21:28 | access to local variable sink28 | semmle.label | access to local variable sink28 | +| Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | semmle.label | access to local function M : M [captured tainted] : String | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | semmle.label | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | +| Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureIn3 : (...) => ... [captured tainted] : String | +| Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | semmle.label | (...) => ... : (...) => ... [captured tainted] : String | | Capture.cs:29:17:29:22 | access to local variable sink29 : String | semmle.label | access to local variable sink29 : String | +| Capture.cs:29:26:29:32 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:30:19:30:24 | access to local variable sink29 | semmle.label | access to local variable sink29 | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureIn3 : (...) => ... [captured tainted] : String | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | semmle.label | access to local variable captureIn3 : Func [captured tainted] : String | | Capture.cs:50:50:50:55 | sink39 : String | semmle.label | sink39 : String | +| Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | semmle.label | (...) => ... : (...) => ... [captured sink39] : String | +| Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | semmle.label | (...) => ... : (...) => ... [captured sink39] : String | | Capture.cs:57:27:57:32 | access to parameter sink39 | semmle.label | access to parameter sink39 | | Capture.cs:61:36:61:42 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:69:13:69:18 | access to local variable sink30 : String | semmle.label | access to local variable sink30 : String | | Capture.cs:69:22:69:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | semmle.label | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | | Capture.cs:72:15:72:20 | access to local variable sink30 | semmle.label | access to local variable sink30 | -| Capture.cs:79:17:79:22 | access to local variable sink31 : String | semmle.label | access to local variable sink31 : String | | Capture.cs:79:26:79:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | semmle.label | [post] access to local function M : M [captured sink31] : String | +| Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | semmle.label | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | | Capture.cs:84:15:84:20 | access to local variable sink31 | semmle.label | access to local variable sink31 | -| Capture.cs:89:13:89:18 | access to local variable sink32 : String | semmle.label | access to local variable sink32 : String | | Capture.cs:89:22:89:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | semmle.label | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | | Capture.cs:93:15:93:20 | access to local variable sink32 | semmle.label | access to local variable sink32 | -| Capture.cs:116:17:116:22 | access to local variable sink40 : String | semmle.label | access to local variable sink40 : String | +| Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | semmle.label | [post] (...) => ... : (...) => ... [captured sink40] : String | | Capture.cs:116:26:116:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | semmle.label | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | | Capture.cs:124:15:124:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | | Capture.cs:127:25:127:31 | tainted : String | semmle.label | tainted : String | +| Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | semmle.label | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | +| Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | semmle.label | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | +| Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | semmle.label | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | | Capture.cs:135:15:135:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | +| Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | semmle.label | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | +| Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | semmle.label | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | +| Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | semmle.label | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | | Capture.cs:147:15:147:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | +| Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | +| Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | semmle.label | (...) => ... : (...) => ... [captured tainted] : String | +| Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | semmle.label | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | semmle.label | access to local variable captureThrough3 : Func [captured tainted] : String | | Capture.cs:156:15:156:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | +| Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | semmle.label | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | | Capture.cs:162:13:162:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | +| Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | semmle.label | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | | Capture.cs:163:15:163:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | +| Capture.cs:166:37:166:37 | p : String | semmle.label | p : String | +| Capture.cs:168:22:168:22 | access to parameter p : String | semmle.label | access to parameter p : String | +| Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | semmle.label | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | | Capture.cs:170:25:170:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:171:15:171:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | | Capture.cs:190:26:190:26 | s : String | semmle.label | s : String | +| Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | semmle.label | M(...) : M [captured s] : String | +| Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | semmle.label | access to local function M : M [captured s] : String | | Capture.cs:193:20:193:22 | call to local function M : String | semmle.label | call to local function M : String | | Capture.cs:196:13:196:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | | Capture.cs:196:22:196:32 | call to local function Id : String | semmle.label | call to local function Id : String | | Capture.cs:196:25:196:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:197:15:197:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | | Capture.cs:202:20:202:20 | s : String | semmle.label | s : String | +| Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | semmle.label | access to local variable a : (...) => ... [captured s] : String | +| Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | semmle.label | (...) => ... : (...) => ... [captured s] : String | | Capture.cs:206:19:206:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | semmle.label | access to local variable a : (...) => ... [captured s] : String | +| Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | semmle.label | access to local variable a : Action [captured s] : String | | Capture.cs:211:21:211:34 | "taint source" : String | semmle.label | "taint source" : String | -| Capture.cs:228:13:228:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:213:22:213:22 | s : String | semmle.label | s : String | +| Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | semmle.label | (...) => ... : (...) => ... [captured s] : String | +| Capture.cs:217:19:217:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | semmle.label | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:221:21:221:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | semmle.label | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:223:31:223:44 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:228:17:228:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | semmle.label | [post] (...) => ... : (...) => ... [captured x] : String | | Capture.cs:231:19:231:19 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:232:13:232:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:232:17:232:30 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:234:15:234:15 | access to local variable x | semmle.label | access to local variable x | | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | | Capture.cs:242:19:242:32 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | semmle.label | (...) => ... : (...) => ... [captured c, field Field] : String | +| Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:246:19:246:25 | access to field Field | semmle.label | access to field Field | +| Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:247:23:247:36 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | semmle.label | access to local variable a : Action [captured c, field Field] : String | | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | | Capture.cs:251:15:251:21 | access to field Field | semmle.label | access to field Field | +| Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:264:23:264:36 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:268:15:268:21 | access to field Field | semmle.label | access to field Field | | Capture.cs:273:19:273:19 | x : String | semmle.label | x : String | | Capture.cs:273:30:273:30 | access to parameter x | semmle.label | access to parameter x | | Capture.cs:273:34:273:47 | "taint source" : String | semmle.label | "taint source" : String | -| Capture.cs:278:13:278:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:278:17:278:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | semmle.label | access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | semmle.label | access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | | Capture.cs:284:23:284:23 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:285:17:285:17 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:285:21:285:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | semmle.label | [post] access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | semmle.label | access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | semmle.label | access to local variable inner : Action [captured x] : String | +| Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | semmle.label | [post] access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | semmle.label | access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | semmle.label | access to local variable middle : Action [captured x] : String | | Capture.cs:292:15:292:15 | access to local variable x | semmle.label | access to local variable x | | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | | Capture.cs:297:22:297:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | semmle.label | (...) => ... : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | +| Capture.cs:301:19:301:28 | access to field Field | semmle.label | access to field Field | +| Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | +| Capture.cs:302:26:302:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | semmle.label | access to local variable a : Action [captured this in M10, field Field] : String | | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | | Capture.cs:306:15:306:24 | access to field Field | semmle.label | access to field Field | -| Capture.cs:311:13:311:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:311:17:311:30 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:312:15:312:15 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:318:13:318:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:318:17:318:30 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:319:19:319:19 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:337:13:337:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:328:17:328:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | semmle.label | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | +| Capture.cs:330:47:330:47 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | semmle.label | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | | Capture.cs:337:17:337:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | | Capture.cs:339:45:339:45 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | semmle.label | access to local variable capturedLambda : (...) => ... [captured x] : String | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | semmle.label | a : (...) => ... [captured s] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | +| Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | semmle.label | [post] access to parameter a : (...) => ... [captured sink40] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | semmle.label | access to parameter a : (...) => ... [captured s] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | semmle.label | access to parameter a : (...) => ... [captured sink39] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | semmle.label | access to parameter a : (...) => ... [captured sink39] : String | | Capture.cs:353:45:353:45 | x : String | semmle.label | x : String | | Capture.cs:355:11:355:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | semmle.label | access to field SinkField0 : String | @@ -783,7 +981,10 @@ nodes | Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s | | Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s | subpaths +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:166:37:166:37 | p : String | Capture.cs:168:22:168:22 | access to parameter p : String | Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | | Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | Capture.cs:196:22:196:32 | call to local function Id : String | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | @@ -808,8 +1009,13 @@ subpaths | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | [b (line 24): true] access to local variable x | | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | [b (line 3): false] access to local variable x | | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | [b (line 3): true] access to local variable x | +| Capture.cs:246:19:246:25 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:246:19:246:25 | access to field Field | access to field Field | | Capture.cs:251:15:251:21 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:247:23:247:36 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:268:15:268:21 | access to field Field | Capture.cs:264:23:264:36 | "taint source" : String | Capture.cs:268:15:268:21 | access to field Field | access to field Field | +| Capture.cs:301:19:301:28 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:301:19:301:28 | access to field Field | access to field Field | | Capture.cs:306:15:306:24 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | +| Capture.cs:306:15:306:24 | access to field Field | Capture.cs:302:26:302:39 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | access to field SinkField0 | | GlobalDataFlow.cs:491:15:491:22 | access to field field | GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:491:15:491:22 | access to field field | access to field field | | GlobalDataFlow.cs:492:15:492:22 | access to field field | GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:492:15:492:22 | access to field field | access to field field | @@ -867,15 +1073,20 @@ subpaths | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | GlobalDataFlow.cs:351:13:351:26 | "taint source" : String | GlobalDataFlow.cs:164:15:164:19 | access to local variable sink8 | access to local variable sink8 | | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | GlobalDataFlow.cs:183:35:183:48 | "taint source" : String | GlobalDataFlow.cs:185:15:185:19 | access to local variable sink9 | access to local variable sink9 | | Capture.cs:231:19:231:19 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:231:19:231:19 | access to local variable x | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | | Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | | Capture.cs:284:23:284:23 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:284:23:284:23 | access to local variable x | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | | Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | | Capture.cs:312:15:312:15 | access to local variable x | Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | access to local variable x | | Capture.cs:319:19:319:19 | access to local variable x | Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | access to local variable x | +| Capture.cs:330:47:330:47 | access to local variable x | Capture.cs:328:17:328:30 | "taint source" : String | Capture.cs:330:47:330:47 | access to local variable x | access to local variable x | | Capture.cs:339:45:339:45 | access to local variable x | Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:45:339:45 | access to local variable x | access to local variable x | | Splitting.cs:11:19:11:19 | access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:11:19:11:19 | access to local variable x | access to local variable x | | Splitting.cs:34:19:34:19 | access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:34:19:34:19 | access to local variable x | access to local variable x | | Capture.cs:206:19:206:19 | access to parameter s | Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:206:19:206:19 | access to parameter s | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:217:19:217:19 | access to parameter s | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:217:19:217:19 | access to parameter s | access to parameter s | | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | GlobalDataFlow.cs:473:28:473:41 | "taint source" : String | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | access to parameter s | | Capture.cs:57:27:57:32 | access to parameter sink39 | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:57:27:57:32 | access to parameter sink39 | access to parameter sink39 | | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:260:15:260:24 | access to parameter sinkParam0 | access to parameter sinkParam0 | diff --git a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected index 76416668e22..ff1e94029b4 100644 --- a/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected +++ b/csharp/ql/test/library-tests/dataflow/global/GetAnOutNode.expected @@ -1,30 +1,20 @@ +| Capture.cs:5:7:5:13 | call to constructor Object | normal | Capture.cs:5:7:5:13 | call to constructor Object | | Capture.cs:33:9:33:40 | call to method Select | normal | Capture.cs:33:9:33:40 | call to method Select | | Capture.cs:33:9:33:50 | call to method ToArray | normal | Capture.cs:33:9:33:50 | call to method ToArray | -| Capture.cs:71:9:71:21 | call to local function CaptureOut1 | captured sink30 | Capture.cs:71:9:71:21 | SSA call def(sink30) | -| Capture.cs:83:9:83:21 | [transitive] call to local function CaptureOut2 | captured sink31 | Capture.cs:83:9:83:21 | SSA call def(sink31) | -| Capture.cs:92:9:92:41 | [transitive] call to method Select | captured sink32 | Capture.cs:92:9:92:41 | SSA call def(sink32) | | Capture.cs:92:9:92:41 | call to method Select | normal | Capture.cs:92:9:92:41 | call to method Select | | Capture.cs:92:9:92:51 | call to method ToArray | normal | Capture.cs:92:9:92:51 | call to method ToArray | -| Capture.cs:123:9:123:35 | [transitive] call to local function CaptureOutMultipleLambdas | captured nonSink0 | Capture.cs:123:9:123:35 | SSA call def(nonSink0) | -| Capture.cs:123:9:123:35 | [transitive] call to local function CaptureOutMultipleLambdas | captured sink40 | Capture.cs:123:9:123:35 | SSA call def(sink40) | -| Capture.cs:134:9:134:25 | call to local function CaptureThrough1 | captured sink33 | Capture.cs:134:9:134:25 | SSA call def(sink33) | -| Capture.cs:146:9:146:25 | [transitive] call to local function CaptureThrough2 | captured sink34 | Capture.cs:146:9:146:25 | SSA call def(sink34) | -| Capture.cs:155:9:155:45 | [transitive] call to method Select | captured sink35 | Capture.cs:155:9:155:45 | SSA call def(sink35) | | Capture.cs:155:9:155:45 | call to method Select | normal | Capture.cs:155:9:155:45 | call to method Select | | Capture.cs:155:9:155:55 | call to method ToArray | normal | Capture.cs:155:9:155:55 | call to method ToArray | | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 | normal | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 | -| Capture.cs:170:9:170:32 | call to local function CaptureThrough5 | captured sink37 | Capture.cs:170:9:170:32 | SSA call def(sink37) | | Capture.cs:193:20:193:22 | call to local function M | normal | Capture.cs:193:20:193:22 | call to local function M | | Capture.cs:196:22:196:32 | call to local function Id | normal | Capture.cs:196:22:196:32 | call to local function Id | | Capture.cs:198:20:198:25 | call to local function Id | normal | Capture.cs:198:20:198:25 | call to local function Id | | Capture.cs:221:18:221:35 | call to method M3 | normal | Capture.cs:221:18:221:35 | call to method M3 | | Capture.cs:223:28:223:45 | call to method M3 | normal | Capture.cs:223:28:223:45 | call to method M3 | | Capture.cs:227:24:227:48 | object creation of type List | normal | Capture.cs:227:24:227:48 | object creation of type List | -| Capture.cs:229:9:233:10 | [transitive] call to method ForEach | captured x | Capture.cs:229:9:233:10 | SSA call def(x) | | Capture.cs:241:17:241:29 | object creation of type Capture | normal | Capture.cs:241:17:241:29 | object creation of type Capture | | Capture.cs:256:17:256:29 | object creation of type Capture | normal | Capture.cs:256:17:256:29 | object creation of type Capture | -| Capture.cs:290:9:290:16 | [transitive] delegate call | captured x | Capture.cs:290:9:290:16 | SSA call def(x) | -| Capture.cs:323:9:323:11 | delegate call | captured x | Capture.cs:323:9:323:11 | SSA call def(x) | +| GlobalDataFlow.cs:13:14:13:21 | call to constructor Object | normal | GlobalDataFlow.cs:13:14:13:21 | call to constructor Object | | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:26:9:26:26 | access to property SinkProperty0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | normal | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | | GlobalDataFlow.cs:30:9:30:29 | access to property NonSinkProperty0 | normal | GlobalDataFlow.cs:30:9:30:29 | access to property NonSinkProperty0 | @@ -155,17 +145,20 @@ | GlobalDataFlow.cs:249:24:249:34 | access to property Result | normal | GlobalDataFlow.cs:249:24:249:34 | access to property Result | | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc | normal | GlobalDataFlow.cs:300:17:300:38 | call to method ApplyFunc | | GlobalDataFlow.cs:389:16:389:19 | delegate call | normal | GlobalDataFlow.cs:389:16:389:19 | delegate call | +| GlobalDataFlow.cs:415:11:415:14 | call to constructor Object | normal | GlobalDataFlow.cs:415:11:415:14 | call to constructor Object | | GlobalDataFlow.cs:448:22:448:65 | call to method Join | normal | GlobalDataFlow.cs:448:22:448:65 | call to method Join | | GlobalDataFlow.cs:451:23:451:65 | call to method Join | normal | GlobalDataFlow.cs:451:23:451:65 | call to method Join | | GlobalDataFlow.cs:457:20:457:49 | call to method Run | normal | GlobalDataFlow.cs:457:20:457:49 | call to method Run | | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait | normal | GlobalDataFlow.cs:458:25:458:50 | call to method ConfigureAwait | | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter | normal | GlobalDataFlow.cs:459:23:459:44 | call to method GetAwaiter | | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult | normal | GlobalDataFlow.cs:460:22:460:40 | call to method GetResult | +| GlobalDataFlow.cs:476:18:476:28 | call to constructor Object | normal | GlobalDataFlow.cs:476:18:476:28 | call to constructor Object | | GlobalDataFlow.cs:488:18:488:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:488:18:488:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:489:18:489:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:489:18:489:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:494:18:494:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:494:18:494:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:495:18:495:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:495:18:495:34 | object creation of type SimpleClass | | GlobalDataFlow.cs:496:18:496:34 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:496:18:496:34 | object creation of type SimpleClass | +| GlobalDataFlow.cs:503:19:503:32 | call to constructor SimpleClass | normal | GlobalDataFlow.cs:503:19:503:32 | call to constructor SimpleClass | | GlobalDataFlow.cs:507:17:507:36 | object creation of type SubSimpleClass | normal | GlobalDataFlow.cs:507:17:507:36 | object creation of type SubSimpleClass | | GlobalDataFlow.cs:514:17:514:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:514:17:514:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:522:17:522:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:522:17:522:33 | object creation of type SimpleClass | @@ -173,6 +166,7 @@ | GlobalDataFlow.cs:524:17:524:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:524:17:524:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:545:17:545:33 | object creation of type SimpleClass | normal | GlobalDataFlow.cs:545:17:545:33 | object creation of type SimpleClass | | GlobalDataFlow.cs:558:44:558:47 | delegate call | normal | GlobalDataFlow.cs:558:44:558:47 | delegate call | +| GlobalDataFlowStringBuilder.cs:13:14:13:34 | call to constructor Object | normal | GlobalDataFlowStringBuilder.cs:13:14:13:34 | call to constructor Object | | GlobalDataFlowStringBuilder.cs:19:9:19:20 | call to method Append | normal | GlobalDataFlowStringBuilder.cs:19:9:19:20 | call to method Append | | GlobalDataFlowStringBuilder.cs:24:9:24:27 | call to method Append | normal | GlobalDataFlowStringBuilder.cs:24:9:24:27 | call to method Append | | GlobalDataFlowStringBuilder.cs:29:18:29:36 | object creation of type StringBuilder | normal | GlobalDataFlowStringBuilder.cs:29:18:29:36 | object creation of type StringBuilder | @@ -186,6 +180,7 @@ | GlobalDataFlowStringBuilder.cs:44:9:44:18 | call to method Clear | normal | GlobalDataFlowStringBuilder.cs:44:9:44:18 | call to method Clear | | GlobalDataFlowStringBuilder.cs:45:23:45:35 | call to method ToString | normal | GlobalDataFlowStringBuilder.cs:45:23:45:35 | call to method ToString | | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString | normal | GlobalDataFlowStringBuilder.cs:49:21:49:33 | call to method ToString | +| Splitting.cs:1:7:1:15 | call to constructor Object | normal | Splitting.cs:1:7:1:15 | call to constructor Object | | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return | normal | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return | | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return | normal | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return | | Splitting.cs:20:22:20:30 | call to method Return | normal | Splitting.cs:20:22:20:30 | call to method Return | diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected index a17520910af..61ffecc4760 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTracking.expected @@ -13,15 +13,20 @@ | Capture.cs:171:15:171:20 | access to local variable sink37 | | Capture.cs:197:15:197:20 | access to local variable sink38 | | Capture.cs:206:19:206:19 | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | | Capture.cs:231:19:231:19 | access to local variable x | | Capture.cs:234:15:234:15 | access to local variable x | +| Capture.cs:246:19:246:25 | access to field Field | | Capture.cs:251:15:251:21 | access to field Field | +| Capture.cs:268:15:268:21 | access to field Field | | Capture.cs:273:30:273:30 | access to parameter x | | Capture.cs:284:23:284:23 | access to local variable x | | Capture.cs:292:15:292:15 | access to local variable x | +| Capture.cs:301:19:301:28 | access to field Field | | Capture.cs:306:15:306:24 | access to field Field | | Capture.cs:312:15:312:15 | access to local variable x | | Capture.cs:319:19:319:19 | access to local variable x | +| Capture.cs:330:47:330:47 | access to local variable x | | Capture.cs:339:45:339:45 | access to local variable x | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected index 42883e2b533..9ccbaf82517 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected @@ -1,59 +1,166 @@ edges -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:11:17:11:22 | access to local variable sink27 : String | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:20:21:20:26 | access to local variable sink28 : String | provenance | | -| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:29:17:29:22 | access to local variable sink29 : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:7:20:7:26 | tainted : String | Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | provenance | | | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:61:36:61:42 | access to parameter tainted : String | provenance | | +| Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | provenance | | | Capture.cs:11:17:11:22 | access to local variable sink27 : String | Capture.cs:12:19:12:24 | access to local variable sink27 | provenance | | +| Capture.cs:11:26:11:32 | access to parameter tainted : String | Capture.cs:11:17:11:22 | access to local variable sink27 : String | provenance | | +| Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | Capture.cs:11:26:11:32 | access to parameter tainted : String | provenance | | +| Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | provenance | | +| Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | provenance | | | Capture.cs:20:21:20:26 | access to local variable sink28 : String | Capture.cs:21:23:21:28 | access to local variable sink28 | provenance | | +| Capture.cs:20:30:20:36 | access to parameter tainted : String | Capture.cs:20:21:20:26 | access to local variable sink28 : String | provenance | | +| Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | Capture.cs:20:30:20:36 | access to parameter tainted : String | provenance | | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | provenance | | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | provenance | | +| Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | provenance | | | Capture.cs:29:17:29:22 | access to local variable sink29 : String | Capture.cs:30:19:30:24 | access to local variable sink29 | provenance | | -| Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | +| Capture.cs:29:26:29:32 | access to parameter tainted : String | Capture.cs:29:17:29:22 | access to local variable sink29 : String | provenance | | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | Capture.cs:29:26:29:32 | access to parameter tainted : String | provenance | | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | Capture.cs:29:26:29:32 | access to parameter tainted : String | provenance | | +| Capture.cs:50:50:50:55 | sink39 : String | Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | provenance | | | Capture.cs:61:36:61:42 | access to parameter tainted : String | Capture.cs:50:50:50:55 | sink39 : String | provenance | | -| Capture.cs:69:13:69:18 | access to local variable sink30 : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | -| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:69:13:69:18 | access to local variable sink30 : String | provenance | | -| Capture.cs:79:17:79:22 | access to local variable sink31 : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | -| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:79:17:79:22 | access to local variable sink31 : String | provenance | | -| Capture.cs:89:13:89:18 | access to local variable sink32 : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | -| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:89:13:89:18 | access to local variable sink32 : String | provenance | | -| Capture.cs:116:17:116:22 | access to local variable sink40 : String | Capture.cs:124:15:124:20 | access to local variable sink40 | provenance | | -| Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:116:17:116:22 | access to local variable sink40 : String | provenance | | -| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:135:15:135:20 | access to local variable sink33 | provenance | | -| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:147:15:147:20 | access to local variable sink34 | provenance | | -| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:156:15:156:20 | access to local variable sink35 | provenance | | -| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | provenance | | +| Capture.cs:69:22:69:35 | "taint source" : String | Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | provenance | | +| Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | Capture.cs:72:15:72:20 | access to local variable sink30 | provenance | | +| Capture.cs:79:26:79:39 | "taint source" : String | Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | provenance | | +| Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | provenance | | +| Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | Capture.cs:84:15:84:20 | access to local variable sink31 | provenance | | +| Capture.cs:89:22:89:35 | "taint source" : String | Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | provenance | | +| Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | Capture.cs:93:15:93:20 | access to local variable sink32 | provenance | | +| Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | provenance | | +| Capture.cs:116:26:116:39 | "taint source" : String | Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | provenance | | +| Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | Capture.cs:124:15:124:20 | access to local variable sink40 | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | provenance | | +| Capture.cs:127:25:127:31 | tainted : String | Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | provenance | | | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:170:25:170:31 | access to parameter tainted : String | provenance | | | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:196:25:196:31 | access to parameter tainted : String | provenance | | +| Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | provenance | | +| Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | Capture.cs:135:15:135:20 | access to local variable sink33 | provenance | | +| Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | provenance | | +| Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | provenance | | +| Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | Capture.cs:147:15:147:20 | access to local variable sink34 | provenance | | +| Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | provenance | | +| Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | provenance | | +| Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | Capture.cs:156:15:156:20 | access to local variable sink35 | provenance | | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | provenance | | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | provenance | | +| Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | provenance | | | Capture.cs:162:13:162:18 | access to local variable sink36 : String | Capture.cs:163:15:163:20 | access to local variable sink36 | provenance | | +| Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | provenance | | | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | Capture.cs:162:13:162:18 | access to local variable sink36 : String | provenance | | -| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:171:15:171:20 | access to local variable sink37 | provenance | | -| Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | provenance | | +| Capture.cs:166:37:166:37 | p : String | Capture.cs:168:22:168:22 | access to parameter p : String | provenance | | +| Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | Capture.cs:171:15:171:20 | access to local variable sink37 | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:166:37:166:37 | p : String | provenance | | +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | provenance | | +| Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | provenance | | +| Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | provenance | | +| Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | Capture.cs:193:20:193:22 | call to local function M : String | provenance | | | Capture.cs:196:13:196:18 | access to local variable sink38 : String | Capture.cs:197:15:197:20 | access to local variable sink38 | provenance | | | Capture.cs:196:22:196:32 | call to local function Id : String | Capture.cs:196:13:196:18 | access to local variable sink38 : String | provenance | | | Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | provenance | | | Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:196:22:196:32 | call to local function Id : String | provenance | | -| Capture.cs:202:20:202:20 | s : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | provenance | | +| Capture.cs:202:20:202:20 | s : String | Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | provenance | | +| Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | +| Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | Capture.cs:206:19:206:19 | access to parameter s | provenance | | | Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:202:20:202:20 | s : String | provenance | | -| Capture.cs:228:13:228:13 | access to local variable x : String | Capture.cs:231:19:231:19 | access to local variable x | provenance | | -| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:228:13:228:13 | access to local variable x : String | provenance | | -| Capture.cs:232:13:232:13 | access to local variable x : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | -| Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:232:13:232:13 | access to local variable x : String | provenance | | +| Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | provenance | | +| Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | Capture.cs:217:19:217:19 | access to parameter s | provenance | | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | provenance | | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | provenance | | +| Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | provenance | | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:231:19:231:19 | access to local variable x | provenance | | +| Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | Capture.cs:234:15:234:15 | access to local variable x | provenance | | +| Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | provenance | | | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | Capture.cs:246:19:246:25 | access to field Field | provenance | | +| Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:247:23:247:36 | "taint source" : String | Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | provenance | | | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | Capture.cs:251:15:251:21 | access to field Field | provenance | | +| Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | provenance | | +| Capture.cs:264:23:264:36 | "taint source" : String | Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | provenance | | +| Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | Capture.cs:268:15:268:21 | access to field Field | provenance | | | Capture.cs:273:19:273:19 | x : String | Capture.cs:273:30:273:30 | access to parameter x | provenance | | | Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:353:45:353:45 | x : String | provenance | | -| Capture.cs:278:13:278:13 | access to local variable x : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | -| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:278:13:278:13 | access to local variable x : String | provenance | | -| Capture.cs:285:17:285:17 | access to local variable x : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | -| Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:285:17:285:17 | access to local variable x : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | provenance | | +| Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | provenance | | +| Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | provenance | | +| Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | Capture.cs:284:23:284:23 | access to local variable x | provenance | | +| Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | Capture.cs:292:15:292:15 | access to local variable x | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | provenance | | | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | Capture.cs:301:19:301:28 | access to field Field | provenance | | +| Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | provenance | | +| Capture.cs:302:26:302:39 | "taint source" : String | Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | provenance | | +| Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | provenance | | | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | Capture.cs:306:15:306:24 | access to field Field | provenance | | -| Capture.cs:311:13:311:13 | access to local variable x : String | Capture.cs:312:15:312:15 | access to local variable x | provenance | | -| Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:311:13:311:13 | access to local variable x : String | provenance | | -| Capture.cs:318:13:318:13 | access to local variable x : String | Capture.cs:319:19:319:19 | access to local variable x | provenance | | -| Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:318:13:318:13 | access to local variable x : String | provenance | | -| Capture.cs:337:13:337:13 | access to local variable x : String | Capture.cs:339:45:339:45 | access to local variable x | provenance | | -| Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:337:13:337:13 | access to local variable x : String | provenance | | +| Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | provenance | | +| Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | provenance | | +| Capture.cs:328:17:328:30 | "taint source" : String | Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | provenance | | +| Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | provenance | | +| Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | Capture.cs:330:47:330:47 | access to local variable x | provenance | | +| Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | provenance | | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | provenance | | +| Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | Capture.cs:339:45:339:45 | access to local variable x | provenance | | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | Capture.cs:217:19:217:19 | access to parameter s | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | provenance | | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | Capture.cs:57:27:57:32 | access to parameter sink39 | provenance | | | Capture.cs:353:45:353:45 | x : String | Capture.cs:355:11:355:11 | access to parameter x : String | provenance | | | Capture.cs:355:11:355:11 | access to parameter x : String | Capture.cs:273:19:273:19 | x : String | provenance | | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | provenance | | @@ -457,77 +564,168 @@ edges | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:48:13:48:13 | access to local variable s : String | provenance | | nodes | Capture.cs:7:20:7:26 | tainted : String | semmle.label | tainted : String | +| Capture.cs:9:9:13:9 | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | semmle.label | CaptureIn1(...) : CaptureIn1 [captured tainted] : String | | Capture.cs:11:17:11:22 | access to local variable sink27 : String | semmle.label | access to local variable sink27 : String | +| Capture.cs:11:26:11:32 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:12:19:12:24 | access to local variable sink27 | semmle.label | access to local variable sink27 | +| Capture.cs:14:9:14:18 | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | semmle.label | access to local function CaptureIn1 : CaptureIn1 [captured tainted] : String | +| Capture.cs:16:9:24:9 | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | semmle.label | CaptureIn2(...) : CaptureIn2 [captured tainted] : String | +| Capture.cs:18:13:22:13 | M(...) : M [captured tainted] : String | semmle.label | M(...) : M [captured tainted] : String | | Capture.cs:20:21:20:26 | access to local variable sink28 : String | semmle.label | access to local variable sink28 : String | +| Capture.cs:20:30:20:36 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:21:23:21:28 | access to local variable sink28 | semmle.label | access to local variable sink28 | +| Capture.cs:23:13:23:13 | access to local function M : M [captured tainted] : String | semmle.label | access to local function M : M [captured tainted] : String | +| Capture.cs:25:9:25:18 | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | semmle.label | access to local function CaptureIn2 : CaptureIn2 [captured tainted] : String | +| Capture.cs:27:30:27:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureIn3 : (...) => ... [captured tainted] : String | +| Capture.cs:27:43:32:9 | (...) => ... : (...) => ... [captured tainted] : String | semmle.label | (...) => ... : (...) => ... [captured tainted] : String | | Capture.cs:29:17:29:22 | access to local variable sink29 : String | semmle.label | access to local variable sink29 : String | +| Capture.cs:29:26:29:32 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:30:19:30:24 | access to local variable sink29 | semmle.label | access to local variable sink29 | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureIn3 : (...) => ... [captured tainted] : String | +| Capture.cs:33:30:33:39 | access to local variable captureIn3 : Func [captured tainted] : String | semmle.label | access to local variable captureIn3 : Func [captured tainted] : String | | Capture.cs:50:50:50:55 | sink39 : String | semmle.label | sink39 : String | +| Capture.cs:52:23:59:13 | (...) => ... : (...) => ... [captured sink39] : String | semmle.label | (...) => ... : (...) => ... [captured sink39] : String | +| Capture.cs:55:27:58:17 | (...) => ... : (...) => ... [captured sink39] : String | semmle.label | (...) => ... : (...) => ... [captured sink39] : String | | Capture.cs:57:27:57:32 | access to parameter sink39 | semmle.label | access to parameter sink39 | | Capture.cs:61:36:61:42 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | -| Capture.cs:69:13:69:18 | access to local variable sink30 : String | semmle.label | access to local variable sink30 : String | | Capture.cs:69:22:69:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:71:9:71:19 | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | semmle.label | [post] access to local function CaptureOut1 : CaptureOut1 [captured sink30] : String | | Capture.cs:72:15:72:20 | access to local variable sink30 | semmle.label | access to local variable sink30 | -| Capture.cs:79:17:79:22 | access to local variable sink31 : String | semmle.label | access to local variable sink31 : String | | Capture.cs:79:26:79:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:81:13:81:13 | [post] access to local function M : M [captured sink31] : String | semmle.label | [post] access to local function M : M [captured sink31] : String | +| Capture.cs:83:9:83:19 | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | semmle.label | [post] access to local function CaptureOut2 : CaptureOut2 [captured sink31] : String | | Capture.cs:84:15:84:20 | access to local variable sink31 | semmle.label | access to local variable sink31 | -| Capture.cs:89:13:89:18 | access to local variable sink32 : String | semmle.label | access to local variable sink32 : String | | Capture.cs:89:22:89:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:92:30:92:40 | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | semmle.label | [post] access to local variable captureOut3 : (...) => ... [captured sink32] : String | | Capture.cs:93:15:93:20 | access to local variable sink32 | semmle.label | access to local variable sink32 | -| Capture.cs:116:17:116:22 | access to local variable sink40 : String | semmle.label | access to local variable sink40 : String | +| Capture.cs:114:23:117:13 | [post] (...) => ... : (...) => ... [captured sink40] : String | semmle.label | [post] (...) => ... : (...) => ... [captured sink40] : String | | Capture.cs:116:26:116:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:123:9:123:33 | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | semmle.label | [post] access to local function CaptureOutMultipleLambdas : CaptureOutMultipleLambdas [captured sink40] : String | | Capture.cs:124:15:124:20 | access to local variable sink40 | semmle.label | access to local variable sink40 | | Capture.cs:127:25:127:31 | tainted : String | semmle.label | tainted : String | +| Capture.cs:130:9:133:9 | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | semmle.label | CaptureThrough1(...) : CaptureThrough1 [captured tainted] : String | +| Capture.cs:134:9:134:23 | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | semmle.label | [post] access to local function CaptureThrough1 : CaptureThrough1 [captured sink33] : String | +| Capture.cs:134:9:134:23 | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | semmle.label | access to local function CaptureThrough1 : CaptureThrough1 [captured tainted] : String | | Capture.cs:135:15:135:20 | access to local variable sink33 | semmle.label | access to local variable sink33 | +| Capture.cs:138:9:145:9 | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | semmle.label | CaptureThrough2(...) : CaptureThrough2 [captured tainted] : String | +| Capture.cs:146:9:146:23 | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | semmle.label | [post] access to local function CaptureThrough2 : CaptureThrough2 [captured sink34] : String | +| Capture.cs:146:9:146:23 | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | semmle.label | access to local function CaptureThrough2 : CaptureThrough2 [captured tainted] : String | | Capture.cs:147:15:147:20 | access to local variable sink34 | semmle.label | access to local variable sink34 | +| Capture.cs:150:30:150:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | +| Capture.cs:150:48:154:9 | (...) => ... : (...) => ... [captured tainted] : String | semmle.label | (...) => ... : (...) => ... [captured tainted] : String | +| Capture.cs:155:30:155:44 | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | semmle.label | [post] access to local variable captureThrough3 : (...) => ... [captured sink35] : String | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | semmle.label | access to local variable captureThrough3 : (...) => ... [captured tainted] : String | +| Capture.cs:155:30:155:44 | access to local variable captureThrough3 : Func [captured tainted] : String | semmle.label | access to local variable captureThrough3 : Func [captured tainted] : String | | Capture.cs:156:15:156:20 | access to local variable sink35 | semmle.label | access to local variable sink35 | +| Capture.cs:158:9:161:9 | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | semmle.label | CaptureThrough4(...) : CaptureThrough4 [captured tainted] : String | | Capture.cs:162:13:162:18 | access to local variable sink36 : String | semmle.label | access to local variable sink36 : String | +| Capture.cs:162:22:162:36 | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | semmle.label | access to local function CaptureThrough4 : CaptureThrough4 [captured tainted] : String | | Capture.cs:162:22:162:38 | call to local function CaptureThrough4 : String | semmle.label | call to local function CaptureThrough4 : String | | Capture.cs:163:15:163:20 | access to local variable sink36 | semmle.label | access to local variable sink36 | +| Capture.cs:166:37:166:37 | p : String | semmle.label | p : String | +| Capture.cs:168:22:168:22 | access to parameter p : String | semmle.label | access to parameter p : String | +| Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | semmle.label | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | | Capture.cs:170:25:170:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:171:15:171:20 | access to local variable sink37 | semmle.label | access to local variable sink37 | | Capture.cs:190:26:190:26 | s : String | semmle.label | s : String | +| Capture.cs:192:13:192:28 | M(...) : M [captured s] : String | semmle.label | M(...) : M [captured s] : String | +| Capture.cs:193:20:193:20 | access to local function M : M [captured s] : String | semmle.label | access to local function M : M [captured s] : String | | Capture.cs:193:20:193:22 | call to local function M : String | semmle.label | call to local function M : String | | Capture.cs:196:13:196:18 | access to local variable sink38 : String | semmle.label | access to local variable sink38 : String | | Capture.cs:196:22:196:32 | call to local function Id : String | semmle.label | call to local function Id : String | | Capture.cs:196:25:196:31 | access to parameter tainted : String | semmle.label | access to parameter tainted : String | | Capture.cs:197:15:197:20 | access to local variable sink38 | semmle.label | access to local variable sink38 | | Capture.cs:202:20:202:20 | s : String | semmle.label | s : String | +| Capture.cs:204:16:204:16 | access to local variable a : (...) => ... [captured s] : String | semmle.label | access to local variable a : (...) => ... [captured s] : String | +| Capture.cs:204:20:207:9 | (...) => ... : (...) => ... [captured s] : String | semmle.label | (...) => ... : (...) => ... [captured s] : String | | Capture.cs:206:19:206:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:208:9:208:9 | access to local variable a : (...) => ... [captured s] : String | semmle.label | access to local variable a : (...) => ... [captured s] : String | +| Capture.cs:208:9:208:9 | access to local variable a : Action [captured s] : String | semmle.label | access to local variable a : Action [captured s] : String | | Capture.cs:211:21:211:34 | "taint source" : String | semmle.label | "taint source" : String | -| Capture.cs:228:13:228:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:213:22:213:22 | s : String | semmle.label | s : String | +| Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | semmle.label | (...) => ... : (...) => ... [captured s] : String | +| Capture.cs:217:19:217:19 | access to parameter s | semmle.label | access to parameter s | +| Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | semmle.label | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:221:21:221:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | semmle.label | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:223:31:223:44 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:228:17:228:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:229:20:233:9 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:229:20:233:9 | [post] (...) => ... : (...) => ... [captured x] : String | semmle.label | [post] (...) => ... : (...) => ... [captured x] : String | | Capture.cs:231:19:231:19 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:232:13:232:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:232:17:232:30 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:234:15:234:15 | access to local variable x | semmle.label | access to local variable x | | Capture.cs:242:9:242:9 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | | Capture.cs:242:19:242:32 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:244:16:244:16 | access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:244:20:248:9 | (...) => ... : (...) => ... [captured c, field Field] : String | semmle.label | (...) => ... : (...) => ... [captured c, field Field] : String | +| Capture.cs:246:19:246:19 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:246:19:246:25 | access to field Field | semmle.label | access to field Field | +| Capture.cs:247:13:247:13 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:247:23:247:36 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:249:9:249:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:249:9:249:9 | access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:249:9:249:9 | access to local variable a : Action [captured c, field Field] : String | semmle.label | access to local variable a : Action [captured c, field Field] : String | | Capture.cs:251:15:251:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | | Capture.cs:251:15:251:21 | access to field Field | semmle.label | access to field Field | +| Capture.cs:264:13:264:13 | [post] access to local variable c : Capture [field Field] : String | semmle.label | [post] access to local variable c : Capture [field Field] : String | +| Capture.cs:264:23:264:36 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:266:9:266:9 | [post] access to local variable a : (...) => ... [captured c, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured c, field Field] : String | +| Capture.cs:268:15:268:15 | access to local variable c : Capture [field Field] : String | semmle.label | access to local variable c : Capture [field Field] : String | +| Capture.cs:268:15:268:21 | access to field Field | semmle.label | access to field Field | | Capture.cs:273:19:273:19 | x : String | semmle.label | x : String | | Capture.cs:273:30:273:30 | access to parameter x | semmle.label | access to parameter x | | Capture.cs:273:34:273:47 | "taint source" : String | semmle.label | "taint source" : String | -| Capture.cs:278:13:278:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:278:17:278:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:280:16:280:21 | access to local variable middle : (...) => ... [captured x] : String | semmle.label | access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:280:25:288:9 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | +| Capture.cs:282:20:282:24 | access to local variable inner : (...) => ... [captured x] : String | semmle.label | access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:282:28:286:13 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | | Capture.cs:284:23:284:23 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:285:17:285:17 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:285:21:285:34 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:287:13:287:17 | [post] access to local variable inner : (...) => ... [captured x] : String | semmle.label | [post] access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:287:13:287:17 | access to local variable inner : (...) => ... [captured x] : String | semmle.label | access to local variable inner : (...) => ... [captured x] : String | +| Capture.cs:287:13:287:17 | access to local variable inner : Action [captured x] : String | semmle.label | access to local variable inner : Action [captured x] : String | +| Capture.cs:290:9:290:14 | [post] access to local variable middle : (...) => ... [captured x] : String | semmle.label | [post] access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:290:9:290:14 | access to local variable middle : (...) => ... [captured x] : String | semmle.label | access to local variable middle : (...) => ... [captured x] : String | +| Capture.cs:290:9:290:14 | access to local variable middle : Action [captured x] : String | semmle.label | access to local variable middle : Action [captured x] : String | | Capture.cs:292:15:292:15 | access to local variable x | semmle.label | access to local variable x | | Capture.cs:297:9:297:12 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | | Capture.cs:297:22:297:35 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:299:16:299:16 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:299:20:303:9 | (...) => ... : (...) => ... [captured this in M10, field Field] : String | semmle.label | (...) => ... : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:301:19:301:22 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | +| Capture.cs:301:19:301:28 | access to field Field | semmle.label | access to field Field | +| Capture.cs:302:13:302:16 | [post] this access : Capture [field Field] : String | semmle.label | [post] this access : Capture [field Field] : String | +| Capture.cs:302:26:302:39 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:304:9:304:9 | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | [post] access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:304:9:304:9 | access to local variable a : (...) => ... [captured this in M10, field Field] : String | semmle.label | access to local variable a : (...) => ... [captured this in M10, field Field] : String | +| Capture.cs:304:9:304:9 | access to local variable a : Action [captured this in M10, field Field] : String | semmle.label | access to local variable a : Action [captured this in M10, field Field] : String | | Capture.cs:306:15:306:18 | this access : Capture [field Field] : String | semmle.label | this access : Capture [field Field] : String | | Capture.cs:306:15:306:24 | access to field Field | semmle.label | access to field Field | -| Capture.cs:311:13:311:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:311:17:311:30 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:312:15:312:15 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:318:13:318:13 | access to local variable x : String | semmle.label | access to local variable x : String | | Capture.cs:318:17:318:30 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:319:19:319:19 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:337:13:337:13 | access to local variable x : String | semmle.label | access to local variable x : String | +| Capture.cs:328:17:328:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:330:9:330:49 | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | semmle.label | CapturedLocalFunction(...) : CapturedLocalFunction [captured x] : String | +| Capture.cs:330:47:330:47 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | semmle.label | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | | Capture.cs:337:17:337:30 | "taint source" : String | semmle.label | "taint source" : String | +| Capture.cs:339:33:339:46 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | | Capture.cs:339:45:339:45 | access to local variable x | semmle.label | access to local variable x | +| Capture.cs:341:16:341:30 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:341:34:341:55 | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | (...) => ... : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:341:40:341:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | semmle.label | access to local variable capturedLambda : (...) => ... [captured x] : String | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : (...) => ... [captured capturedLambda, captured x] : String | +| Capture.cs:343:9:343:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured s] : String | semmle.label | a : (...) => ... [captured s] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | +| Capture.cs:348:34:348:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | +| Capture.cs:350:9:350:9 | [post] access to parameter a : (...) => ... [captured sink40] : String | semmle.label | [post] access to parameter a : (...) => ... [captured sink40] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured s] : String | semmle.label | access to parameter a : (...) => ... [captured s] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | semmle.label | access to parameter a : (...) => ... [captured sink39] : String | +| Capture.cs:350:9:350:9 | access to parameter a : (...) => ... [captured sink39] : String | semmle.label | access to parameter a : (...) => ... [captured sink39] : String | | Capture.cs:353:45:353:45 | x : String | semmle.label | x : String | | Capture.cs:355:11:355:11 | access to parameter x : String | semmle.label | access to parameter x : String | | GlobalDataFlow.cs:18:9:18:23 | access to field SinkField0 : String | semmle.label | access to field SinkField0 : String | @@ -886,7 +1084,10 @@ nodes | Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s | | Splitting.cs:52:19:52:19 | access to local variable s | semmle.label | access to local variable s | subpaths +| Capture.cs:170:25:170:31 | access to parameter tainted : String | Capture.cs:166:37:166:37 | p : String | Capture.cs:168:22:168:22 | access to parameter p : String | Capture.cs:170:9:170:23 | [post] access to local function CaptureThrough5 : CaptureThrough5 [captured sink37] : String | | Capture.cs:196:25:196:31 | access to parameter tainted : String | Capture.cs:190:26:190:26 | s : String | Capture.cs:193:20:193:22 | call to local function M : String | Capture.cs:196:22:196:32 | call to local function Id : String | +| Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:221:18:221:35 | call to method M3 : (...) => ... [captured s] : String | +| Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:213:22:213:22 | s : String | Capture.cs:215:16:218:9 | (...) => ... : (...) => ... [captured s] : String | Capture.cs:223:28:223:45 | call to method M3 : (...) => ... [captured s] : String | | GlobalDataFlow.cs:71:28:71:45 | access to property SinkProperty0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:71:21:71:46 | call to method Return : String | | GlobalDataFlow.cs:73:94:73:98 | access to local variable sink0 : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:73:29:73:101 | call to method Invoke : String | | GlobalDataFlow.cs:76:19:76:23 | access to local variable sink1 : String | GlobalDataFlow.cs:304:32:304:32 | x : String | GlobalDataFlow.cs:306:9:306:9 | access to parameter y : String | GlobalDataFlow.cs:76:30:76:34 | access to local variable sink2 : String | @@ -924,15 +1125,25 @@ subpaths | Capture.cs:171:15:171:20 | access to local variable sink37 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:171:15:171:20 | access to local variable sink37 | access to local variable sink37 | | Capture.cs:197:15:197:20 | access to local variable sink38 | Capture.cs:127:25:127:31 | tainted : String | Capture.cs:197:15:197:20 | access to local variable sink38 | access to local variable sink38 | | Capture.cs:206:19:206:19 | access to parameter s | Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:206:19:206:19 | access to parameter s | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:217:19:217:19 | access to parameter s | access to parameter s | +| Capture.cs:217:19:217:19 | access to parameter s | Capture.cs:223:31:223:44 | "taint source" : String | Capture.cs:217:19:217:19 | access to parameter s | access to parameter s | | Capture.cs:231:19:231:19 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:231:19:231:19 | access to local variable x | access to local variable x | +| Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:228:17:228:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | | Capture.cs:234:15:234:15 | access to local variable x | Capture.cs:232:17:232:30 | "taint source" : String | Capture.cs:234:15:234:15 | access to local variable x | access to local variable x | +| Capture.cs:246:19:246:25 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:246:19:246:25 | access to field Field | access to field Field | | Capture.cs:251:15:251:21 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:247:23:247:36 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field | +| Capture.cs:268:15:268:21 | access to field Field | Capture.cs:264:23:264:36 | "taint source" : String | Capture.cs:268:15:268:21 | access to field Field | access to field Field | | Capture.cs:273:30:273:30 | access to parameter x | Capture.cs:273:34:273:47 | "taint source" : String | Capture.cs:273:30:273:30 | access to parameter x | access to parameter x | | Capture.cs:284:23:284:23 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:284:23:284:23 | access to local variable x | access to local variable x | +| Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:278:17:278:30 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | | Capture.cs:292:15:292:15 | access to local variable x | Capture.cs:285:21:285:34 | "taint source" : String | Capture.cs:292:15:292:15 | access to local variable x | access to local variable x | +| Capture.cs:301:19:301:28 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:301:19:301:28 | access to field Field | access to field Field | | Capture.cs:306:15:306:24 | access to field Field | Capture.cs:297:22:297:35 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | +| Capture.cs:306:15:306:24 | access to field Field | Capture.cs:302:26:302:39 | "taint source" : String | Capture.cs:306:15:306:24 | access to field Field | access to field Field | | Capture.cs:312:15:312:15 | access to local variable x | Capture.cs:311:17:311:30 | "taint source" : String | Capture.cs:312:15:312:15 | access to local variable x | access to local variable x | | Capture.cs:319:19:319:19 | access to local variable x | Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | access to local variable x | +| Capture.cs:330:47:330:47 | access to local variable x | Capture.cs:328:17:328:30 | "taint source" : String | Capture.cs:330:47:330:47 | access to local variable x | access to local variable x | | Capture.cs:339:45:339:45 | access to local variable x | Capture.cs:337:17:337:30 | "taint source" : String | Capture.cs:339:45:339:45 | access to local variable x | access to local variable x | | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:19:15:19:29 | access to field SinkField0 | access to field SinkField0 | | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:27:15:27:32 | access to property SinkProperty0 | access to property SinkProperty0 | diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 17838631b58..0e656151f08 100644 --- a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1,31 +1,15 @@ | Capture.cs:5:17:5:17 | this | Capture.cs:13:9:13:14 | this access | -| Capture.cs:7:13:7:13 | access to local variable i | Capture.cs:7:13:7:17 | SSA def(i) | | Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:13 | access to local variable i | -| Capture.cs:9:9:12:9 | SSA capture def(i) | Capture.cs:11:17:11:17 | access to local variable i | | Capture.cs:13:9:13:14 | this access | Capture.cs:23:9:23:14 | this access | -| Capture.cs:15:9:22:9 | this | Capture.cs:21:13:21:18 | this access | -| Capture.cs:17:13:20:13 | SSA capture def(i) | Capture.cs:19:21:19:21 | access to local variable i | | Capture.cs:23:9:23:14 | this access | Capture.cs:34:9:34:14 | this access | -| Capture.cs:25:9:33:9 | this | Capture.cs:32:13:32:18 | this access | -| Capture.cs:27:13:30:13 | SSA capture def(i) | Capture.cs:29:21:29:21 | access to local variable i | -| Capture.cs:31:13:31:13 | access to local variable i | Capture.cs:31:13:31:17 | SSA def(i) | | Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:13 | access to local variable i | | Capture.cs:34:9:34:14 | this access | Capture.cs:40:9:40:15 | this access | -| Capture.cs:38:13:38:13 | access to local variable i | Capture.cs:38:13:38:17 | SSA def(i) | | Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:13 | access to local variable i | | Capture.cs:40:9:40:15 | this access | Capture.cs:51:9:51:15 | this access | -| Capture.cs:40:9:40:17 | SSA call def(i) | Capture.cs:41:13:41:13 | access to local variable i | -| Capture.cs:43:9:50:9 | this | Capture.cs:49:13:49:19 | this access | -| Capture.cs:47:17:47:17 | access to local variable i | Capture.cs:47:17:47:21 | SSA def(i) | | Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:17 | access to local variable i | | Capture.cs:51:9:51:15 | this access | Capture.cs:63:9:63:15 | this access | -| Capture.cs:51:9:51:17 | SSA call def(i) | Capture.cs:52:13:52:13 | access to local variable i | -| Capture.cs:54:9:62:9 | this | Capture.cs:60:13:60:19 | this access | -| Capture.cs:58:17:58:17 | access to local variable i | Capture.cs:58:17:58:21 | SSA def(i) | | Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:17 | access to local variable i | -| Capture.cs:61:13:61:13 | access to local variable i | Capture.cs:61:13:61:17 | SSA def(i) | | Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:13 | access to local variable i | -| Capture.cs:63:9:63:17 | SSA call def(i) | Capture.cs:64:13:64:13 | access to local variable i | | LocalDataFlow.cs:48:24:48:24 | b | LocalDataFlow.cs:84:21:84:21 | access to parameter b | | LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected index 6782695246e..e1ea6fe13d9 100644 --- a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected @@ -1,31 +1,15 @@ | Capture.cs:5:17:5:17 | this | Capture.cs:13:9:13:14 | this access | -| Capture.cs:7:13:7:13 | access to local variable i | Capture.cs:7:13:7:17 | SSA def(i) | | Capture.cs:7:17:7:17 | 0 | Capture.cs:7:13:7:13 | access to local variable i | -| Capture.cs:9:9:12:9 | SSA capture def(i) | Capture.cs:11:17:11:17 | access to local variable i | | Capture.cs:13:9:13:14 | this access | Capture.cs:23:9:23:14 | this access | -| Capture.cs:15:9:22:9 | this | Capture.cs:21:13:21:18 | this access | -| Capture.cs:17:13:20:13 | SSA capture def(i) | Capture.cs:19:21:19:21 | access to local variable i | | Capture.cs:23:9:23:14 | this access | Capture.cs:34:9:34:14 | this access | -| Capture.cs:25:9:33:9 | this | Capture.cs:32:13:32:18 | this access | -| Capture.cs:27:13:30:13 | SSA capture def(i) | Capture.cs:29:21:29:21 | access to local variable i | -| Capture.cs:31:13:31:13 | access to local variable i | Capture.cs:31:13:31:17 | SSA def(i) | | Capture.cs:31:17:31:17 | 1 | Capture.cs:31:13:31:13 | access to local variable i | | Capture.cs:34:9:34:14 | this access | Capture.cs:40:9:40:15 | this access | -| Capture.cs:38:13:38:13 | access to local variable i | Capture.cs:38:13:38:17 | SSA def(i) | | Capture.cs:38:17:38:17 | 0 | Capture.cs:38:13:38:13 | access to local variable i | | Capture.cs:40:9:40:15 | this access | Capture.cs:51:9:51:15 | this access | -| Capture.cs:40:9:40:17 | SSA call def(i) | Capture.cs:41:13:41:13 | access to local variable i | -| Capture.cs:43:9:50:9 | this | Capture.cs:49:13:49:19 | this access | -| Capture.cs:47:17:47:17 | access to local variable i | Capture.cs:47:17:47:21 | SSA def(i) | | Capture.cs:47:21:47:21 | 0 | Capture.cs:47:17:47:17 | access to local variable i | | Capture.cs:51:9:51:15 | this access | Capture.cs:63:9:63:15 | this access | -| Capture.cs:51:9:51:17 | SSA call def(i) | Capture.cs:52:13:52:13 | access to local variable i | -| Capture.cs:54:9:62:9 | this | Capture.cs:60:13:60:19 | this access | -| Capture.cs:58:17:58:17 | access to local variable i | Capture.cs:58:17:58:21 | SSA def(i) | | Capture.cs:58:21:58:21 | 1 | Capture.cs:58:17:58:17 | access to local variable i | -| Capture.cs:61:13:61:13 | access to local variable i | Capture.cs:61:13:61:17 | SSA def(i) | | Capture.cs:61:17:61:17 | 1 | Capture.cs:61:13:61:13 | access to local variable i | -| Capture.cs:63:9:63:17 | SSA call def(i) | Capture.cs:64:13:64:13 | access to local variable i | | LocalDataFlow.cs:48:24:48:24 | b | LocalDataFlow.cs:84:21:84:21 | access to parameter b | | LocalDataFlow.cs:51:13:51:17 | access to local variable sink0 | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | | LocalDataFlow.cs:51:13:51:34 | SSA def(sink0) | LocalDataFlow.cs:52:15:52:19 | access to local variable sink0 | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected index 8cb16972603..05e1e3d3a5c 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected @@ -1,12 +1,6 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | i | Capture.cs:8:17:8:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | ... = ... | Capture.cs:14:17:14:17 | access to parameter i | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | Int32 x = ... | Capture.cs:34:13:34:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | ... = ... | Capture.cs:16:17:16:17 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | ... = ... | Capture.cs:44:11:44:11 | access to local variable x | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | Action a = ... | Capture.cs:38:9:38:9 | access to local variable a | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | Int32 y = ... | Capture.cs:26:17:26:17 | access to local variable y | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | Action b = ... | Capture.cs:25:13:25:13 | access to local variable b | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | ... = ... | Capture.cs:41:13:41:13 | access to local variable z | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | Action c = ... | Capture.cs:32:9:32:9 | access to local variable c | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | Action b = ... | Capture.cs:53:9:53:9 | access to local variable b | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | strings | Capture.cs:61:9:61:15 | access to parameter strings | @@ -21,22 +15,15 @@ | Capture.cs:86:64:86:64 | e | Capture.cs:86:64:86:73 | Expression> e = ... | Capture.cs:87:23:87:23 | access to local variable e | | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | d | Capture.cs:92:24:92:24 | access to parameter d | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | Int32 x = ... | Capture.cs:99:20:99:20 | access to local variable x | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | ... = ... | Capture.cs:106:20:106:20 | access to local variable z | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | Int32 x = ... | Capture.cs:118:17:118:17 | access to local variable x | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | ... = ... | Capture.cs:126:17:126:17 | access to local variable b | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | ... = ... | Capture.cs:134:17:134:17 | access to local variable c | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | Int32 f = ... | Capture.cs:155:13:155:13 | access to local variable f | | Capture.cs:198:28:198:29 | eh | Capture.cs:198:28:198:44 | MyEventHandler eh = ... | Capture.cs:199:27:199:28 | access to local variable eh | | Capture.cs:203:28:203:30 | eh2 | Capture.cs:203:28:203:45 | MyEventHandler eh2 = ... | Capture.cs:204:27:204:29 | access to local variable eh2 | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | Process p = ... | Capture.cs:213:17:213:17 | access to local variable p | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | EventHandler exited = ... | Capture.cs:213:29:213:34 | access to local variable exited | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | Int32 i = ... | Capture.cs:254:27:254:27 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | access to local variable i | Capture.cs:255:34:255:34 | access to local variable i | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | b | Consistency.cs:11:17:11:17 | access to parameter b | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | Int32 i = ... | Consistency.cs:16:17:16:17 | access to local variable i | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | Consistency c | Consistency.cs:26:13:26:13 | access to local variable c | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | ... = ... | Consistency.cs:33:9:33:9 | access to parameter c | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | ... = ... | Consistency.cs:39:39:39:39 | access to local variable i | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | S s | Consistency.cs:45:9:45:9 | access to local variable s | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:47:49:47 | access to parameter a | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:49:49:49 | access to parameter i | @@ -51,11 +38,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:44:13:44:17 | Int32 z = ... | DefUse.cs:45:13:45:13 | access to local variable z | | DefUse.cs:44:13:44:13 | z | DefUse.cs:47:23:47:23 | access to local variable z | DefUse.cs:48:13:48:13 | access to local variable z | | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | access to local variable z | DefUse.cs:51:13:51:13 | access to local variable z | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | Int32 i = ... | DefUse.cs:61:13:61:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | ... = ... | DefUse.cs:72:9:72:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | ...++ | DefUse.cs:73:13:73:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | ... = ... | DefUse.cs:76:9:76:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | ...-- | DefUse.cs:77:13:77:13 | access to local variable i | | DefUse.cs:67:19:67:20 | tc | DefUse.cs:67:19:67:27 | TestClass tc = ... | DefUse.cs:68:9:68:10 | access to local variable tc | | DefUse.cs:79:13:79:14 | x1 | DefUse.cs:80:30:80:31 | access to local variable x1 | DefUse.cs:81:13:81:14 | access to local variable x1 | | DefUse.cs:83:13:83:14 | x2 | DefUse.cs:83:13:83:18 | Int32 x2 = ... | DefUse.cs:85:15:85:16 | access to local variable x2 | @@ -77,8 +59,6 @@ | DefUse.cs:152:9:152:14 | Field4 | DefUse.cs:155:9:155:18 | ... = ... | DefUse.cs:156:13:156:18 | access to field Field4 | | DefUse.cs:166:9:166:14 | Field5 | DefUse.cs:184:9:184:18 | ... = ... | DefUse.cs:185:13:185:18 | access to field Field5 | | DefUse.cs:166:9:166:14 | Field5 | DefUse.cs:188:13:188:22 | ... = ... | DefUse.cs:189:17:189:22 | access to field Field5 | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | i | DefUse.cs:169:13:169:13 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | ... = ... | DefUse.cs:174:17:174:17 | access to parameter i | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | Action a = ... | DefUse.cs:181:9:181:9 | access to local variable a | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | ... = ... | DefUse.cs:191:9:191:9 | access to local variable a | | Example.cs:4:9:4:13 | Field | Example.cs:8:9:8:22 | ... = ... | Example.cs:9:13:9:22 | access to field Field | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/ReadAdjacentRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/ReadAdjacentRead.expected index cd51b66ba3b..1b416d1b4f2 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/ReadAdjacentRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/ReadAdjacentRead.expected @@ -1,6 +1,3 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:8:17:8:17 | access to parameter i | Capture.cs:33:13:33:13 | access to parameter i | -| Capture.cs:8:13:8:13 | x | Capture.cs:16:17:16:17 | access to local variable x | Capture.cs:17:21:17:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:45:13:45:13 | access to local variable x | Capture.cs:47:13:47:13 | access to local variable x | | Capture.cs:10:16:10:16 | a | Capture.cs:38:9:38:9 | access to local variable a | Capture.cs:46:12:46:12 | access to local variable a | | Capture.cs:65:45:65:51 | strings | Capture.cs:68:18:68:24 | access to parameter strings | Capture.cs:70:9:70:15 | access to parameter strings | | Consistency.cs:5:9:5:13 | Field | Consistency.cs:26:13:26:19 | access to field Field | Consistency.cs:27:13:27:19 | access to field Field | @@ -22,7 +19,6 @@ | DefUse.cs:144:22:144:22 | x | DefUse.cs:146:17:146:17 | access to local variable x | DefUse.cs:147:17:147:17 | access to local variable x | | DefUse.cs:152:9:152:14 | Field4 | DefUse.cs:156:13:156:18 | access to field Field4 | DefUse.cs:157:13:157:18 | access to field Field4 | | DefUse.cs:152:9:152:14 | Field4 | DefUse.cs:162:13:162:18 | access to field Field4 | DefUse.cs:163:13:163:18 | access to field Field4 | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:177:21:177:21 | access to parameter i | DefUse.cs:178:21:178:21 | access to parameter i | | Example.cs:4:9:4:13 | Field | Example.cs:14:13:14:22 | access to field Field | Example.cs:15:13:15:22 | access to field Field | | Example.cs:6:23:6:23 | i | Example.cs:8:22:8:22 | access to parameter i | Example.cs:10:13:10:13 | access to parameter i | | Example.cs:6:23:6:23 | i | Example.cs:10:13:10:13 | access to parameter i | Example.cs:11:26:11:26 | access to parameter i | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SSAPhi.expected b/csharp/ql/test/library-tests/dataflow/ssa/SSAPhi.expected index 134190ef871..8cbd5e6b1b6 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SSAPhi.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SSAPhi.expected @@ -4,7 +4,6 @@ | DefUse.cs:6:14:6:14 | y | DefUse.cs:23:9:23:15 | SSA phi(y) | DefUse.cs:18:13:18:18 | SSA def(y) | | DefUse.cs:6:14:6:14 | y | DefUse.cs:42:9:42:15 | SSA phi(y) | DefUse.cs:28:13:28:18 | SSA def(y) | | DefUse.cs:6:14:6:14 | y | DefUse.cs:42:9:42:15 | SSA phi(y) | DefUse.cs:39:13:39:18 | SSA def(y) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:3:17:3:19 | SSA phi(i) | DefUse.cs:76:9:76:11 | SSA def(i) | | DefUse.cs:79:13:79:14 | x1 | DefUse.cs:80:30:80:31 | SSA phi(x1) | DefUse.cs:79:13:79:18 | SSA def(x1) | | DefUse.cs:79:13:79:14 | x1 | DefUse.cs:80:30:80:31 | SSA phi(x1) | DefUse.cs:80:30:80:31 | SSA def(x1) | | DefUse.cs:97:13:97:14 | x5 | DefUse.cs:98:16:98:17 | SSA phi(x5) | DefUse.cs:97:13:97:18 | SSA def(x5) | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.expected deleted file mode 100644 index 48aafe94201..00000000000 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.expected +++ /dev/null @@ -1,45 +0,0 @@ -| in | Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:38:9:38:11 | delegate call | false | -| in | Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:44:9:44:12 | call to method M | true | -| in | Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:38:9:38:11 | delegate call | true | -| in | Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:25:13:25:15 | delegate call | false | -| in | Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:44:9:44:12 | call to method M | true | -| in | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:25:13:25:15 | delegate call | false | -| in | Capture.cs:59:13:59:13 | i | Capture.cs:59:13:59:17 | SSA def(i) | Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:61:9:61:25 | call to method Select | true | -| in | Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:68:32:68:49 | SSA capture def(c) | Capture.cs:68:18:68:50 | call to method Where | true | -| in | Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:69:9:69:62 | SSA capture def(c) | Capture.cs:70:9:70:25 | call to method Select | true | -| in | Capture.cs:75:13:75:13 | i | Capture.cs:75:13:75:17 | SSA def(i) | Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:77:9:77:25 | call to method Select | true | -| in | Capture.cs:85:13:85:13 | b | Capture.cs:85:13:85:20 | SSA def(b) | Capture.cs:86:68:86:73 | SSA capture def(b) | Capture.cs:87:9:87:24 | call to method Where | true | -| in | Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:96:9:100:10 | call to local function fn | true | -| in | Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:103:9:107:10 | call to local function fn | true | -| in | Capture.cs:114:13:114:13 | a | Capture.cs:114:13:114:18 | SSA def(a) | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:120:9:120:12 | call to local function M1 | false | -| in | Capture.cs:182:17:182:17 | i | Capture.cs:182:17:182:21 | SSA def(i) | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:187:13:187:17 | call to local function M10 | true | -| in | Capture.cs:182:17:182:17 | i | Capture.cs:188:13:188:17 | SSA def(i) | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:189:13:189:17 | call to local function M11 | false | -| in | Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:200:13:200:19 | delegate call | false | -| in | Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:200:13:200:19 | delegate call | false | -| in | Capture.cs:209:17:209:17 | i | Capture.cs:209:17:209:21 | SSA def(i) | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:213:17:213:24 | access to event Exited | true | -| in | Capture.cs:229:13:229:13 | i | Capture.cs:232:9:232:13 | SSA def(i) | Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:233:9:233:12 | call to local function M2 | false | -| in | Fields.cs:77:13:77:13 | f | Fields.cs:77:13:77:45 | SSA def(f) | Fields.cs:78:27:78:54 | SSA capture def(f) | Fields.cs:81:9:81:11 | delegate call | false | -| in | Fields.cs:77:13:77:13 | f | Fields.cs:77:13:77:45 | SSA def(f) | Fields.cs:78:27:78:54 | SSA capture def(f) | Fields.cs:86:9:86:47 | call to method Select | true | -| in | Fields.cs:78:23:78:23 | a | Fields.cs:78:23:78:54 | SSA def(a) | Fields.cs:86:24:86:46 | SSA capture def(a) | Fields.cs:86:9:86:47 | call to method Select | true | -| in | Fields.cs:79:23:79:23 | b | Fields.cs:79:23:79:35 | SSA def(b) | Fields.cs:89:24:89:46 | SSA capture def(b) | Fields.cs:89:9:89:47 | call to method Select | true | -| in | Properties.cs:73:13:73:13 | f | Properties.cs:73:13:73:32 | SSA def(f) | Properties.cs:74:27:74:54 | SSA capture def(f) | Properties.cs:77:9:77:11 | delegate call | false | -| in | Properties.cs:73:13:73:13 | f | Properties.cs:73:13:73:32 | SSA def(f) | Properties.cs:74:27:74:54 | SSA capture def(f) | Properties.cs:82:9:82:47 | call to method Select | true | -| in | Properties.cs:74:23:74:23 | a | Properties.cs:74:23:74:54 | SSA def(a) | Properties.cs:82:24:82:46 | SSA capture def(a) | Properties.cs:82:9:82:47 | call to method Select | true | -| in | Properties.cs:75:23:75:23 | b | Properties.cs:75:23:75:35 | SSA def(b) | Properties.cs:85:24:85:46 | SSA capture def(b) | Properties.cs:85:9:85:47 | call to method Select | true | -| out | Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:38:9:38:11 | delegate call | false | -| out | Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:44:9:44:12 | call to method M | true | -| out | Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:38:9:38:11 | delegate call | false | -| out | Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:44:9:44:12 | call to method M | true | -| out | Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:32:9:32:11 | delegate call | false | -| out | Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:44:9:44:12 | call to method M | true | -| out | Capture.cs:50:20:50:20 | a | Capture.cs:52:28:52:40 | SSA def(a) | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:53:9:53:11 | delegate call | false | -| out | Capture.cs:59:13:59:13 | i | Capture.cs:60:36:60:38 | SSA def(i) | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:61:9:61:25 | call to method Select | true | -| out | Capture.cs:75:13:75:13 | i | Capture.cs:76:80:76:80 | SSA def(i) | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:77:9:77:25 | call to method Select | true | -| out | Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:103:9:107:10 | call to local function fn | true | -| out | Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:128:9:128:12 | call to local function M2 | false | -| out | Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:136:9:136:12 | call to local function M3 | false | -| out | Capture.cs:139:13:139:13 | d | Capture.cs:142:13:142:17 | SSA def(d) | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:144:9:144:12 | call to local function M4 | false | -| out | Capture.cs:154:13:154:13 | f | Capture.cs:158:13:158:17 | SSA def(f) | Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:160:9:160:12 | call to local function M6 | false | -| out | Capture.cs:168:13:168:13 | h | Capture.cs:174:17:174:21 | SSA def(h) | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:176:13:176:16 | call to local function M9 | false | -| out | Capture.cs:229:13:229:13 | i | Capture.cs:235:21:235:25 | SSA def(i) | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:236:9:236:12 | call to local function M3 | false | -| out | DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:181:9:181:11 | delegate call | false | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.ql b/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.ql deleted file mode 100644 index f5815998200..00000000000 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaCapturedVariableDef.ql +++ /dev/null @@ -1,12 +0,0 @@ -import csharp - -from - string inout, Ssa::ExplicitDefinition def, Ssa::Definition targetDef, ControlFlow::Node call, - boolean additionalCalls -where - inout = "in" and def.isCapturedVariableDefinitionFlowIn(targetDef, call, additionalCalls) - or - inout = "out" and - def.isCapturedVariableDefinitionFlowOut(targetDef, additionalCalls) and - targetDef.(Ssa::ImplicitCallDefinition).getControlFlowNode() = call -select inout, def.getSourceVariable(), def, targetDef, call, additionalCalls diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected index 02d622c006a..aeda9e9b4c1 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected @@ -1,101 +1,37 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:10:20:27:9 | SSA capture def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:19:24:23:13 | SSA capture def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | | Capture.cs:17:17:17:17 | y | Capture.cs:19:24:23:13 | SSA capture def(y) | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | -| Capture.cs:29:13:29:13 | z | Capture.cs:29:13:29:17 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:44:9:44:12 | SSA call def(z) | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | -| Capture.cs:50:20:50:20 | a | Capture.cs:50:20:50:20 | SSA param(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:52:28:52:40 | SSA def(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | -| Capture.cs:59:13:59:13 | i | Capture.cs:59:13:59:17 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:31:60:38 | SSA capture def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:36:60:38 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | -| Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | | Capture.cs:67:13:67:13 | c | Capture.cs:68:32:68:49 | SSA capture def(c) | | Capture.cs:67:13:67:13 | c | Capture.cs:69:9:69:62 | SSA capture def(c) | | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | -| Capture.cs:75:13:75:13 | i | Capture.cs:75:13:75:17 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:67:76:81 | SSA capture def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:80:76:80 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | | Capture.cs:81:28:81:28 | i | Capture.cs:81:34:81:36 | SSA def(i) | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | -| Capture.cs:85:13:85:13 | b | Capture.cs:85:13:85:20 | SSA def(b) | | Capture.cs:85:13:85:13 | b | Capture.cs:86:68:86:73 | SSA capture def(b) | | Capture.cs:86:64:86:64 | e | Capture.cs:86:64:86:73 | SSA def(e) | | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | -| Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | | Capture.cs:94:13:94:13 | y | Capture.cs:96:12:100:9 | SSA capture def(y) | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | -| Capture.cs:102:13:102:13 | z | Capture.cs:102:13:102:18 | SSA def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:103:9:107:10 | SSA call def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | -| Capture.cs:114:13:114:13 | a | Capture.cs:114:13:114:18 | SSA def(a) | | Capture.cs:114:13:114:13 | a | Capture.cs:115:9:119:9 | SSA capture def(a) | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | -| Capture.cs:122:13:122:13 | b | Capture.cs:122:13:122:18 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:128:9:128:12 | SSA call def(b) | -| Capture.cs:130:13:130:13 | c | Capture.cs:130:13:130:18 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | -| Capture.cs:139:13:139:13 | d | Capture.cs:139:13:139:18 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:142:13:142:17 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | -| Capture.cs:147:13:147:13 | e | Capture.cs:147:13:147:18 | SSA def(e) | -| Capture.cs:147:13:147:13 | e | Capture.cs:148:9:152:9 | SSA capture def(e) | -| Capture.cs:147:13:147:13 | e | Capture.cs:151:13:151:17 | SSA def(e) | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:158:13:158:17 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:160:9:160:12 | SSA call def(f) | | Capture.cs:162:13:162:13 | g | Capture.cs:163:9:166:9 | SSA capture def(g) | -| Capture.cs:168:13:168:13 | h | Capture.cs:168:13:168:18 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:171:13:171:17 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:174:17:174:21 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | -| Capture.cs:182:17:182:17 | i | Capture.cs:182:17:182:21 | SSA def(i) | | Capture.cs:182:17:182:17 | i | Capture.cs:183:13:186:13 | SSA capture def(i) | -| Capture.cs:182:17:182:17 | i | Capture.cs:188:13:188:17 | SSA def(i) | -| Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | | Capture.cs:197:17:197:17 | i | Capture.cs:198:33:198:44 | SSA capture def(i) | | Capture.cs:197:17:197:17 | i | Capture.cs:203:34:203:45 | SSA capture def(i) | | Capture.cs:198:28:198:29 | eh | Capture.cs:198:28:198:44 | SSA def(eh) | | Capture.cs:203:28:203:30 | eh2 | Capture.cs:203:28:203:45 | SSA def(eh2) | -| Capture.cs:209:17:209:17 | i | Capture.cs:209:17:209:21 | SSA def(i) | | Capture.cs:209:17:209:17 | i | Capture.cs:212:39:212:71 | SSA capture def(i) | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | -| Capture.cs:229:13:229:13 | i | Capture.cs:231:9:231:49 | SSA capture def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:232:9:232:13 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:235:21:235:25 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:245:13:245:17 | SSA def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | | Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | @@ -103,8 +39,6 @@ | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:38:13:38:13 | SSA def(i) | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | SSA param(i) | @@ -129,13 +63,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:3:17:3:19 | SSA phi(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:60:37:60:41 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | | DefUse.cs:67:19:67:20 | tc | DefUse.cs:67:19:67:27 | SSA def(tc) | @@ -162,11 +89,6 @@ | DefUse.cs:144:22:144:22 | x | DefUse.cs:144:22:144:22 | SSA def(x) | | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:170:9:170:13 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected index 4ec9fbf90b0..69309834706 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected @@ -1,110 +1,44 @@ -| Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:6:16:6:16 | i | -| Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:8:13:8:17 | Int32 x = ... | | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:10:16:27:9 | Action a = ... | -| Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:10:20:27:9 | (...) => ... | -| Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:13:13:13:17 | ... = ... | -| Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:15:13:15:17 | ... = ... | | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:17:17:17:21 | Int32 y = ... | | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:19:20:23:13 | Action b = ... | -| Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:19:24:23:13 | (...) => ... | | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:19:24:23:13 | (...) => ... | -| Capture.cs:29:13:29:17 | SSA def(z) | Capture.cs:29:13:29:17 | Int32 z = ... | | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:30:16:30:35 | Action c = ... | -| Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:30:28:30:32 | ... = ... | -| Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:32:9:32:11 | delegate call | -| Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:37:9:37:13 | ... = ... | -| Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:38:9:38:11 | delegate call | -| Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:38:9:38:11 | delegate call | -| Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:43:9:43:13 | ... = ... | -| Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:44:9:44:12 | call to method M | -| Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:44:9:44:12 | call to method M | -| Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:44:9:44:12 | call to method M | -| Capture.cs:50:20:50:20 | SSA param(a) | Capture.cs:50:20:50:20 | a | | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:52:16:52:43 | Action b = ... | -| Capture.cs:52:28:52:40 | SSA def(a) | Capture.cs:52:28:52:40 | ... = ... | -| Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:53:9:53:11 | delegate call | | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:57:57:57:63 | strings | -| Capture.cs:59:13:59:17 | SSA def(i) | Capture.cs:59:13:59:17 | Int32 i = ... | | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:60:27:60:38 | Func e = ... | -| Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:60:31:60:38 | (...) => ... | -| Capture.cs:60:36:60:38 | SSA def(i) | Capture.cs:60:36:60:38 | ...++ | -| Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:61:9:61:25 | call to method Select | | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:65:45:65:51 | strings | -| Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:67:13:67:19 | Char c = ... | | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:32:68:32 | s | | Capture.cs:68:32:68:49 | SSA capture def(c) | Capture.cs:68:32:68:49 | (...) => ... | | Capture.cs:69:9:69:62 | SSA capture def(c) | Capture.cs:69:9:69:62 | M | | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:25:69:25 | s | | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:73:67:73:73 | strings | -| Capture.cs:75:13:75:17 | SSA def(i) | Capture.cs:75:13:75:17 | Int32 i = ... | | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:76:63:76:81 | Expression> e = ... | -| Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:76:67:76:81 | (...) => ... | -| Capture.cs:76:80:76:80 | SSA def(i) | Capture.cs:76:72:76:81 | call to method Inc | -| Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:77:9:77:25 | call to method Select | | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:28:81:28 | i | | Capture.cs:81:34:81:36 | SSA def(i) | Capture.cs:81:34:81:36 | ...++ | | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:83:65:83:71 | strings | -| Capture.cs:85:13:85:20 | SSA def(b) | Capture.cs:85:13:85:20 | Boolean b = ... | | Capture.cs:86:64:86:73 | SSA def(e) | Capture.cs:86:64:86:73 | Expression> e = ... | | Capture.cs:86:68:86:73 | SSA capture def(b) | Capture.cs:86:68:86:73 | (...) => ... | | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:18:92:18 | d | -| Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:94:13:94:18 | Int32 y = ... | | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:96:12:100:9 | (...) => ... | | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:98:17:98:21 | Int32 x = ... | -| Capture.cs:102:13:102:18 | SSA def(z) | Capture.cs:102:13:102:18 | Int32 z = ... | -| Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:103:9:107:10 | call to local function fn | -| Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:105:13:105:17 | ... = ... | -| Capture.cs:114:13:114:18 | SSA def(a) | Capture.cs:114:13:114:18 | Int32 a = ... | | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:115:9:119:9 | M1 | | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:117:17:117:21 | Int32 x = ... | -| Capture.cs:122:13:122:18 | SSA def(b) | Capture.cs:122:13:122:18 | Int32 b = ... | -| Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:125:13:125:17 | ... = ... | -| Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:128:9:128:12 | call to local function M2 | -| Capture.cs:130:13:130:18 | SSA def(c) | Capture.cs:130:13:130:18 | Int32 c = ... | -| Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:133:13:133:17 | ... = ... | -| Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:136:9:136:12 | call to local function M3 | -| Capture.cs:139:13:139:18 | SSA def(d) | Capture.cs:139:13:139:18 | Int32 d = ... | -| Capture.cs:142:13:142:17 | SSA def(d) | Capture.cs:142:13:142:17 | ... = ... | -| Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:144:9:144:12 | call to local function M4 | -| Capture.cs:147:13:147:18 | SSA def(e) | Capture.cs:147:13:147:18 | Int32 e = ... | -| Capture.cs:148:9:152:9 | SSA capture def(e) | Capture.cs:148:9:152:9 | M5 | -| Capture.cs:151:13:151:17 | SSA def(e) | Capture.cs:151:13:151:17 | ... = ... | -| Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:154:13:154:18 | Int32 f = ... | -| Capture.cs:158:13:158:17 | SSA def(f) | Capture.cs:158:13:158:17 | ... = ... | -| Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:160:9:160:12 | call to local function M6 | | Capture.cs:163:9:166:9 | SSA capture def(g) | Capture.cs:163:9:166:9 | M7 | -| Capture.cs:168:13:168:18 | SSA def(h) | Capture.cs:168:13:168:18 | Int32 h = ... | -| Capture.cs:171:13:171:17 | SSA def(h) | Capture.cs:171:13:171:17 | ... = ... | -| Capture.cs:174:17:174:21 | SSA def(h) | Capture.cs:174:17:174:21 | ... = ... | -| Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:176:13:176:16 | call to local function M9 | -| Capture.cs:182:17:182:21 | SSA def(i) | Capture.cs:182:17:182:21 | Int32 i = ... | | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:183:13:186:13 | M11 | -| Capture.cs:188:13:188:17 | SSA def(i) | Capture.cs:188:13:188:17 | ... = ... | -| Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:197:17:197:21 | Int32 i = ... | | Capture.cs:198:28:198:44 | SSA def(eh) | Capture.cs:198:28:198:44 | MyEventHandler eh = ... | | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:198:33:198:44 | (...) => ... | | Capture.cs:203:28:203:45 | SSA def(eh2) | Capture.cs:203:28:203:45 | MyEventHandler eh2 = ... | | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:203:34:203:45 | (...) => ... | -| Capture.cs:209:17:209:21 | SSA def(i) | Capture.cs:209:17:209:21 | Int32 i = ... | | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:210:24:210:59 | Process p = ... | | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:212:30:212:71 | EventHandler exited = ... | | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:212:39:212:71 | (...) => ... | -| Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:231:9:231:49 | M2 | -| Capture.cs:232:9:232:13 | SSA def(i) | Capture.cs:232:9:232:13 | ... = ... | -| Capture.cs:235:21:235:25 | SSA def(i) | Capture.cs:235:21:235:25 | ... = ... | -| Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:236:9:236:12 | call to local function M3 | -| Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:242:13:242:17 | Int32 i = ... | -| Capture.cs:245:13:245:17 | SSA def(i) | Capture.cs:245:13:245:17 | ... = ... | | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... | -| Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:254:9:254:28 | call to local function CaptureAndRef | | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | b | | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:9:25:30 | call to method Out | | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:25:9:25:30 | call to method Out | | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | ... = ... | -| Consistency.cs:38:13:38:13 | SSA def(i) | Consistency.cs:38:13:38:13 | Int32 i | -| Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:28:39:32 | ... = ... | | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:44:11:44:11 | S s | | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:30:49:30 | a | | Consistency.cs:49:37:49:37 | SSA param(i) | Consistency.cs:49:37:49:37 | i | @@ -126,15 +60,9 @@ | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:50:9:50:24 | call to method refMethod | | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:53:9:53:17 | ... = ... | | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:56:9:56:16 | ... = ... | -| DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:59:13:59:17 | Int32 i = ... | -| DefUse.cs:60:37:60:41 | SSA def(i) | DefUse.cs:60:37:60:41 | ... = ... | | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:63:9:63:18 | ... = ... | | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:66:9:66:18 | ... = ... | | DefUse.cs:67:19:67:27 | SSA def(tc) | DefUse.cs:67:19:67:27 | TestClass tc = ... | -| DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:71:9:71:13 | ... = ... | -| DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:72:9:72:11 | ...++ | -| DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:75:9:75:13 | ... = ... | -| DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:76:9:76:11 | ...-- | | DefUse.cs:79:13:79:18 | SSA def(x1) | DefUse.cs:79:13:79:18 | Int32 x1 = ... | | DefUse.cs:80:30:80:31 | SSA def(x1) | DefUse.cs:80:16:80:32 | call to method refMethod | | DefUse.cs:83:13:83:18 | SSA def(x2) | DefUse.cs:83:13:83:18 | Int32 x2 = ... | @@ -156,12 +84,7 @@ | DefUse.cs:144:22:144:22 | SSA def(x) | DefUse.cs:144:22:144:22 | String x | | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:155:9:155:18 | ... = ... | | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:160:10:160:16 | FieldM2 | -| DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:167:23:167:23 | i | -| DefUse.cs:170:9:170:13 | SSA def(i) | DefUse.cs:170:9:170:13 | ... = ... | | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:171:23:180:9 | Action a = ... | -| DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:173:13:173:17 | ... = ... | -| DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:175:32:179:13 | (...) => ... | -| DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:181:9:181:11 | delegate call | | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:184:9:184:18 | ... = ... | | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:186:9:190:9 | ... = ... | | DefUse.cs:188:13:188:22 | SSA def(this.Field5) | DefUse.cs:188:13:188:22 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefLastRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefLastRead.expected index fe4cfec2ec0..d94da54d008 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefLastRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefLastRead.expected @@ -1,25 +1,10 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:33:13:33:13 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:12:17:12:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:14:17:14:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:39:13:39:13 | access to parameter i | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:34:13:34:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:17:21:17:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:21:21:21:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:40:13:40:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:44:11:44:11 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:47:13:47:13 | access to local variable x | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:46:12:46:12 | access to local variable a | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:26:17:26:17 | access to local variable y | | Capture.cs:17:17:17:17 | y | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:22:21:22:21 | access to local variable y | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:25:13:25:13 | access to local variable b | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:35:13:35:13 | access to local variable z | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:41:13:41:13 | access to local variable z | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:32:9:32:9 | access to local variable c | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:54:9:54:9 | access to parameter a | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:53:9:53:9 | access to local variable b | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:61:9:61:15 | access to parameter strings | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:60:36:60:36 | access to local variable i | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:62:13:62:13 | access to local variable i | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:61:24:61:24 | access to local variable e | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:70:9:70:15 | access to parameter strings | | Capture.cs:67:13:67:13 | c | Capture.cs:68:32:68:49 | SSA capture def(c) | Capture.cs:68:48:68:48 | access to local variable c | @@ -27,8 +12,6 @@ | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:37:68:37 | access to parameter s | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:59:69:59 | access to parameter s | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:77:9:77:15 | access to parameter strings | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:76:80:76:80 | access to local variable i | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:78:13:78:13 | access to local variable i | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:77:24:77:24 | access to local variable e | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:34:81:34 | access to parameter i | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:87:9:87:15 | access to parameter strings | @@ -37,17 +20,9 @@ | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:24:92:24 | access to parameter d | | Capture.cs:94:13:94:13 | y | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:98:21:98:21 | access to local variable y | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:99:20:99:20 | access to local variable x | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:106:20:106:20 | access to local variable z | | Capture.cs:114:13:114:13 | a | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:117:21:117:21 | access to local variable a | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:118:17:118:17 | access to local variable x | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:126:17:126:17 | access to local variable b | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:134:17:134:17 | access to local variable c | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:137:13:137:13 | access to local variable c | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:145:13:145:13 | access to local variable d | -| Capture.cs:147:13:147:13 | e | Capture.cs:148:9:152:9 | SSA capture def(e) | Capture.cs:150:17:150:17 | access to local variable e | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:155:13:155:13 | access to local variable f | | Capture.cs:162:13:162:13 | g | Capture.cs:163:9:166:9 | SSA capture def(g) | Capture.cs:165:17:165:17 | access to local variable g | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:177:17:177:17 | access to local variable h | | Capture.cs:182:17:182:17 | i | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:185:21:185:21 | access to local variable i | | Capture.cs:197:17:197:17 | i | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:198:43:198:43 | access to local variable i | | Capture.cs:197:17:197:17 | i | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:203:44:203:44 | access to local variable i | @@ -56,17 +31,12 @@ | Capture.cs:209:17:209:17 | i | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:212:70:212:70 | access to local variable i | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:213:17:213:17 | access to local variable p | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:213:29:213:34 | access to local variable exited | -| Capture.cs:229:13:229:13 | i | Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:231:47:231:47 | access to local variable i | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:237:34:237:34 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:254:27:254:27 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:255:34:255:34 | access to local variable i | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:11:17:11:17 | access to parameter b | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:27:13:27:13 | access to local variable c | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:27:13:27:19 | access to field Field | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:33:9:33:9 | access to parameter c | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:39:39:39 | access to local variable i | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:46:13:46:13 | access to local variable s | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:47:49:47 | access to parameter a | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | SSA param(i) | Consistency.cs:49:49:49:49 | access to parameter i | @@ -87,11 +57,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:51:13:51:13 | access to local variable z | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:54:13:54:17 | access to field Field | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:57:13:57:16 | access to property Prop | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:61:13:61:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:72:9:72:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:73:13:73:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:76:9:76:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:77:13:77:13 | access to local variable i | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:64:13:64:18 | access to field Field2 | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:80:37:80:42 | access to field Field2 | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:69:13:69:18 | access to field Field3 | @@ -113,10 +78,6 @@ | DefUse.cs:144:22:144:22 | x | DefUse.cs:144:22:144:22 | SSA def(x) | DefUse.cs:147:17:147:17 | access to local variable x | | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:157:13:157:18 | access to field Field4 | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:163:13:163:18 | access to field Field4 | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:169:13:169:13 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:174:17:174:17 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:178:21:178:21 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:182:13:182:13 | access to parameter i | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:181:9:181:9 | access to local variable a | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:191:9:191:9 | access to local variable a | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:185:13:185:18 | access to field Field5 | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected index 56d86ea53cd..000751cad1b 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected @@ -1,76 +1,32 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:6:16:6:16 | i | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:13:13:13:17 | ... = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:8:13:8:17 | Int32 x = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:15:13:15:17 | ... = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:43:9:43:13 | ... = ... | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:10:16:27:9 | Action a = ... | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:17:17:17:21 | Int32 y = ... | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:19:20:23:13 | Action b = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:29:13:29:17 | SSA def(z) | Capture.cs:29:13:29:17 | Int32 z = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:30:28:30:32 | ... = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:37:9:37:13 | ... = ... | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:30:16:30:35 | Action c = ... | -| Capture.cs:50:20:50:20 | a | Capture.cs:50:20:50:20 | SSA param(a) | Capture.cs:50:20:50:20 | a | -| Capture.cs:50:20:50:20 | a | Capture.cs:52:28:52:40 | SSA def(a) | Capture.cs:52:28:52:40 | ... = ... | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:52:16:52:43 | Action b = ... | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:57:57:57:63 | strings | -| Capture.cs:59:13:59:13 | i | Capture.cs:59:13:59:17 | SSA def(i) | Capture.cs:59:13:59:17 | Int32 i = ... | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:36:60:38 | SSA def(i) | Capture.cs:60:36:60:38 | ...++ | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:60:27:60:38 | Func e = ... | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:65:45:65:51 | strings | -| Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:67:13:67:19 | Char c = ... | | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:32:68:32 | s | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:25:69:25 | s | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:73:67:73:73 | strings | -| Capture.cs:75:13:75:13 | i | Capture.cs:75:13:75:17 | SSA def(i) | Capture.cs:75:13:75:17 | Int32 i = ... | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:80:76:80 | SSA def(i) | Capture.cs:76:80:76:80 | access to local variable i | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:76:63:76:81 | Expression> e = ... | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:28:81:28 | i | | Capture.cs:81:28:81:28 | i | Capture.cs:81:34:81:36 | SSA def(i) | Capture.cs:81:34:81:36 | ...++ | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:83:65:83:71 | strings | -| Capture.cs:85:13:85:13 | b | Capture.cs:85:13:85:20 | SSA def(b) | Capture.cs:85:13:85:20 | Boolean b = ... | | Capture.cs:86:64:86:64 | e | Capture.cs:86:64:86:73 | SSA def(e) | Capture.cs:86:64:86:73 | Expression> e = ... | | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:18:92:18 | d | -| Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:94:13:94:18 | Int32 y = ... | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:98:17:98:21 | Int32 x = ... | -| Capture.cs:102:13:102:13 | z | Capture.cs:102:13:102:18 | SSA def(z) | Capture.cs:102:13:102:18 | Int32 z = ... | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:105:13:105:17 | ... = ... | -| Capture.cs:114:13:114:13 | a | Capture.cs:114:13:114:18 | SSA def(a) | Capture.cs:114:13:114:18 | Int32 a = ... | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:117:17:117:21 | Int32 x = ... | -| Capture.cs:122:13:122:13 | b | Capture.cs:122:13:122:18 | SSA def(b) | Capture.cs:122:13:122:18 | Int32 b = ... | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:125:13:125:17 | ... = ... | -| Capture.cs:130:13:130:13 | c | Capture.cs:130:13:130:18 | SSA def(c) | Capture.cs:130:13:130:18 | Int32 c = ... | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:133:13:133:17 | ... = ... | -| Capture.cs:139:13:139:13 | d | Capture.cs:139:13:139:18 | SSA def(d) | Capture.cs:139:13:139:18 | Int32 d = ... | -| Capture.cs:139:13:139:13 | d | Capture.cs:142:13:142:17 | SSA def(d) | Capture.cs:142:13:142:17 | ... = ... | -| Capture.cs:147:13:147:13 | e | Capture.cs:147:13:147:18 | SSA def(e) | Capture.cs:147:13:147:18 | Int32 e = ... | -| Capture.cs:147:13:147:13 | e | Capture.cs:151:13:151:17 | SSA def(e) | Capture.cs:151:13:151:17 | ... = ... | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:154:13:154:18 | Int32 f = ... | -| Capture.cs:154:13:154:13 | f | Capture.cs:158:13:158:17 | SSA def(f) | Capture.cs:158:13:158:17 | ... = ... | -| Capture.cs:168:13:168:13 | h | Capture.cs:168:13:168:18 | SSA def(h) | Capture.cs:168:13:168:18 | Int32 h = ... | -| Capture.cs:168:13:168:13 | h | Capture.cs:171:13:171:17 | SSA def(h) | Capture.cs:171:13:171:17 | ... = ... | -| Capture.cs:168:13:168:13 | h | Capture.cs:174:17:174:21 | SSA def(h) | Capture.cs:174:17:174:21 | ... = ... | -| Capture.cs:182:17:182:17 | i | Capture.cs:182:17:182:21 | SSA def(i) | Capture.cs:182:17:182:21 | Int32 i = ... | -| Capture.cs:182:17:182:17 | i | Capture.cs:188:13:188:17 | SSA def(i) | Capture.cs:188:13:188:17 | ... = ... | -| Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:197:17:197:21 | Int32 i = ... | | Capture.cs:198:28:198:29 | eh | Capture.cs:198:28:198:44 | SSA def(eh) | Capture.cs:198:28:198:44 | MyEventHandler eh = ... | | Capture.cs:203:28:203:30 | eh2 | Capture.cs:203:28:203:45 | SSA def(eh2) | Capture.cs:203:28:203:45 | MyEventHandler eh2 = ... | -| Capture.cs:209:17:209:17 | i | Capture.cs:209:17:209:21 | SSA def(i) | Capture.cs:209:17:209:21 | Int32 i = ... | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:210:24:210:59 | Process p = ... | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:212:30:212:71 | EventHandler exited = ... | -| Capture.cs:229:13:229:13 | i | Capture.cs:232:9:232:13 | SSA def(i) | Capture.cs:232:9:232:13 | ... = ... | -| Capture.cs:229:13:229:13 | i | Capture.cs:235:21:235:25 | SSA def(i) | Capture.cs:235:21:235:25 | ... = ... | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:242:13:242:17 | Int32 i = ... | -| Capture.cs:242:13:242:13 | i | Capture.cs:245:13:245:17 | SSA def(i) | Capture.cs:245:13:245:17 | ... = ... | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:254:27:254:27 | access to local variable i | | Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | b | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:29:25:29 | Consistency c | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | ... = ... | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:38:13:38:13 | SSA def(i) | Consistency.cs:38:13:38:13 | Int32 i | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:28:39:32 | ... = ... | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:44:11:44:11 | S s | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:30:49:30 | a | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | SSA param(i) | Consistency.cs:49:37:49:37 | i | @@ -92,12 +48,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:50:23:50:23 | access to local variable z | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:53:9:53:17 | ... = ... | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:56:9:56:16 | ... = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:59:13:59:17 | Int32 i = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:60:37:60:41 | SSA def(i) | DefUse.cs:60:37:60:41 | ... = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:71:9:71:13 | ... = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:72:9:72:11 | ...++ | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:75:9:75:13 | ... = ... | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:76:9:76:11 | ...-- | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:63:9:63:18 | ... = ... | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:66:9:66:18 | ... = ... | | DefUse.cs:67:19:67:20 | tc | DefUse.cs:67:19:67:27 | SSA def(tc) | DefUse.cs:67:19:67:27 | TestClass tc = ... | @@ -122,9 +72,6 @@ | DefUse.cs:142:68:142:69 | ie | DefUse.cs:142:68:142:69 | SSA param(ie) | DefUse.cs:142:68:142:69 | ie | | DefUse.cs:144:22:144:22 | x | DefUse.cs:144:22:144:22 | SSA def(x) | DefUse.cs:144:22:144:22 | String x | | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:155:9:155:18 | ... = ... | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:167:23:167:23 | i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:170:9:170:13 | SSA def(i) | DefUse.cs:170:9:170:13 | ... = ... | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:173:13:173:17 | ... = ... | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:171:23:180:9 | Action a = ... | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:186:9:190:9 | ... = ... | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:184:9:184:18 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaImplicitCall.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaImplicitCall.expected index 22a56a7da24..189720acf12 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaImplicitCall.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaImplicitCall.expected @@ -1,20 +1,3 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:13:13:13:17 | ... = ... | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:13:13:13:17 | ... = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:15:13:15:17 | ... = ... | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:15:13:15:17 | ... = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:30:28:30:32 | ... = ... | -| Capture.cs:29:13:29:13 | z | Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:30:28:30:32 | ... = ... | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:52:28:52:40 | ... = ... | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:60:36:60:38 | ...++ | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:76:80:76:80 | access to local variable i | -| Capture.cs:102:13:102:13 | z | Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:105:13:105:17 | ... = ... | -| Capture.cs:122:13:122:13 | b | Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:125:13:125:17 | ... = ... | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:133:13:133:17 | ... = ... | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:142:13:142:17 | ... = ... | -| Capture.cs:154:13:154:13 | f | Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:158:13:158:17 | ... = ... | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:174:17:174:21 | ... = ... | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:235:21:235:25 | ... = ... | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:173:13:173:17 | ... = ... | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:191:9:191:11 | SSA call def(this.Field5) | DefUse.cs:188:13:188:22 | ... = ... | | Example.cs:8:9:8:18 | this.Field | Example.cs:13:13:13:23 | SSA call def(this.Field) | Example.cs:8:9:8:22 | ... = ... | | Example.cs:8:9:8:18 | this.Field | Example.cs:13:13:13:23 | SSA call def(this.Field) | Example.cs:11:13:11:30 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected index 48acb24891f..8df92f84755 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected @@ -1,29 +1,11 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:8:17:8:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:33:13:33:13 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:12:17:12:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:14:17:14:17 | access to parameter i | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:39:13:39:13 | access to parameter i | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:34:13:34:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:16:17:16:17 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:17:21:17:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:21:21:21:21 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:40:13:40:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:44:11:44:11 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:45:13:45:13 | access to local variable x | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:47:13:47:13 | access to local variable x | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:38:9:38:9 | access to local variable a | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:46:12:46:12 | access to local variable a | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:26:17:26:17 | access to local variable y | | Capture.cs:17:17:17:17 | y | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:22:21:22:21 | access to local variable y | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:25:13:25:13 | access to local variable b | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:35:13:35:13 | access to local variable z | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:41:13:41:13 | access to local variable z | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:32:9:32:9 | access to local variable c | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:54:9:54:9 | access to parameter a | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:53:9:53:9 | access to local variable b | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:61:9:61:15 | access to parameter strings | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:60:36:60:36 | access to local variable i | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:62:13:62:13 | access to local variable i | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:61:24:61:24 | access to local variable e | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:68:18:68:24 | access to parameter strings | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:70:9:70:15 | access to parameter strings | @@ -32,8 +14,6 @@ | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:37:68:37 | access to parameter s | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:59:69:59 | access to parameter s | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:77:9:77:15 | access to parameter strings | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:76:80:76:80 | access to local variable i | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:78:13:78:13 | access to local variable i | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:77:24:77:24 | access to local variable e | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:34:81:34 | access to parameter i | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:87:9:87:15 | access to parameter strings | @@ -42,17 +22,9 @@ | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:24:92:24 | access to parameter d | | Capture.cs:94:13:94:13 | y | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:98:21:98:21 | access to local variable y | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:99:20:99:20 | access to local variable x | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:106:20:106:20 | access to local variable z | | Capture.cs:114:13:114:13 | a | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:117:21:117:21 | access to local variable a | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:118:17:118:17 | access to local variable x | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:126:17:126:17 | access to local variable b | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:134:17:134:17 | access to local variable c | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:137:13:137:13 | access to local variable c | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:145:13:145:13 | access to local variable d | -| Capture.cs:147:13:147:13 | e | Capture.cs:148:9:152:9 | SSA capture def(e) | Capture.cs:150:17:150:17 | access to local variable e | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:155:13:155:13 | access to local variable f | | Capture.cs:162:13:162:13 | g | Capture.cs:163:9:166:9 | SSA capture def(g) | Capture.cs:165:17:165:17 | access to local variable g | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:177:17:177:17 | access to local variable h | | Capture.cs:182:17:182:17 | i | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:185:21:185:21 | access to local variable i | | Capture.cs:197:17:197:17 | i | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:198:43:198:43 | access to local variable i | | Capture.cs:197:17:197:17 | i | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:203:44:203:44 | access to local variable i | @@ -61,10 +33,6 @@ | Capture.cs:209:17:209:17 | i | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:212:70:212:70 | access to local variable i | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:213:17:213:17 | access to local variable p | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:213:29:213:34 | access to local variable exited | -| Capture.cs:229:13:229:13 | i | Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:231:47:231:47 | access to local variable i | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:237:34:237:34 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:254:27:254:27 | access to local variable i | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:255:34:255:34 | access to local variable i | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:11:17:11:17 | access to parameter b | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | @@ -73,7 +41,6 @@ | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:26:13:26:19 | access to field Field | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:27:13:27:19 | access to field Field | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:33:9:33:9 | access to parameter c | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:39:39:39 | access to local variable i | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:45:9:45:9 | access to local variable s | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:46:13:46:13 | access to local variable s | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:47:49:47 | access to parameter a | @@ -102,11 +69,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:51:13:51:13 | access to local variable z | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:54:13:54:17 | access to field Field | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:57:13:57:16 | access to property Prop | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:61:13:61:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:72:9:72:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:73:13:73:13 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:76:9:76:9 | access to local variable i | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:77:13:77:13 | access to local variable i | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:64:13:64:18 | access to field Field2 | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:80:37:80:42 | access to field Field2 | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:69:13:69:18 | access to field Field3 | @@ -133,11 +95,6 @@ | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:157:13:157:18 | access to field Field4 | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:162:13:162:18 | access to field Field4 | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:163:13:163:18 | access to field Field4 | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:169:13:169:13 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:174:17:174:17 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:177:21:177:21 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:178:21:178:21 | access to parameter i | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:182:13:182:13 | access to parameter i | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:181:9:181:9 | access to local variable a | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:191:9:191:9 | access to local variable a | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:185:13:185:18 | access to field Field5 | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected index bf7db292429..311df004270 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected @@ -1,118 +1,37 @@ -| Capture.cs:6:16:6:16 | i | Capture.cs:6:16:6:16 | SSA param(i) | Capture.cs:6:16:6:16 | SSA param(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:10:20:27:9 | SSA capture def(i) | Capture.cs:10:20:27:9 | SSA capture def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:13:13:13:17 | SSA def(i) | Capture.cs:13:13:13:17 | SSA def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:6:16:6:16 | SSA param(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:38:9:38:11 | SSA call def(i) | Capture.cs:38:9:38:11 | SSA call def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:6:16:6:16 | SSA param(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:38:9:38:11 | SSA call def(i) | -| Capture.cs:6:16:6:16 | i | Capture.cs:44:9:44:12 | SSA call def(i) | Capture.cs:44:9:44:12 | SSA call def(i) | -| Capture.cs:8:13:8:13 | x | Capture.cs:8:13:8:17 | SSA def(x) | Capture.cs:8:13:8:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:15:13:15:17 | SSA def(x) | Capture.cs:15:13:15:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:19:24:23:13 | SSA capture def(x) | Capture.cs:19:24:23:13 | SSA capture def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:8:13:8:17 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:38:9:38:11 | SSA call def(x) | Capture.cs:38:9:38:11 | SSA call def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:43:9:43:13 | SSA def(x) | Capture.cs:43:9:43:13 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:43:9:43:13 | SSA def(x) | -| Capture.cs:8:13:8:13 | x | Capture.cs:44:9:44:12 | SSA call def(x) | Capture.cs:44:9:44:12 | SSA call def(x) | | Capture.cs:10:16:10:16 | a | Capture.cs:10:16:27:9 | SSA def(a) | Capture.cs:10:16:27:9 | SSA def(a) | | Capture.cs:17:17:17:17 | y | Capture.cs:17:17:17:21 | SSA def(y) | Capture.cs:17:17:17:21 | SSA def(y) | | Capture.cs:17:17:17:17 | y | Capture.cs:19:24:23:13 | SSA capture def(y) | Capture.cs:19:24:23:13 | SSA capture def(y) | | Capture.cs:19:20:19:20 | b | Capture.cs:19:20:23:13 | SSA def(b) | Capture.cs:19:20:23:13 | SSA def(b) | -| Capture.cs:29:13:29:13 | z | Capture.cs:29:13:29:17 | SSA def(z) | Capture.cs:29:13:29:17 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:30:28:30:32 | SSA def(z) | Capture.cs:30:28:30:32 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:29:13:29:17 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:32:9:32:11 | SSA call def(z) | Capture.cs:32:9:32:11 | SSA call def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:37:9:37:13 | SSA def(z) | Capture.cs:37:9:37:13 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:37:9:37:13 | SSA def(z) | -| Capture.cs:29:13:29:13 | z | Capture.cs:44:9:44:12 | SSA call def(z) | Capture.cs:44:9:44:12 | SSA call def(z) | | Capture.cs:30:16:30:16 | c | Capture.cs:30:16:30:35 | SSA def(c) | Capture.cs:30:16:30:35 | SSA def(c) | -| Capture.cs:50:20:50:20 | a | Capture.cs:50:20:50:20 | SSA param(a) | Capture.cs:50:20:50:20 | SSA param(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:52:28:52:40 | SSA def(a) | Capture.cs:52:28:52:40 | SSA def(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:50:20:50:20 | SSA param(a) | -| Capture.cs:50:20:50:20 | a | Capture.cs:53:9:53:11 | SSA call def(a) | Capture.cs:53:9:53:11 | SSA call def(a) | | Capture.cs:52:16:52:16 | b | Capture.cs:52:16:52:43 | SSA def(b) | Capture.cs:52:16:52:43 | SSA def(b) | | Capture.cs:57:57:57:63 | strings | Capture.cs:57:57:57:63 | SSA param(strings) | Capture.cs:57:57:57:63 | SSA param(strings) | -| Capture.cs:59:13:59:13 | i | Capture.cs:59:13:59:17 | SSA def(i) | Capture.cs:59:13:59:17 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:31:60:38 | SSA capture def(i) | Capture.cs:60:31:60:38 | SSA capture def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:60:36:60:38 | SSA def(i) | Capture.cs:60:36:60:38 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:59:13:59:17 | SSA def(i) | -| Capture.cs:59:13:59:13 | i | Capture.cs:61:9:61:25 | SSA call def(i) | Capture.cs:61:9:61:25 | SSA call def(i) | | Capture.cs:60:27:60:27 | e | Capture.cs:60:27:60:38 | SSA def(e) | Capture.cs:60:27:60:38 | SSA def(e) | | Capture.cs:65:45:65:51 | strings | Capture.cs:65:45:65:51 | SSA param(strings) | Capture.cs:65:45:65:51 | SSA param(strings) | -| Capture.cs:67:13:67:13 | c | Capture.cs:67:13:67:19 | SSA def(c) | Capture.cs:67:13:67:19 | SSA def(c) | | Capture.cs:67:13:67:13 | c | Capture.cs:68:32:68:49 | SSA capture def(c) | Capture.cs:68:32:68:49 | SSA capture def(c) | | Capture.cs:67:13:67:13 | c | Capture.cs:69:9:69:62 | SSA capture def(c) | Capture.cs:69:9:69:62 | SSA capture def(c) | | Capture.cs:68:32:68:32 | s | Capture.cs:68:32:68:32 | SSA param(s) | Capture.cs:68:32:68:32 | SSA param(s) | | Capture.cs:69:25:69:25 | s | Capture.cs:69:25:69:25 | SSA param(s) | Capture.cs:69:25:69:25 | SSA param(s) | | Capture.cs:73:67:73:73 | strings | Capture.cs:73:67:73:73 | SSA param(strings) | Capture.cs:73:67:73:73 | SSA param(strings) | -| Capture.cs:75:13:75:13 | i | Capture.cs:75:13:75:17 | SSA def(i) | Capture.cs:75:13:75:17 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:67:76:81 | SSA capture def(i) | Capture.cs:76:67:76:81 | SSA capture def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:76:80:76:80 | SSA def(i) | Capture.cs:76:80:76:80 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:75:13:75:17 | SSA def(i) | -| Capture.cs:75:13:75:13 | i | Capture.cs:77:9:77:25 | SSA call def(i) | Capture.cs:77:9:77:25 | SSA call def(i) | | Capture.cs:76:63:76:63 | e | Capture.cs:76:63:76:81 | SSA def(e) | Capture.cs:76:63:76:81 | SSA def(e) | | Capture.cs:81:28:81:28 | i | Capture.cs:81:28:81:28 | SSA param(i) | Capture.cs:81:28:81:28 | SSA param(i) | | Capture.cs:81:28:81:28 | i | Capture.cs:81:34:81:36 | SSA def(i) | Capture.cs:81:34:81:36 | SSA def(i) | | Capture.cs:83:65:83:71 | strings | Capture.cs:83:65:83:71 | SSA param(strings) | Capture.cs:83:65:83:71 | SSA param(strings) | -| Capture.cs:85:13:85:13 | b | Capture.cs:85:13:85:20 | SSA def(b) | Capture.cs:85:13:85:20 | SSA def(b) | | Capture.cs:85:13:85:13 | b | Capture.cs:86:68:86:73 | SSA capture def(b) | Capture.cs:86:68:86:73 | SSA capture def(b) | | Capture.cs:86:64:86:64 | e | Capture.cs:86:64:86:73 | SSA def(e) | Capture.cs:86:64:86:73 | SSA def(e) | | Capture.cs:92:18:92:18 | d | Capture.cs:92:18:92:18 | SSA param(d) | Capture.cs:92:18:92:18 | SSA param(d) | -| Capture.cs:94:13:94:13 | y | Capture.cs:94:13:94:18 | SSA def(y) | Capture.cs:94:13:94:18 | SSA def(y) | | Capture.cs:94:13:94:13 | y | Capture.cs:96:12:100:9 | SSA capture def(y) | Capture.cs:96:12:100:9 | SSA capture def(y) | | Capture.cs:98:17:98:17 | x | Capture.cs:98:17:98:21 | SSA def(x) | Capture.cs:98:17:98:21 | SSA def(x) | -| Capture.cs:102:13:102:13 | z | Capture.cs:102:13:102:18 | SSA def(z) | Capture.cs:102:13:102:18 | SSA def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:102:13:102:18 | SSA def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:103:9:107:10 | SSA call def(z) | Capture.cs:103:9:107:10 | SSA call def(z) | -| Capture.cs:102:13:102:13 | z | Capture.cs:105:13:105:17 | SSA def(z) | Capture.cs:105:13:105:17 | SSA def(z) | -| Capture.cs:114:13:114:13 | a | Capture.cs:114:13:114:18 | SSA def(a) | Capture.cs:114:13:114:18 | SSA def(a) | | Capture.cs:114:13:114:13 | a | Capture.cs:115:9:119:9 | SSA capture def(a) | Capture.cs:115:9:119:9 | SSA capture def(a) | | Capture.cs:117:17:117:17 | x | Capture.cs:117:17:117:21 | SSA def(x) | Capture.cs:117:17:117:21 | SSA def(x) | -| Capture.cs:122:13:122:13 | b | Capture.cs:122:13:122:18 | SSA def(b) | Capture.cs:122:13:122:18 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:125:13:125:17 | SSA def(b) | Capture.cs:125:13:125:17 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:122:13:122:18 | SSA def(b) | -| Capture.cs:122:13:122:13 | b | Capture.cs:128:9:128:12 | SSA call def(b) | Capture.cs:128:9:128:12 | SSA call def(b) | -| Capture.cs:130:13:130:13 | c | Capture.cs:130:13:130:18 | SSA def(c) | Capture.cs:130:13:130:18 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:133:13:133:17 | SSA def(c) | Capture.cs:133:13:133:17 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:130:13:130:18 | SSA def(c) | -| Capture.cs:130:13:130:13 | c | Capture.cs:136:9:136:12 | SSA call def(c) | Capture.cs:136:9:136:12 | SSA call def(c) | -| Capture.cs:139:13:139:13 | d | Capture.cs:139:13:139:18 | SSA def(d) | Capture.cs:139:13:139:18 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:142:13:142:17 | SSA def(d) | Capture.cs:142:13:142:17 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:139:13:139:18 | SSA def(d) | -| Capture.cs:139:13:139:13 | d | Capture.cs:144:9:144:12 | SSA call def(d) | Capture.cs:144:9:144:12 | SSA call def(d) | -| Capture.cs:147:13:147:13 | e | Capture.cs:147:13:147:18 | SSA def(e) | Capture.cs:147:13:147:18 | SSA def(e) | -| Capture.cs:147:13:147:13 | e | Capture.cs:148:9:152:9 | SSA capture def(e) | Capture.cs:148:9:152:9 | SSA capture def(e) | -| Capture.cs:147:13:147:13 | e | Capture.cs:151:13:151:17 | SSA def(e) | Capture.cs:151:13:151:17 | SSA def(e) | -| Capture.cs:154:13:154:13 | f | Capture.cs:154:13:154:18 | SSA def(f) | Capture.cs:154:13:154:18 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:158:13:158:17 | SSA def(f) | Capture.cs:158:13:158:17 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:154:13:154:18 | SSA def(f) | -| Capture.cs:154:13:154:13 | f | Capture.cs:160:9:160:12 | SSA call def(f) | Capture.cs:160:9:160:12 | SSA call def(f) | | Capture.cs:162:13:162:13 | g | Capture.cs:163:9:166:9 | SSA capture def(g) | Capture.cs:163:9:166:9 | SSA capture def(g) | -| Capture.cs:168:13:168:13 | h | Capture.cs:168:13:168:18 | SSA def(h) | Capture.cs:168:13:168:18 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:171:13:171:17 | SSA def(h) | Capture.cs:171:13:171:17 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:174:17:174:21 | SSA def(h) | Capture.cs:174:17:174:21 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:171:13:171:17 | SSA def(h) | -| Capture.cs:168:13:168:13 | h | Capture.cs:176:13:176:16 | SSA call def(h) | Capture.cs:176:13:176:16 | SSA call def(h) | -| Capture.cs:182:17:182:17 | i | Capture.cs:182:17:182:21 | SSA def(i) | Capture.cs:182:17:182:21 | SSA def(i) | | Capture.cs:182:17:182:17 | i | Capture.cs:183:13:186:13 | SSA capture def(i) | Capture.cs:183:13:186:13 | SSA capture def(i) | -| Capture.cs:182:17:182:17 | i | Capture.cs:188:13:188:17 | SSA def(i) | Capture.cs:188:13:188:17 | SSA def(i) | -| Capture.cs:197:17:197:17 | i | Capture.cs:197:17:197:21 | SSA def(i) | Capture.cs:197:17:197:21 | SSA def(i) | | Capture.cs:197:17:197:17 | i | Capture.cs:198:33:198:44 | SSA capture def(i) | Capture.cs:198:33:198:44 | SSA capture def(i) | | Capture.cs:197:17:197:17 | i | Capture.cs:203:34:203:45 | SSA capture def(i) | Capture.cs:203:34:203:45 | SSA capture def(i) | | Capture.cs:198:28:198:29 | eh | Capture.cs:198:28:198:44 | SSA def(eh) | Capture.cs:198:28:198:44 | SSA def(eh) | | Capture.cs:203:28:203:30 | eh2 | Capture.cs:203:28:203:45 | SSA def(eh2) | Capture.cs:203:28:203:45 | SSA def(eh2) | -| Capture.cs:209:17:209:17 | i | Capture.cs:209:17:209:21 | SSA def(i) | Capture.cs:209:17:209:21 | SSA def(i) | | Capture.cs:209:17:209:17 | i | Capture.cs:212:39:212:71 | SSA capture def(i) | Capture.cs:212:39:212:71 | SSA capture def(i) | | Capture.cs:210:24:210:24 | p | Capture.cs:210:24:210:59 | SSA def(p) | Capture.cs:210:24:210:59 | SSA def(p) | | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:212:30:212:71 | SSA def(exited) | -| Capture.cs:229:13:229:13 | i | Capture.cs:231:9:231:49 | SSA capture def(i) | Capture.cs:231:9:231:49 | SSA capture def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:232:9:232:13 | SSA def(i) | Capture.cs:232:9:232:13 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:235:21:235:25 | SSA def(i) | Capture.cs:235:21:235:25 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:232:9:232:13 | SSA def(i) | -| Capture.cs:229:13:229:13 | i | Capture.cs:236:9:236:12 | SSA call def(i) | Capture.cs:236:9:236:12 | SSA call def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:242:13:242:17 | SSA def(i) | Capture.cs:242:13:242:17 | SSA def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:245:13:245:17 | SSA def(i) | Capture.cs:245:13:245:17 | SSA def(i) | -| Capture.cs:242:13:242:13 | i | Capture.cs:254:27:254:27 | SSA def(i) | Capture.cs:254:27:254:27 | SSA def(i) | | Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | SSA def(j) | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | SSA param(b) | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | SSA def(i) | @@ -120,8 +39,6 @@ | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:29:25:29 | SSA def(c) | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | SSA def(c) | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:38:13:38:13 | SSA def(i) | Consistency.cs:38:13:38:13 | SSA def(i) | -| Consistency.cs:38:13:38:13 | i | Consistency.cs:39:28:39:32 | SSA def(i) | Consistency.cs:39:28:39:32 | SSA def(i) | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:44:11:44:11 | SSA def(s) | | Consistency.cs:49:30:49:30 | a | Consistency.cs:49:30:49:30 | SSA param(a) | Consistency.cs:49:30:49:30 | SSA param(a) | | Consistency.cs:49:37:49:37 | i | Consistency.cs:49:37:49:37 | SSA param(i) | Consistency.cs:49:37:49:37 | SSA param(i) | @@ -149,13 +66,6 @@ | DefUse.cs:44:13:44:13 | z | DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:50:23:50:23 | SSA def(z) | | DefUse.cs:53:9:53:13 | this.Field | DefUse.cs:53:9:53:17 | SSA def(this.Field) | DefUse.cs:53:9:53:17 | SSA def(this.Field) | | DefUse.cs:56:9:56:12 | this.Prop | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | DefUse.cs:56:9:56:16 | SSA def(this.Prop) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:3:17:3:19 | SSA phi(i) | DefUse.cs:76:9:76:11 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:59:13:59:17 | SSA def(i) | DefUse.cs:59:13:59:17 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:60:37:60:41 | SSA def(i) | DefUse.cs:60:37:60:41 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:71:9:71:13 | SSA def(i) | DefUse.cs:71:9:71:13 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:72:9:72:11 | SSA def(i) | DefUse.cs:72:9:72:11 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:75:9:75:13 | SSA def(i) | DefUse.cs:75:9:75:13 | SSA def(i) | -| DefUse.cs:59:13:59:13 | i | DefUse.cs:76:9:76:11 | SSA def(i) | DefUse.cs:76:9:76:11 | SSA def(i) | | DefUse.cs:63:9:63:14 | this.Field2 | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | DefUse.cs:63:9:63:18 | SSA def(this.Field2) | | DefUse.cs:66:9:66:14 | this.Field3 | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | DefUse.cs:66:9:66:18 | SSA def(this.Field3) | | DefUse.cs:67:19:67:20 | tc | DefUse.cs:67:19:67:27 | SSA def(tc) | DefUse.cs:67:19:67:27 | SSA def(tc) | @@ -184,12 +94,6 @@ | DefUse.cs:144:22:144:22 | x | DefUse.cs:144:22:144:22 | SSA def(x) | DefUse.cs:144:22:144:22 | SSA def(x) | | DefUse.cs:155:9:155:14 | this.Field4 | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | DefUse.cs:155:9:155:18 | SSA def(this.Field4) | | DefUse.cs:162:13:162:18 | this.Field4 | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | DefUse.cs:160:10:160:16 | SSA entry def(this.Field4) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:167:23:167:23 | SSA param(i) | DefUse.cs:167:23:167:23 | SSA param(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:170:9:170:13 | SSA def(i) | DefUse.cs:170:9:170:13 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:173:13:173:17 | SSA def(i) | DefUse.cs:173:13:173:17 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:175:32:179:13 | SSA capture def(i) | DefUse.cs:175:32:179:13 | SSA capture def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:170:9:170:13 | SSA def(i) | -| DefUse.cs:167:23:167:23 | i | DefUse.cs:181:9:181:11 | SSA call def(i) | DefUse.cs:181:9:181:11 | SSA call def(i) | | DefUse.cs:171:23:171:23 | a | DefUse.cs:171:23:180:9 | SSA def(a) | DefUse.cs:171:23:180:9 | SSA def(a) | | DefUse.cs:171:23:171:23 | a | DefUse.cs:186:9:190:9 | SSA def(a) | DefUse.cs:186:9:190:9 | SSA def(a) | | DefUse.cs:184:9:184:14 | this.Field5 | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | DefUse.cs:184:9:184:18 | SSA def(this.Field5) | diff --git a/csharp/ql/test/query-tests/Nullness/E.cs b/csharp/ql/test/query-tests/Nullness/E.cs index ec2dee0d66f..ec1fa161392 100644 --- a/csharp/ql/test/query-tests/Nullness/E.cs +++ b/csharp/ql/test/query-tests/Nullness/E.cs @@ -420,14 +420,14 @@ public class E static bool Ex43(int? i, IEnumerable @is) { if (i.HasValue) - return @is.Any(j => j == i.Value); // GOOD + return @is.Any(j => j == i.Value); // GOOD (FALSE POSITIVE) return false; } static bool Ex44(int? i, IEnumerable @is) { if (i.HasValue) - @is = @is.Where(j => j == i.Value); // BAD (always) (FALSE NEGATIVE) + @is = @is.Where(j => j == i.Value); // BAD (always) i = null; return @is.Any(); } diff --git a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected index 3789903e8b5..631c2cd7766 100644 --- a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected +++ b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected @@ -408,6 +408,10 @@ nodes | E.cs:405:16:405:16 | access to local variable i | | E.cs:417:24:417:40 | SSA capture def(i) | | E.cs:417:34:417:34 | access to parameter i | +| E.cs:423:28:423:44 | SSA capture def(i) | +| E.cs:423:38:423:38 | access to parameter i | +| E.cs:430:29:430:45 | SSA capture def(i) | +| E.cs:430:39:430:39 | access to parameter i | | E.cs:435:29:435:29 | SSA param(s) | | E.cs:437:13:437:21 | [true] ... is ... | | E.cs:439:13:439:13 | access to parameter s | @@ -803,6 +807,8 @@ edges | E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i | | E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i | | E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i | +| E.cs:423:28:423:44 | SSA capture def(i) | E.cs:423:38:423:38 | access to parameter i | +| E.cs:430:29:430:45 | SSA capture def(i) | E.cs:430:39:430:39 | access to parameter i | | E.cs:435:29:435:29 | SSA param(s) | E.cs:437:13:437:21 | [true] ... is ... | | E.cs:437:13:437:21 | [true] ... is ... | E.cs:439:13:439:13 | access to parameter s | | Forwarding.cs:7:16:7:23 | SSA def(s) | Forwarding.cs:9:13:9:30 | [false] !... | @@ -919,6 +925,8 @@ edges | E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:382:58:382:67 | ... == ... | this | | E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:384:27:384:36 | ... == ... | this | | E.cs:417:34:417:34 | access to parameter i | E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:415:27:415:27 | i | i | E.cs:415:27:415:27 | i | this | +| E.cs:423:38:423:38 | access to parameter i | E.cs:423:28:423:44 | SSA capture def(i) | E.cs:423:38:423:38 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:420:27:420:27 | i | i | E.cs:420:27:420:27 | i | this | +| E.cs:430:39:430:39 | access to parameter i | E.cs:430:29:430:45 | SSA capture def(i) | E.cs:430:39:430:39 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:427:27:427:27 | i | i | E.cs:427:27:427:27 | i | this | | GuardedString.cs:35:31:35:31 | access to local variable s | GuardedString.cs:7:16:7:32 | SSA def(s) | GuardedString.cs:35:31:35:31 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | GuardedString.cs:7:16:7:16 | s | s | GuardedString.cs:7:16:7:32 | String s = ... | this | | NullMaybeBad.cs:7:27:7:27 | access to parameter o | NullMaybeBad.cs:13:17:13:20 | null | NullMaybeBad.cs:7:27:7:27 | access to parameter o | Variable $@ may be null at this access because of $@ null argument. | NullMaybeBad.cs:5:25:5:25 | o | o | NullMaybeBad.cs:13:17:13:20 | null | this | | Params.cs:14:17:14:20 | access to parameter args | Params.cs:20:12:20:15 | null | Params.cs:14:17:14:20 | access to parameter args | Variable $@ may be null at this access because of $@ null argument. | Params.cs:12:36:12:39 | args | args | Params.cs:20:12:20:15 | null | this | From 4bd79c0eb393f8b52850c300e97f4e2577d29421 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 26 Feb 2024 09:58:23 +0100 Subject: [PATCH 139/207] Add change note --- .../ql/lib/change-notes/2024-02-26-variable-capture-flow.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2024-02-26-variable-capture-flow.md diff --git a/csharp/ql/lib/change-notes/2024-02-26-variable-capture-flow.md b/csharp/ql/lib/change-notes/2024-02-26-variable-capture-flow.md new file mode 100644 index 00000000000..66ab65083dc --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-02-26-variable-capture-flow.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Improved support for flow through captured variables that properly adheres to inter-procedural control flow. \ No newline at end of file From 788100d4756a2433c731c5f2615330b60f211dad Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Mon, 26 Feb 2024 10:04:42 +0100 Subject: [PATCH 140/207] C++: Update test after extractor changes --- cpp/ql/test/library-tests/arguments/arguments.expected | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/arguments/arguments.expected b/cpp/ql/test/library-tests/arguments/arguments.expected index efaf3cf81c0..9d0d85857ef 100644 --- a/cpp/ql/test/library-tests/arguments/arguments.expected +++ b/cpp/ql/test/library-tests/arguments/arguments.expected @@ -3,7 +3,7 @@ | arguments.c | 3 | --edg | | arguments.c | 4 | --disable_system_macros | | arguments.c | 5 | --edg | -| arguments.c | 6 | --verbosity | +| arguments.c | 6 | --codeql-verbosity | | arguments.c | 7 | --edg | | arguments.c | 8 | 2 | | arguments.c | 9 | --edg | From 8fbe62ccae07607b968449674934ff7b05f84868 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 26 Feb 2024 10:31:51 +0100 Subject: [PATCH 141/207] Swift: Implement `getExtension` and `getStem` --- swift/ql/lib/codeql/swift/elements/File.qll | 59 +++++++++++++++++++-- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/swift/ql/lib/codeql/swift/elements/File.qll b/swift/ql/lib/codeql/swift/elements/File.qll index 4645c6a1094..823430ee7ee 100644 --- a/swift/ql/lib/codeql/swift/elements/File.qll +++ b/swift/ql/lib/codeql/swift/elements/File.qll @@ -15,11 +15,64 @@ class File extends Generated::File { /** Gets the URL of this file. */ string getURL() { result = "file://" + this.getAbsolutePath() + ":0:0:0:0" } - /** Gets the base name of this file. */ - string getBaseName() { - result = this.getAbsolutePath().regexpCapture(".*/(([^/]*?)(?:\\.([^.]*))?)", 1) + /** + * Holds if either, + * - `part` is the base name of this container and `i = 1`, or + * - `part` is the stem of this container and `i = 2`, or + * - `part` is the extension of this container and `i = 3`. + */ + cached + private predicate splitAbsolutePath(string part, int i) { + part = this.getAbsolutePath().regexpCapture(".*/(([^/]*?)(?:\\.([^.]*))?)", i) } + /** Gets the base name of this file. */ + string getBaseName() { this.splitAbsolutePath(result, 1) } + + /** + * Gets the extension of this container, that is, the suffix of its base name + * after the last dot character, if any. + * + * In particular, + * + * - if the name does not include a dot, there is no extension, so this + * predicate has no result; + * - if the name ends in a dot, the extension is the empty string; + * - if the name contains multiple dots, the extension follows the last dot. + * + * Here are some examples of absolute paths and the corresponding extensions + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathExtension
    "/tmp/tst.txt""txt"
    "/tmp/.classpath""classpath"
    "/bin/bash"not defined
    "/tmp/tst2."""
    "/tmp/x.tar.gz""gz"
    + */ + string getExtension() { this.splitAbsolutePath(result, 3) } + + /** + * Gets the stem of this container, that is, the prefix of its base name up to + * (but not including) the last dot character if there is one, or the entire + * base name if there is not. + * + * Here are some examples of absolute paths and the corresponding stems + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
    Absolute pathStem
    "/tmp/tst.txt""tst"
    "/tmp/.classpath"""
    "/bin/bash""bash"
    "/tmp/tst2.""tst2"
    "/tmp/x.tar.gz""x.tar"
    + */ + string getStem() { this.splitAbsolutePath(result, 2) } + /** * Gets the number of lines containing code in this file. This value * is approximate. From 2257df5c6f5ded8833999f24148d5bb2e0a9bfd3 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 26 Feb 2024 09:36:35 +0000 Subject: [PATCH 142/207] Model Arel::Nodes::SqlLiteral.new --- .../2024-02-26-arel-sqlliteral.md | 4 +++ ruby/ql/lib/codeql/ruby/frameworks/Arel.qll | 36 +++++++++++++++++++ .../security/cwe-089/ArelInjection.rb | 1 + .../security/cwe-089/SqlInjection.expected | 3 ++ 4 files changed, 44 insertions(+) create mode 100644 ruby/ql/lib/change-notes/2024-02-26-arel-sqlliteral.md diff --git a/ruby/ql/lib/change-notes/2024-02-26-arel-sqlliteral.md b/ruby/ql/lib/change-notes/2024-02-26-arel-sqlliteral.md new file mode 100644 index 00000000000..56d2dcf5c73 --- /dev/null +++ b/ruby/ql/lib/change-notes/2024-02-26-arel-sqlliteral.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +Calls to `Arel::Nodes::SqlLiteral.new` are now modeled as instances of the `SqlConstruction` concept, as well as propagating taint from their argument. \ No newline at end of file diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll b/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll index 92fcb9ac5b4..0dd4f3e44a1 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll @@ -39,4 +39,40 @@ module Arel { override DataFlow::Node getSql() { result = this.getArgument(0) } } + + /** + * Flow summary for `Arel::Nodes::SqlLiteral.new`. This method wraps a SQL string, marking it as + * safe. + */ + private class SqlLiteralNewSummary extends SummarizedCallable { + SqlLiteralNewSummary() { this = "Arel::Nodes::SqlLiteral.new" } + + override MethodCall getACall() { + result = + API::getTopLevelMember("Arel") + .getMember("Nodes") + .getMember("SqlLiteral") + .getAMethodCall("new") + .asExpr() + .getExpr() + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + input = "Argument[0]" and output = "ReturnValue" and preservesValue = false + } + } + + /** A call to `Arel::Nodes::SqlLiteral.new`, considered as a SQL construction. */ + private class ArelSqlLiteralNewConstruction extends SqlConstruction::Range, DataFlow::CallNode { + ArelSqlLiteralNewConstruction() { + this.asExpr() = + API::getTopLevelMember("Arel") + .getMember("Nodes") + .getMember("SqlLiteral") + .getAMethodCall("new") + .asExpr() + } + + override DataFlow::Node getSql() { result = this.getArgument(0) } + } } diff --git a/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb b/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb index a1efb3adabb..1cd6782b241 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb +++ b/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb @@ -4,5 +4,6 @@ class PotatoController < ActionController::Base name = params[:user_name] # BAD: SQL statement constructed from user input sql = Arel.sql("SELECT * FROM users WHERE name = #{name}") + sql = Arel::Nodes::SqlLiteral.new("SELECT * FROM users WHERE name = #{name}") end end \ No newline at end of file diff --git a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected index 726aefe7a20..fee6441cf9c 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected @@ -73,6 +73,7 @@ edges | ActiveRecordInjection.rb:198:69:198:84 | call to permitted_params | ActiveRecordInjection.rb:198:69:198:94 | ...[...] | provenance | | | ActiveRecordInjection.rb:198:69:198:94 | ...[...] | ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | provenance | | | ArelInjection.rb:4:5:4:8 | name | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | provenance | | +| ArelInjection.rb:4:5:4:8 | name | ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | provenance | | | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:4:12:4:29 | ...[...] | provenance | | | ArelInjection.rb:4:12:4:29 | ...[...] | ArelInjection.rb:4:5:4:8 | name | provenance | | | PgInjection.rb:6:5:6:8 | name | PgInjection.rb:13:5:13:8 | qry1 | provenance | | @@ -194,6 +195,7 @@ nodes | ArelInjection.rb:4:12:4:17 | call to params | semmle.label | call to params | | ArelInjection.rb:4:12:4:29 | ...[...] | semmle.label | ...[...] | | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." | +| ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." | | PgInjection.rb:6:5:6:8 | name | semmle.label | name | | PgInjection.rb:6:12:6:17 | call to params | semmle.label | call to params | | PgInjection.rb:6:12:6:24 | ...[...] | semmle.label | ...[...] | @@ -244,6 +246,7 @@ subpaths | ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:197:43:197:104 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:193:5:193:10 | call to params | user-provided value | | ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | ActiveRecordInjection.rb:193:5:193:10 | call to params | ActiveRecordInjection.rb:198:35:198:96 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:193:5:193:10 | call to params | user-provided value | | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value | +| ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value | | PgInjection.rb:14:15:14:18 | qry1 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:14:15:14:18 | qry1 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value | | PgInjection.rb:15:21:15:24 | qry1 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:15:21:15:24 | qry1 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value | | PgInjection.rb:20:22:20:25 | qry2 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:20:22:20:25 | qry2 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value | From 403a1ac4830ca7db797b5ceac978c5c1dbbc95a5 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 26 Feb 2024 10:21:26 +0000 Subject: [PATCH 143/207] Fix change note formatting --- .../change-notes/2024-02-20-activerecord-sql-sink-arguments.md | 1 - 1 file changed, 1 deletion(-) diff --git a/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md b/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md index fffc9d6f064..1486c7a472d 100644 --- a/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md +++ b/ruby/ql/lib/change-notes/2024-02-20-activerecord-sql-sink-arguments.md @@ -1,4 +1,3 @@ - --- category: minorAnalysis --- From 5b6e76c03057712c472f62b0ed924c0d8e087361 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 26 Feb 2024 10:32:26 +0100 Subject: [PATCH 144/207] Move `View CFG` implementation from Ruby/Swift into shared library --- .../controlflow/graph/NodeGraph.ql | 7 +- .../ql/lib/ide-contextual-queries/printCfg.ql | 56 +++++------- .../library-tests/controlflow/graph/Cfg.ql | 7 +- shared/controlflow/codeql/controlflow/Cfg.qll | 91 +++++++++++++++++-- .../swift/controlflow/internal/PrintCFG.ql | 55 +++++------ .../library-tests/controlflow/graph/Cfg.ql | 7 +- 6 files changed, 141 insertions(+), 82 deletions(-) diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql index dd6c58d68f7..62805d6e6c9 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql @@ -4,6 +4,9 @@ import csharp import Common -import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl::TestOutput -private class MyRelevantNode extends RelevantNode, SourceControlFlowNode { } +private class MyRelevantNode extends SourceControlFlowNode { + string getOrderDisambiguation() { result = "" } +} + +import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl::TestOutput diff --git a/ruby/ql/lib/ide-contextual-queries/printCfg.ql b/ruby/ql/lib/ide-contextual-queries/printCfg.ql index c902474a55c..1c4cec61a3e 100644 --- a/ruby/ql/lib/ide-contextual-queries/printCfg.ql +++ b/ruby/ql/lib/ide-contextual-queries/printCfg.ql @@ -7,47 +7,35 @@ * @tags ide-contextual-queries/print-cfg */ -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput -private import codeql.IDEContextual private import codeql.Locations +private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl private import codeql.ruby.controlflow.ControlFlowGraph -/** - * Gets the source file to generate a CFG from. - */ external string selectedSourceFile(); -external string selectedSourceLine(); +private predicate selectedSourceFileAlias = selectedSourceFile/0; -external string selectedSourceColumn(); +external int selectedSourceLine(); -bindingset[file, line, column] -private CfgScope smallestEnclosingScope(File file, int line, int column) { - result = - min(Location loc, CfgScope scope | - loc = scope.getLocation() and - ( - loc.getStartLine() < line - or - loc.getStartLine() = line and loc.getStartColumn() <= column - ) and - ( - loc.getEndLine() > line - or - loc.getEndLine() = line and loc.getEndColumn() >= column - ) and - loc.getFile() = file - | - scope - order by - loc.getStartLine() desc, loc.getStartColumn() desc, loc.getEndLine(), loc.getEndColumn() - ) -} +private predicate selectedSourceLineAlias = selectedSourceLine/0; -class MyRelevantNode extends RelevantNode { - MyRelevantNode() { - this.getScope() = - smallestEnclosingScope(getFileBySourceArchiveName(selectedSourceFile()), - selectedSourceLine().toInt(), selectedSourceColumn().toInt()) +external int selectedSourceColumn(); + +private predicate selectedSourceColumnAlias = selectedSourceColumn/0; + +module ViewCfgQueryInput implements ViewCfgQueryInputSig { + predicate selectedSourceFile = selectedSourceFileAlias/0; + + predicate selectedSourceLine = selectedSourceLineAlias/0; + + predicate selectedSourceColumn = selectedSourceColumnAlias/0; + + predicate cfgScopeSpan( + CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + ) { + file = scope.getFile() and + scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) } } + +import ViewCfgQuery diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql index b4a5bbe946f..5e7dfe69d87 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql @@ -3,8 +3,9 @@ */ import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput -class MyRelevantNode extends RelevantNode { - MyRelevantNode() { exists(this) } +class MyRelevantNode extends CfgNode { + string getOrderDisambiguation() { result = "" } } + +import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput diff --git a/shared/controlflow/codeql/controlflow/Cfg.qll b/shared/controlflow/codeql/controlflow/Cfg.qll index 682240972dc..e7e033f9ae2 100644 --- a/shared/controlflow/codeql/controlflow/Cfg.qll +++ b/shared/controlflow/codeql/controlflow/Cfg.qll @@ -4,6 +4,7 @@ */ private import codeql.util.Location +private import codeql.util.FileSystem /** Provides the language-specific input specification. */ signature module InputSig { @@ -1132,19 +1133,19 @@ module Make Input> { final class AstCfgNode = AstCfgNodeImpl; + /** A node to be included in the output of `TestOutput`. */ + signature class RelevantNodeSig extends Node { + /** + * Gets a string used to resolve ties in node and edge ordering. + */ + string getOrderDisambiguation(); + } + /** * Import this module into a `.ql` file of `@kind graph` to render a CFG. The * graph is restricted to nodes from `RelevantNode`. */ - module TestOutput { - /** A CFG node to include in the output. */ - abstract class RelevantNode extends Node { - /** - * Gets a string used to resolve ties in node and edge ordering. - */ - string getOrderDisambiguation() { result = "" } - } - + module TestOutput { /** Holds if `n` is a relevant node in the CFG. */ query predicate nodes(RelevantNode n, string attr, string val) { attr = "semmle.order" and @@ -1192,6 +1193,78 @@ module Make Input> { } } + /** Provides the input to `ViewCfgQuery`. */ + signature module ViewCfgQueryInputSig { + /** The source file selected in the IDE. Should be an `external` predicate. */ + string selectedSourceFile(); + + /** The source line selected in the IDE. Should be an `external` predicate. */ + int selectedSourceLine(); + + /** The source column selected in the IDE. Should be an `external` predicate. */ + int selectedSourceColumn(); + + /** + * Holds if CFG scope `scope` spans column `startColumn` of line `startLine` to + * column `endColumn` of line `endLine` in `file`. + */ + predicate cfgScopeSpan( + CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + ); + } + + /** + * Provides an implementation for a `View CFG` query. + * + * Import this module into a `.ql` that looks like + * + * ```ql + * @name Print CFG + * @description Produces a representation of a file's Control Flow Graph. + * This query is used by the VS Code extension. + * @id /print-cfg + * @kind graph + * @tags ide-contextual-queries/print-cfg + * ``` + */ + module ViewCfgQuery ViewCfgQueryInput> { + private import ViewCfgQueryInput + + bindingset[file, line, column] + private CfgScope smallestEnclosingScope(File file, int line, int column) { + result = + min(CfgScope scope, int startLine, int startColumn, int endLine, int endColumn | + cfgScopeSpan(scope, file, startLine, startColumn, endLine, endColumn) and + ( + startLine < line + or + startLine = line and startColumn <= column + ) and + ( + endLine > line + or + endLine = line and endColumn >= column + ) + | + scope order by startLine desc, startColumn desc, endLine, endColumn + ) + } + + private import IdeContextual + + private class RelevantNode extends Node { + RelevantNode() { + this.getScope() = + smallestEnclosingScope(getFileBySourceArchiveName(selectedSourceFile()), + selectedSourceLine(), selectedSourceColumn()) + } + + string getOrderDisambiguation() { result = "" } + } + + import TestOutput + } + /** Provides a set of consistency queries. */ module Consistency { /** Holds if `s1` and `s2` are distinct representations of the same set. */ diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/PrintCFG.ql b/swift/ql/lib/codeql/swift/controlflow/internal/PrintCFG.ql index fa25c039263..2f9a0572111 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/PrintCFG.ql +++ b/swift/ql/lib/codeql/swift/controlflow/internal/PrintCFG.ql @@ -7,52 +7,45 @@ * @tags ide-contextual-queries/print-cfg */ -private import codeql.IDEContextual +private import codeql.swift.elements.File private import codeql.swift.controlflow.ControlFlowGraph -private import codeql.swift.controlflow.internal.ControlFlowGraphImpl::TestOutput +private import codeql.swift.controlflow.internal.ControlFlowGraphImpl as Impl +private import codeql.swift.controlflow.internal.ControlFlowGraphImplSpecific /** * Gets the source file to generate a CFG from. */ external string selectedSourceFile(); +private predicate selectedSourceFileAlias = selectedSourceFile/0; + /** * Gets the source line to generate a CFG from. */ -external string selectedSourceLine(); +external int selectedSourceLine(); + +private predicate selectedSourceLineAlias = selectedSourceLine/0; /** * Gets the source column to generate a CFG from. */ -external string selectedSourceColumn(); +external int selectedSourceColumn(); -bindingset[file, line, column] -private CfgScope smallestEnclosingScope(File file, int line, int column) { - result = - min(Location loc, CfgScope scope | - loc = scope.getLocation() and - ( - loc.getStartLine() < line - or - loc.getStartLine() = line and loc.getStartColumn() <= column - ) and - ( - loc.getEndLine() > line - or - loc.getEndLine() = line and loc.getEndColumn() >= column - ) and - loc.getFile() = file - | - scope - order by - loc.getStartLine() desc, loc.getStartColumn() desc, loc.getEndLine(), loc.getEndColumn() - ) -} +private predicate selectedSourceColumnAlias = selectedSourceColumn/0; -class MyRelevantNode extends RelevantNode { - MyRelevantNode() { - this.getScope() = - smallestEnclosingScope(getFileBySourceArchiveName(selectedSourceFile()), - selectedSourceLine().toInt(), selectedSourceColumn().toInt()) +module ViewCfgQueryInput implements Impl::ViewCfgQueryInputSig { + predicate selectedSourceFile = selectedSourceFileAlias/0; + + predicate selectedSourceLine = selectedSourceLineAlias/0; + + predicate selectedSourceColumn = selectedSourceColumnAlias/0; + + predicate cfgScopeSpan( + CfgInput::CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + ) { + file = scope.getFile() and + scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) } } + +import Impl::ViewCfgQuery diff --git a/swift/ql/test/library-tests/controlflow/graph/Cfg.ql b/swift/ql/test/library-tests/controlflow/graph/Cfg.ql index 093638e5f87..661ab48818a 100644 --- a/swift/ql/test/library-tests/controlflow/graph/Cfg.ql +++ b/swift/ql/test/library-tests/controlflow/graph/Cfg.ql @@ -4,16 +4,17 @@ import swift import codeql.swift.controlflow.ControlFlowGraph -import codeql.swift.controlflow.internal.ControlFlowGraphImpl::TestOutput -class MyRelevantNode extends RelevantNode { +class MyRelevantNode extends ControlFlowNode { MyRelevantNode() { this.getScope().getLocation().getFile().getName().matches("%swift/ql/test%") } private AstNode asAstNode() { result = this.getAstNode().asAstNode() } - override string getOrderDisambiguation() { + string getOrderDisambiguation() { result = this.asAstNode().getPrimaryQlClasses() or not exists(this.asAstNode()) and result = "" } } + +import codeql.swift.controlflow.internal.ControlFlowGraphImpl::TestOutput From 5b1fb8789a5d6f803c2f10bb1e445debbc340ac8 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 26 Feb 2024 10:21:48 +0100 Subject: [PATCH 145/207] C#: Implement `View CFG` query --- csharp/ql/lib/printCfg.ql | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 csharp/ql/lib/printCfg.ql diff --git a/csharp/ql/lib/printCfg.ql b/csharp/ql/lib/printCfg.ql new file mode 100644 index 00000000000..aa92b119204 --- /dev/null +++ b/csharp/ql/lib/printCfg.ql @@ -0,0 +1,50 @@ +/** + * @name Print CFG + * @description Produces a representation of a file's Control Flow Graph. + * This query is used by the VS Code extension. + * @id cs/print-cfg + * @kind graph + * @tags ide-contextual-queries/print-cfg + */ + +private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl + +external string selectedSourceFile(); + +private predicate selectedSourceFileAlias = selectedSourceFile/0; + +external int selectedSourceLine(); + +private predicate selectedSourceLineAlias = selectedSourceLine/0; + +external int selectedSourceColumn(); + +private predicate selectedSourceColumnAlias = selectedSourceColumn/0; + +module ViewCfgQueryInput implements ViewCfgQueryInputSig { + predicate selectedSourceFile = selectedSourceFileAlias/0; + + predicate selectedSourceLine = selectedSourceLineAlias/0; + + predicate selectedSourceColumn = selectedSourceColumnAlias/0; + + predicate cfgScopeSpan( + CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + ) { + file = scope.getFile() and + scope.getLocation().getStartLine() = startLine and + scope.getLocation().getStartColumn() = startColumn and + exists(Location loc | + loc.getEndLine() = endLine and + loc.getEndColumn() = endColumn + | + loc = scope.(Callable).getBody().getLocation() + or + loc = scope.(Field).getInitializer().getLocation() + or + loc = scope.(Property).getInitializer().getLocation() + ) + } +} + +import ViewCfgQuery From dab8e237e66308df4bd816d688573081824045e2 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 26 Feb 2024 11:33:00 +0100 Subject: [PATCH 146/207] Workflows: Run format check on shared. --- .github/workflows/compile-queries.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-queries.yml b/.github/workflows/compile-queries.yml index 7176c6c1a50..38452f97d36 100644 --- a/.github/workflows/compile-queries.yml +++ b/.github/workflows/compile-queries.yml @@ -28,7 +28,7 @@ jobs: with: key: all-queries - name: check formatting - run: find */ql -type f \( -name "*.qll" -o -name "*.ql" \) -print0 | xargs -0 -n 3000 -P 10 codeql query format -q --check-only + run: find shared */ql -type f \( -name "*.qll" -o -name "*.ql" \) -print0 | xargs -0 -n 3000 -P 10 codeql query format -q --check-only - name: compile queries - check-only # run with --check-only if running in a PR (github.sha != main) if : ${{ github.event_name == 'pull_request' }} From 5f5bcf686dd21554651437ed5b27e385bba4c3de Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 26 Feb 2024 11:35:28 +0100 Subject: [PATCH 147/207] Update csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll Co-authored-by: Michael Nebel --- csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll b/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll index ae0f36f0a26..98447be7e4e 100644 --- a/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll +++ b/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll @@ -174,7 +174,7 @@ private module Annotations { Nullability getChildNullability(Nullability n, int i) { result = getChildNullability0(n, i) or - not exists(getChildNullability0(n, _)) and + not exists(getChildNullability0(n, i)) and result = n } From 386defc3c75a14131c93d8aa7d8e0a213a61a385 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 26 Feb 2024 11:21:03 +0000 Subject: [PATCH 148/207] Update test output --- ruby/ql/test/library-tests/dataflow/local/TaintStep.expected | 1 + 1 file changed, 1 insertion(+) diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 35249d82a65..3f11dd07617 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -2804,6 +2804,7 @@ | file://:0:0:0:0 | [summary param] position 0 in ActionController::Parameters#merge! | file://:0:0:0:0 | [summary] to write: Argument[self] in ActionController::Parameters#merge! | | file://:0:0:0:0 | [summary param] position 0 in ActionController::Parameters#merge! | file://:0:0:0:0 | [summary] to write: ReturnValue in ActionController::Parameters#merge! | | file://:0:0:0:0 | [summary param] position 0 in Arel.sql | file://:0:0:0:0 | [summary] to write: ReturnValue in Arel.sql | +| file://:0:0:0:0 | [summary param] position 0 in Arel::Nodes::SqlLiteral.new | file://:0:0:0:0 | [summary] to write: ReturnValue in Arel::Nodes::SqlLiteral.new | | file://:0:0:0:0 | [summary param] position 0 in Base64.decode64() | file://:0:0:0:0 | [summary] to write: ReturnValue in Base64.decode64() | | file://:0:0:0:0 | [summary param] position 0 in ERB.new | file://:0:0:0:0 | [summary] to write: ReturnValue in ERB.new | | file://:0:0:0:0 | [summary param] position 0 in File.absolute_path | file://:0:0:0:0 | [summary] to write: ReturnValue in File.absolute_path | From fd85c441291fb9fad515fce28b1fff56298c7eac Mon Sep 17 00:00:00 2001 From: Cornelius Riemenschneider Date: Tue, 13 Feb 2024 10:49:28 +0100 Subject: [PATCH 149/207] Ruby: Start building the language pack using bazel. This PR introduces a bazel and `rules_rust`-based build system for the ruby extractor and language pack. This replacese the existing, `cargo` and `cross`-based build system. For local development, nothing changes, and the existing `cargo`-based build still keeps working as-is. We no longer need to use `cross` to compile our Linux binaries, as we now can link against our hermetic C++ toolchain, which ships with an old enough glibc, so that we don't run into symbol version issues when deploying the binaries to older systems. Besides the one change in dependency (explained in detail in `Cargo.toml` and in https://github.com/github/codeql/pull/15595), nothing ought to change in how we build the extractor. --- .github/workflows/ruby-build.yml | 68 +- ruby/BUILD.bazel | 60 + ruby/downgrades/BUILD.bazel | 12 + ruby/extractor/BUILD.bazel | 15 + ruby/extractor/Cargo.Bazel.lock | 8381 ++++++++++++++++++++++++++++++ ruby/extractor/Cargo.lock | Bin 32298 -> 32436 bytes ruby/extractor/Cargo.toml | 21 +- ruby/extractor/Cross.toml | 8 - ruby/ql/lib/BUILD.bazel | 13 + ruby/tools/BUILD.bazel | 11 + 10 files changed, 8513 insertions(+), 76 deletions(-) create mode 100644 ruby/BUILD.bazel create mode 100644 ruby/downgrades/BUILD.bazel create mode 100644 ruby/extractor/BUILD.bazel create mode 100644 ruby/extractor/Cargo.Bazel.lock delete mode 100644 ruby/extractor/Cross.toml create mode 100644 ruby/ql/lib/BUILD.bazel create mode 100644 ruby/tools/BUILD.bazel diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index fda4045cd44..0f529ac8bb9 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -51,9 +51,6 @@ jobs: run: | brew install gnu-tar echo "/usr/local/opt/gnu-tar/libexec/gnubin" >> $GITHUB_PATH - - name: Install cargo-cross - if: runner.os == 'Linux' - run: cargo install cross --version 0.2.5 - uses: ./.github/actions/os-version id: os_version - name: Cache entire extractor @@ -82,16 +79,8 @@ jobs: - name: Run tests if: steps.cache-extractor.outputs.cache-hit != 'true' run: cd extractor && cargo test --verbose - # On linux, build the extractor via cross in a centos7 container. - # This ensures we don't depend on glibc > 2.17. - - name: Release build (linux) - if: steps.cache-extractor.outputs.cache-hit != 'true' && runner.os == 'Linux' - run: | - cd extractor - cross build --release - mv target/x86_64-unknown-linux-gnu/release/codeql-extractor-ruby target/release/ - - name: Release build (windows and macos) - if: steps.cache-extractor.outputs.cache-hit != 'true' && runner.os != 'Linux' + - name: Release build + if: steps.cache-extractor.outputs.cache-hit != 'true' run: cd extractor && cargo build --release - name: Generate dbscheme if: ${{ matrix.os == 'ubuntu-latest' && steps.cache-extractor.outputs.cache-hit != 'true'}} @@ -123,7 +112,7 @@ jobs: - name: Cache compilation cache id: query-cache uses: ./.github/actions/cache-query-compilation - with: + with: key: ruby-build - name: Build Query Pack run: | @@ -235,54 +224,3 @@ jobs: shell: bash run: | codeql database analyze --search-path "${{ runner.temp }}/ruby-bundle" --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls - - # This is a copy of the 'test' job that runs in a centos7 container. - # This tests that the extractor works correctly on systems with an old glibc. - test-centos7: - defaults: - run: - working-directory: ${{ github.workspace }} - strategy: - fail-fast: false - runs-on: ubuntu-latest - container: - image: centos:centos7 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - needs: [package] - steps: - - name: Install gh cli - run: | - yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo - # fetch-codeql requires unzip and jq - # jq is available in epel-release (https://docs.fedoraproject.org/en-US/epel/) - yum install -y gh unzip epel-release - yum install -y jq - - uses: actions/checkout@v3 - - name: Fetch CodeQL - uses: ./.github/actions/fetch-codeql - - # Due to a bug in Actions, we can't use runner.temp in the run blocks here. - # https://github.com/actions/runner/issues/2185 - - - name: Download Ruby bundle - uses: actions/download-artifact@v3 - with: - name: codeql-ruby-bundle - path: ${{ runner.temp }} - - name: Unzip Ruby bundle - shell: bash - run: unzip -q -d "$RUNNER_TEMP"/ruby-bundle "$RUNNER_TEMP"/codeql-ruby-bundle.zip - - - name: Run QL test - shell: bash - run: | - codeql test run --search-path "$RUNNER_TEMP"/ruby-bundle --additional-packs "$RUNNER_TEMP"/ruby-bundle ruby/ql/test/library-tests/ast/constants/ - - name: Create database - shell: bash - run: | - codeql database create --search-path "$RUNNER_TEMP"/ruby-bundle --language ruby --source-root ruby/ql/test/library-tests/ast/constants/ ../database - - name: Analyze database - shell: bash - run: | - codeql database analyze --search-path "$RUNNER_TEMP"/ruby-bundle --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls diff --git a/ruby/BUILD.bazel b/ruby/BUILD.bazel new file mode 100644 index 00000000000..64bba5f0efc --- /dev/null +++ b/ruby/BUILD.bazel @@ -0,0 +1,60 @@ +load("@//:dist.bzl", "dist", "pack_zip") +load("@ql//:defs.bzl", "codeql_platform") +load("@rules_pkg//pkg:mappings.bzl", "pkg_filegroup", "pkg_files") + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "dbscheme", + actual = "//ruby/ql/lib:dbscheme", +) + +alias( + name = "dbscheme-stats", + actual = "//ruby/ql/lib:dbscheme-stats", +) + +pkg_files( + name = "dbscheme-group", + srcs = [ + ":dbscheme", + ":dbscheme-stats", + ], + strip_prefix = None, +) + +pkg_filegroup( + name = "db-files", + srcs = [ + ":dbscheme-group", + "//ruby/downgrades", + ], +) + +pkg_files( + name = "codeql-extractor-yml", + srcs = ["codeql-extractor.yml"], + strip_prefix = None, +) + +dist( + name = "extractor-generic", + srcs = [ + ":codeql-extractor-yml", + ":dbscheme-group", + "//ruby/downgrades", + "//ruby/tools", + ], + prefix = "ruby", + visibility = ["//visibility:public"], +) + +pack_zip( + name = "extractor-arch", + srcs = [ + "//ruby/extractor", + ], + package_file_name = "extractor-" + codeql_platform + ".zip", + prefix = "ruby/tools/" + codeql_platform, + visibility = ["//visibility:public"], +) diff --git a/ruby/downgrades/BUILD.bazel b/ruby/downgrades/BUILD.bazel new file mode 100644 index 00000000000..39bea56f767 --- /dev/null +++ b/ruby/downgrades/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix") + +pkg_files( + name = "downgrades", + srcs = glob( + ["**"], + exclude = ["BUILD.bazel"], + ), + prefix = "downgrades", + strip_prefix = strip_prefix.from_pkg(), + visibility = ["//ruby:__pkg__"], +) diff --git a/ruby/extractor/BUILD.bazel b/ruby/extractor/BUILD.bazel new file mode 100644 index 00000000000..254424fc455 --- /dev/null +++ b/ruby/extractor/BUILD.bazel @@ -0,0 +1,15 @@ +load("@//:common.bzl", "codeql_rust_binary") +load("@ruby_deps//:defs.bzl", "aliases", "all_crate_deps") + +codeql_rust_binary( + name = "extractor", + srcs = glob(["src/*.rs"]), + aliases = aliases(), + proc_macro_deps = all_crate_deps( + proc_macro = True, + ), + visibility = ["//visibility:public"], + deps = all_crate_deps( + normal = True, + ), +) diff --git a/ruby/extractor/Cargo.Bazel.lock b/ruby/extractor/Cargo.Bazel.lock new file mode 100644 index 00000000000..a2215f91967 --- /dev/null +++ b/ruby/extractor/Cargo.Bazel.lock @@ -0,0 +1,8381 @@ +{ + "checksum": "967967dffe2fa38c30836aad92aad831f6eaab77aac76c0710d807bc80a9b2f6", + "crates": { + "adler 1.0.2": { + "name": "adler", + "version": "1.0.2", + "package_url": "https://github.com/jonas-schievink/adler.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/adler/1.0.2/download", + "sha256": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + } + }, + "targets": [ + { + "Library": { + "crate_name": "adler", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "adler", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "1.0.2" + }, + "license": "0BSD OR MIT OR Apache-2.0", + "license_ids": [ + "0BSD", + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "aho-corasick 0.7.20": { + "name": "aho-corasick", + "version": "0.7.20", + "package_url": "https://github.com/BurntSushi/aho-corasick", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/aho-corasick/0.7.20/download", + "sha256": "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" + } + }, + "targets": [ + { + "Library": { + "crate_name": "aho_corasick", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "aho_corasick", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "memchr 2.7.1", + "target": "memchr" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.7.20" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "aho-corasick 1.1.2": { + "name": "aho-corasick", + "version": "1.1.2", + "package_url": "https://github.com/BurntSushi/aho-corasick", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/aho-corasick/1.1.2/download", + "sha256": "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "aho_corasick", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "aho_corasick", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "perf-literal", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "memchr 2.7.1", + "target": "memchr" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.1.2" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "android_system_properties 0.1.5": { + "name": "android_system_properties", + "version": "0.1.5", + "package_url": "https://github.com/nical/android_system_properties", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/android_system_properties/0.1.5/download", + "sha256": "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" + } + }, + "targets": [ + { + "Library": { + "crate_name": "android_system_properties", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "android_system_properties", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.5" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "anstream 0.2.6": { + "name": "anstream", + "version": "0.2.6", + "package_url": "https://github.com/rust-cli/anstyle.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/anstream/0.2.6/download", + "sha256": "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "anstream", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "anstream", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "auto", + "default", + "wincon" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "anstyle 0.3.5", + "target": "anstyle" + }, + { + "id": "anstyle-parse 0.1.1", + "target": "anstyle_parse" + }, + { + "id": "concolor-override 1.0.0", + "target": "concolor_override" + }, + { + "id": "concolor-query 0.3.3", + "target": "concolor_query" + }, + { + "id": "is-terminal 0.4.6", + "target": "is_terminal" + }, + { + "id": "utf8parse 0.2.1", + "target": "utf8parse" + } + ], + "selects": { + "cfg(windows)": [ + { + "id": "anstyle-wincon 0.2.0", + "target": "anstyle_wincon" + } + ] + } + }, + "edition": "2021", + "version": "0.2.6" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "anstyle 0.3.5": { + "name": "anstyle", + "version": "0.3.5", + "package_url": "https://github.com/rust-cli/anstyle.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/anstyle/0.3.5/download", + "sha256": "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" + } + }, + "targets": [ + { + "Library": { + "crate_name": "anstyle", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "anstyle", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "0.3.5" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "anstyle-parse 0.1.1": { + "name": "anstyle-parse", + "version": "0.1.1", + "package_url": "https://github.com/rust-cli/anstyle.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/anstyle-parse/0.1.1/download", + "sha256": "a7d1bb534e9efed14f3e5f44e7dd1a4f709384023a4165199a4241e18dff0116" + } + }, + "targets": [ + { + "Library": { + "crate_name": "anstyle_parse", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "anstyle_parse", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "utf8" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "utf8parse 0.2.1", + "target": "utf8parse" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "anstyle-wincon 0.2.0": { + "name": "anstyle-wincon", + "version": "0.2.0", + "package_url": "https://github.com/rust-cli/anstyle.git", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/anstyle-wincon/0.2.0/download", + "sha256": "c3127af6145b149f3287bb9a0d10ad9c5692dba8c53ad48285e5bec4063834fa" + } + }, + "targets": [ + { + "Library": { + "crate_name": "anstyle_wincon", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "anstyle_wincon", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "anstyle 0.3.5", + "target": "anstyle" + } + ], + "selects": { + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2021", + "version": "0.2.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "autocfg 1.1.0": { + "name": "autocfg", + "version": "1.1.0", + "package_url": "https://github.com/cuviper/autocfg", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/autocfg/1.1.0/download", + "sha256": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + } + }, + "targets": [ + { + "Library": { + "crate_name": "autocfg", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "autocfg", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "1.1.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "bitflags 1.3.2": { + "name": "bitflags", + "version": "1.3.2", + "package_url": "https://github.com/bitflags/bitflags", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/bitflags/1.3.2/download", + "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bitflags", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "bitflags", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "edition": "2018", + "version": "1.3.2" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "bstr 1.9.0": { + "name": "bstr", + "version": "1.9.0", + "package_url": "https://github.com/BurntSushi/bstr", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/bstr/1.9.0/download", + "sha256": "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bstr", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "bstr", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "memchr 2.7.1", + "target": "memchr" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.9.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "bumpalo 3.12.0": { + "name": "bumpalo", + "version": "3.12.0", + "package_url": "https://github.com/fitzgen/bumpalo", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/bumpalo/3.12.0/download", + "sha256": "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bumpalo", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "bumpalo", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "edition": "2021", + "version": "3.12.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cc 1.0.79": { + "name": "cc", + "version": "1.0.79", + "package_url": "https://github.com/rust-lang/cc-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cc/1.0.79/download", + "sha256": "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.79" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cfg-if 1.0.0": { + "name": "cfg-if", + "version": "1.0.0", + "package_url": "https://github.com/alexcrichton/cfg-if", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cfg-if/1.0.0/download", + "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cfg_if", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cfg_if", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "chrono 0.4.24": { + "name": "chrono", + "version": "0.4.24", + "package_url": "https://github.com/chronotope/chrono", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/chrono/0.4.24/download", + "sha256": "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "chrono", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "chrono", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "clock", + "default", + "iana-time-zone", + "js-sys", + "oldtime", + "serde", + "std", + "time", + "wasm-bindgen", + "wasmbind", + "winapi" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "num-integer 0.1.45", + "target": "num_integer" + }, + { + "id": "num-traits 0.2.15", + "target": "num_traits" + }, + { + "id": "serde 1.0.159", + "target": "serde" + }, + { + "id": "time 0.1.45", + "target": "time" + } + ], + "selects": { + "cfg(all(target_arch = \"wasm32\", not(any(target_os = \"emscripten\", target_os = \"wasi\"))))": [ + { + "id": "js-sys 0.3.61", + "target": "js_sys" + }, + { + "id": "wasm-bindgen 0.2.84", + "target": "wasm_bindgen" + } + ], + "cfg(unix)": [ + { + "id": "iana-time-zone 0.1.56", + "target": "iana_time_zone" + } + ], + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2018", + "version": "0.4.24" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "clap 4.2.1": { + "name": "clap", + "version": "4.2.1", + "package_url": "https://github.com/clap-rs/clap", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/clap/4.2.1/download", + "sha256": "046ae530c528f252094e4a77886ee1374437744b2bff1497aa898bbddbbb29b3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "clap", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "clap", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "color", + "default", + "derive", + "error-context", + "help", + "std", + "suggestions", + "usage" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "clap_builder 4.2.1", + "target": "clap_builder" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + } + ], + "selects": {} + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "clap_derive 4.2.0", + "target": "clap_derive" + } + ], + "selects": {} + }, + "version": "4.2.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "clap_builder 4.2.1": { + "name": "clap_builder", + "version": "4.2.1", + "package_url": "https://github.com/clap-rs/clap", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/clap_builder/4.2.1/download", + "sha256": "223163f58c9a40c3b0a43e1c4b50a9ce09f007ea2cb1ec258a687945b4b7929f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "clap_builder", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "clap_builder", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "color", + "error-context", + "help", + "std", + "suggestions", + "usage" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "anstream 0.2.6", + "target": "anstream" + }, + { + "id": "anstyle 0.3.5", + "target": "anstyle" + }, + { + "id": "bitflags 1.3.2", + "target": "bitflags" + }, + { + "id": "clap_lex 0.4.1", + "target": "clap_lex" + }, + { + "id": "strsim 0.10.0", + "target": "strsim" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "4.2.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "clap_derive 4.2.0": { + "name": "clap_derive", + "version": "4.2.0", + "package_url": "https://github.com/clap-rs/clap/tree/master/clap_derive", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/clap_derive/4.2.0/download", + "sha256": "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "clap_derive", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "clap_derive", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "heck 0.4.1", + "target": "heck" + }, + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 2.0.13", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "4.2.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "clap_lex 0.4.1": { + "name": "clap_lex", + "version": "0.4.1", + "package_url": "https://github.com/clap-rs/clap/tree/master/clap_lex", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/clap_lex/0.4.1/download", + "sha256": "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "clap_lex", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "clap_lex", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2021", + "version": "0.4.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "codeql-extractor 0.2.0": { + "name": "codeql-extractor", + "version": "0.2.0", + "package_url": null, + "repository": { + "Git": { + "remote": "https://github.com/github/codeql.git", + "commitish": { + "Rev": "514a92d5bd1e24e4b7367d64430762ffd1ffbe7f" + }, + "strip_prefix": "shared/tree-sitter-extractor" + } + }, + "targets": [ + { + "Library": { + "crate_name": "codeql_extractor", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "codeql_extractor", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "chrono 0.4.24", + "target": "chrono" + }, + { + "id": "encoding 0.2.33", + "target": "encoding" + }, + { + "id": "flate2 1.0.25", + "target": "flate2" + }, + { + "id": "globset 0.4.14", + "target": "globset" + }, + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + }, + { + "id": "num_cpus 1.15.0", + "target": "num_cpus" + }, + { + "id": "rayon 1.7.0", + "target": "rayon" + }, + { + "id": "regex 1.7.3", + "target": "regex" + }, + { + "id": "serde 1.0.159", + "target": "serde" + }, + { + "id": "serde_json 1.0.95", + "target": "serde_json" + }, + { + "id": "tracing 0.1.37", + "target": "tracing" + }, + { + "id": "tree-sitter 0.20.10", + "target": "tree_sitter" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.2.0" + }, + "license": null, + "license_ids": [], + "license_file": null + }, + "codeql-extractor-ruby 0.1.0": { + "name": "codeql-extractor-ruby", + "version": "0.1.0", + "package_url": null, + "repository": null, + "targets": [], + "library_target_name": null, + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "clap 4.2.1", + "target": "clap" + }, + { + "id": "codeql-extractor 0.2.0", + "target": "codeql_extractor" + }, + { + "id": "encoding 0.2.33", + "target": "encoding" + }, + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + }, + { + "id": "rayon 1.7.0", + "target": "rayon" + }, + { + "id": "regex 1.7.3", + "target": "regex" + }, + { + "id": "tracing 0.1.37", + "target": "tracing" + }, + { + "id": "tracing-subscriber 0.3.16", + "target": "tracing_subscriber" + }, + { + "id": "tree-sitter 0.20.10", + "target": "tree_sitter" + }, + { + "id": "tree-sitter-embedded-template 0.20.0", + "target": "tree_sitter_embedded_template" + }, + { + "id": "tree-sitter-ruby 0.20.0", + "target": "tree_sitter_ruby" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.0" + }, + "license": null, + "license_ids": [], + "license_file": null + }, + "codespan-reporting 0.11.1": { + "name": "codespan-reporting", + "version": "0.11.1", + "package_url": "https://github.com/brendanzab/codespan", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/codespan-reporting/0.11.1/download", + "sha256": "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" + } + }, + "targets": [ + { + "Library": { + "crate_name": "codespan_reporting", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "codespan_reporting", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "termcolor 1.2.0", + "target": "termcolor" + }, + { + "id": "unicode-width 0.1.10", + "target": "unicode_width" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.11.1" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "concolor-override 1.0.0": { + "name": "concolor-override", + "version": "1.0.0", + "package_url": "https://github.com/rust-cli/concolor", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/concolor-override/1.0.0/download", + "sha256": "a855d4a1978dc52fb0536a04d384c2c0c1aa273597f08b77c8c4d3b2eec6037f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "concolor_override", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "concolor_override", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2021", + "version": "1.0.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "concolor-query 0.3.3": { + "name": "concolor-query", + "version": "0.3.3", + "package_url": "https://github.com/rust-cli/concolor", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/concolor-query/0.3.3/download", + "sha256": "88d11d52c3d7ca2e6d0040212be9e4dbbcd78b6447f535b6b561f449427944cf" + } + }, + "targets": [ + { + "Library": { + "crate_name": "concolor_query", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "concolor_query", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2021", + "version": "0.3.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "core-foundation-sys 0.8.4": { + "name": "core-foundation-sys", + "version": "0.8.4", + "package_url": "https://github.com/servo/core-foundation-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/core-foundation-sys/0.8.4/download", + "sha256": "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + } + }, + "targets": [ + { + "Library": { + "crate_name": "core_foundation_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "core_foundation_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.8.4" + }, + "license": "MIT / Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crc32fast 1.3.2": { + "name": "crc32fast", + "version": "1.3.2", + "package_url": "https://github.com/srijs/rust-crc32fast", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crc32fast/1.3.2/download", + "sha256": "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crc32fast", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crc32fast", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crc32fast 1.3.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.3.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crossbeam-channel 0.5.7": { + "name": "crossbeam-channel", + "version": "0.5.7", + "package_url": "https://github.com/crossbeam-rs/crossbeam", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crossbeam-channel/0.5.7/download", + "sha256": "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crossbeam_channel", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crossbeam_channel", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "crossbeam-utils", + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "crossbeam_utils" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.5.7" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crossbeam-deque 0.8.3": { + "name": "crossbeam-deque", + "version": "0.8.3", + "package_url": "https://github.com/crossbeam-rs/crossbeam", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crossbeam-deque/0.8.3/download", + "sha256": "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crossbeam_deque", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crossbeam_deque", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "crossbeam-epoch", + "crossbeam-utils", + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crossbeam-epoch 0.9.14", + "target": "crossbeam_epoch" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "crossbeam_utils" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.8.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crossbeam-epoch 0.9.14": { + "name": "crossbeam-epoch", + "version": "0.9.14", + "package_url": "https://github.com/crossbeam-rs/crossbeam", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crossbeam-epoch/0.9.14/download", + "sha256": "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crossbeam_epoch", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crossbeam_epoch", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crossbeam-epoch 0.9.14", + "target": "build_script_build" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "crossbeam_utils" + }, + { + "id": "memoffset 0.8.0", + "target": "memoffset" + }, + { + "id": "scopeguard 1.1.0", + "target": "scopeguard" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.9.14" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "autocfg 1.1.0", + "target": "autocfg" + } + ], + "selects": {} + } + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "crossbeam-utils 0.8.15": { + "name": "crossbeam-utils", + "version": "0.8.15", + "package_url": "https://github.com/crossbeam-rs/crossbeam", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/crossbeam-utils/0.8.15/download", + "sha256": "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crossbeam_utils", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "crossbeam_utils", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.8.15" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cxx 1.0.94": { + "name": "cxx", + "version": "1.0.94", + "package_url": "https://github.com/dtolnay/cxx", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cxx/1.0.94/download", + "sha256": "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cxx", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cxx", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cxx 1.0.94", + "target": "build_script_build" + }, + { + "id": "link-cplusplus 1.0.8", + "target": "link_cplusplus" + } + ], + "selects": {} + }, + "edition": "2018", + "proc_macro_deps": { + "common": [ + { + "id": "cxxbridge-macro 1.0.94", + "target": "cxxbridge_macro" + } + ], + "selects": {} + }, + "version": "1.0.94" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + }, + { + "id": "cxxbridge-flags 1.0.94", + "target": "cxxbridge_flags" + } + ], + "selects": {} + }, + "link_deps": { + "common": [ + { + "id": "link-cplusplus 1.0.8", + "target": "link_cplusplus" + } + ], + "selects": {} + }, + "links": "cxxbridge1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cxx-build 1.0.94": { + "name": "cxx-build", + "version": "1.0.94", + "package_url": "https://github.com/dtolnay/cxx", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cxx-build/1.0.94/download", + "sha256": "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cxx_build", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cxx_build", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + }, + { + "id": "codespan-reporting 0.11.1", + "target": "codespan_reporting" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + }, + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "scratch 1.0.5", + "target": "scratch" + }, + { + "id": "syn 2.0.13", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.94" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cxxbridge-flags 1.0.94": { + "name": "cxxbridge-flags", + "version": "1.0.94", + "package_url": "https://github.com/dtolnay/cxx", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cxxbridge-flags/1.0.94/download", + "sha256": "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" + } + }, + "targets": [ + { + "Library": { + "crate_name": "cxxbridge_flags", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cxxbridge_flags", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.94" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "cxxbridge-macro 1.0.94": { + "name": "cxxbridge-macro", + "version": "1.0.94", + "package_url": "https://github.com/dtolnay/cxx", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/cxxbridge-macro/1.0.94/download", + "sha256": "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "cxxbridge_macro", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "cxxbridge_macro", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 2.0.13", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.94" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "either 1.8.1": { + "name": "either", + "version": "1.8.1", + "package_url": "https://github.com/bluss/either", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/either/1.8.1/download", + "sha256": "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + } + }, + "targets": [ + { + "Library": { + "crate_name": "either", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "either", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.8.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "encoding 0.2.33": { + "name": "encoding", + "version": "0.2.33", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding/0.2.33/download", + "sha256": "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding-index-japanese 1.20141219.5", + "target": "encoding_index_japanese" + }, + { + "id": "encoding-index-korean 1.20141219.5", + "target": "encoding_index_korean" + }, + { + "id": "encoding-index-simpchinese 1.20141219.5", + "target": "encoding_index_simpchinese" + }, + { + "id": "encoding-index-singlebyte 1.20141219.5", + "target": "encoding_index_singlebyte" + }, + { + "id": "encoding-index-tradchinese 1.20141219.5", + "target": "encoding_index_tradchinese" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.2.33" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "encoding-index-japanese 1.20141219.5": { + "name": "encoding-index-japanese", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-japanese/1.20141219.5/download", + "sha256": "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_japanese", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_japanese", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding-index-korean 1.20141219.5": { + "name": "encoding-index-korean", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-korean/1.20141219.5/download", + "sha256": "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_korean", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_korean", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding-index-simpchinese 1.20141219.5": { + "name": "encoding-index-simpchinese", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-simpchinese/1.20141219.5/download", + "sha256": "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_simpchinese", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_simpchinese", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding-index-singlebyte 1.20141219.5": { + "name": "encoding-index-singlebyte", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-singlebyte/1.20141219.5/download", + "sha256": "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_singlebyte", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_singlebyte", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding-index-tradchinese 1.20141219.5": { + "name": "encoding-index-tradchinese", + "version": "1.20141219.5", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding-index-tradchinese/1.20141219.5/download", + "sha256": "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_tradchinese", + "crate_root": "lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_tradchinese", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "encoding_index_tests 0.1.4", + "target": "encoding_index_tests" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.20141219.5" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "encoding_index_tests 0.1.4": { + "name": "encoding_index_tests", + "version": "0.1.4", + "package_url": "https://github.com/lifthrasiir/rust-encoding", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/encoding_index_tests/0.1.4/download", + "sha256": "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" + } + }, + "targets": [ + { + "Library": { + "crate_name": "encoding_index_tests", + "crate_root": "index_tests.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "encoding_index_tests", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.1.4" + }, + "license": "CC0-1.0", + "license_ids": [ + "CC0-1.0" + ], + "license_file": null + }, + "errno 0.3.0": { + "name": "errno", + "version": "0.3.0", + "package_url": "https://github.com/lambda-fairy/rust-errno", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/errno/0.3.0/download", + "sha256": "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "errno", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "errno", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(target_os = \"dragonfly\")": [ + { + "id": "errno-dragonfly 0.1.2", + "target": "errno_dragonfly" + } + ], + "cfg(target_os = \"hermit\")": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(target_os = \"wasi\")": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(unix)": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2018", + "version": "0.3.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "errno-dragonfly 0.1.2": { + "name": "errno-dragonfly", + "version": "0.1.2", + "package_url": "https://github.com/mneumann/errno-dragonfly-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/errno-dragonfly/0.1.2/download", + "sha256": "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" + } + }, + "targets": [ + { + "Library": { + "crate_name": "errno_dragonfly", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "errno_dragonfly", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "errno-dragonfly 0.1.2", + "target": "build_script_build" + }, + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "flate2 1.0.25": { + "name": "flate2", + "version": "1.0.25", + "package_url": "https://github.com/rust-lang/flate2-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/flate2/1.0.25/download", + "sha256": "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" + } + }, + "targets": [ + { + "Library": { + "crate_name": "flate2", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "flate2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "miniz_oxide", + "rust_backend" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "crc32fast 1.3.2", + "target": "crc32fast" + }, + { + "id": "miniz_oxide 0.6.2", + "target": "miniz_oxide" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.25" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "globset 0.4.14": { + "name": "globset", + "version": "0.4.14", + "package_url": "https://github.com/BurntSushi/ripgrep/tree/master/crates/globset", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/globset/0.4.14/download", + "sha256": "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "globset", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "globset", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "log" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aho-corasick 1.1.2", + "target": "aho_corasick" + }, + { + "id": "bstr 1.9.0", + "target": "bstr" + }, + { + "id": "log 0.4.20", + "target": "log" + }, + { + "id": "regex-automata 0.4.3", + "target": "regex_automata" + }, + { + "id": "regex-syntax 0.8.2", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.14" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "heck 0.4.1": { + "name": "heck", + "version": "0.4.1", + "package_url": "https://github.com/withoutboats/heck", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/heck/0.4.1/download", + "sha256": "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "heck", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "heck", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "edition": "2018", + "version": "0.4.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "hermit-abi 0.2.6": { + "name": "hermit-abi", + "version": "0.2.6", + "package_url": "https://github.com/hermitcore/rusty-hermit", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/hermit-abi/0.2.6/download", + "sha256": "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" + } + }, + "targets": [ + { + "Library": { + "crate_name": "hermit_abi", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "hermit_abi", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.2.6" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "hermit-abi 0.3.1": { + "name": "hermit-abi", + "version": "0.3.1", + "package_url": "https://github.com/hermitcore/rusty-hermit", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/hermit-abi/0.3.1/download", + "sha256": "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + } + }, + "targets": [ + { + "Library": { + "crate_name": "hermit_abi", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "hermit_abi", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2021", + "version": "0.3.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "iana-time-zone 0.1.56": { + "name": "iana-time-zone", + "version": "0.1.56", + "package_url": "https://github.com/strawlab/iana-time-zone", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/iana-time-zone/0.1.56/download", + "sha256": "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "iana_time_zone", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "iana_time_zone", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "fallback" + ], + "selects": {} + }, + "deps": { + "common": [], + "selects": { + "cfg(any(target_os = \"macos\", target_os = \"ios\"))": [ + { + "id": "core-foundation-sys 0.8.4", + "target": "core_foundation_sys" + } + ], + "cfg(target_arch = \"wasm32\")": [ + { + "id": "js-sys 0.3.61", + "target": "js_sys" + }, + { + "id": "wasm-bindgen 0.2.84", + "target": "wasm_bindgen" + } + ], + "cfg(target_os = \"android\")": [ + { + "id": "android_system_properties 0.1.5", + "target": "android_system_properties" + } + ], + "cfg(target_os = \"haiku\")": [ + { + "id": "iana-time-zone-haiku 0.1.1", + "target": "iana_time_zone_haiku" + } + ], + "cfg(target_os = \"windows\")": [ + { + "id": "windows 0.48.0", + "target": "windows" + } + ] + } + }, + "edition": "2018", + "version": "0.1.56" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "iana-time-zone-haiku 0.1.1": { + "name": "iana-time-zone-haiku", + "version": "0.1.1", + "package_url": "https://github.com/strawlab/iana-time-zone", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/iana-time-zone-haiku/0.1.1/download", + "sha256": "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" + } + }, + "targets": [ + { + "Library": { + "crate_name": "iana_time_zone_haiku", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "iana_time_zone_haiku", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cxx 1.0.94", + "target": "cxx" + }, + { + "id": "iana-time-zone-haiku 0.1.1", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.1" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cxx-build 1.0.94", + "target": "cxx_build" + } + ], + "selects": {} + }, + "link_deps": { + "common": [ + { + "id": "cxx 1.0.94", + "target": "cxx" + } + ], + "selects": {} + } + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "io-lifetimes 1.0.10": { + "name": "io-lifetimes", + "version": "1.0.10", + "package_url": "https://github.com/sunfishcode/io-lifetimes", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/io-lifetimes/1.0.10/download", + "sha256": "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" + } + }, + "targets": [ + { + "Library": { + "crate_name": "io_lifetimes", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "io_lifetimes", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "close", + "default", + "hermit-abi", + "libc", + "windows-sys" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "io-lifetimes 1.0.10", + "target": "build_script_build" + } + ], + "selects": { + "cfg(not(windows))": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(target_os = \"hermit\")": [ + { + "id": "hermit-abi 0.3.1", + "target": "hermit_abi" + } + ], + "cfg(windows)": [ + { + "id": "windows-sys 0.48.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2018", + "version": "1.0.10" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "is-terminal 0.4.6": { + "name": "is-terminal", + "version": "0.4.6", + "package_url": "https://github.com/sunfishcode/is-terminal", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/is-terminal/0.4.6/download", + "sha256": "256017f749ab3117e93acb91063009e1f1bb56d03965b14c2c8df4eb02c524d8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "is_terminal", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "is_terminal", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "io-lifetimes 1.0.10", + "target": "io_lifetimes" + } + ], + "selects": { + "cfg(not(any(windows, target_os = \"hermit\", target_os = \"unknown\")))": [ + { + "id": "rustix 0.37.7", + "target": "rustix" + } + ], + "cfg(target_os = \"hermit\")": [ + { + "id": "hermit-abi 0.3.1", + "target": "hermit_abi" + } + ], + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2018", + "version": "0.4.6" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "itoa 1.0.6": { + "name": "itoa", + "version": "1.0.6", + "package_url": "https://github.com/dtolnay/itoa", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/itoa/1.0.6/download", + "sha256": "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "itoa", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "itoa", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.6" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "js-sys 0.3.61": { + "name": "js-sys", + "version": "0.3.61", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/js-sys/0.3.61/download", + "sha256": "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" + } + }, + "targets": [ + { + "Library": { + "crate_name": "js_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "js_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "wasm-bindgen 0.2.84", + "target": "wasm_bindgen" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.3.61" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "lazy_static 1.4.0": { + "name": "lazy_static", + "version": "1.4.0", + "package_url": "https://github.com/rust-lang-nursery/lazy-static.rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/lazy_static/1.4.0/download", + "sha256": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + } + }, + "targets": [ + { + "Library": { + "crate_name": "lazy_static", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "lazy_static", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "1.4.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "libc 0.2.141": { + "name": "libc", + "version": "0.2.141", + "package_url": "https://github.com/rust-lang/libc", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/libc/0.2.141/download", + "sha256": "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" + } + }, + "targets": [ + { + "Library": { + "crate_name": "libc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "libc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": { + "aarch64-apple-darwin": [ + "extra_traits" + ], + "aarch64-apple-ios": [ + "extra_traits" + ], + "aarch64-apple-ios-sim": [ + "extra_traits" + ], + "aarch64-fuchsia": [ + "extra_traits" + ], + "aarch64-linux-android": [ + "extra_traits" + ], + "aarch64-unknown-linux-gnu": [ + "extra_traits" + ], + "aarch64-unknown-nixos-gnu": [ + "extra_traits" + ], + "aarch64-unknown-nto-qnx710": [ + "extra_traits" + ], + "arm-unknown-linux-gnueabi": [ + "extra_traits" + ], + "armv7-linux-androideabi": [ + "extra_traits" + ], + "armv7-unknown-linux-gnueabi": [ + "extra_traits" + ], + "i686-apple-darwin": [ + "extra_traits" + ], + "i686-linux-android": [ + "extra_traits" + ], + "i686-unknown-freebsd": [ + "extra_traits" + ], + "i686-unknown-linux-gnu": [ + "extra_traits" + ], + "powerpc-unknown-linux-gnu": [ + "extra_traits" + ], + "riscv32imc-unknown-none-elf": [ + "extra_traits" + ], + "riscv64gc-unknown-none-elf": [ + "extra_traits" + ], + "s390x-unknown-linux-gnu": [ + "extra_traits" + ], + "thumbv7em-none-eabi": [ + "extra_traits" + ], + "thumbv8m.main-none-eabi": [ + "extra_traits" + ], + "wasm32-wasi": [ + "extra_traits" + ], + "x86_64-apple-darwin": [ + "extra_traits" + ], + "x86_64-apple-ios": [ + "extra_traits" + ], + "x86_64-fuchsia": [ + "extra_traits" + ], + "x86_64-linux-android": [ + "extra_traits" + ], + "x86_64-unknown-freebsd": [ + "extra_traits" + ], + "x86_64-unknown-linux-gnu": [ + "extra_traits" + ], + "x86_64-unknown-nixos-gnu": [ + "extra_traits" + ], + "x86_64-unknown-none": [ + "extra_traits" + ] + } + }, + "deps": { + "common": [ + { + "id": "libc 0.2.141", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.2.141" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "link-cplusplus 1.0.8": { + "name": "link-cplusplus", + "version": "1.0.8", + "package_url": "https://github.com/dtolnay/link-cplusplus", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/link-cplusplus/1.0.8/download", + "sha256": "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" + } + }, + "targets": [ + { + "Library": { + "crate_name": "link_cplusplus", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "link_cplusplus", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "link-cplusplus 1.0.8", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.8" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + }, + "links": "cplusplus" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "linux-raw-sys 0.3.1": { + "name": "linux-raw-sys", + "version": "0.3.1", + "package_url": "https://github.com/sunfishcode/linux-raw-sys", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/linux-raw-sys/0.3.1/download", + "sha256": "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "linux_raw_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "linux_raw_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "general", + "no_std" + ], + "selects": { + "aarch64-unknown-linux-gnu": [ + "errno", + "ioctl" + ], + "aarch64-unknown-nixos-gnu": [ + "errno", + "ioctl" + ], + "arm-unknown-linux-gnueabi": [ + "errno", + "ioctl" + ], + "armv7-unknown-linux-gnueabi": [ + "errno", + "ioctl" + ], + "i686-unknown-linux-gnu": [ + "errno", + "ioctl" + ], + "x86_64-unknown-linux-gnu": [ + "errno", + "ioctl" + ], + "x86_64-unknown-nixos-gnu": [ + "errno", + "ioctl" + ] + } + }, + "edition": "2018", + "version": "0.3.1" + }, + "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "log 0.4.20": { + "name": "log", + "version": "0.4.20", + "package_url": "https://github.com/rust-lang/log", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/log/0.4.20/download", + "sha256": "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "log", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "log", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "edition": "2015", + "version": "0.4.20" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "matchers 0.1.0": { + "name": "matchers", + "version": "0.1.0", + "package_url": "https://github.com/hawkw/matchers", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/matchers/0.1.0/download", + "sha256": "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" + } + }, + "targets": [ + { + "Library": { + "crate_name": "matchers", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "matchers", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "regex-automata 0.1.10", + "target": "regex_automata" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "memchr 2.7.1": { + "name": "memchr", + "version": "2.7.1", + "package_url": "https://github.com/BurntSushi/memchr", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/memchr/2.7.1/download", + "sha256": "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + } + }, + "targets": [ + { + "Library": { + "crate_name": "memchr", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "memchr", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "default", + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "2.7.1" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "memoffset 0.8.0": { + "name": "memoffset", + "version": "0.8.0", + "package_url": "https://github.com/Gilnaa/memoffset", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/memoffset/0.8.0/download", + "sha256": "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "memoffset", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "memoffset", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "memoffset 0.8.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.8.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "autocfg 1.1.0", + "target": "autocfg" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "miniz_oxide 0.6.2": { + "name": "miniz_oxide", + "version": "0.6.2", + "package_url": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/miniz_oxide/0.6.2/download", + "sha256": "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" + } + }, + "targets": [ + { + "Library": { + "crate_name": "miniz_oxide", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "miniz_oxide", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "with-alloc" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "adler 1.0.2", + "target": "adler" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.6.2" + }, + "license": "MIT OR Zlib OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT", + "Zlib" + ], + "license_file": null + }, + "nu-ansi-term 0.46.0": { + "name": "nu-ansi-term", + "version": "0.46.0", + "package_url": "https://github.com/nushell/nu-ansi-term", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/nu-ansi-term/0.46.0/download", + "sha256": "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" + } + }, + "targets": [ + { + "Library": { + "crate_name": "nu_ansi_term", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "nu_ansi_term", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "overload 0.1.1", + "target": "overload" + } + ], + "selects": { + "cfg(target_os = \"windows\")": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2018", + "version": "0.46.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "num-integer 0.1.45": { + "name": "num-integer", + "version": "0.1.45", + "package_url": "https://github.com/rust-num/num-integer", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/num-integer/0.1.45/download", + "sha256": "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_integer", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "num_integer", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "num-integer 0.1.45", + "target": "build_script_build" + }, + { + "id": "num-traits 0.2.15", + "target": "num_traits" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.1.45" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "autocfg 1.1.0", + "target": "autocfg" + } + ], + "selects": {} + } + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "num-traits 0.2.15": { + "name": "num-traits", + "version": "0.2.15", + "package_url": "https://github.com/rust-num/num-traits", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/num-traits/0.2.15/download", + "sha256": "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_traits", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "num_traits", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "num-traits 0.2.15", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.2.15" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "autocfg 1.1.0", + "target": "autocfg" + } + ], + "selects": {} + } + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "num_cpus 1.15.0": { + "name": "num_cpus", + "version": "1.15.0", + "package_url": "https://github.com/seanmonstar/num_cpus", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/num_cpus/1.15.0/download", + "sha256": "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_cpus", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "num_cpus", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(all(any(target_arch = \"x86_64\", target_arch = \"aarch64\"), target_os = \"hermit\"))": [ + { + "id": "hermit-abi 0.2.6", + "target": "hermit_abi" + } + ], + "cfg(not(windows))": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ] + } + }, + "edition": "2015", + "version": "1.15.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "once_cell 1.17.1": { + "name": "once_cell", + "version": "1.17.1", + "package_url": "https://github.com/matklad/once_cell", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/once_cell/1.17.1/download", + "sha256": "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "once_cell", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "once_cell", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "default", + "race", + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "1.17.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "overload 0.1.1": { + "name": "overload", + "version": "0.1.1", + "package_url": "https://github.com/danaugrs/overload", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/overload/0.1.1/download", + "sha256": "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + } + }, + "targets": [ + { + "Library": { + "crate_name": "overload", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "overload", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "0.1.1" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "pin-project-lite 0.2.9": { + "name": "pin-project-lite", + "version": "0.2.9", + "package_url": "https://github.com/taiki-e/pin-project-lite", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/pin-project-lite/0.2.9/download", + "sha256": "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + } + }, + "targets": [ + { + "Library": { + "crate_name": "pin_project_lite", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "pin_project_lite", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "0.2.9" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "proc-macro2 1.0.56": { + "name": "proc-macro2", + "version": "1.0.56", + "package_url": "https://github.com/dtolnay/proc-macro2", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/proc-macro2/1.0.56/download", + "sha256": "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" + } + }, + "targets": [ + { + "Library": { + "crate_name": "proc_macro2", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "proc_macro2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "proc-macro" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "build_script_build" + }, + { + "id": "unicode-ident 1.0.8", + "target": "unicode_ident" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.56" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "quote 1.0.26": { + "name": "quote", + "version": "1.0.26", + "package_url": "https://github.com/dtolnay/quote", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/quote/1.0.26/download", + "sha256": "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" + } + }, + "targets": [ + { + "Library": { + "crate_name": "quote", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "quote", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "proc-macro" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.26" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "rayon 1.7.0": { + "name": "rayon", + "version": "1.7.0", + "package_url": "https://github.com/rayon-rs/rayon", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/rayon/1.7.0/download", + "sha256": "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rayon", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "rayon", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "either 1.8.1", + "target": "either" + }, + { + "id": "rayon-core 1.11.0", + "target": "rayon_core" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.7.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "rayon-core 1.11.0": { + "name": "rayon-core", + "version": "1.11.0", + "package_url": "https://github.com/rayon-rs/rayon", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/rayon-core/1.11.0/download", + "sha256": "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rayon_core", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "rayon_core", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "crossbeam-channel 0.5.7", + "target": "crossbeam_channel" + }, + { + "id": "crossbeam-deque 0.8.3", + "target": "crossbeam_deque" + }, + { + "id": "crossbeam-utils 0.8.15", + "target": "crossbeam_utils" + }, + { + "id": "num_cpus 1.15.0", + "target": "num_cpus" + }, + { + "id": "rayon-core 1.11.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.11.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "links": "rayon-core" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "regex 1.7.3": { + "name": "regex", + "version": "1.7.3", + "package_url": "https://github.com/rust-lang/regex", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex/1.7.3/download", + "sha256": "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "aho-corasick", + "default", + "memchr", + "perf", + "perf-cache", + "perf-dfa", + "perf-inline", + "perf-literal", + "std", + "unicode", + "unicode-age", + "unicode-bool", + "unicode-case", + "unicode-gencat", + "unicode-perl", + "unicode-script", + "unicode-segment" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aho-corasick 0.7.20", + "target": "aho_corasick" + }, + { + "id": "memchr 2.7.1", + "target": "memchr" + }, + { + "id": "regex-syntax 0.6.29", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.7.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "regex-automata 0.1.10": { + "name": "regex-automata", + "version": "0.1.10", + "package_url": "https://github.com/BurntSushi/regex-automata", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex-automata/0.1.10/download", + "sha256": "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_automata", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex_automata", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "regex-syntax", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "regex-syntax 0.6.29", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.1.10" + }, + "license": "Unlicense/MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "regex-automata 0.4.3": { + "name": "regex-automata", + "version": "0.4.3", + "package_url": "https://github.com/rust-lang/regex/tree/master/regex-automata", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex-automata/0.4.3/download", + "sha256": "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_automata", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex_automata", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "hybrid", + "meta", + "nfa", + "nfa-backtrack", + "nfa-pikevm", + "nfa-thompson", + "perf", + "perf-inline", + "perf-literal", + "perf-literal-multisubstring", + "perf-literal-substring", + "std", + "syntax" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aho-corasick 1.1.2", + "target": "aho_corasick" + }, + { + "id": "memchr 2.7.1", + "target": "memchr" + }, + { + "id": "regex-syntax 0.8.2", + "target": "regex_syntax" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "regex-syntax 0.6.29": { + "name": "regex-syntax", + "version": "0.6.29", + "package_url": "https://github.com/rust-lang/regex", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex-syntax/0.6.29/download", + "sha256": "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_syntax", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex_syntax", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "unicode", + "unicode-age", + "unicode-bool", + "unicode-case", + "unicode-gencat", + "unicode-perl", + "unicode-script", + "unicode-segment" + ], + "selects": {} + }, + "edition": "2018", + "version": "0.6.29" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "regex-syntax 0.8.2": { + "name": "regex-syntax", + "version": "0.8.2", + "package_url": "https://github.com/rust-lang/regex/tree/master/regex-syntax", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/regex-syntax/0.8.2/download", + "sha256": "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "regex_syntax", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "regex_syntax", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "0.8.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "rustix 0.37.7": { + "name": "rustix", + "version": "0.37.7", + "package_url": "https://github.com/bytecodealliance/rustix", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/rustix/0.37.7/download", + "sha256": "2aae838e49b3d63e9274e1c01833cc8139d3fec468c3b84688c628f44b1ae11d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rustix", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "rustix", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "io-lifetimes", + "libc", + "std", + "termios", + "use-libc-auxv" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bitflags 1.3.2", + "target": "bitflags" + }, + { + "id": "io-lifetimes 1.0.10", + "target": "io_lifetimes" + }, + { + "id": "rustix 0.37.7", + "target": "build_script_build" + } + ], + "selects": { + "cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\"))))))))": [ + { + "id": "linux-raw-sys 0.3.1", + "target": "linux_raw_sys" + } + ], + "cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\")))))": [ + { + "id": "libc 0.2.141", + "target": "libc" + }, + { + "id": "linux-raw-sys 0.3.1", + "target": "linux_raw_sys" + } + ], + "cfg(any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\")))))))": [ + { + "id": "errno 0.3.0", + "target": "errno", + "alias": "libc_errno" + }, + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "cfg(windows)": [ + { + "id": "windows-sys 0.45.0", + "target": "windows_sys" + } + ] + } + }, + "edition": "2018", + "version": "0.37.7" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "ryu 1.0.13": { + "name": "ryu", + "version": "1.0.13", + "package_url": "https://github.com/dtolnay/ryu", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/ryu/1.0.13/download", + "sha256": "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ryu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "ryu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.13" + }, + "license": "Apache-2.0 OR BSL-1.0", + "license_ids": [ + "Apache-2.0", + "BSL-1.0" + ], + "license_file": null + }, + "scopeguard 1.1.0": { + "name": "scopeguard", + "version": "1.1.0", + "package_url": "https://github.com/bluss/scopeguard", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/scopeguard/1.1.0/download", + "sha256": "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + } + }, + "targets": [ + { + "Library": { + "crate_name": "scopeguard", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "scopeguard", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "1.1.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "scratch 1.0.5": { + "name": "scratch", + "version": "1.0.5", + "package_url": "https://github.com/dtolnay/scratch", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/scratch/1.0.5/download", + "sha256": "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "scratch", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "scratch", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "scratch 1.0.5", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.0.5" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "serde 1.0.159": { + "name": "serde", + "version": "1.0.159", + "package_url": "https://github.com/serde-rs/serde", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/serde/1.0.159/download", + "sha256": "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" + } + }, + "targets": [ + { + "Library": { + "crate_name": "serde", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "serde", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "derive", + "serde_derive", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "serde 1.0.159", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "proc_macro_deps": { + "common": [ + { + "id": "serde_derive 1.0.159", + "target": "serde_derive" + } + ], + "selects": {} + }, + "version": "1.0.159" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "serde_derive 1.0.159": { + "name": "serde_derive", + "version": "1.0.159", + "package_url": "https://github.com/serde-rs/serde", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/serde_derive/1.0.159/download", + "sha256": "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "serde_derive", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "serde_derive", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "serde_derive 1.0.159", + "target": "build_script_build" + }, + { + "id": "syn 2.0.13", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "1.0.159" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "serde_json 1.0.95": { + "name": "serde_json", + "version": "1.0.95", + "package_url": "https://github.com/serde-rs/json", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/serde_json/1.0.95/download", + "sha256": "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" + } + }, + "targets": [ + { + "Library": { + "crate_name": "serde_json", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "serde_json", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "itoa 1.0.6", + "target": "itoa" + }, + { + "id": "ryu 1.0.13", + "target": "ryu" + }, + { + "id": "serde 1.0.159", + "target": "serde" + }, + { + "id": "serde_json 1.0.95", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.95" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "sharded-slab 0.1.4": { + "name": "sharded-slab", + "version": "0.1.4", + "package_url": "https://github.com/hawkw/sharded-slab", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/sharded-slab/0.1.4/download", + "sha256": "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" + } + }, + "targets": [ + { + "Library": { + "crate_name": "sharded_slab", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "sharded_slab", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.4" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "smallvec 1.10.0": { + "name": "smallvec", + "version": "1.10.0", + "package_url": "https://github.com/servo/rust-smallvec", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/smallvec/1.10.0/download", + "sha256": "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "smallvec", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "smallvec", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.10.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "strsim 0.10.0": { + "name": "strsim", + "version": "0.10.0", + "package_url": "https://github.com/dguo/strsim-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/strsim/0.10.0/download", + "sha256": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + } + }, + "targets": [ + { + "Library": { + "crate_name": "strsim", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "strsim", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.10.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "syn 1.0.109": { + "name": "syn", + "version": "1.0.109", + "package_url": "https://github.com/dtolnay/syn", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/syn/1.0.109/download", + "sha256": "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" + } + }, + "targets": [ + { + "Library": { + "crate_name": "syn", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "syn", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "clone-impls", + "extra-traits", + "full", + "parsing", + "printing", + "proc-macro", + "quote", + "visit", + "visit-mut" + ], + "selects": { + "wasm32-unknown-unknown": [ + "default", + "derive" + ] + } + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 1.0.109", + "target": "build_script_build" + }, + { + "id": "unicode-ident 1.0.8", + "target": "unicode_ident" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "1.0.109" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "syn 2.0.13": { + "name": "syn", + "version": "2.0.13", + "package_url": "https://github.com/dtolnay/syn", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/syn/2.0.13/download", + "sha256": "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" + } + }, + "targets": [ + { + "Library": { + "crate_name": "syn", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "syn", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "clone-impls", + "default", + "derive", + "full", + "parsing", + "printing", + "proc-macro", + "quote" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "unicode-ident 1.0.8", + "target": "unicode_ident" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "2.0.13" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "termcolor 1.2.0": { + "name": "termcolor", + "version": "1.2.0", + "package_url": "https://github.com/BurntSushi/termcolor", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/termcolor/1.2.0/download", + "sha256": "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "termcolor", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "termcolor", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(windows)": [ + { + "id": "winapi-util 0.1.5", + "target": "winapi_util" + } + ] + } + }, + "edition": "2018", + "version": "1.2.0" + }, + "license": "Unlicense OR MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "thread_local 1.1.7": { + "name": "thread_local", + "version": "1.1.7", + "package_url": "https://github.com/Amanieu/thread_local-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/thread_local/1.1.7/download", + "sha256": "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" + } + }, + "targets": [ + { + "Library": { + "crate_name": "thread_local", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "thread_local", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.1.7" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "time 0.1.45": { + "name": "time", + "version": "0.1.45", + "package_url": "https://github.com/time-rs/time", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/time/0.1.45/download", + "sha256": "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "time", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "time", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libc 0.2.141", + "target": "libc" + } + ], + "selects": { + "cfg(target_os = \"wasi\")": [ + { + "id": "wasi 0.10.0+wasi-snapshot-preview1", + "target": "wasi" + } + ], + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2015", + "version": "0.1.45" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "tracing 0.1.37": { + "name": "tracing", + "version": "0.1.37", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing/0.1.37/download", + "sha256": "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tracing", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "attributes", + "default", + "std", + "tracing-attributes" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "pin-project-lite 0.2.9", + "target": "pin_project_lite" + }, + { + "id": "tracing-core 0.1.30", + "target": "tracing_core" + } + ], + "selects": {} + }, + "edition": "2018", + "proc_macro_deps": { + "common": [ + { + "id": "tracing-attributes 0.1.23", + "target": "tracing_attributes" + } + ], + "selects": {} + }, + "version": "0.1.37" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tracing-attributes 0.1.23": { + "name": "tracing-attributes", + "version": "0.1.23", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing-attributes/0.1.23/download", + "sha256": "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "tracing_attributes", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing_attributes", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 1.0.109", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.23" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tracing-core 0.1.30": { + "name": "tracing-core", + "version": "0.1.30", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing-core/0.1.30/download", + "sha256": "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tracing_core", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing_core", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "once_cell", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "once_cell 1.17.1", + "target": "once_cell" + } + ], + "selects": { + "cfg(tracing_unstable)": [ + { + "id": "valuable 0.1.0", + "target": "valuable" + } + ] + } + }, + "edition": "2018", + "version": "0.1.30" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tracing-log 0.1.3": { + "name": "tracing-log", + "version": "0.1.3", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing-log/0.1.3/download", + "sha256": "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tracing_log", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing_log", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "log-tracer", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + }, + { + "id": "log 0.4.20", + "target": "log" + }, + { + "id": "tracing-core 0.1.30", + "target": "tracing_core" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.3" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tracing-subscriber 0.3.16": { + "name": "tracing-subscriber", + "version": "0.3.16", + "package_url": "https://github.com/tokio-rs/tracing", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tracing-subscriber/0.3.16/download", + "sha256": "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tracing_subscriber", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tracing_subscriber", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "ansi", + "default", + "env-filter", + "fmt", + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "registry", + "sharded-slab", + "smallvec", + "std", + "thread_local", + "tracing", + "tracing-log" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "matchers 0.1.0", + "target": "matchers" + }, + { + "id": "nu-ansi-term 0.46.0", + "target": "nu_ansi_term" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + }, + { + "id": "regex 1.7.3", + "target": "regex" + }, + { + "id": "sharded-slab 0.1.4", + "target": "sharded_slab" + }, + { + "id": "smallvec 1.10.0", + "target": "smallvec" + }, + { + "id": "thread_local 1.1.7", + "target": "thread_local" + }, + { + "id": "tracing 0.1.37", + "target": "tracing" + }, + { + "id": "tracing-core 0.1.30", + "target": "tracing_core" + }, + { + "id": "tracing-log 0.1.3", + "target": "tracing_log" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.3.16" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tree-sitter 0.20.10": { + "name": "tree-sitter", + "version": "0.20.10", + "package_url": "https://github.com/tree-sitter/tree-sitter", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/tree-sitter/0.20.10/download", + "sha256": "e747b1f9b7b931ed39a548c1fae149101497de3c1fc8d9e18c62c1a66c683d3d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "tree_sitter", + "crate_root": "binding_rust/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "binding_rust/build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tree_sitter", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "regex 1.7.3", + "target": "regex" + }, + { + "id": "tree-sitter 0.20.10", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.20.10" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tree-sitter-embedded-template 0.20.0": { + "name": "tree-sitter-embedded-template", + "version": "0.20.0", + "package_url": "https://github.com/tree-sitter/tree-sitter-embedded-template", + "repository": { + "Git": { + "remote": "https://github.com/tree-sitter/tree-sitter-embedded-template.git", + "commitish": { + "Rev": "203f7bd3c1bbfbd98fc19add4b8fcb213c059205" + } + } + }, + "targets": [ + { + "Library": { + "crate_name": "tree_sitter_embedded_template", + "crate_root": "bindings/rust/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "bindings/rust/build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tree_sitter_embedded_template", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "tree-sitter 0.20.10", + "target": "tree_sitter" + }, + { + "id": "tree-sitter-embedded-template 0.20.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.20.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "tree-sitter-ruby 0.20.0": { + "name": "tree-sitter-ruby", + "version": "0.20.0", + "package_url": "https://github.com/tree-sitter/tree-sitter-ruby", + "repository": { + "Git": { + "remote": "https://github.com/tree-sitter/tree-sitter-ruby.git", + "commitish": { + "Rev": "4d9ad3f010fdc47a8433adcf9ae30c8eb8475ae7" + } + } + }, + "targets": [ + { + "Library": { + "crate_name": "tree_sitter_ruby", + "crate_root": "bindings/rust/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "bindings/rust/build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "tree_sitter_ruby", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "tree-sitter 0.20.10", + "target": "tree_sitter" + }, + { + "id": "tree-sitter-ruby 0.20.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.20.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.0.79", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "unicode-ident 1.0.8": { + "name": "unicode-ident", + "version": "1.0.8", + "package_url": "https://github.com/dtolnay/unicode-ident", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/unicode-ident/1.0.8/download", + "sha256": "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + } + }, + "targets": [ + { + "Library": { + "crate_name": "unicode_ident", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "unicode_ident", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2018", + "version": "1.0.8" + }, + "license": "(MIT OR Apache-2.0) AND Unicode-DFS-2016", + "license_ids": [ + "Apache-2.0", + "MIT", + "Unicode-DFS-2016" + ], + "license_file": null + }, + "unicode-width 0.1.10": { + "name": "unicode-width", + "version": "0.1.10", + "package_url": "https://github.com/unicode-rs/unicode-width", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/unicode-width/0.1.10/download", + "sha256": "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "unicode_width", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "unicode_width", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.1.10" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "utf8parse 0.2.1": { + "name": "utf8parse", + "version": "0.2.1", + "package_url": "https://github.com/alacritty/vte", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/utf8parse/0.2.1/download", + "sha256": "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "utf8parse", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "utf8parse", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "valuable 0.1.0": { + "name": "valuable", + "version": "0.1.0", + "package_url": "https://github.com/tokio-rs/valuable", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/valuable/0.1.0/download", + "sha256": "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "valuable", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "valuable", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "valuable 0.1.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": null + }, + "wasi 0.10.0+wasi-snapshot-preview1": { + "name": "wasi", + "version": "0.10.0+wasi-snapshot-preview1", + "package_url": "https://github.com/bytecodealliance/wasi", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasi/0.10.0+wasi-snapshot-preview1/download", + "sha256": "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasi", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasi", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "edition": "2018", + "version": "0.10.0+wasi-snapshot-preview1" + }, + "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen 0.2.84": { + "name": "wasm-bindgen", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen/0.2.84/download", + "sha256": "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasm_bindgen", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "spans", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "wasm-bindgen 0.2.84", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "proc_macro_deps": { + "common": [ + { + "id": "wasm-bindgen-macro 0.2.84", + "target": "wasm_bindgen_macro" + } + ], + "selects": {} + }, + "version": "0.2.84" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen-backend 0.2.84": { + "name": "wasm-bindgen-backend", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen-backend/0.2.84/download", + "sha256": "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasm_bindgen_backend", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen_backend", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "spans" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bumpalo 3.12.0", + "target": "bumpalo" + }, + { + "id": "log 0.4.20", + "target": "log" + }, + { + "id": "once_cell 1.17.1", + "target": "once_cell" + }, + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 1.0.109", + "target": "syn" + }, + { + "id": "wasm-bindgen-shared 0.2.84", + "target": "wasm_bindgen_shared" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.84" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen-macro 0.2.84": { + "name": "wasm-bindgen-macro", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen-macro/0.2.84/download", + "sha256": "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "wasm_bindgen_macro", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen_macro", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "spans" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "wasm-bindgen-macro-support 0.2.84", + "target": "wasm_bindgen_macro_support" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.84" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen-macro-support 0.2.84": { + "name": "wasm-bindgen-macro-support", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen-macro-support/0.2.84/download", + "sha256": "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasm_bindgen_macro_support", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen_macro_support", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "spans" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.56", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.26", + "target": "quote" + }, + { + "id": "syn 1.0.109", + "target": "syn" + }, + { + "id": "wasm-bindgen-backend 0.2.84", + "target": "wasm_bindgen_backend" + }, + { + "id": "wasm-bindgen-shared 0.2.84", + "target": "wasm_bindgen_shared" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.84" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "wasm-bindgen-shared 0.2.84": { + "name": "wasm-bindgen-shared", + "version": "0.2.84", + "package_url": "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/wasm-bindgen-shared/0.2.84/download", + "sha256": "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasm_bindgen_shared", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "wasm_bindgen_shared", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "wasm-bindgen-shared 0.2.84", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.2.84" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ], + "links": "wasm_bindgen" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "winapi 0.3.9": { + "name": "winapi", + "version": "0.3.9", + "package_url": "https://github.com/retep998/winapi-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/winapi/0.3.9/download", + "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" + } + }, + "targets": [ + { + "Library": { + "crate_name": "winapi", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "winapi", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "consoleapi", + "errhandlingapi", + "fileapi", + "handleapi", + "minwinbase", + "minwindef", + "ntdef", + "processenv", + "profileapi", + "std", + "sysinfoapi", + "timezoneapi" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "winapi 0.3.9", + "target": "build_script_build" + } + ], + "selects": { + "i686-pc-windows-gnu": [ + { + "id": "winapi-i686-pc-windows-gnu 0.4.0", + "target": "winapi_i686_pc_windows_gnu" + } + ], + "x86_64-pc-windows-gnu": [ + { + "id": "winapi-x86_64-pc-windows-gnu 0.4.0", + "target": "winapi_x86_64_pc_windows_gnu" + } + ] + } + }, + "edition": "2015", + "version": "0.3.9" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "winapi-i686-pc-windows-gnu 0.4.0": { + "name": "winapi-i686-pc-windows-gnu", + "version": "0.4.0", + "package_url": "https://github.com/retep998/winapi-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/winapi-i686-pc-windows-gnu/0.4.0/download", + "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "winapi_i686_pc_windows_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "winapi_i686_pc_windows_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "winapi-i686-pc-windows-gnu 0.4.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.4.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "winapi-util 0.1.5": { + "name": "winapi-util", + "version": "0.1.5", + "package_url": "https://github.com/BurntSushi/winapi-util", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/winapi-util/0.1.5/download", + "sha256": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" + } + }, + "targets": [ + { + "Library": { + "crate_name": "winapi_util", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "winapi_util", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2018", + "version": "0.1.5" + }, + "license": "Unlicense/MIT", + "license_ids": [ + "MIT", + "Unlicense" + ], + "license_file": null + }, + "winapi-x86_64-pc-windows-gnu 0.4.0": { + "name": "winapi-x86_64-pc-windows-gnu", + "version": "0.4.0", + "package_url": "https://github.com/retep998/winapi-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download", + "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "winapi_x86_64_pc_windows_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "winapi_x86_64_pc_windows_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "winapi-x86_64-pc-windows-gnu 0.4.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.4.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows 0.48.0": { + "name": "windows", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows/0.48.0/download", + "sha256": "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows-targets 0.48.0", + "target": "windows_targets" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows-sys 0.45.0": { + "name": "windows-sys", + "version": "0.45.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows-sys/0.45.0/download", + "sha256": "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "Win32", + "Win32_Foundation", + "Win32_Storage", + "Win32_Storage_FileSystem", + "Win32_System", + "Win32_System_Console", + "default" + ], + "selects": {} + }, + "deps": { + "common": [], + "selects": { + "cfg(not(windows_raw_dylib))": [ + { + "id": "windows-targets 0.42.2", + "target": "windows_targets" + } + ] + } + }, + "edition": "2018", + "version": "0.45.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows-sys 0.48.0": { + "name": "windows-sys", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows-sys/0.48.0/download", + "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_sys", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "Win32", + "Win32_Foundation", + "Win32_Networking", + "Win32_Networking_WinSock", + "Win32_Security", + "Win32_Storage", + "Win32_Storage_FileSystem", + "Win32_System", + "Win32_System_IO", + "Win32_System_Threading", + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "windows-targets 0.48.0", + "target": "windows_targets" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows-targets 0.42.2": { + "name": "windows-targets", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows-targets/0.42.2/download", + "sha256": "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_targets", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_targets", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "aarch64-pc-windows-gnullvm": [ + { + "id": "windows_aarch64_gnullvm 0.42.2", + "target": "windows_aarch64_gnullvm" + } + ], + "aarch64-pc-windows-msvc": [ + { + "id": "windows_aarch64_msvc 0.42.2", + "target": "windows_aarch64_msvc" + } + ], + "aarch64-uwp-windows-msvc": [ + { + "id": "windows_aarch64_msvc 0.42.2", + "target": "windows_aarch64_msvc" + } + ], + "i686-pc-windows-gnu": [ + { + "id": "windows_i686_gnu 0.42.2", + "target": "windows_i686_gnu" + } + ], + "i686-pc-windows-msvc": [ + { + "id": "windows_i686_msvc 0.42.2", + "target": "windows_i686_msvc" + } + ], + "i686-uwp-windows-gnu": [ + { + "id": "windows_i686_gnu 0.42.2", + "target": "windows_i686_gnu" + } + ], + "i686-uwp-windows-msvc": [ + { + "id": "windows_i686_msvc 0.42.2", + "target": "windows_i686_msvc" + } + ], + "x86_64-pc-windows-gnu": [ + { + "id": "windows_x86_64_gnu 0.42.2", + "target": "windows_x86_64_gnu" + } + ], + "x86_64-pc-windows-gnullvm": [ + { + "id": "windows_x86_64_gnullvm 0.42.2", + "target": "windows_x86_64_gnullvm" + } + ], + "x86_64-pc-windows-msvc": [ + { + "id": "windows_x86_64_msvc 0.42.2", + "target": "windows_x86_64_msvc" + } + ], + "x86_64-uwp-windows-gnu": [ + { + "id": "windows_x86_64_gnu 0.42.2", + "target": "windows_x86_64_gnu" + } + ], + "x86_64-uwp-windows-msvc": [ + { + "id": "windows_x86_64_msvc 0.42.2", + "target": "windows_x86_64_msvc" + } + ] + } + }, + "edition": "2018", + "version": "0.42.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows-targets 0.48.0": { + "name": "windows-targets", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows-targets/0.48.0/download", + "sha256": "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_targets", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_targets", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(all(target_arch = \"aarch64\", target_env = \"gnu\", target_abi = \"llvm\", not(windows_raw_dylib)))": [ + { + "id": "windows_aarch64_gnullvm 0.48.0", + "target": "windows_aarch64_gnullvm" + } + ], + "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_aarch64_msvc 0.48.0", + "target": "windows_aarch64_msvc" + } + ], + "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(windows_raw_dylib)))": [ + { + "id": "windows_i686_gnu 0.48.0", + "target": "windows_i686_gnu" + } + ], + "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_i686_msvc 0.48.0", + "target": "windows_i686_msvc" + } + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_gnu 0.48.0", + "target": "windows_x86_64_gnu" + } + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", target_abi = \"llvm\", not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_gnullvm 0.48.0", + "target": "windows_x86_64_gnullvm" + } + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + { + "id": "windows_x86_64_msvc 0.48.0", + "target": "windows_x86_64_msvc" + } + ] + } + }, + "edition": "2018", + "version": "0.48.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_aarch64_gnullvm 0.42.2": { + "name": "windows_aarch64_gnullvm", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_aarch64_gnullvm/0.42.2/download", + "sha256": "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_aarch64_gnullvm", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_aarch64_gnullvm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_aarch64_gnullvm 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_aarch64_gnullvm 0.48.0": { + "name": "windows_aarch64_gnullvm", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_aarch64_gnullvm/0.48.0/download", + "sha256": "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_aarch64_gnullvm", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_aarch64_gnullvm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_aarch64_gnullvm 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_aarch64_msvc 0.42.2": { + "name": "windows_aarch64_msvc", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_aarch64_msvc/0.42.2/download", + "sha256": "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_aarch64_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_aarch64_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_aarch64_msvc 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_aarch64_msvc 0.48.0": { + "name": "windows_aarch64_msvc", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_aarch64_msvc/0.48.0/download", + "sha256": "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_aarch64_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_aarch64_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_aarch64_msvc 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_i686_gnu 0.42.2": { + "name": "windows_i686_gnu", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_i686_gnu/0.42.2/download", + "sha256": "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_i686_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_i686_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_i686_gnu 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_i686_gnu 0.48.0": { + "name": "windows_i686_gnu", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_i686_gnu/0.48.0/download", + "sha256": "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_i686_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_i686_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_i686_gnu 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_i686_msvc 0.42.2": { + "name": "windows_i686_msvc", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_i686_msvc/0.42.2/download", + "sha256": "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_i686_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_i686_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_i686_msvc 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_i686_msvc 0.48.0": { + "name": "windows_i686_msvc", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_i686_msvc/0.48.0/download", + "sha256": "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_i686_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_i686_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_i686_msvc 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_gnu 0.42.2": { + "name": "windows_x86_64_gnu", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_gnu/0.42.2/download", + "sha256": "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_gnu 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_gnu 0.48.0": { + "name": "windows_x86_64_gnu", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_gnu/0.48.0/download", + "sha256": "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_gnu", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_gnu", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_gnu 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_gnullvm 0.42.2": { + "name": "windows_x86_64_gnullvm", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_gnullvm/0.42.2/download", + "sha256": "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_gnullvm", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_gnullvm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_gnullvm 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_gnullvm 0.48.0": { + "name": "windows_x86_64_gnullvm", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_gnullvm/0.48.0/download", + "sha256": "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_gnullvm", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_gnullvm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_gnullvm 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_msvc 0.42.2": { + "name": "windows_x86_64_msvc", + "version": "0.42.2", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_msvc/0.42.2/download", + "sha256": "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_msvc 0.42.2", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.42.2" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, + "windows_x86_64_msvc 0.48.0": { + "name": "windows_x86_64_msvc", + "version": "0.48.0", + "package_url": "https://github.com/microsoft/windows-rs", + "repository": { + "Http": { + "url": "https://crates.io/api/v1/crates/windows_x86_64_msvc/0.48.0/download", + "sha256": "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + } + }, + "targets": [ + { + "Library": { + "crate_name": "windows_x86_64_msvc", + "crate_root": "src/lib.rs", + "srcs": [ + "**/*.rs" + ] + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": [ + "**/*.rs" + ] + } + } + ], + "library_target_name": "windows_x86_64_msvc", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "windows_x86_64_msvc 0.48.0", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.48.0" + }, + "build_script_attrs": { + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + } + }, + "binary_crates": [], + "workspace_members": { + "codeql-extractor-ruby 0.1.0": "ruby/extractor" + }, + "conditions": { + "aarch64-apple-darwin": [ + "aarch64-apple-darwin" + ], + "aarch64-apple-ios": [ + "aarch64-apple-ios" + ], + "aarch64-apple-ios-sim": [ + "aarch64-apple-ios-sim" + ], + "aarch64-fuchsia": [ + "aarch64-fuchsia" + ], + "aarch64-linux-android": [ + "aarch64-linux-android" + ], + "aarch64-pc-windows-gnullvm": [], + "aarch64-pc-windows-msvc": [ + "aarch64-pc-windows-msvc" + ], + "aarch64-unknown-linux-gnu": [ + "aarch64-unknown-linux-gnu" + ], + "aarch64-unknown-nixos-gnu": [ + "aarch64-unknown-nixos-gnu" + ], + "aarch64-unknown-nto-qnx710": [ + "aarch64-unknown-nto-qnx710" + ], + "aarch64-uwp-windows-msvc": [], + "arm-unknown-linux-gnueabi": [ + "arm-unknown-linux-gnueabi" + ], + "armv7-linux-androideabi": [ + "armv7-linux-androideabi" + ], + "armv7-unknown-linux-gnueabi": [ + "armv7-unknown-linux-gnueabi" + ], + "cfg(all(any(target_arch = \"x86_64\", target_arch = \"aarch64\"), target_os = \"hermit\"))": [], + "cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\"))))))))": [ + "aarch64-linux-android", + "armv7-linux-androideabi", + "i686-linux-android", + "powerpc-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-linux-android" + ], + "cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\")))))": [ + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "arm-unknown-linux-gnueabi", + "armv7-unknown-linux-gnueabi", + "i686-unknown-linux-gnu", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu" + ], + "cfg(all(target_arch = \"aarch64\", target_env = \"gnu\", target_abi = \"llvm\", not(windows_raw_dylib)))": [], + "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + "aarch64-pc-windows-msvc" + ], + "cfg(all(target_arch = \"wasm32\", not(any(target_os = \"emscripten\", target_os = \"wasi\"))))": [ + "wasm32-unknown-unknown" + ], + "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(windows_raw_dylib)))": [ + "i686-unknown-linux-gnu" + ], + "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + "i686-pc-windows-msvc" + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": [ + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu" + ], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", target_abi = \"llvm\", not(windows_raw_dylib)))": [], + "cfg(all(target_arch = \"x86_64\", target_env = \"msvc\", not(windows_raw_dylib)))": [ + "x86_64-pc-windows-msvc" + ], + "cfg(any(rustix_use_libc, miri, not(all(target_os = \"linux\", any(target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"), all(target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"powerpc64\", target_arch = \"riscv64\", target_arch = \"mips\", target_arch = \"mips64\")))))))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-nto-qnx710", + "armv7-linux-androideabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-pc-windows-msvc", + "i686-unknown-freebsd", + "powerpc-unknown-linux-gnu", + "riscv32imc-unknown-none-elf", + "riscv64gc-unknown-none-elf", + "s390x-unknown-linux-gnu", + "thumbv7em-none-eabi", + "thumbv8m.main-none-eabi", + "wasm32-unknown-unknown", + "wasm32-wasi", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-pc-windows-msvc", + "x86_64-unknown-freebsd", + "x86_64-unknown-none" + ], + "cfg(any(target_os = \"macos\", target_os = \"ios\"))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "i686-apple-darwin", + "x86_64-apple-darwin", + "x86_64-apple-ios" + ], + "cfg(not(any(windows, target_os = \"hermit\", target_os = \"unknown\")))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "aarch64-unknown-nto-qnx710", + "arm-unknown-linux-gnueabi", + "armv7-linux-androideabi", + "armv7-unknown-linux-gnueabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-unknown-freebsd", + "i686-unknown-linux-gnu", + "powerpc-unknown-linux-gnu", + "riscv32imc-unknown-none-elf", + "riscv64gc-unknown-none-elf", + "s390x-unknown-linux-gnu", + "thumbv7em-none-eabi", + "thumbv8m.main-none-eabi", + "wasm32-wasi", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-unknown-freebsd", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu", + "x86_64-unknown-none" + ], + "cfg(not(windows))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "aarch64-unknown-nto-qnx710", + "arm-unknown-linux-gnueabi", + "armv7-linux-androideabi", + "armv7-unknown-linux-gnueabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-unknown-freebsd", + "i686-unknown-linux-gnu", + "powerpc-unknown-linux-gnu", + "riscv32imc-unknown-none-elf", + "riscv64gc-unknown-none-elf", + "s390x-unknown-linux-gnu", + "thumbv7em-none-eabi", + "thumbv8m.main-none-eabi", + "wasm32-unknown-unknown", + "wasm32-wasi", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-unknown-freebsd", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu", + "x86_64-unknown-none" + ], + "cfg(not(windows_raw_dylib))": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-pc-windows-msvc", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "aarch64-unknown-nto-qnx710", + "arm-unknown-linux-gnueabi", + "armv7-linux-androideabi", + "armv7-unknown-linux-gnueabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-pc-windows-msvc", + "i686-unknown-freebsd", + "i686-unknown-linux-gnu", + "powerpc-unknown-linux-gnu", + "riscv32imc-unknown-none-elf", + "riscv64gc-unknown-none-elf", + "s390x-unknown-linux-gnu", + "thumbv7em-none-eabi", + "thumbv8m.main-none-eabi", + "wasm32-unknown-unknown", + "wasm32-wasi", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-pc-windows-msvc", + "x86_64-unknown-freebsd", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu", + "x86_64-unknown-none" + ], + "cfg(target_arch = \"wasm32\")": [ + "wasm32-unknown-unknown", + "wasm32-wasi" + ], + "cfg(target_os = \"android\")": [ + "aarch64-linux-android", + "armv7-linux-androideabi", + "i686-linux-android", + "x86_64-linux-android" + ], + "cfg(target_os = \"dragonfly\")": [], + "cfg(target_os = \"haiku\")": [], + "cfg(target_os = \"hermit\")": [], + "cfg(target_os = \"wasi\")": [ + "wasm32-wasi" + ], + "cfg(target_os = \"windows\")": [ + "aarch64-pc-windows-msvc", + "i686-pc-windows-msvc", + "x86_64-pc-windows-msvc" + ], + "cfg(tracing_unstable)": [], + "cfg(unix)": [ + "aarch64-apple-darwin", + "aarch64-apple-ios", + "aarch64-apple-ios-sim", + "aarch64-fuchsia", + "aarch64-linux-android", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-nixos-gnu", + "aarch64-unknown-nto-qnx710", + "arm-unknown-linux-gnueabi", + "armv7-linux-androideabi", + "armv7-unknown-linux-gnueabi", + "i686-apple-darwin", + "i686-linux-android", + "i686-unknown-freebsd", + "i686-unknown-linux-gnu", + "powerpc-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-apple-ios", + "x86_64-fuchsia", + "x86_64-linux-android", + "x86_64-unknown-freebsd", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-nixos-gnu" + ], + "cfg(windows)": [ + "aarch64-pc-windows-msvc", + "i686-pc-windows-msvc", + "x86_64-pc-windows-msvc" + ], + "i686-apple-darwin": [ + "i686-apple-darwin" + ], + "i686-linux-android": [ + "i686-linux-android" + ], + "i686-pc-windows-gnu": [], + "i686-pc-windows-msvc": [ + "i686-pc-windows-msvc" + ], + "i686-unknown-freebsd": [ + "i686-unknown-freebsd" + ], + "i686-unknown-linux-gnu": [ + "i686-unknown-linux-gnu" + ], + "i686-uwp-windows-gnu": [], + "i686-uwp-windows-msvc": [], + "powerpc-unknown-linux-gnu": [ + "powerpc-unknown-linux-gnu" + ], + "riscv32imc-unknown-none-elf": [ + "riscv32imc-unknown-none-elf" + ], + "riscv64gc-unknown-none-elf": [ + "riscv64gc-unknown-none-elf" + ], + "s390x-unknown-linux-gnu": [ + "s390x-unknown-linux-gnu" + ], + "thumbv7em-none-eabi": [ + "thumbv7em-none-eabi" + ], + "thumbv8m.main-none-eabi": [ + "thumbv8m.main-none-eabi" + ], + "wasm32-unknown-unknown": [ + "wasm32-unknown-unknown" + ], + "wasm32-wasi": [ + "wasm32-wasi" + ], + "x86_64-apple-darwin": [ + "x86_64-apple-darwin" + ], + "x86_64-apple-ios": [ + "x86_64-apple-ios" + ], + "x86_64-fuchsia": [ + "x86_64-fuchsia" + ], + "x86_64-linux-android": [ + "x86_64-linux-android" + ], + "x86_64-pc-windows-gnu": [], + "x86_64-pc-windows-gnullvm": [], + "x86_64-pc-windows-msvc": [ + "x86_64-pc-windows-msvc" + ], + "x86_64-unknown-freebsd": [ + "x86_64-unknown-freebsd" + ], + "x86_64-unknown-linux-gnu": [ + "x86_64-unknown-linux-gnu" + ], + "x86_64-unknown-nixos-gnu": [ + "x86_64-unknown-nixos-gnu" + ], + "x86_64-unknown-none": [ + "x86_64-unknown-none" + ], + "x86_64-uwp-windows-gnu": [], + "x86_64-uwp-windows-msvc": [] + }, + "direct_deps": [ + "clap 4.2.1", + "codeql-extractor 0.2.0", + "encoding 0.2.33", + "lazy_static 1.4.0", + "rayon 1.7.0", + "regex 1.7.3", + "tracing 0.1.37", + "tracing-subscriber 0.3.16", + "tree-sitter 0.20.10", + "tree-sitter-embedded-template 0.20.0", + "tree-sitter-ruby 0.20.0" + ], + "direct_dev_deps": [] +} diff --git a/ruby/extractor/Cargo.lock b/ruby/extractor/Cargo.lock index 328e597dd3bbdea057a5398f216c944a60e6e2ac..d5e8f132f24041f7fc286ade2d6dbd2b1562b66a 100644 GIT binary patch delta 130 zcmZ4WhjGha#tj<;C;w&Rnrs^{o}Qjrl2MwZpPZkPT9~5;5min on my M1 mac, so do wait for a while. [dependencies] tree-sitter = "0.20" tree-sitter-embedded-template = { git = "https://github.com/tree-sitter/tree-sitter-embedded-template.git", rev = "203f7bd3c1bbfbd98fc19add4b8fcb213c059205" } @@ -18,4 +24,13 @@ rayon = "1.5.0" regex = "1.7.1" encoding = "0.2" lazy_static = "1.4.0" -codeql-extractor = { path = "../../shared/tree-sitter-extractor" } +# Ideally, we'd like to pull this in via a relative path. +# However, our bazel/rust tooling chokes on this, c.f. https://github.com/bazelbuild/rules_rust/issues/1525 +# Therefore, to break that dependency, we depend on it via a git dependency instead. +# We should change this back to a path dependency once this issue is fixed. +# We can't depend on this without a rev/branch specification, as the rules_rust code assumes the default branch +# is called `master`, and if we pull this in with `branch=main`, then `cargo` works (and pins this at th current git SHA +# of lock-file update time, but `rules_rust` pins generates a bazel rule that unconditionally downloads `main`, which +# breaks build hermeticity. So, rev-pinning it is. +# See also https://github.com/bazelbuild/rules_rust/issues/2502. +codeql-extractor = { git = "https://github.com/github/codeql.git", rev = "514a92d5bd1e24e4b7367d64430762ffd1ffbe7f" } diff --git a/ruby/extractor/Cross.toml b/ruby/extractor/Cross.toml deleted file mode 100644 index f3ed51aee59..00000000000 --- a/ruby/extractor/Cross.toml +++ /dev/null @@ -1,8 +0,0 @@ -[target.x86_64-unknown-linux-gnu] -image = "centos/devtoolset-7-toolchain-centos7" - -[build.env] -# Provide the path to the shared extractor -# Cross mounts this directory as a volume, so builds inside the docker container -# can see it. -volumes = ["__CODEQL-EXTRACTOR=../../shared/tree-sitter-extractor"] diff --git a/ruby/ql/lib/BUILD.bazel b/ruby/ql/lib/BUILD.bazel new file mode 100644 index 00000000000..54a65933149 --- /dev/null +++ b/ruby/ql/lib/BUILD.bazel @@ -0,0 +1,13 @@ +load("@rules_pkg//:mappings.bzl", "pkg_files") + +package(default_visibility = ["//ruby:__pkg__"]) + +pkg_files( + name = "dbscheme", + srcs = ["ruby.dbscheme"], +) + +pkg_files( + name = "dbscheme-stats", + srcs = ["ruby.dbscheme.stats"], +) diff --git a/ruby/tools/BUILD.bazel b/ruby/tools/BUILD.bazel new file mode 100644 index 00000000000..76f86578880 --- /dev/null +++ b/ruby/tools/BUILD.bazel @@ -0,0 +1,11 @@ +load("@//:dist.bzl", "pack_zip") + +pack_zip( + name = "tools", + srcs = glob(["**/*"]), + excludes = [ + "BUILD.bazel", + ], + prefix = "tools", + visibility = ["//visibility:public"], +) From b82ffd40e7cb02a3df07d1829917bbc826089bf2 Mon Sep 17 00:00:00 2001 From: Cornelius Riemenschneider Date: Mon, 19 Feb 2024 16:37:36 +0100 Subject: [PATCH 150/207] Fix windows CI build. As we're now checking out the `codeql` repo in a sub-path, we need to enable long paths on Windows. --- .github/workflows/ruby-build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index 0f529ac8bb9..7ef3f499f83 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -51,6 +51,11 @@ jobs: run: | brew install gnu-tar echo "/usr/local/opt/gnu-tar/libexec/gnubin" >> $GITHUB_PATH + - name: Prepare Windows + if: runner.os == 'Windows' + shell: powershell + run: | + git config --global core.longpaths true - uses: ./.github/actions/os-version id: os_version - name: Cache entire extractor From 688b9955a01f13cc53b4d2e5be0149646b08493f Mon Sep 17 00:00:00 2001 From: Cornelius Riemenschneider Date: Thu, 22 Feb 2024 22:02:14 +0100 Subject: [PATCH 151/207] Address review, start accomodating bzlmod. --- .gitattributes | 4 ++++ ruby/BUILD.bazel | 4 ++-- ruby/extractor/BUILD.bazel | 2 +- ruby/extractor/Cargo.toml | 11 ++++++----- .../{Cargo.Bazel.lock => cargo-bazel-lock.json} | 2 +- ruby/tools/BUILD.bazel | 2 +- 6 files changed, 15 insertions(+), 10 deletions(-) rename ruby/extractor/{Cargo.Bazel.lock => cargo-bazel-lock.json} (99%) diff --git a/.gitattributes b/.gitattributes index 229c2eaefea..37484ad742a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -74,3 +74,7 @@ javascript/ql/experimental/adaptivethreatmodeling/test/endpoint_large_scale/auto # Auto-generated modeling for Python python/ql/lib/semmle/python/frameworks/data/internal/subclass-capture/*.yml linguist-generated=true + +# auto-generated bazel lock file +ruby/extractor/cargo-bazel-lock.json linguist-generated=true +ruby/extractor/cargo-bazel-lock.json -merge diff --git a/ruby/BUILD.bazel b/ruby/BUILD.bazel index 64bba5f0efc..28cb046e3a6 100644 --- a/ruby/BUILD.bazel +++ b/ruby/BUILD.bazel @@ -1,6 +1,6 @@ -load("@//:dist.bzl", "dist", "pack_zip") -load("@ql//:defs.bzl", "codeql_platform") load("@rules_pkg//pkg:mappings.bzl", "pkg_filegroup", "pkg_files") +load("@semmle_code//:dist.bzl", "dist", "pack_zip") +load("//:defs.bzl", "codeql_platform") package(default_visibility = ["//visibility:public"]) diff --git a/ruby/extractor/BUILD.bazel b/ruby/extractor/BUILD.bazel index 254424fc455..e859884085d 100644 --- a/ruby/extractor/BUILD.bazel +++ b/ruby/extractor/BUILD.bazel @@ -1,5 +1,5 @@ -load("@//:common.bzl", "codeql_rust_binary") load("@ruby_deps//:defs.bzl", "aliases", "all_crate_deps") +load("@semmle_code//:common.bzl", "codeql_rust_binary") codeql_rust_binary( name = "extractor", diff --git a/ruby/extractor/Cargo.toml b/ruby/extractor/Cargo.toml index c807de4b869..8bb8cd96dce 100644 --- a/ruby/extractor/Cargo.toml +++ b/ruby/extractor/Cargo.toml @@ -5,11 +5,12 @@ version = "0.1.0" authors = ["GitHub"] edition = "2018" -# When changing/updating these, the `Cargo.Bazel.lock` file has to be regenerated. -# Check out the documentation at https://bazelbuild.github.io/rules_rust/crate_universe.html#repinning--updating-dependencies -# for how to do so. The bazel repository for the ruby extractor is called `ruby_extractor_crate_index`, -# and instead of calling `bazel sync`, `./build --bazel sync` should be used instead, to always use the correct bazel version. -# In the future, the hope is to move this handling of the dependencies entirely into the `codeql` submodule, +# When changing/updating these, the `cargo-bazel-lock.json` file has to be regenerated. +# Run `CARGO_BAZEL_REPIN=true CARGO_BAZEL_REPIN_ONLY=ruby_deps ./build --bazel sync --only=ruby_deps` +# in the `semmle-code` repository to do so. +# For more information, check out the documentation at +# https://bazelbuild.github.io/rules_rust/crate_universe.html#repinning--updating-dependencies +# In the future, the hope is to move this handling of the dependencies entirely into the `codeql` repository, # but that depends on `rules_rust` being fully compatible with bzlmod, which they aren't yet # (c.f. https://github.com/bazelbuild/rules_rust/issues/2452). # Warning: The process takes >5min on my M1 mac, so do wait for a while. diff --git a/ruby/extractor/Cargo.Bazel.lock b/ruby/extractor/cargo-bazel-lock.json similarity index 99% rename from ruby/extractor/Cargo.Bazel.lock rename to ruby/extractor/cargo-bazel-lock.json index a2215f91967..4c32c4e0e09 100644 --- a/ruby/extractor/Cargo.Bazel.lock +++ b/ruby/extractor/cargo-bazel-lock.json @@ -1,5 +1,5 @@ { - "checksum": "967967dffe2fa38c30836aad92aad831f6eaab77aac76c0710d807bc80a9b2f6", + "checksum": "d560c06cf4f13182656a5daa708e6278b403dfc9075fc8539b046c3cf823e3a1", "crates": { "adler 1.0.2": { "name": "adler", diff --git a/ruby/tools/BUILD.bazel b/ruby/tools/BUILD.bazel index 76f86578880..4ec50830a43 100644 --- a/ruby/tools/BUILD.bazel +++ b/ruby/tools/BUILD.bazel @@ -1,4 +1,4 @@ -load("@//:dist.bzl", "pack_zip") +load("@semmle_code//:dist.bzl", "pack_zip") pack_zip( name = "tools", From 1657b314c1ac5b0c9b0dc0f6d6d3b59dd91a76b6 Mon Sep 17 00:00:00 2001 From: Cornelius Riemenschneider Date: Mon, 26 Feb 2024 11:48:05 +0100 Subject: [PATCH 152/207] Re-pin ruby extractor deps. --- ruby/extractor/cargo-bazel-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/extractor/cargo-bazel-lock.json b/ruby/extractor/cargo-bazel-lock.json index 4c32c4e0e09..76a63d4376d 100644 --- a/ruby/extractor/cargo-bazel-lock.json +++ b/ruby/extractor/cargo-bazel-lock.json @@ -1,5 +1,5 @@ { - "checksum": "d560c06cf4f13182656a5daa708e6278b403dfc9075fc8539b046c3cf823e3a1", + "checksum": "1c460a0aa044e422d51b182416888e0a45d131996cc1821a0fedbab3cd2b07bf", "crates": { "adler 1.0.2": { "name": "adler", From 1410574f769c3474bb621554597723bfb144f3e7 Mon Sep 17 00:00:00 2001 From: amammad Date: Mon, 12 Jun 2023 20:06:26 +1000 Subject: [PATCH 153/207] make seperate steps for YAML.parse* and use `getAsuccessor*()` to reach final to_ruby method call, All parts have Rewritten with API graphs exclusively --- ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll | 41 +++++++++++++++---- .../UnsafeDeserializationCustomizations.qll | 18 +++++++- .../UnsafeDeserialization.qlref | 2 +- .../YAMLUnsafeDeserialization.rb | 18 +++++++- 4 files changed, 66 insertions(+), 13 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll index 65596df7fe2..5dcd0056207 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll @@ -10,25 +10,48 @@ private import codeql.ruby.ApiGraphs * A taint step related to the result of `YAML.parse` calls, or similar. * In the following example, this step will propagate taint from * `source` to `sink`: - * + * this contains two seperate steps: * ```rb * x = source - * result = YAML.parse(x) - * sink result.to_ruby # Unsafe call + * sink = YAML.parse(x) + * ``` + * By second step + * source is a Successor of `YAML.parse(x)` + * which ends with `to_ruby` or an Element of `to_ruby` + * ```ruby + * sink source.to_ruby # Unsafe call * ``` */ private class YamlParseStep extends AdditionalTaintStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { - exists(DataFlow::CallNode yamlParserMethod | - succ = yamlParserMethod.getAMethodCall("to_ruby") and + exists(API::Node yamlParserMethod | + succ = yamlParserMethod.getReturn().asSource() and ( - yamlParserMethod = yamlNode().getAMethodCall(["parse", "parse_stream"]) and - pred = [yamlParserMethod.getArgument(0), yamlParserMethod.getKeywordArgument("yaml")] + yamlParserMethod = yamlNode().getMethod(["parse", "parse_stream"]) and + pred = + [yamlParserMethod.getParameter(0), yamlParserMethod.getKeywordParameter("yaml")].asSink() or - yamlParserMethod = yamlNode().getAMethodCall("parse_file") and - pred = [yamlParserMethod.getArgument(0), yamlParserMethod.getKeywordArgument("filename")] + yamlParserMethod = yamlNode().getMethod("parse_file") and + pred = + [yamlParserMethod.getParameter(0), yamlParserMethod.getKeywordParameter("filename")] + .asSink() ) ) + or + exists(API::Node yamlParserMethod | + succ = + [ + yamlParserMethod.getASuccessor*().getMethod("to_ruby").getReturn().asSource(), + yamlParserMethod + .getASuccessor*() + .getMethod("to_ruby") + .getReturn() + .getAnElement() + .asSource() + ] and + yamlParserMethod = yamlNode().getMethod(["parse", "parse_stream", "parse_file"]) and + pred = yamlParserMethod.getReturn().asSource() + ) } } diff --git a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll index 40e03912adc..7ec6d64b3da 100644 --- a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll @@ -97,12 +97,26 @@ module UnsafeDeserialization { /** * An argument in a call to `YAML.parse*`, considered a sink for unsafe deserialization - * if there is a call to `to_ruby` on the returned value. + * if there is a call to `to_ruby` on the returned value of any Successor. */ class YamlParseArgument extends Sink { YamlParseArgument() { this = - yamlNode().getAMethodCall(["parse", "parse_stream", "parse_file"]).getAMethodCall("to_ruby") + [ + yamlNode() + .getMethod(["parse", "parse_stream", "parse_file"]) + .getASuccessor*() + .getMethod("to_ruby") + .getReturn() + .asSource(), + yamlNode() + .getMethod(["parse", "parse_stream", "parse_file"]) + .getASuccessor*() + .getMethod("to_ruby") + .getReturn() + .getAnElement() + .asSource() + ] } } diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.qlref b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.qlref index 55f7c440b46..abfb453d723 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.qlref +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.qlref @@ -1 +1 @@ -queries/security/cwe-502/UnsafeDeserialization.ql +queries/security/cwe-502/UnsafeDeserialization.ql \ No newline at end of file diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb index 6e836a0a049..98abc47ba36 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb @@ -15,7 +15,23 @@ class UsersController < ActionController::Base parse_output.to_ruby Psych.parse(params[:yaml_string]).to_ruby Psych.parse_file(params[:yaml_file]).to_ruby - + parsed_yaml.children.each do |child| + puts child.to_ruby + end + Psych.parse_stream(params[:yaml_string]) do |document| + puts document.to_ruby + end + parsed_yaml.children.first.to_ruby + parsed_yaml = Psych.parse_stream(params[:yaml_string]) + content = parsed_yaml.children[0].children[0].children + parsed = parsed_yaml.to_ruby[0] + parsed = content.to_ruby[0] + Psych.parse(params[:yaml_string]).children[0].to_ruby + # FP + parsed_yaml = Psych2.parse_stream(params[:yaml_string]) + content = parsed_yaml.children[0].children[0].children + parsed = parsed_yaml.to_ruby + parsed = parsed_yaml.to_ruby[0] end end From 474a4f8abdbad932b8a07ba4ba1fb57fa7706be4 Mon Sep 17 00:00:00 2001 From: amammad Date: Mon, 12 Jun 2023 23:23:09 +1000 Subject: [PATCH 154/207] thanks @asgerf for informing me that Successor wants to be deprecated and thank him that providing the solution --- ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll | 24 +++++++++++-------- .../UnsafeDeserializationCustomizations.qll | 16 +++---------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll index 5dcd0056207..051555d87ca 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll @@ -38,21 +38,25 @@ private class YamlParseStep extends AdditionalTaintStep { ) ) or - exists(API::Node yamlParserMethod | + exists(API::Node parseSuccessors | parseSuccessors = yamlParseChildNodeAccess(_) | succ = [ - yamlParserMethod.getASuccessor*().getMethod("to_ruby").getReturn().asSource(), - yamlParserMethod - .getASuccessor*() - .getMethod("to_ruby") - .getReturn() - .getAnElement() - .asSource() + parseSuccessors.getMethod("to_ruby").getReturn().asSource(), + parseSuccessors.getMethod("to_ruby").getReturn().getAnElement().asSource() ] and - yamlParserMethod = yamlNode().getMethod(["parse", "parse_stream", "parse_file"]) and - pred = yamlParserMethod.getReturn().asSource() + pred = parseSuccessors.asSource() ) } } +API::Node yamlParseChildNodeAccess(API::Node source) { + source = yamlNode().getMethod(["parse", "parse_stream"]).getReturn() and source = result + or + result = yamlParseChildNodeAccess(source).getMethod(_).getReturn() + or + result = yamlParseChildNodeAccess(source).getMethod(_).getBlock().getParameter(_) + or + result = yamlParseChildNodeAccess(source).getAnElement() +} + private API::Node yamlNode() { result = API::getTopLevelMember(["YAML", "Psych"]) } diff --git a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll index 7ec6d64b3da..e696cff91c6 100644 --- a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll @@ -11,6 +11,7 @@ private import codeql.ruby.dataflow.RemoteFlowSources private import codeql.ruby.frameworks.ActiveJob private import codeql.ruby.frameworks.core.Module private import codeql.ruby.frameworks.core.Kernel +private import codeql.ruby.frameworks.Yaml module UnsafeDeserialization { /** @@ -103,19 +104,8 @@ module UnsafeDeserialization { YamlParseArgument() { this = [ - yamlNode() - .getMethod(["parse", "parse_stream", "parse_file"]) - .getASuccessor*() - .getMethod("to_ruby") - .getReturn() - .asSource(), - yamlNode() - .getMethod(["parse", "parse_stream", "parse_file"]) - .getASuccessor*() - .getMethod("to_ruby") - .getReturn() - .getAnElement() - .asSource() + yamlParseChildNodeAccess(_).getMethod("to_ruby").getReturn().asSource(), + yamlParseChildNodeAccess(_).getMethod("to_ruby").getReturn().getAnElement().asSource() ] } } From a75a0049428c5fe45cd2c429baf337877bd5fa3a Mon Sep 17 00:00:00 2001 From: amammad Date: Mon, 12 Jun 2023 23:23:09 +1000 Subject: [PATCH 155/207] add more additional steps, change parse* sinks to reciever of them --- ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll | 27 ++++++++++++------- .../UnsafeDeserializationCustomizations.qll | 22 +++++++-------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll index 051555d87ca..2bfd5118599 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll @@ -27,18 +27,18 @@ private class YamlParseStep extends AdditionalTaintStep { exists(API::Node yamlParserMethod | succ = yamlParserMethod.getReturn().asSource() and ( - yamlParserMethod = yamlNode().getMethod(["parse", "parse_stream"]) and + yamlParserMethod = yamlLibrary().getMethod(["parse", "parse_stream"]) and pred = [yamlParserMethod.getParameter(0), yamlParserMethod.getKeywordParameter("yaml")].asSink() or - yamlParserMethod = yamlNode().getMethod("parse_file") and + yamlParserMethod = yamlLibrary().getMethod("parse_file") and pred = [yamlParserMethod.getParameter(0), yamlParserMethod.getKeywordParameter("filename")] .asSink() ) ) or - exists(API::Node parseSuccessors | parseSuccessors = yamlParseChildNodeAccess(_) | + exists(API::Node parseSuccessors | parseSuccessors = yamlNode() | succ = [ parseSuccessors.getMethod("to_ruby").getReturn().asSource(), @@ -46,17 +46,26 @@ private class YamlParseStep extends AdditionalTaintStep { ] and pred = parseSuccessors.asSource() ) + or + exists(API::Node parseSuccessors | parseSuccessors = yamlNode() | + succ = + [ + parseSuccessors.getMethod(_).getBlock().getParameter(_).asSource(), + parseSuccessors.getMethod(_).getReturn().asSource() + ] and + pred = parseSuccessors.asSource() + ) } } -API::Node yamlParseChildNodeAccess(API::Node source) { - source = yamlNode().getMethod(["parse", "parse_stream"]).getReturn() and source = result +API::Node yamlNode() { + result = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]).getReturn() or - result = yamlParseChildNodeAccess(source).getMethod(_).getReturn() + result = yamlNode().getMethod(_).getReturn() or - result = yamlParseChildNodeAccess(source).getMethod(_).getBlock().getParameter(_) + result = yamlNode().getMethod(_).getBlock().getParameter(_) or - result = yamlParseChildNodeAccess(source).getAnElement() + result = yamlNode().getAnElement() } -private API::Node yamlNode() { result = API::getTopLevelMember(["YAML", "Psych"]) } +API::Node yamlLibrary() { result = API::getTopLevelMember(["YAML", "Psych"]) } diff --git a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll index e696cff91c6..b54b081e660 100644 --- a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll @@ -83,30 +83,30 @@ module UnsafeDeserialization { class YamlLoadArgument extends Sink { YamlLoadArgument() { // Note: this is safe in psych/yaml >= 4.0.0. - this = yamlNode().getAMethodCall("load").getArgument(0) + this = yamlLibrary().getAMethodCall("load").getArgument(0) or this = - yamlNode().getAMethodCall(["unsafe_load_file", "unsafe_load", "load_stream"]).getArgument(0) + yamlLibrary() + .getAMethodCall(["unsafe_load_file", "unsafe_load", "load_stream"]) + .getArgument(0) or - this = yamlNode().getAMethodCall(["unsafe_load", "load_stream"]).getKeywordArgument("yaml") + this = yamlLibrary().getAMethodCall(["unsafe_load", "load_stream"]).getKeywordArgument("yaml") or - this = yamlNode().getAMethodCall("unsafe_load_file").getKeywordArgument("filename") + this = yamlLibrary().getAMethodCall("unsafe_load_file").getKeywordArgument("filename") } } - private API::Node yamlNode() { result = API::getTopLevelMember(["YAML", "Psych"]) } - /** * An argument in a call to `YAML.parse*`, considered a sink for unsafe deserialization * if there is a call to `to_ruby` on the returned value of any Successor. */ class YamlParseArgument extends Sink { YamlParseArgument() { - this = - [ - yamlParseChildNodeAccess(_).getMethod("to_ruby").getReturn().asSource(), - yamlParseChildNodeAccess(_).getMethod("to_ruby").getReturn().getAnElement().asSource() - ] + exists(API::Node toRubyReceiver | + toRubyReceiver = yamlNode() and this = toRubyReceiver.asSource() + | + exists(toRubyReceiver.getMethod("to_ruby")) + ) } } From 18fa91bde43bf26b75b6c27877a8b73955f2408a Mon Sep 17 00:00:00 2001 From: amammad Date: Sat, 17 Jun 2023 07:12:02 +1000 Subject: [PATCH 156/207] add transform method that is an alias for to_ruby --- ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll | 4 ++-- .../ruby/security/UnsafeDeserializationCustomizations.qll | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll index 2bfd5118599..a513d7f7cad 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll @@ -41,8 +41,8 @@ private class YamlParseStep extends AdditionalTaintStep { exists(API::Node parseSuccessors | parseSuccessors = yamlNode() | succ = [ - parseSuccessors.getMethod("to_ruby").getReturn().asSource(), - parseSuccessors.getMethod("to_ruby").getReturn().getAnElement().asSource() + parseSuccessors.getMethod(["to_ruby", "transform"]).getReturn().asSource(), + parseSuccessors.getMethod(["to_ruby", "transform"]).getReturn().getAnElement().asSource() ] and pred = parseSuccessors.asSource() ) diff --git a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll index b54b081e660..6a42a49f369 100644 --- a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll @@ -105,7 +105,7 @@ module UnsafeDeserialization { exists(API::Node toRubyReceiver | toRubyReceiver = yamlNode() and this = toRubyReceiver.asSource() | - exists(toRubyReceiver.getMethod("to_ruby")) + exists(toRubyReceiver.getMethod(["to_ruby", "transform"])) ) } } From 464e2e429175ec0aa22b66c01b234a9cc99a5b25 Mon Sep 17 00:00:00 2001 From: amammad Date: Mon, 24 Jul 2023 17:59:54 +1000 Subject: [PATCH 157/207] fix qldoc and test files --- ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll | 6 ++ .../PlistUnsafeDeserialization.rb | 13 --- .../UnsafeDeserialization.expected | 81 +++++++------------ .../UnsafeDeserialization.rb | 55 ++++++++++++- .../YAMLUnsafeDeserialization.rb | 38 --------- 5 files changed, 89 insertions(+), 104 deletions(-) delete mode 100644 ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/PlistUnsafeDeserialization.rb delete mode 100644 ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll index a513d7f7cad..259db547e33 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll @@ -58,6 +58,9 @@ private class YamlParseStep extends AdditionalTaintStep { } } +/** + * A Node ends with YAML parse, parse_stream, parse_file methods + */ API::Node yamlNode() { result = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]).getReturn() or @@ -68,4 +71,7 @@ API::Node yamlNode() { result = yamlNode().getAnElement() } +/** + * A YAML module instance + */ API::Node yamlLibrary() { result = API::getTopLevelMember(["YAML", "Psych"]) } diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/PlistUnsafeDeserialization.rb b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/PlistUnsafeDeserialization.rb deleted file mode 100644 index 63f64b5cd22..00000000000 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/PlistUnsafeDeserialization.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'yaml' -class UsersController < ActionController::Base - def example - # not safe - result = Plist.parse_xml(params[:yaml_string]) - result = Plist.parse_xml(params[:yaml_string], marshal: true) - - # safe - result = Plist.parse_xml(params[:yaml_string], marshal: false) - end -end - - diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected index bf0376f3959..b57182b01c2 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected @@ -1,6 +1,4 @@ edges -| PlistUnsafeDeserialization.rb:5:30:5:35 | call to params | PlistUnsafeDeserialization.rb:5:30:5:49 | ...[...] | provenance | | -| PlistUnsafeDeserialization.rb:6:30:6:35 | call to params | PlistUnsafeDeserialization.rb:6:30:6:49 | ...[...] | provenance | | | UnsafeDeserialization.rb:11:5:11:19 | serialized_data | UnsafeDeserialization.rb:12:27:12:41 | serialized_data | provenance | | | UnsafeDeserialization.rb:11:23:11:50 | call to decode64 | UnsafeDeserialization.rb:11:5:11:19 | serialized_data | provenance | | | UnsafeDeserialization.rb:11:39:11:44 | call to params | UnsafeDeserialization.rb:11:39:11:50 | ...[...] | provenance | | @@ -40,21 +38,14 @@ edges | UnsafeDeserialization.rb:115:5:115:13 | yaml_data | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | provenance | | | UnsafeDeserialization.rb:115:17:115:22 | call to params | UnsafeDeserialization.rb:115:17:115:28 | ...[...] | provenance | | | UnsafeDeserialization.rb:115:17:115:28 | ...[...] | UnsafeDeserialization.rb:115:5:115:13 | yaml_data | provenance | | -| YAMLUnsafeDeserialization.rb:5:16:5:21 | call to params | YAMLUnsafeDeserialization.rb:5:16:5:35 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:11:23:11:28 | call to params | YAMLUnsafeDeserialization.rb:11:23:11:42 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:12:28:12:33 | call to params | YAMLUnsafeDeserialization.rb:12:28:12:45 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:13:23:13:28 | call to params | YAMLUnsafeDeserialization.rb:13:23:13:42 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:14:39:14:44 | call to params | YAMLUnsafeDeserialization.rb:14:39:14:58 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:14:39:14:58 | ...[...] | YAMLUnsafeDeserialization.rb:15:5:15:24 | call to to_ruby | provenance | | -| YAMLUnsafeDeserialization.rb:16:17:16:22 | call to params | YAMLUnsafeDeserialization.rb:16:17:16:36 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:16:17:16:36 | ...[...] | YAMLUnsafeDeserialization.rb:16:5:16:45 | call to to_ruby | provenance | | -| YAMLUnsafeDeserialization.rb:17:22:17:27 | call to params | YAMLUnsafeDeserialization.rb:17:22:17:39 | ...[...] | provenance | | -| YAMLUnsafeDeserialization.rb:17:22:17:39 | ...[...] | YAMLUnsafeDeserialization.rb:17:5:17:48 | call to to_ruby | provenance | | +| UnsafeDeserialization.rb:122:5:122:13 | yaml_data | UnsafeDeserialization.rb:123:25:123:33 | yaml_data | provenance | | +| UnsafeDeserialization.rb:122:17:122:22 | call to params | UnsafeDeserialization.rb:122:17:122:28 | ...[...] | provenance | | +| UnsafeDeserialization.rb:122:17:122:28 | ...[...] | UnsafeDeserialization.rb:122:5:122:13 | yaml_data | provenance | | +| UnsafeDeserialization.rb:161:5:161:14 | plist_data | UnsafeDeserialization.rb:162:30:162:39 | plist_data | provenance | | +| UnsafeDeserialization.rb:161:5:161:14 | plist_data | UnsafeDeserialization.rb:163:30:163:39 | plist_data | provenance | | +| UnsafeDeserialization.rb:161:18:161:23 | call to params | UnsafeDeserialization.rb:161:18:161:29 | ...[...] | provenance | | +| UnsafeDeserialization.rb:161:18:161:29 | ...[...] | UnsafeDeserialization.rb:161:5:161:14 | plist_data | provenance | | nodes -| PlistUnsafeDeserialization.rb:5:30:5:35 | call to params | semmle.label | call to params | -| PlistUnsafeDeserialization.rb:5:30:5:49 | ...[...] | semmle.label | ...[...] | -| PlistUnsafeDeserialization.rb:6:30:6:35 | call to params | semmle.label | call to params | -| PlistUnsafeDeserialization.rb:6:30:6:49 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:11:5:11:19 | serialized_data | semmle.label | serialized_data | | UnsafeDeserialization.rb:11:23:11:50 | call to decode64 | semmle.label | call to decode64 | | UnsafeDeserialization.rb:11:39:11:44 | call to params | semmle.label | call to params | @@ -106,32 +97,22 @@ nodes | UnsafeDeserialization.rb:115:17:115:22 | call to params | semmle.label | call to params | | UnsafeDeserialization.rb:115:17:115:28 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | semmle.label | yaml_data | -| UnsafeDeserialization.rb:120:24:120:34 | call to read | semmle.label | call to read | -| UnsafeDeserialization.rb:123:24:123:33 | call to gets | semmle.label | call to gets | -| UnsafeDeserialization.rb:126:24:126:32 | call to read | semmle.label | call to read | -| UnsafeDeserialization.rb:129:24:129:27 | call to gets | semmle.label | call to gets | -| UnsafeDeserialization.rb:132:24:132:32 | call to readlines | semmle.label | call to readlines | -| YAMLUnsafeDeserialization.rb:5:16:5:21 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:5:16:5:35 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:11:23:11:28 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:11:23:11:42 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:12:28:12:33 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:12:28:12:45 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:13:23:13:28 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:13:23:13:42 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:14:39:14:44 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:14:39:14:58 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:15:5:15:24 | call to to_ruby | semmle.label | call to to_ruby | -| YAMLUnsafeDeserialization.rb:16:5:16:45 | call to to_ruby | semmle.label | call to to_ruby | -| YAMLUnsafeDeserialization.rb:16:17:16:22 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:16:17:16:36 | ...[...] | semmle.label | ...[...] | -| YAMLUnsafeDeserialization.rb:17:5:17:48 | call to to_ruby | semmle.label | call to to_ruby | -| YAMLUnsafeDeserialization.rb:17:22:17:27 | call to params | semmle.label | call to params | -| YAMLUnsafeDeserialization.rb:17:22:17:39 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:122:5:122:13 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:122:17:122:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:122:17:122:28 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:123:25:123:33 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:161:5:161:14 | plist_data | semmle.label | plist_data | +| UnsafeDeserialization.rb:161:18:161:23 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:161:18:161:29 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:162:30:162:39 | plist_data | semmle.label | plist_data | +| UnsafeDeserialization.rb:163:30:163:39 | plist_data | semmle.label | plist_data | +| UnsafeDeserialization.rb:173:24:173:34 | call to read | semmle.label | call to read | +| UnsafeDeserialization.rb:176:24:176:33 | call to gets | semmle.label | call to gets | +| UnsafeDeserialization.rb:179:24:179:32 | call to read | semmle.label | call to read | +| UnsafeDeserialization.rb:182:24:182:27 | call to gets | semmle.label | call to gets | +| UnsafeDeserialization.rb:185:24:185:32 | call to readlines | semmle.label | call to readlines | subpaths #select -| PlistUnsafeDeserialization.rb:5:30:5:49 | ...[...] | PlistUnsafeDeserialization.rb:5:30:5:35 | call to params | PlistUnsafeDeserialization.rb:5:30:5:49 | ...[...] | Unsafe deserialization depends on a $@. | PlistUnsafeDeserialization.rb:5:30:5:35 | call to params | user-provided value | -| PlistUnsafeDeserialization.rb:6:30:6:49 | ...[...] | PlistUnsafeDeserialization.rb:6:30:6:35 | call to params | PlistUnsafeDeserialization.rb:6:30:6:49 | ...[...] | Unsafe deserialization depends on a $@. | PlistUnsafeDeserialization.rb:6:30:6:35 | call to params | user-provided value | | UnsafeDeserialization.rb:12:27:12:41 | serialized_data | UnsafeDeserialization.rb:11:39:11:44 | call to params | UnsafeDeserialization.rb:12:27:12:41 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:11:39:11:44 | call to params | user-provided value | | UnsafeDeserialization.rb:18:30:18:44 | serialized_data | UnsafeDeserialization.rb:17:39:17:44 | call to params | UnsafeDeserialization.rb:18:30:18:44 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:17:39:17:44 | call to params | user-provided value | | UnsafeDeserialization.rb:24:24:24:32 | json_data | UnsafeDeserialization.rb:23:17:23:22 | call to params | UnsafeDeserialization.rb:24:24:24:32 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:23:17:23:22 | call to params | user-provided value | @@ -145,15 +126,11 @@ subpaths | UnsafeDeserialization.rb:94:22:94:29 | xml_data | UnsafeDeserialization.rb:93:16:93:21 | call to params | UnsafeDeserialization.rb:94:22:94:29 | xml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:93:16:93:21 | call to params | user-provided value | | UnsafeDeserialization.rb:110:34:110:36 | xml | UnsafeDeserialization.rb:109:11:109:16 | call to params | UnsafeDeserialization.rb:110:34:110:36 | xml | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:109:11:109:16 | call to params | user-provided value | | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | UnsafeDeserialization.rb:115:17:115:22 | call to params | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:115:17:115:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:120:24:120:34 | call to read | UnsafeDeserialization.rb:120:24:120:34 | call to read | UnsafeDeserialization.rb:120:24:120:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:120:24:120:34 | call to read | value from stdin | -| UnsafeDeserialization.rb:123:24:123:33 | call to gets | UnsafeDeserialization.rb:123:24:123:33 | call to gets | UnsafeDeserialization.rb:123:24:123:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:123:24:123:33 | call to gets | value from stdin | -| UnsafeDeserialization.rb:126:24:126:32 | call to read | UnsafeDeserialization.rb:126:24:126:32 | call to read | UnsafeDeserialization.rb:126:24:126:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:126:24:126:32 | call to read | value from stdin | -| UnsafeDeserialization.rb:129:24:129:27 | call to gets | UnsafeDeserialization.rb:129:24:129:27 | call to gets | UnsafeDeserialization.rb:129:24:129:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:129:24:129:27 | call to gets | value from stdin | -| UnsafeDeserialization.rb:132:24:132:32 | call to readlines | UnsafeDeserialization.rb:132:24:132:32 | call to readlines | UnsafeDeserialization.rb:132:24:132:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:132:24:132:32 | call to readlines | value from stdin | -| YAMLUnsafeDeserialization.rb:5:16:5:35 | ...[...] | YAMLUnsafeDeserialization.rb:5:16:5:21 | call to params | YAMLUnsafeDeserialization.rb:5:16:5:35 | ...[...] | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:5:16:5:21 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:11:23:11:42 | ...[...] | YAMLUnsafeDeserialization.rb:11:23:11:28 | call to params | YAMLUnsafeDeserialization.rb:11:23:11:42 | ...[...] | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:11:23:11:28 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:12:28:12:45 | ...[...] | YAMLUnsafeDeserialization.rb:12:28:12:33 | call to params | YAMLUnsafeDeserialization.rb:12:28:12:45 | ...[...] | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:12:28:12:33 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:13:23:13:42 | ...[...] | YAMLUnsafeDeserialization.rb:13:23:13:28 | call to params | YAMLUnsafeDeserialization.rb:13:23:13:42 | ...[...] | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:13:23:13:28 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:15:5:15:24 | call to to_ruby | YAMLUnsafeDeserialization.rb:14:39:14:44 | call to params | YAMLUnsafeDeserialization.rb:15:5:15:24 | call to to_ruby | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:14:39:14:44 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:16:5:16:45 | call to to_ruby | YAMLUnsafeDeserialization.rb:16:17:16:22 | call to params | YAMLUnsafeDeserialization.rb:16:5:16:45 | call to to_ruby | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:16:17:16:22 | call to params | user-provided value | -| YAMLUnsafeDeserialization.rb:17:5:17:48 | call to to_ruby | YAMLUnsafeDeserialization.rb:17:22:17:27 | call to params | YAMLUnsafeDeserialization.rb:17:5:17:48 | call to to_ruby | Unsafe deserialization depends on a $@. | YAMLUnsafeDeserialization.rb:17:22:17:27 | call to params | user-provided value | +| UnsafeDeserialization.rb:123:25:123:33 | yaml_data | UnsafeDeserialization.rb:122:17:122:22 | call to params | UnsafeDeserialization.rb:123:25:123:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:122:17:122:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:162:30:162:39 | plist_data | UnsafeDeserialization.rb:161:18:161:23 | call to params | UnsafeDeserialization.rb:162:30:162:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:161:18:161:23 | call to params | user-provided value | +| UnsafeDeserialization.rb:163:30:163:39 | plist_data | UnsafeDeserialization.rb:161:18:161:23 | call to params | UnsafeDeserialization.rb:163:30:163:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:161:18:161:23 | call to params | user-provided value | +| UnsafeDeserialization.rb:173:24:173:34 | call to read | UnsafeDeserialization.rb:173:24:173:34 | call to read | UnsafeDeserialization.rb:173:24:173:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:173:24:173:34 | call to read | value from stdin | +| UnsafeDeserialization.rb:176:24:176:33 | call to gets | UnsafeDeserialization.rb:176:24:176:33 | call to gets | UnsafeDeserialization.rb:176:24:176:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:176:24:176:33 | call to gets | value from stdin | +| UnsafeDeserialization.rb:179:24:179:32 | call to read | UnsafeDeserialization.rb:179:24:179:32 | call to read | UnsafeDeserialization.rb:179:24:179:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:179:24:179:32 | call to read | value from stdin | +| UnsafeDeserialization.rb:182:24:182:27 | call to gets | UnsafeDeserialization.rb:182:24:182:27 | call to gets | UnsafeDeserialization.rb:182:24:182:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:182:24:182:27 | call to gets | value from stdin | +| UnsafeDeserialization.rb:185:24:185:32 | call to readlines | UnsafeDeserialization.rb:185:24:185:32 | call to readlines | UnsafeDeserialization.rb:185:24:185:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:185:24:185:32 | call to readlines | value from stdin | diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb index ed89f3e566c..27892fcc95b 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb @@ -110,10 +110,63 @@ class UsersController < ActionController::Base hash = Hash.from_trusted_xml(xml) end - # BAD + # BAD before psych version 4.0.0 def route15 yaml_data = params[:key] object = Psych.load yaml_data + object = Psych.load_file yaml_data + end + + # GOOD In psych version 4.0.0 and above + def route16 + yaml_data = params[:key] + object = Psych.load yaml_data + object = Psych.load_file yaml_data2 + end + + # GOOD + def route17 + yaml_data = params[:key] + object = Psych.parse_stream(yaml_data) + object = Psych.parse(yaml_data) + object = Psych.parse_file(yaml_data) + end + + # BAD + def route18 + yaml_data = params[:key] + object = Psych.unsafe_load(plist_data) + object = Psych.unsafe_load_file(plist_data) + object = Psych.load_stream(plist_data) + parse_output = Psych.parse_stream(plist_data) + object = parse_output.to_ruby + object = Psych.parse(plist_data).to_ruby + object = Psych.parse_file(plist_data).to_ruby + parsed_yaml = Psych.parse_stream(plist_data) + parsed_yaml.children.each do |child| + object = child.to_ruby + end + Psych.parse_stream(plist_data) do |document| + object = document.to_ruby + end + object = parsed_yaml.children.first.to_ruby + content = parsed_yaml.children[0].children[0].children + object = parsed_yaml.to_ruby[0] + object = content.to_ruby[0] + object = Psych.parse(plist_data).children[0].to_ruby + end + + # BAD + def route19 + plist_data = params[:key] + result = Plist.parse_xml(plist_data) + result = Plist.parse_xml(plist_data, marshal: true) + end + + # GOOD + def route20 + plist_data = params[:key] + result = Plist.parse_xml(plist_data, marshal: false) end def stdin diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb deleted file mode 100644 index 98abc47ba36..00000000000 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/YAMLUnsafeDeserialization.rb +++ /dev/null @@ -1,38 +0,0 @@ -require 'yaml' -class UsersController < ActionController::Base - def example - # safe - Psych.load(params[:yaml_string]) - Psych.load_file(params[:yaml_file]) - Psych.parse_stream(params[:yaml_string]) - Psych.parse(params[:yaml_string]) - Psych.parse_file(params[:yaml_file]) - # unsafe - Psych.unsafe_load(params[:yaml_string]) - Psych.unsafe_load_file(params[:yaml_file]) - Psych.load_stream(params[:yaml_string]) - parse_output = Psych.parse_stream(params[:yaml_string]) - parse_output.to_ruby - Psych.parse(params[:yaml_string]).to_ruby - Psych.parse_file(params[:yaml_file]).to_ruby - parsed_yaml.children.each do |child| - puts child.to_ruby - end - Psych.parse_stream(params[:yaml_string]) do |document| - puts document.to_ruby - end - parsed_yaml.children.first.to_ruby - parsed_yaml = Psych.parse_stream(params[:yaml_string]) - content = parsed_yaml.children[0].children[0].children - parsed = parsed_yaml.to_ruby[0] - parsed = content.to_ruby[0] - Psych.parse(params[:yaml_string]).children[0].to_ruby - # FP - parsed_yaml = Psych2.parse_stream(params[:yaml_string]) - content = parsed_yaml.children[0].children[0].children - parsed = parsed_yaml.to_ruby - parsed = parsed_yaml.to_ruby[0] - end -end - - From 9c5c8c8362b6f4eca6c957c458a855a8826bc3e3 Mon Sep 17 00:00:00 2001 From: amammad Date: Tue, 8 Aug 2023 03:17:49 +1000 Subject: [PATCH 158/207] fix test file --- .../UnsafeDeserialization.rb | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb index 27892fcc95b..d3d40c6c73e 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb @@ -121,7 +121,7 @@ class UsersController < ActionController::Base def route16 yaml_data = params[:key] object = Psych.load yaml_data - object = Psych.load_file yaml_data2 + object = Psych.load_file yaml_data end # GOOD @@ -135,25 +135,25 @@ class UsersController < ActionController::Base # BAD def route18 yaml_data = params[:key] - object = Psych.unsafe_load(plist_data) - object = Psych.unsafe_load_file(plist_data) - object = Psych.load_stream(plist_data) - parse_output = Psych.parse_stream(plist_data) + object = Psych.unsafe_load(yaml_data) + object = Psych.unsafe_load_file(yaml_data) + object = Psych.load_stream(yaml_data) + parse_output = Psych.parse_stream(yaml_data) object = parse_output.to_ruby - object = Psych.parse(plist_data).to_ruby - object = Psych.parse_file(plist_data).to_ruby - parsed_yaml = Psych.parse_stream(plist_data) + object = Psych.parse(yaml_data).to_ruby + object = Psych.parse_file(yaml_data).to_ruby + parsed_yaml = Psych.parse_stream(yaml_data) parsed_yaml.children.each do |child| object = child.to_ruby end - Psych.parse_stream(plist_data) do |document| + Psych.parse_stream(yaml_data) do |document| object = document.to_ruby end object = parsed_yaml.children.first.to_ruby content = parsed_yaml.children[0].children[0].children object = parsed_yaml.to_ruby[0] object = content.to_ruby[0] - object = Psych.parse(plist_data).children[0].to_ruby + object = Psych.parse(yaml_data).children[0].to_ruby end # BAD From 1c1a6f13dfc7e092dde2f4d2038767e0d00953d7 Mon Sep 17 00:00:00 2001 From: amammad Date: Tue, 8 Aug 2023 03:19:16 +1000 Subject: [PATCH 159/207] fix QLDoc style --- ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll index 259db547e33..1b68711313e 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll @@ -59,7 +59,7 @@ private class YamlParseStep extends AdditionalTaintStep { } /** - * A Node ends with YAML parse, parse_stream, parse_file methods + * Gets A Node ends with YAML parse, parse_stream, parse_file methods */ API::Node yamlNode() { result = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]).getReturn() @@ -72,6 +72,6 @@ API::Node yamlNode() { } /** - * A YAML module instance + * Gets A YAML module instance */ API::Node yamlLibrary() { result = API::getTopLevelMember(["YAML", "Psych"]) } From c582ea626d647979aee3ce24339d64337184731d Mon Sep 17 00:00:00 2001 From: amammad Date: Wed, 9 Aug 2023 02:09:16 +1000 Subject: [PATCH 160/207] update expected test file --- .../UnsafeDeserialization.expected | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected index b57182b01c2..e3bb0ba2b2a 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected @@ -41,6 +41,41 @@ edges | UnsafeDeserialization.rb:122:5:122:13 | yaml_data | UnsafeDeserialization.rb:123:25:123:33 | yaml_data | provenance | | | UnsafeDeserialization.rb:122:17:122:22 | call to params | UnsafeDeserialization.rb:122:17:122:28 | ...[...] | provenance | | | UnsafeDeserialization.rb:122:17:122:28 | ...[...] | UnsafeDeserialization.rb:122:5:122:13 | yaml_data | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:138:32:138:40 | yaml_data | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:139:37:139:45 | yaml_data | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:140:32:140:40 | yaml_data | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:141:20:141:48 | call to parse_stream | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:143:14:143:35 | call to parse | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:144:14:144:40 | call to parse_file | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:146:5:146:24 | call to children | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:152:14:152:33 | call to children | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:152:14:152:39 | call to first | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:153:15:153:34 | call to children | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:153:15:153:46 | call to children | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:156:14:156:44 | call to children | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:156:14:156:47 | ...[...] | provenance | | +| UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:137:17:137:28 | ...[...] | provenance | | +| UnsafeDeserialization.rb:137:17:137:28 | ...[...] | UnsafeDeserialization.rb:137:5:137:13 | yaml_data | provenance | | +| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:146:5:146:24 | call to children | provenance | | +| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:152:14:152:33 | call to children | provenance | | +| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:152:14:152:39 | call to first | provenance | | +| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:153:15:153:34 | call to children | provenance | | +| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:153:15:153:46 | call to children | provenance | | +| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | +| UnsafeDeserialization.rb:146:5:146:24 | call to children | UnsafeDeserialization.rb:146:35:146:39 | child | provenance | | +| UnsafeDeserialization.rb:152:14:152:33 | call to children | UnsafeDeserialization.rb:152:14:152:39 | call to first | provenance | | +| UnsafeDeserialization.rb:153:15:153:34 | call to children | UnsafeDeserialization.rb:153:15:153:37 | ...[...] | provenance | | +| UnsafeDeserialization.rb:153:15:153:34 | call to children | UnsafeDeserialization.rb:153:15:153:46 | call to children | provenance | | +| UnsafeDeserialization.rb:153:15:153:34 | call to children | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | +| UnsafeDeserialization.rb:153:15:153:37 | ...[...] | UnsafeDeserialization.rb:153:15:153:46 | call to children | provenance | | +| UnsafeDeserialization.rb:153:15:153:37 | ...[...] | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | +| UnsafeDeserialization.rb:153:15:153:46 | call to children | UnsafeDeserialization.rb:153:15:153:49 | ...[...] | provenance | | +| UnsafeDeserialization.rb:153:15:153:46 | call to children | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | +| UnsafeDeserialization.rb:153:15:153:49 | ...[...] | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | +| UnsafeDeserialization.rb:156:14:156:44 | call to children | UnsafeDeserialization.rb:156:14:156:47 | ...[...] | provenance | | | UnsafeDeserialization.rb:161:5:161:14 | plist_data | UnsafeDeserialization.rb:162:30:162:39 | plist_data | provenance | | | UnsafeDeserialization.rb:161:5:161:14 | plist_data | UnsafeDeserialization.rb:163:30:163:39 | plist_data | provenance | | | UnsafeDeserialization.rb:161:18:161:23 | call to params | UnsafeDeserialization.rb:161:18:161:29 | ...[...] | provenance | | @@ -101,6 +136,28 @@ nodes | UnsafeDeserialization.rb:122:17:122:22 | call to params | semmle.label | call to params | | UnsafeDeserialization.rb:122:17:122:28 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:123:25:123:33 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:137:17:137:22 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:137:17:137:28 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:138:32:138:40 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:139:37:139:45 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:140:32:140:40 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:141:20:141:48 | call to parse_stream | semmle.label | call to parse_stream | +| UnsafeDeserialization.rb:143:14:143:35 | call to parse | semmle.label | call to parse | +| UnsafeDeserialization.rb:144:14:144:40 | call to parse_file | semmle.label | call to parse_file | +| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | semmle.label | call to parse_stream | +| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | semmle.label | call to parse_stream | +| UnsafeDeserialization.rb:146:5:146:24 | call to children | semmle.label | call to children | +| UnsafeDeserialization.rb:146:35:146:39 | child | semmle.label | child | +| UnsafeDeserialization.rb:152:14:152:33 | call to children | semmle.label | call to children | +| UnsafeDeserialization.rb:152:14:152:39 | call to first | semmle.label | call to first | +| UnsafeDeserialization.rb:153:15:153:34 | call to children | semmle.label | call to children | +| UnsafeDeserialization.rb:153:15:153:37 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:153:15:153:46 | call to children | semmle.label | call to children | +| UnsafeDeserialization.rb:153:15:153:49 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:153:15:153:58 | call to children | semmle.label | call to children | +| UnsafeDeserialization.rb:156:14:156:44 | call to children | semmle.label | call to children | +| UnsafeDeserialization.rb:156:14:156:47 | ...[...] | semmle.label | ...[...] | | UnsafeDeserialization.rb:161:5:161:14 | plist_data | semmle.label | plist_data | | UnsafeDeserialization.rb:161:18:161:23 | call to params | semmle.label | call to params | | UnsafeDeserialization.rb:161:18:161:29 | ...[...] | semmle.label | ...[...] | @@ -127,6 +184,17 @@ subpaths | UnsafeDeserialization.rb:110:34:110:36 | xml | UnsafeDeserialization.rb:109:11:109:16 | call to params | UnsafeDeserialization.rb:110:34:110:36 | xml | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:109:11:109:16 | call to params | user-provided value | | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | UnsafeDeserialization.rb:115:17:115:22 | call to params | UnsafeDeserialization.rb:116:25:116:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:115:17:115:22 | call to params | user-provided value | | UnsafeDeserialization.rb:123:25:123:33 | yaml_data | UnsafeDeserialization.rb:122:17:122:22 | call to params | UnsafeDeserialization.rb:123:25:123:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:122:17:122:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:138:32:138:40 | yaml_data | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:138:32:138:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:139:37:139:45 | yaml_data | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:139:37:139:45 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:140:32:140:40 | yaml_data | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:140:32:140:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:141:20:141:48 | call to parse_stream | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:141:20:141:48 | call to parse_stream | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:143:14:143:35 | call to parse | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:143:14:143:35 | call to parse | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:144:14:144:40 | call to parse_file | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:144:14:144:40 | call to parse_file | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:146:35:146:39 | child | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:146:35:146:39 | child | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:152:14:152:39 | call to first | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:152:14:152:39 | call to first | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:153:15:153:58 | call to children | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:153:15:153:58 | call to children | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:156:14:156:47 | ...[...] | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:156:14:156:47 | ...[...] | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | | UnsafeDeserialization.rb:162:30:162:39 | plist_data | UnsafeDeserialization.rb:161:18:161:23 | call to params | UnsafeDeserialization.rb:162:30:162:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:161:18:161:23 | call to params | user-provided value | | UnsafeDeserialization.rb:163:30:163:39 | plist_data | UnsafeDeserialization.rb:161:18:161:23 | call to params | UnsafeDeserialization.rb:163:30:163:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:161:18:161:23 | call to params | user-provided value | | UnsafeDeserialization.rb:173:24:173:34 | call to read | UnsafeDeserialization.rb:173:24:173:34 | call to read | UnsafeDeserialization.rb:173:24:173:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:173:24:173:34 | call to read | value from stdin | From 32f5667bb61398352dd03a771a6cfc715479646d Mon Sep 17 00:00:00 2001 From: amammad <77095239+amammad@users.noreply.github.com> Date: Wed, 4 Oct 2023 18:21:12 +0200 Subject: [PATCH 161/207] revert YAML.qll and yaml sinks to previous PR, make a separate experimental query only for yaml --- ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll | 62 ++------ .../UnsafeDeserializationCustomizations.qll | 22 ++- .../cwe-502/UnsafeYamlDeserialization.qhelp | 62 ++++++++ .../cwe-502/UnsafeYamlDeserialization.ql | 21 +++ .../cwe-502/UnsafeYamlDeserialization.qll | 83 +++++++++++ ...nsafeYamlDeserializationCustomizations.qll | 136 ++++++++++++++++++ ruby/ql/src/experimental/cwe-502/Yaml.qll | 34 +++++ .../examples/UnsafeDeserializationBad.rb | 16 +++ .../examples/UnsafeDeserializationGood.rb | 10 ++ .../UnsafeYamlDeserialization.expected | 75 ++++++++++ .../cwe-502/UnsafeYamlDeserialization.qlref | 1 + .../cwe-502/UnsafeYamlDeserialization.rb | 75 ++++++++++ .../UnsafeDeserialization.expected | 105 ++++---------- .../UnsafeDeserialization.qlref | 2 +- .../UnsafeDeserialization.rb | 14 +- 15 files changed, 564 insertions(+), 154 deletions(-) create mode 100644 ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qhelp create mode 100644 ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.ql create mode 100644 ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll create mode 100644 ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserializationCustomizations.qll create mode 100644 ruby/ql/src/experimental/cwe-502/Yaml.qll create mode 100644 ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationBad.rb create mode 100644 ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationGood.rb create mode 100644 ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected create mode 100644 ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.qlref create mode 100644 ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.rb diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll index 1b68711313e..65596df7fe2 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Yaml.qll @@ -10,68 +10,26 @@ private import codeql.ruby.ApiGraphs * A taint step related to the result of `YAML.parse` calls, or similar. * In the following example, this step will propagate taint from * `source` to `sink`: - * this contains two seperate steps: + * * ```rb * x = source - * sink = YAML.parse(x) - * ``` - * By second step - * source is a Successor of `YAML.parse(x)` - * which ends with `to_ruby` or an Element of `to_ruby` - * ```ruby - * sink source.to_ruby # Unsafe call + * result = YAML.parse(x) + * sink result.to_ruby # Unsafe call * ``` */ private class YamlParseStep extends AdditionalTaintStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { - exists(API::Node yamlParserMethod | - succ = yamlParserMethod.getReturn().asSource() and + exists(DataFlow::CallNode yamlParserMethod | + succ = yamlParserMethod.getAMethodCall("to_ruby") and ( - yamlParserMethod = yamlLibrary().getMethod(["parse", "parse_stream"]) and - pred = - [yamlParserMethod.getParameter(0), yamlParserMethod.getKeywordParameter("yaml")].asSink() + yamlParserMethod = yamlNode().getAMethodCall(["parse", "parse_stream"]) and + pred = [yamlParserMethod.getArgument(0), yamlParserMethod.getKeywordArgument("yaml")] or - yamlParserMethod = yamlLibrary().getMethod("parse_file") and - pred = - [yamlParserMethod.getParameter(0), yamlParserMethod.getKeywordParameter("filename")] - .asSink() + yamlParserMethod = yamlNode().getAMethodCall("parse_file") and + pred = [yamlParserMethod.getArgument(0), yamlParserMethod.getKeywordArgument("filename")] ) ) - or - exists(API::Node parseSuccessors | parseSuccessors = yamlNode() | - succ = - [ - parseSuccessors.getMethod(["to_ruby", "transform"]).getReturn().asSource(), - parseSuccessors.getMethod(["to_ruby", "transform"]).getReturn().getAnElement().asSource() - ] and - pred = parseSuccessors.asSource() - ) - or - exists(API::Node parseSuccessors | parseSuccessors = yamlNode() | - succ = - [ - parseSuccessors.getMethod(_).getBlock().getParameter(_).asSource(), - parseSuccessors.getMethod(_).getReturn().asSource() - ] and - pred = parseSuccessors.asSource() - ) } } -/** - * Gets A Node ends with YAML parse, parse_stream, parse_file methods - */ -API::Node yamlNode() { - result = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]).getReturn() - or - result = yamlNode().getMethod(_).getReturn() - or - result = yamlNode().getMethod(_).getBlock().getParameter(_) - or - result = yamlNode().getAnElement() -} - -/** - * Gets A YAML module instance - */ -API::Node yamlLibrary() { result = API::getTopLevelMember(["YAML", "Psych"]) } +private API::Node yamlNode() { result = API::getTopLevelMember(["YAML", "Psych"]) } diff --git a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll index 6a42a49f369..40e03912adc 100644 --- a/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationCustomizations.qll @@ -11,7 +11,6 @@ private import codeql.ruby.dataflow.RemoteFlowSources private import codeql.ruby.frameworks.ActiveJob private import codeql.ruby.frameworks.core.Module private import codeql.ruby.frameworks.core.Kernel -private import codeql.ruby.frameworks.Yaml module UnsafeDeserialization { /** @@ -83,30 +82,27 @@ module UnsafeDeserialization { class YamlLoadArgument extends Sink { YamlLoadArgument() { // Note: this is safe in psych/yaml >= 4.0.0. - this = yamlLibrary().getAMethodCall("load").getArgument(0) + this = yamlNode().getAMethodCall("load").getArgument(0) or this = - yamlLibrary() - .getAMethodCall(["unsafe_load_file", "unsafe_load", "load_stream"]) - .getArgument(0) + yamlNode().getAMethodCall(["unsafe_load_file", "unsafe_load", "load_stream"]).getArgument(0) or - this = yamlLibrary().getAMethodCall(["unsafe_load", "load_stream"]).getKeywordArgument("yaml") + this = yamlNode().getAMethodCall(["unsafe_load", "load_stream"]).getKeywordArgument("yaml") or - this = yamlLibrary().getAMethodCall("unsafe_load_file").getKeywordArgument("filename") + this = yamlNode().getAMethodCall("unsafe_load_file").getKeywordArgument("filename") } } + private API::Node yamlNode() { result = API::getTopLevelMember(["YAML", "Psych"]) } + /** * An argument in a call to `YAML.parse*`, considered a sink for unsafe deserialization - * if there is a call to `to_ruby` on the returned value of any Successor. + * if there is a call to `to_ruby` on the returned value. */ class YamlParseArgument extends Sink { YamlParseArgument() { - exists(API::Node toRubyReceiver | - toRubyReceiver = yamlNode() and this = toRubyReceiver.asSource() - | - exists(toRubyReceiver.getMethod(["to_ruby", "transform"])) - ) + this = + yamlNode().getAMethodCall(["parse", "parse_stream", "parse_file"]).getAMethodCall("to_ruby") } } diff --git a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qhelp b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qhelp new file mode 100644 index 00000000000..209e051f9f4 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qhelp @@ -0,0 +1,62 @@ + + + + +

    +Deserializing untrusted data using any method that allows the construction of +arbitrary objects is easily exploitable and, in many cases, allows an attacker +to execute arbitrary code. +

    +
    + + + +

    +If deserializing an untrusted YAML document using the psych gem, +prefer the safe_load and safe_load_file methods over +load and load_file, as the former will safely +handle untrusted data. Avoid passing untrusted data to the load_stream +method. In psych version 4.0.0 and above, the load method can +safely be used. +

    + +
    + + +

    +The following example calls the Marshal.load, +JSON.load, YAML.load, and Oj.load methods +on data from an HTTP request. Since these methods are capable of deserializing +to arbitrary objects, this is inherently unsafe. +

    + + +

    +Using JSON.parse and YAML.safe_load instead, as in the +following example, removes the vulnerability. Similarly, calling +Oj.load with any mode other than :object is safe, as +is calling Oj.safe_load. Note that there is no safe way to deserialize +untrusted data using Marshal. +

    + +
    + + + +
  • +OWASP vulnerability description: +deserialization of untrusted data. +
  • +
  • +Ruby documentation: guidance on deserializing objects safely. +
  • +
  • +Ruby documentation: security guidance on the YAML library. +
  • +
  • +You can read that how unsafe yaml load methods can lead to code executions: +Universal Deserialisation Gadget for Ruby 2.x-3.x . +
  • +
    + +
    diff --git a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.ql b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.ql new file mode 100644 index 00000000000..8e05c13361a --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.ql @@ -0,0 +1,21 @@ +/** + * @name Deserialization of user-controlled yaml data + * @description Deserializing user-controlled yaml data may allow attackers to + * execute arbitrary code. + * @kind path-problem + * @problem.severity warning + * @security-severity 9.8 + * @precision high + * @id rb/unsafe-unsafeyamldeserialization + * @tags security + * external/cwe/cwe-502 + */ + +import ruby +import codeql.ruby.security.UnsafeDeserializationQuery +import UnsafeCodeConstructionFlow::PathGraph + +from UnsafeCodeConstructionFlow::PathNode source, UnsafeCodeConstructionFlow::PathNode sink +where UnsafeCodeConstructionFlow::flowPath(source, sink) +select sink.getNode(), source, sink, "Unsafe deserialization depends on a $@.", source.getNode(), + source.getNode().(UnsafeDeserialization::Source).describe() diff --git a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll new file mode 100644 index 00000000000..cf3b129714f --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll @@ -0,0 +1,83 @@ +/** + * Provides a taint-tracking configuration for reasoning about unsafe deserialization. + * + * Note, for performance reasons: only import this file if + * `UnsafeYamlDeserializationFlow` is needed, otherwise + * `UnsafeYamlDeserializationCustomizations` should be imported instead. + */ + +private import codeql.ruby.AST +private import codeql.ruby.DataFlow +private import codeql.ruby.TaintTracking +private import codeql.ruby.ApiGraphs +import UnsafeYamlDeserializationCustomizations::UnsafeYamlDeserialization +import Yaml + +private module UnsafeYamlDeserializationConfig implements DataFlow::StateConfigSig { + class FlowState = FlowState::State; + + predicate isSource(DataFlow::Node source, FlowState state) { + source instanceof Source and + (state instanceof FlowState::Parse or state instanceof FlowState::Load) + } + + predicate isSink(DataFlow::Node sink, FlowState state) { + sink instanceof Sink and + (state instanceof FlowState::Parse or state instanceof FlowState::Load) + } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } + + /** + * A taint step related to the result of `YAML.parse` calls, or similar. + * In the following example, this step will propagate taint from + * `source` to `sink`: + * this contains two seperate steps: + * ```rb + * x = source + * sink = YAML.parse(x) + * ``` + * By second step + * source is a Successor of `YAML.parse(x)` + * which ends with `to_ruby` or an Element of `to_ruby` + * ```ruby + * sink source.to_ruby # Unsafe call + * ``` + */ + predicate isAdditionalFlowStep( + DataFlow::Node pred, FlowState stateFrom, DataFlow::Node succ, FlowState stateTo + ) { + ( + exists(API::Node parseSuccessors, API::Node parseMethod | + parseMethod = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]) and + parseSuccessors = yamlParseNode(parseMethod) + | + succ = parseSuccessors.getMethod("to_ruby").getReturn().asSource() and + pred = parseMethod.getArgument(0).asSink() + ) + or + exists(API::Node parseMethod | + parseMethod = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]) + | + succ = parseMethod.getReturn().asSource() and + pred = parseMethod.getArgument(0).asSink() + ) + ) and + stateFrom instanceof FlowState::Parse and + stateTo instanceof FlowState::Parse + } +} + +predicate isAdditionalFlowStepTest(DataFlow::Node pred, DataFlow::Node succ) { + exists(API::Node parseMethod | + parseMethod = yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"]) + | + succ = parseMethod.getReturn().asSource() and + pred = parseMethod.getArgument(0).asSink() + ) +} + +/** + * Taint-tracking for reasoning about unsafe deserialization. + */ +module UnsafeCodeConstructionFlow = TaintTracking::GlobalWithState; diff --git a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserializationCustomizations.qll b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserializationCustomizations.qll new file mode 100644 index 00000000000..b244797b286 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserializationCustomizations.qll @@ -0,0 +1,136 @@ +/** + * Provides default sources, sinks and sanitizers for reasoning about unsafe + * deserialization, as well as extension points for adding your own. + */ + +private import codeql.ruby.AST +private import codeql.ruby.ApiGraphs +private import codeql.ruby.CFG +private import codeql.ruby.DataFlow +private import codeql.ruby.dataflow.RemoteFlowSources +private import codeql.ruby.frameworks.ActiveJob +private import codeql.ruby.frameworks.core.Module +private import codeql.ruby.frameworks.core.Kernel +private import Yaml + +module UnsafeYamlDeserialization { + /** Flow states used to distinguish whether we are using a yaml parse node or a yaml load node. */ + module FlowState { + private newtype TState = + TParse() or + TLoad() + + /** A flow state used to distinguish whether we have a middle node that use `YAML.load*` or `YAML.parse*` */ + class State extends TState { + /** + * Gets a string representation of this state. + */ + string toString() { result = this.getStringRepresentation() } + + /** + * Gets a canonical string representation of this state. + */ + string getStringRepresentation() { + this = TParse() and result = "parse" + or + this = TLoad() and result = "load" + } + } + + /** + * A flow state used for `YAML.parse*` methods. + */ + class Parse extends State, TParse { } + + /** + * A flow state used for `YAML.load*` methods. + */ + class Load extends State, TLoad { } + } + + /** + * A data flow source for unsafe deserialization vulnerabilities. + */ + abstract class Source extends DataFlow::Node { + /** Gets a string that describes the source. */ + string describe() { result = "user-provided value" } + } + + /** + * 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 source of remote user input, considered as a flow source for unsafe deserialization. */ + class RemoteFlowSourceAsSource extends Source instanceof RemoteFlowSource { } + + /** A read of data from `STDIN`/`ARGV`, considered as a flow source for unsafe deserialization. */ + class StdInSource extends UnsafeYamlDeserialization::Source { + boolean stdin; + + StdInSource() { + this = API::getTopLevelMember(["STDIN", "ARGF"]).getAMethodCall(["gets", "read"]) and + stdin = true + or + // > $stdin == STDIN + // => true + // but $stdin is special in that it is a global variable and not a constant. `API::getTopLevelMember` only gets constants. + exists(DataFlow::Node dollarStdin | + dollarStdin.asExpr().getExpr().(GlobalVariableReadAccess).getVariable().getName() = "$stdin" and + this = dollarStdin.getALocalSource().getAMethodCall(["gets", "read"]) + ) and + stdin = true + or + // ARGV. + this.asExpr().getExpr().(GlobalVariableReadAccess).getVariable().getName() = "ARGV" and + stdin = false + or + this.(Kernel::KernelMethodCall).getMethodName() = ["gets", "readline", "readlines"] and + stdin = true + } + + override string describe() { + if stdin = true then result = "value from stdin" else result = "value from ARGV" + } + } + + /** + * An argument in a call to `YAML.unsafe_*` and `YAML.load_stream` , considered a sink + * for unsafe deserialization. The `YAML` module is an alias of `Psych` in + * recent versions of Ruby. + */ + class YamlLoadArgument extends Sink { + YamlLoadArgument() { + // Note: this is safe in psych/yaml >= 4.0.0. + this = yamlLibrary().getAMethodCall("load").getArgument(0) + or + this = + yamlLibrary() + .getAMethodCall(["unsafe_load_file", "unsafe_load", "load_stream"]) + .getArgument(0) + or + this = yamlLibrary().getAMethodCall(["unsafe_load", "load_stream"]).getKeywordArgument("yaml") + or + this = yamlLibrary().getAMethodCall("unsafe_load_file").getKeywordArgument("filename") + } + } + + /** + * An argument in a call to `YAML.parse*`, considered a sink for unsafe deserialization + * if there is a call to `to_ruby` on the returned value of any Successor. + */ + class YamlParseArgument extends Sink { + YamlParseArgument() { + this = + yamlParseNode(yamlLibrary().getMethod(["parse", "parse_stream", "parse_file"])) + .getMethod(["to_ruby", "transform"]) + .getReturn() + .asSource() + } + } +} diff --git a/ruby/ql/src/experimental/cwe-502/Yaml.qll b/ruby/ql/src/experimental/cwe-502/Yaml.qll new file mode 100644 index 00000000000..85f1889d243 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/Yaml.qll @@ -0,0 +1,34 @@ +/** + * Provides modeling for the `YAML` and `Psych` libraries. + */ + +private import codeql.ruby.dataflow.FlowSteps +private import codeql.ruby.DataFlow +private import codeql.ruby.ApiGraphs + + +/** + * Gets A Node ends with YAML parse, parse_stream, parse_file methods + */ +API::Node yamlParseNode(API::Node yamlParseInstance) { + result = yamlParseInstance + or + result = yamlParseNode(yamlParseInstance).getReturn() + or + result = yamlParseNode(yamlParseInstance).getBlock() + or + result = yamlParseNode(yamlParseInstance).getAnElement() + or + result = yamlParseNode(yamlParseInstance).getParameter(_) + or + result = yamlParseNode(yamlParseInstance).getMethod(_) + or + result = yamlParseNode(yamlParseInstance).getMember(_) + or + result = yamlParseNode(yamlParseInstance).getArgument(_) +} + +/** + * Gets A YAML module instance + */ +API::Node yamlLibrary() { result = API::getTopLevelMember(["YAML", "Psych"]) } diff --git a/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationBad.rb b/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationBad.rb new file mode 100644 index 00000000000..f4455ba3da0 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationBad.rb @@ -0,0 +1,16 @@ +require 'yaml' + +class UserController < ActionController::Base + def yaml_example + object = YAML.unsafe_load params[:yaml] + object = YAML.load_stream params[:yaml] + parsed_yaml = Psych.parse_stream(params[:yaml]) + + # to_ruby is unsafe + parsed_yaml.children.each do |child| + object = child.to_ruby + end + object = Psych.parse(params[:yaml]).to_ruby + # ... + end +end \ No newline at end of file diff --git a/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationGood.rb b/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationGood.rb new file mode 100644 index 00000000000..99a1408cffc --- /dev/null +++ b/ruby/ql/src/experimental/cwe-502/examples/UnsafeDeserializationGood.rb @@ -0,0 +1,10 @@ +require 'yaml' + +class UserController < ActionController::Base + def safe_yaml_example + object = YAML.load params[:yaml] + object = Psych.load_file params[:yaml] + object = YAML.safe_load params[:yaml] + # ... + end +end \ No newline at end of file diff --git a/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected new file mode 100644 index 00000000000..b79057a8479 --- /dev/null +++ b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected @@ -0,0 +1,75 @@ +edges +| unicode_normalization.rb:7:5:7:17 | unicode_input | unicode_normalization.rb:8:23:8:35 | unicode_input | +| unicode_normalization.rb:7:5:7:17 | unicode_input | unicode_normalization.rb:9:22:9:34 | unicode_input | +| unicode_normalization.rb:7:21:7:26 | call to params | unicode_normalization.rb:7:21:7:42 | ...[...] | +| unicode_normalization.rb:7:21:7:42 | ...[...] | unicode_normalization.rb:7:5:7:17 | unicode_input | +| unicode_normalization.rb:15:5:15:17 | unicode_input | unicode_normalization.rb:16:27:16:39 | unicode_input | +| unicode_normalization.rb:15:5:15:17 | unicode_input | unicode_normalization.rb:16:27:16:39 | unicode_input | +| unicode_normalization.rb:15:21:15:26 | call to params | unicode_normalization.rb:15:21:15:42 | ...[...] | +| unicode_normalization.rb:15:21:15:26 | call to params | unicode_normalization.rb:15:21:15:42 | ...[...] | +| unicode_normalization.rb:15:21:15:42 | ...[...] | unicode_normalization.rb:15:5:15:17 | unicode_input | +| unicode_normalization.rb:15:21:15:42 | ...[...] | unicode_normalization.rb:15:5:15:17 | unicode_input | +| unicode_normalization.rb:16:5:16:23 | unicode_input_manip | unicode_normalization.rb:17:23:17:41 | unicode_input_manip | +| unicode_normalization.rb:16:5:16:23 | unicode_input_manip | unicode_normalization.rb:18:22:18:40 | unicode_input_manip | +| unicode_normalization.rb:16:27:16:39 | unicode_input | unicode_normalization.rb:16:27:16:59 | call to sub | +| unicode_normalization.rb:16:27:16:39 | unicode_input | unicode_normalization.rb:16:27:16:59 | call to sub | +| unicode_normalization.rb:16:27:16:59 | call to sub | unicode_normalization.rb:16:5:16:23 | unicode_input_manip | +| unicode_normalization.rb:24:5:24:17 | unicode_input | unicode_normalization.rb:25:37:25:49 | unicode_input | +| unicode_normalization.rb:24:21:24:26 | call to params | unicode_normalization.rb:24:21:24:42 | ...[...] | +| unicode_normalization.rb:24:21:24:42 | ...[...] | unicode_normalization.rb:24:5:24:17 | unicode_input | +| unicode_normalization.rb:25:5:25:21 | unicode_html_safe | unicode_normalization.rb:26:23:26:39 | unicode_html_safe | +| unicode_normalization.rb:25:5:25:21 | unicode_html_safe | unicode_normalization.rb:27:22:27:38 | unicode_html_safe | +| unicode_normalization.rb:25:25:25:50 | call to html_escape | unicode_normalization.rb:25:5:25:21 | unicode_html_safe | +| unicode_normalization.rb:25:37:25:49 | unicode_input | unicode_normalization.rb:25:25:25:50 | call to html_escape | +| unicode_normalization.rb:33:5:33:17 | unicode_input | unicode_normalization.rb:34:40:34:52 | unicode_input | +| unicode_normalization.rb:33:21:33:26 | call to params | unicode_normalization.rb:33:21:33:42 | ...[...] | +| unicode_normalization.rb:33:21:33:42 | ...[...] | unicode_normalization.rb:33:5:33:17 | unicode_input | +| unicode_normalization.rb:34:5:34:21 | unicode_html_safe | unicode_normalization.rb:35:23:35:39 | unicode_html_safe | +| unicode_normalization.rb:34:5:34:21 | unicode_html_safe | unicode_normalization.rb:36:22:36:38 | unicode_html_safe | +| unicode_normalization.rb:34:25:34:53 | call to escapeHTML | unicode_normalization.rb:34:25:34:63 | call to html_safe | +| unicode_normalization.rb:34:25:34:63 | call to html_safe | unicode_normalization.rb:34:5:34:21 | unicode_html_safe | +| unicode_normalization.rb:34:40:34:52 | unicode_input | unicode_normalization.rb:34:25:34:53 | call to escapeHTML | +nodes +| unicode_normalization.rb:7:5:7:17 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:7:21:7:26 | call to params | semmle.label | call to params | +| unicode_normalization.rb:7:21:7:42 | ...[...] | semmle.label | ...[...] | +| unicode_normalization.rb:8:23:8:35 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:9:22:9:34 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:15:5:15:17 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:15:5:15:17 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:15:21:15:26 | call to params | semmle.label | call to params | +| unicode_normalization.rb:15:21:15:42 | ...[...] | semmle.label | ...[...] | +| unicode_normalization.rb:15:21:15:42 | ...[...] | semmle.label | ...[...] | +| unicode_normalization.rb:16:5:16:23 | unicode_input_manip | semmle.label | unicode_input_manip | +| unicode_normalization.rb:16:27:16:39 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:16:27:16:39 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:16:27:16:59 | call to sub | semmle.label | call to sub | +| unicode_normalization.rb:17:23:17:41 | unicode_input_manip | semmle.label | unicode_input_manip | +| unicode_normalization.rb:18:22:18:40 | unicode_input_manip | semmle.label | unicode_input_manip | +| unicode_normalization.rb:24:5:24:17 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:24:21:24:26 | call to params | semmle.label | call to params | +| unicode_normalization.rb:24:21:24:42 | ...[...] | semmle.label | ...[...] | +| unicode_normalization.rb:25:5:25:21 | unicode_html_safe | semmle.label | unicode_html_safe | +| unicode_normalization.rb:25:25:25:50 | call to html_escape | semmle.label | call to html_escape | +| unicode_normalization.rb:25:37:25:49 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:26:23:26:39 | unicode_html_safe | semmle.label | unicode_html_safe | +| unicode_normalization.rb:27:22:27:38 | unicode_html_safe | semmle.label | unicode_html_safe | +| unicode_normalization.rb:33:5:33:17 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:33:21:33:26 | call to params | semmle.label | call to params | +| unicode_normalization.rb:33:21:33:42 | ...[...] | semmle.label | ...[...] | +| unicode_normalization.rb:34:5:34:21 | unicode_html_safe | semmle.label | unicode_html_safe | +| unicode_normalization.rb:34:25:34:53 | call to escapeHTML | semmle.label | call to escapeHTML | +| unicode_normalization.rb:34:25:34:63 | call to html_safe | semmle.label | call to html_safe | +| unicode_normalization.rb:34:40:34:52 | unicode_input | semmle.label | unicode_input | +| unicode_normalization.rb:35:23:35:39 | unicode_html_safe | semmle.label | unicode_html_safe | +| unicode_normalization.rb:36:22:36:38 | unicode_html_safe | semmle.label | unicode_html_safe | +subpaths +#select +| unicode_normalization.rb:8:23:8:35 | unicode_input | unicode_normalization.rb:7:21:7:26 | call to params | unicode_normalization.rb:8:23:8:35 | unicode_input | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:8:23:8:35 | unicode_input | Unicode transformation (Unicode normalization) | unicode_normalization.rb:7:21:7:26 | call to params | remote user-controlled data | +| unicode_normalization.rb:9:22:9:34 | unicode_input | unicode_normalization.rb:7:21:7:26 | call to params | unicode_normalization.rb:9:22:9:34 | unicode_input | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:9:22:9:34 | unicode_input | Unicode transformation (Unicode normalization) | unicode_normalization.rb:7:21:7:26 | call to params | remote user-controlled data | +| unicode_normalization.rb:17:23:17:41 | unicode_input_manip | unicode_normalization.rb:15:21:15:26 | call to params | unicode_normalization.rb:17:23:17:41 | unicode_input_manip | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:17:23:17:41 | unicode_input_manip | Unicode transformation (Unicode normalization) | unicode_normalization.rb:15:21:15:26 | call to params | remote user-controlled data | +| unicode_normalization.rb:18:22:18:40 | unicode_input_manip | unicode_normalization.rb:15:21:15:26 | call to params | unicode_normalization.rb:18:22:18:40 | unicode_input_manip | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:18:22:18:40 | unicode_input_manip | Unicode transformation (Unicode normalization) | unicode_normalization.rb:15:21:15:26 | call to params | remote user-controlled data | +| unicode_normalization.rb:26:23:26:39 | unicode_html_safe | unicode_normalization.rb:24:21:24:26 | call to params | unicode_normalization.rb:26:23:26:39 | unicode_html_safe | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:26:23:26:39 | unicode_html_safe | Unicode transformation (Unicode normalization) | unicode_normalization.rb:24:21:24:26 | call to params | remote user-controlled data | +| unicode_normalization.rb:27:22:27:38 | unicode_html_safe | unicode_normalization.rb:24:21:24:26 | call to params | unicode_normalization.rb:27:22:27:38 | unicode_html_safe | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:27:22:27:38 | unicode_html_safe | Unicode transformation (Unicode normalization) | unicode_normalization.rb:24:21:24:26 | call to params | remote user-controlled data | +| unicode_normalization.rb:35:23:35:39 | unicode_html_safe | unicode_normalization.rb:33:21:33:26 | call to params | unicode_normalization.rb:35:23:35:39 | unicode_html_safe | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:35:23:35:39 | unicode_html_safe | Unicode transformation (Unicode normalization) | unicode_normalization.rb:33:21:33:26 | call to params | remote user-controlled data | +| unicode_normalization.rb:36:22:36:38 | unicode_html_safe | unicode_normalization.rb:33:21:33:26 | call to params | unicode_normalization.rb:36:22:36:38 | unicode_html_safe | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:36:22:36:38 | unicode_html_safe | Unicode transformation (Unicode normalization) | unicode_normalization.rb:33:21:33:26 | call to params | remote user-controlled data | diff --git a/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.qlref b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.qlref new file mode 100644 index 00000000000..991ba757e43 --- /dev/null +++ b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.qlref @@ -0,0 +1 @@ +experimental/cwe-502/UnsafeYamlDeserialization.ql \ No newline at end of file diff --git a/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.rb b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.rb new file mode 100644 index 00000000000..c9b186e0915 --- /dev/null +++ b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.rb @@ -0,0 +1,75 @@ +require "active_job" +require "base64" +require "json" +require "oj" +require "yaml" + +class UsersController < ActionController::Base + # BAD before psych version 4.0.0 and + def route1 + yaml_data = params[:key] + object = Psych.load yaml_data + object = Psych.load_file yaml_data + end + + # GOOD In psych version 4.0.0 and above + def route2 + yaml_data = params[:key] + object = Psych.load yaml_data + object = Psych.load_file yaml_data + end + + # GOOD + def route3 + yaml_data = params[:key] + object = Psych.parse_stream(yaml_data) + object = Psych.parse(yaml_data) + object = Psych.parse_file(yaml_data) + end + + # BAD + def route4 + yaml_data = params[:key] + object = Psych.unsafe_load(yaml_data) + object = Psych.unsafe_load_file(yaml_data) + object = Psych.load_stream(yaml_data) + parse_output = Psych.parse_stream(yaml_data) + object = parse_output.to_ruby + object = Psych.parse(yaml_data).to_ruby + object = Psych.parse_file(yaml_data).to_ruby + parsed_yaml = Psych.parse_stream(yaml_data) + parsed_yaml.children.each do |child| + object = child.to_ruby + end + Psych.parse_stream(yaml_data) do |document| + object = document.to_ruby + end + object = parsed_yaml.children.first.to_ruby + content = parsed_yaml.children[0].children[0].children + object = parsed_yaml.to_ruby[0] + object = content.to_ruby[0] + object = Psych.parse(yaml_data).children[0].to_ruby + end + + # GOOD + def route5 + plist_data = params[:key] + result = Plist.parse_xml(plist_data, marshal: false) + end + + def stdin + object = YAML.load $stdin.read + + # STDIN + object = YAML.load STDIN.gets + + # ARGF + object = YAML.load ARGF.read + + # Kernel.gets + object = YAML.load gets + + # Kernel.readlines + object = YAML.load readlines + end +end diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected index e3bb0ba2b2a..71e206901b9 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected @@ -44,42 +44,15 @@ edges | UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:138:32:138:40 | yaml_data | provenance | | | UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:139:37:139:45 | yaml_data | provenance | | | UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:140:32:140:40 | yaml_data | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:141:20:141:48 | call to parse_stream | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:143:14:143:35 | call to parse | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:144:14:144:40 | call to parse_file | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:146:5:146:24 | call to children | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:152:14:152:33 | call to children | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:152:14:152:39 | call to first | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:153:15:153:34 | call to children | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:153:15:153:46 | call to children | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:156:14:156:44 | call to children | provenance | | -| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:156:14:156:47 | ...[...] | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:142:14:142:33 | call to to_ruby | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:143:14:143:43 | call to to_ruby | provenance | | +| UnsafeDeserialization.rb:137:5:137:13 | yaml_data | UnsafeDeserialization.rb:144:14:144:48 | call to to_ruby | provenance | | | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:137:17:137:28 | ...[...] | provenance | | | UnsafeDeserialization.rb:137:17:137:28 | ...[...] | UnsafeDeserialization.rb:137:5:137:13 | yaml_data | provenance | | -| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:146:5:146:24 | call to children | provenance | | -| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:152:14:152:33 | call to children | provenance | | -| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:152:14:152:39 | call to first | provenance | | -| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:153:15:153:34 | call to children | provenance | | -| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:153:15:153:46 | call to children | provenance | | -| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | -| UnsafeDeserialization.rb:146:5:146:24 | call to children | UnsafeDeserialization.rb:146:35:146:39 | child | provenance | | -| UnsafeDeserialization.rb:152:14:152:33 | call to children | UnsafeDeserialization.rb:152:14:152:39 | call to first | provenance | | -| UnsafeDeserialization.rb:153:15:153:34 | call to children | UnsafeDeserialization.rb:153:15:153:37 | ...[...] | provenance | | -| UnsafeDeserialization.rb:153:15:153:34 | call to children | UnsafeDeserialization.rb:153:15:153:46 | call to children | provenance | | -| UnsafeDeserialization.rb:153:15:153:34 | call to children | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | -| UnsafeDeserialization.rb:153:15:153:37 | ...[...] | UnsafeDeserialization.rb:153:15:153:46 | call to children | provenance | | -| UnsafeDeserialization.rb:153:15:153:37 | ...[...] | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | -| UnsafeDeserialization.rb:153:15:153:46 | call to children | UnsafeDeserialization.rb:153:15:153:49 | ...[...] | provenance | | -| UnsafeDeserialization.rb:153:15:153:46 | call to children | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | -| UnsafeDeserialization.rb:153:15:153:49 | ...[...] | UnsafeDeserialization.rb:153:15:153:58 | call to children | provenance | | -| UnsafeDeserialization.rb:156:14:156:44 | call to children | UnsafeDeserialization.rb:156:14:156:47 | ...[...] | provenance | | -| UnsafeDeserialization.rb:161:5:161:14 | plist_data | UnsafeDeserialization.rb:162:30:162:39 | plist_data | provenance | | -| UnsafeDeserialization.rb:161:5:161:14 | plist_data | UnsafeDeserialization.rb:163:30:163:39 | plist_data | provenance | | -| UnsafeDeserialization.rb:161:18:161:23 | call to params | UnsafeDeserialization.rb:161:18:161:29 | ...[...] | provenance | | -| UnsafeDeserialization.rb:161:18:161:29 | ...[...] | UnsafeDeserialization.rb:161:5:161:14 | plist_data | provenance | | +| UnsafeDeserialization.rb:149:5:149:14 | plist_data | UnsafeDeserialization.rb:150:30:150:39 | plist_data | provenance | | +| UnsafeDeserialization.rb:149:5:149:14 | plist_data | UnsafeDeserialization.rb:151:30:151:39 | plist_data | provenance | | +| UnsafeDeserialization.rb:149:18:149:23 | call to params | UnsafeDeserialization.rb:149:18:149:29 | ...[...] | provenance | | +| UnsafeDeserialization.rb:149:18:149:29 | ...[...] | UnsafeDeserialization.rb:149:5:149:14 | plist_data | provenance | | nodes | UnsafeDeserialization.rb:11:5:11:19 | serialized_data | semmle.label | serialized_data | | UnsafeDeserialization.rb:11:23:11:50 | call to decode64 | semmle.label | call to decode64 | @@ -142,32 +115,19 @@ nodes | UnsafeDeserialization.rb:138:32:138:40 | yaml_data | semmle.label | yaml_data | | UnsafeDeserialization.rb:139:37:139:45 | yaml_data | semmle.label | yaml_data | | UnsafeDeserialization.rb:140:32:140:40 | yaml_data | semmle.label | yaml_data | -| UnsafeDeserialization.rb:141:20:141:48 | call to parse_stream | semmle.label | call to parse_stream | -| UnsafeDeserialization.rb:143:14:143:35 | call to parse | semmle.label | call to parse | -| UnsafeDeserialization.rb:144:14:144:40 | call to parse_file | semmle.label | call to parse_file | -| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | semmle.label | call to parse_stream | -| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | semmle.label | call to parse_stream | -| UnsafeDeserialization.rb:146:5:146:24 | call to children | semmle.label | call to children | -| UnsafeDeserialization.rb:146:35:146:39 | child | semmle.label | child | -| UnsafeDeserialization.rb:152:14:152:33 | call to children | semmle.label | call to children | -| UnsafeDeserialization.rb:152:14:152:39 | call to first | semmle.label | call to first | -| UnsafeDeserialization.rb:153:15:153:34 | call to children | semmle.label | call to children | -| UnsafeDeserialization.rb:153:15:153:37 | ...[...] | semmle.label | ...[...] | -| UnsafeDeserialization.rb:153:15:153:46 | call to children | semmle.label | call to children | -| UnsafeDeserialization.rb:153:15:153:49 | ...[...] | semmle.label | ...[...] | -| UnsafeDeserialization.rb:153:15:153:58 | call to children | semmle.label | call to children | -| UnsafeDeserialization.rb:156:14:156:44 | call to children | semmle.label | call to children | -| UnsafeDeserialization.rb:156:14:156:47 | ...[...] | semmle.label | ...[...] | -| UnsafeDeserialization.rb:161:5:161:14 | plist_data | semmle.label | plist_data | -| UnsafeDeserialization.rb:161:18:161:23 | call to params | semmle.label | call to params | -| UnsafeDeserialization.rb:161:18:161:29 | ...[...] | semmle.label | ...[...] | -| UnsafeDeserialization.rb:162:30:162:39 | plist_data | semmle.label | plist_data | -| UnsafeDeserialization.rb:163:30:163:39 | plist_data | semmle.label | plist_data | -| UnsafeDeserialization.rb:173:24:173:34 | call to read | semmle.label | call to read | -| UnsafeDeserialization.rb:176:24:176:33 | call to gets | semmle.label | call to gets | -| UnsafeDeserialization.rb:179:24:179:32 | call to read | semmle.label | call to read | -| UnsafeDeserialization.rb:182:24:182:27 | call to gets | semmle.label | call to gets | -| UnsafeDeserialization.rb:185:24:185:32 | call to readlines | semmle.label | call to readlines | +| UnsafeDeserialization.rb:142:14:142:33 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeDeserialization.rb:143:14:143:43 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeDeserialization.rb:144:14:144:48 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeDeserialization.rb:149:5:149:14 | plist_data | semmle.label | plist_data | +| UnsafeDeserialization.rb:149:18:149:23 | call to params | semmle.label | call to params | +| UnsafeDeserialization.rb:149:18:149:29 | ...[...] | semmle.label | ...[...] | +| UnsafeDeserialization.rb:150:30:150:39 | plist_data | semmle.label | plist_data | +| UnsafeDeserialization.rb:151:30:151:39 | plist_data | semmle.label | plist_data | +| UnsafeDeserialization.rb:161:24:161:34 | call to read | semmle.label | call to read | +| UnsafeDeserialization.rb:164:24:164:33 | call to gets | semmle.label | call to gets | +| UnsafeDeserialization.rb:167:24:167:32 | call to read | semmle.label | call to read | +| UnsafeDeserialization.rb:170:24:170:27 | call to gets | semmle.label | call to gets | +| UnsafeDeserialization.rb:173:24:173:32 | call to readlines | semmle.label | call to readlines | subpaths #select | UnsafeDeserialization.rb:12:27:12:41 | serialized_data | UnsafeDeserialization.rb:11:39:11:44 | call to params | UnsafeDeserialization.rb:12:27:12:41 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:11:39:11:44 | call to params | user-provided value | @@ -187,18 +147,13 @@ subpaths | UnsafeDeserialization.rb:138:32:138:40 | yaml_data | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:138:32:138:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | | UnsafeDeserialization.rb:139:37:139:45 | yaml_data | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:139:37:139:45 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | | UnsafeDeserialization.rb:140:32:140:40 | yaml_data | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:140:32:140:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:141:20:141:48 | call to parse_stream | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:141:20:141:48 | call to parse_stream | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:143:14:143:35 | call to parse | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:143:14:143:35 | call to parse | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:144:14:144:40 | call to parse_file | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:144:14:144:40 | call to parse_file | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:145:19:145:47 | call to parse_stream | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:146:35:146:39 | child | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:146:35:146:39 | child | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:152:14:152:39 | call to first | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:152:14:152:39 | call to first | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:153:15:153:58 | call to children | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:153:15:153:58 | call to children | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:156:14:156:47 | ...[...] | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:156:14:156:47 | ...[...] | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | -| UnsafeDeserialization.rb:162:30:162:39 | plist_data | UnsafeDeserialization.rb:161:18:161:23 | call to params | UnsafeDeserialization.rb:162:30:162:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:161:18:161:23 | call to params | user-provided value | -| UnsafeDeserialization.rb:163:30:163:39 | plist_data | UnsafeDeserialization.rb:161:18:161:23 | call to params | UnsafeDeserialization.rb:163:30:163:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:161:18:161:23 | call to params | user-provided value | -| UnsafeDeserialization.rb:173:24:173:34 | call to read | UnsafeDeserialization.rb:173:24:173:34 | call to read | UnsafeDeserialization.rb:173:24:173:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:173:24:173:34 | call to read | value from stdin | -| UnsafeDeserialization.rb:176:24:176:33 | call to gets | UnsafeDeserialization.rb:176:24:176:33 | call to gets | UnsafeDeserialization.rb:176:24:176:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:176:24:176:33 | call to gets | value from stdin | -| UnsafeDeserialization.rb:179:24:179:32 | call to read | UnsafeDeserialization.rb:179:24:179:32 | call to read | UnsafeDeserialization.rb:179:24:179:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:179:24:179:32 | call to read | value from stdin | -| UnsafeDeserialization.rb:182:24:182:27 | call to gets | UnsafeDeserialization.rb:182:24:182:27 | call to gets | UnsafeDeserialization.rb:182:24:182:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:182:24:182:27 | call to gets | value from stdin | -| UnsafeDeserialization.rb:185:24:185:32 | call to readlines | UnsafeDeserialization.rb:185:24:185:32 | call to readlines | UnsafeDeserialization.rb:185:24:185:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:185:24:185:32 | call to readlines | value from stdin | +| UnsafeDeserialization.rb:142:14:142:33 | call to to_ruby | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:142:14:142:33 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:143:14:143:43 | call to to_ruby | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:143:14:143:43 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:144:14:144:48 | call to to_ruby | UnsafeDeserialization.rb:137:17:137:22 | call to params | UnsafeDeserialization.rb:144:14:144:48 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:137:17:137:22 | call to params | user-provided value | +| UnsafeDeserialization.rb:150:30:150:39 | plist_data | UnsafeDeserialization.rb:149:18:149:23 | call to params | UnsafeDeserialization.rb:150:30:150:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:149:18:149:23 | call to params | user-provided value | +| UnsafeDeserialization.rb:151:30:151:39 | plist_data | UnsafeDeserialization.rb:149:18:149:23 | call to params | UnsafeDeserialization.rb:151:30:151:39 | plist_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:149:18:149:23 | call to params | user-provided value | +| UnsafeDeserialization.rb:161:24:161:34 | call to read | UnsafeDeserialization.rb:161:24:161:34 | call to read | UnsafeDeserialization.rb:161:24:161:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:161:24:161:34 | call to read | value from stdin | +| UnsafeDeserialization.rb:164:24:164:33 | call to gets | UnsafeDeserialization.rb:164:24:164:33 | call to gets | UnsafeDeserialization.rb:164:24:164:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:164:24:164:33 | call to gets | value from stdin | +| UnsafeDeserialization.rb:167:24:167:32 | call to read | UnsafeDeserialization.rb:167:24:167:32 | call to read | UnsafeDeserialization.rb:167:24:167:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:167:24:167:32 | call to read | value from stdin | +| UnsafeDeserialization.rb:170:24:170:27 | call to gets | UnsafeDeserialization.rb:170:24:170:27 | call to gets | UnsafeDeserialization.rb:170:24:170:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:170:24:170:27 | call to gets | value from stdin | +| UnsafeDeserialization.rb:173:24:173:32 | call to readlines | UnsafeDeserialization.rb:173:24:173:32 | call to readlines | UnsafeDeserialization.rb:173:24:173:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:173:24:173:32 | call to readlines | value from stdin | diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.qlref b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.qlref index abfb453d723..55f7c440b46 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.qlref +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.qlref @@ -1 +1 @@ -queries/security/cwe-502/UnsafeDeserialization.ql \ No newline at end of file +queries/security/cwe-502/UnsafeDeserialization.ql diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb index d3d40c6c73e..633a99c14fb 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.rb @@ -142,18 +142,6 @@ class UsersController < ActionController::Base object = parse_output.to_ruby object = Psych.parse(yaml_data).to_ruby object = Psych.parse_file(yaml_data).to_ruby - parsed_yaml = Psych.parse_stream(yaml_data) - parsed_yaml.children.each do |child| - object = child.to_ruby - end - Psych.parse_stream(yaml_data) do |document| - object = document.to_ruby - end - object = parsed_yaml.children.first.to_ruby - content = parsed_yaml.children[0].children[0].children - object = parsed_yaml.to_ruby[0] - object = content.to_ruby[0] - object = Psych.parse(yaml_data).children[0].to_ruby end # BAD @@ -184,4 +172,4 @@ class UsersController < ActionController::Base # Kernel.readlines object = YAML.load readlines end -end +end \ No newline at end of file From bc98712da5f0a4334ad8345ca436f0cdf4236d7f Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 26 Feb 2024 13:14:03 +0100 Subject: [PATCH 162/207] C#: Add one more using statement to the attributes test file. --- .../attributes/AttributeArguments.expected | 332 ++++---- .../attributes/AttributeComments.expected | 8 +- .../attributes/AttributeElements.expected | 82 +- .../attributes/PrintAst.expected | 720 +++++++++--------- .../library-tests/attributes/attributes.cs | 4 +- 5 files changed, 574 insertions(+), 572 deletions(-) diff --git a/csharp/ql/test/library-tests/attributes/AttributeArguments.expected b/csharp/ql/test/library-tests/attributes/AttributeArguments.expected index dc7bc9330d9..ccd7e81d933 100644 --- a/csharp/ql/test/library-tests/attributes/AttributeArguments.expected +++ b/csharp/ql/test/library-tests/attributes/AttributeArguments.expected @@ -23,89 +23,89 @@ arguments | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 3 | Assembly1.dll:0:0:0:0 | (...) ... | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 4 | Assembly1.dll:0:0:0:0 | array creation of type Int32[] | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 5 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | -| attributes.cs:10:12:10:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:10:26:10:45 | "C# attributes test" | -| attributes.cs:11:12:11:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:11:32:11:56 | "A test of C# attributes" | -| attributes.cs:12:12:12:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:12:34:12:35 | "" | -| attributes.cs:13:12:13:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:13:28:13:39 | "Semmle Plc" | -| attributes.cs:14:12:14:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:14:28:14:34 | "Odasa" | -| attributes.cs:15:12:15:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:15:30:15:54 | "Copyright \u00a9 Semmle 2018" | -| attributes.cs:16:12:16:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:16:30:16:31 | "" | -| attributes.cs:17:12:17:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:17:28:17:29 | "" | -| attributes.cs:22:12:22:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:22:23:22:27 | false | -| attributes.cs:25:12:25:15 | [assembly: Guid(...)] | 0 | attributes.cs:25:17:25:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" | -| attributes.cs:37:12:37:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:37:28:37:36 | "1.0.0.0" | -| attributes.cs:38:12:38:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:38:32:38:40 | "1.0.0.0" | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 0 | attributes.cs:40:17:40:17 | 0 | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 1 | attributes.cs:40:20:40:46 | array creation of type Object[] | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 2 | attributes.cs:40:49:40:69 | typeof(...) | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 3 | attributes.cs:40:72:40:76 | (...) ... | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 4 | attributes.cs:40:79:40:82 | null | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 5 | attributes.cs:40:92:40:122 | array creation of type Object[] | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 0 | attributes.cs:41:15:41:15 | 0 | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 1 | attributes.cs:41:18:41:44 | array creation of type Object[] | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 2 | attributes.cs:41:47:41:67 | typeof(...) | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 3 | attributes.cs:41:70:41:74 | (...) ... | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 4 | attributes.cs:41:77:41:80 | null | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 5 | attributes.cs:41:90:41:120 | array creation of type Object[] | -| attributes.cs:43:2:43:22 | [AttributeUsage(...)] | 0 | attributes.cs:43:24:43:50 | access to constant All | -| attributes.cs:46:6:46:16 | [Conditional(...)] | 0 | attributes.cs:46:18:46:25 | "DEBUG2" | -| attributes.cs:54:6:54:16 | [My(...)] | 0 | attributes.cs:54:18:54:22 | false | -| attributes.cs:57:6:57:16 | [My(...)] | 0 | attributes.cs:57:18:57:21 | true | -| attributes.cs:57:6:57:16 | [My(...)] | 1 | attributes.cs:57:28:57:29 | "" | -| attributes.cs:57:6:57:16 | [My(...)] | 2 | attributes.cs:57:36:57:36 | 0 | -| attributes.cs:58:6:58:8 | [My2(...)] | 0 | attributes.cs:58:28:58:32 | false | -| attributes.cs:58:6:58:8 | [My2(...)] | 1 | attributes.cs:58:13:58:16 | true | -| attributes.cs:58:6:58:8 | [My2(...)] | 2 | attributes.cs:58:6:58:8 | 12 | -| attributes.cs:58:6:58:8 | [My2(...)] | 3 | attributes.cs:58:22:58:22 | 1 | -| attributes.cs:58:6:58:8 | [My2(...)] | 4 | attributes.cs:58:39:58:40 | 42 | -| attributes.cs:77:2:77:5 | [Args(...)] | 0 | attributes.cs:77:7:77:8 | 42 | -| attributes.cs:77:2:77:5 | [Args(...)] | 1 | attributes.cs:77:11:77:14 | null | -| attributes.cs:77:2:77:5 | [Args(...)] | 2 | attributes.cs:77:17:77:25 | typeof(...) | -| attributes.cs:77:2:77:5 | [Args(...)] | 3 | attributes.cs:77:28:77:30 | access to constant A | -| attributes.cs:77:2:77:5 | [Args(...)] | 4 | attributes.cs:77:33:77:53 | array creation of type Int32[] | -| attributes.cs:77:2:77:5 | [Args(...)] | 5 | attributes.cs:77:63:77:93 | array creation of type Object[] | -| attributes.cs:80:6:80:9 | [Args(...)] | 0 | attributes.cs:80:11:80:16 | ... + ... | -| attributes.cs:80:6:80:9 | [Args(...)] | 1 | attributes.cs:80:19:80:39 | array creation of type Int32[] | -| attributes.cs:80:6:80:9 | [Args(...)] | 2 | attributes.cs:80:42:80:45 | null | -| attributes.cs:80:6:80:9 | [Args(...)] | 3 | attributes.cs:80:48:80:52 | (...) ... | -| attributes.cs:80:6:80:9 | [Args(...)] | 4 | attributes.cs:80:55:80:58 | null | -| attributes.cs:80:6:80:9 | [Args(...)] | 5 | attributes.cs:80:68:80:98 | array creation of type Object[] | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 0 | attributes.cs:81:19:81:24 | ... + ... | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 1 | attributes.cs:81:27:81:47 | array creation of type Int32[] | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 2 | attributes.cs:81:50:81:53 | null | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 3 | attributes.cs:81:56:81:60 | (...) ... | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 4 | attributes.cs:81:63:81:66 | null | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 5 | attributes.cs:81:76:81:106 | array creation of type Object[] | -| attributes.cs:96:2:96:13 | [My3(...)] | 0 | attributes.cs:96:15:96:15 | 1 | -| attributes.cs:97:10:97:21 | [return: My3(...)] | 0 | attributes.cs:97:23:97:23 | 2 | -| attributes.cs:100:10:100:21 | [return: My3(...)] | 0 | attributes.cs:100:23:100:23 | 3 | -| attributes.cs:101:8:101:19 | [My3(...)] | 0 | attributes.cs:101:21:101:21 | 4 | -| attributes.cs:106:6:106:17 | [My3(...)] | 0 | attributes.cs:106:19:106:19 | 5 | -| attributes.cs:107:14:107:25 | [return: My3(...)] | 0 | attributes.cs:107:27:107:27 | 6 | -| attributes.cs:112:10:112:21 | [My3(...)] | 0 | attributes.cs:112:23:112:23 | 7 | -| attributes.cs:113:18:113:29 | [return: My3(...)] | 0 | attributes.cs:113:31:113:31 | 8 | -| attributes.cs:116:18:116:29 | [My3(...)] | 0 | attributes.cs:116:31:116:31 | 9 | -| attributes.cs:117:17:117:28 | [My3(...)] | 0 | attributes.cs:117:30:117:31 | 10 | -| attributes.cs:124:18:124:29 | [My3(...)] | 0 | attributes.cs:124:31:124:32 | 11 | -| attributes.cs:125:18:125:29 | [return: My3(...)] | 0 | attributes.cs:125:31:125:32 | 12 | -| attributes.cs:128:10:128:21 | [My3(...)] | 0 | attributes.cs:128:23:128:24 | 13 | -| attributes.cs:129:17:129:28 | [My3(...)] | 0 | attributes.cs:129:30:129:31 | 14 | -| attributes.cs:141:6:141:11 | [Params(...)] | 0 | attributes.cs:141:13:141:15 | "a" | -| attributes.cs:141:6:141:11 | [Params(...)] | 1 | attributes.cs:141:18:141:20 | "b" | -| attributes.cs:141:6:141:11 | [Params(...)] | 2 | attributes.cs:141:23:141:23 | 1 | -| attributes.cs:141:6:141:11 | [Params(...)] | 3 | attributes.cs:141:26:141:26 | 2 | -| attributes.cs:141:6:141:11 | [Params(...)] | 4 | attributes.cs:141:29:141:29 | 3 | -| attributes.cs:144:6:144:11 | [Params(...)] | 0 | attributes.cs:144:17:144:19 | "a" | -| attributes.cs:144:6:144:11 | [Params(...)] | 1 | attributes.cs:144:26:144:28 | "b" | -| attributes.cs:144:6:144:11 | [Params(...)] | 2 | attributes.cs:144:31:144:31 | 1 | -| attributes.cs:144:6:144:11 | [Params(...)] | 3 | attributes.cs:144:34:144:34 | 2 | -| attributes.cs:144:6:144:11 | [Params(...)] | 4 | attributes.cs:144:37:144:37 | 3 | -| attributes.cs:147:6:147:11 | [Params(...)] | 0 | attributes.cs:147:35:147:37 | "a" | -| attributes.cs:147:6:147:11 | [Params(...)] | 1 | attributes.cs:147:26:147:28 | "b" | -| attributes.cs:147:6:147:11 | [Params(...)] | 2 | attributes.cs:147:19:147:19 | 1 | -| attributes.cs:150:6:150:11 | [Params(...)] | 0 | attributes.cs:150:45:150:47 | "a" | -| attributes.cs:150:6:150:11 | [Params(...)] | 1 | attributes.cs:150:36:150:38 | "b" | -| attributes.cs:150:6:150:11 | [Params(...)] | 2 | attributes.cs:150:19:150:29 | array creation of type Int32[] | +| attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:11:26:11:45 | "C# attributes test" | +| attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:12:32:12:56 | "A test of C# attributes" | +| attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:13:34:13:35 | "" | +| attributes.cs:14:12:14:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:14:28:14:39 | "Semmle Plc" | +| attributes.cs:15:12:15:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:15:28:15:34 | "Odasa" | +| attributes.cs:16:12:16:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:16:30:16:54 | "Copyright \u00a9 Semmle 2018" | +| attributes.cs:17:12:17:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:17:30:17:31 | "" | +| attributes.cs:18:12:18:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:18:28:18:29 | "" | +| attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:23:23:23:27 | false | +| attributes.cs:26:12:26:15 | [assembly: Guid(...)] | 0 | attributes.cs:26:17:26:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" | +| attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:38:28:38:36 | "1.0.0.0" | +| attributes.cs:39:12:39:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:39:32:39:40 | "1.0.0.0" | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 0 | attributes.cs:41:17:41:17 | 0 | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 1 | attributes.cs:41:20:41:46 | array creation of type Object[] | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 2 | attributes.cs:41:49:41:69 | typeof(...) | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 3 | attributes.cs:41:72:41:76 | (...) ... | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 4 | attributes.cs:41:79:41:82 | null | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 5 | attributes.cs:41:92:41:122 | array creation of type Object[] | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 0 | attributes.cs:42:15:42:15 | 0 | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 1 | attributes.cs:42:18:42:44 | array creation of type Object[] | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 2 | attributes.cs:42:47:42:67 | typeof(...) | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 3 | attributes.cs:42:70:42:74 | (...) ... | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 4 | attributes.cs:42:77:42:80 | null | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 5 | attributes.cs:42:90:42:120 | array creation of type Object[] | +| attributes.cs:44:2:44:22 | [AttributeUsage(...)] | 0 | attributes.cs:44:24:44:50 | access to constant All | +| attributes.cs:47:6:47:16 | [Conditional(...)] | 0 | attributes.cs:47:18:47:25 | "DEBUG2" | +| attributes.cs:55:6:55:16 | [My(...)] | 0 | attributes.cs:55:18:55:22 | false | +| attributes.cs:58:6:58:16 | [My(...)] | 0 | attributes.cs:58:18:58:21 | true | +| attributes.cs:58:6:58:16 | [My(...)] | 1 | attributes.cs:58:28:58:29 | "" | +| attributes.cs:58:6:58:16 | [My(...)] | 2 | attributes.cs:58:36:58:36 | 0 | +| attributes.cs:59:6:59:8 | [My2(...)] | 0 | attributes.cs:59:28:59:32 | false | +| attributes.cs:59:6:59:8 | [My2(...)] | 1 | attributes.cs:59:13:59:16 | true | +| attributes.cs:59:6:59:8 | [My2(...)] | 2 | attributes.cs:59:6:59:8 | 12 | +| attributes.cs:59:6:59:8 | [My2(...)] | 3 | attributes.cs:59:22:59:22 | 1 | +| attributes.cs:59:6:59:8 | [My2(...)] | 4 | attributes.cs:59:39:59:40 | 42 | +| attributes.cs:78:2:78:5 | [Args(...)] | 0 | attributes.cs:78:7:78:8 | 42 | +| attributes.cs:78:2:78:5 | [Args(...)] | 1 | attributes.cs:78:11:78:14 | null | +| attributes.cs:78:2:78:5 | [Args(...)] | 2 | attributes.cs:78:17:78:25 | typeof(...) | +| attributes.cs:78:2:78:5 | [Args(...)] | 3 | attributes.cs:78:28:78:30 | access to constant A | +| attributes.cs:78:2:78:5 | [Args(...)] | 4 | attributes.cs:78:33:78:53 | array creation of type Int32[] | +| attributes.cs:78:2:78:5 | [Args(...)] | 5 | attributes.cs:78:63:78:93 | array creation of type Object[] | +| attributes.cs:81:6:81:9 | [Args(...)] | 0 | attributes.cs:81:11:81:16 | ... + ... | +| attributes.cs:81:6:81:9 | [Args(...)] | 1 | attributes.cs:81:19:81:39 | array creation of type Int32[] | +| attributes.cs:81:6:81:9 | [Args(...)] | 2 | attributes.cs:81:42:81:45 | null | +| attributes.cs:81:6:81:9 | [Args(...)] | 3 | attributes.cs:81:48:81:52 | (...) ... | +| attributes.cs:81:6:81:9 | [Args(...)] | 4 | attributes.cs:81:55:81:58 | null | +| attributes.cs:81:6:81:9 | [Args(...)] | 5 | attributes.cs:81:68:81:98 | array creation of type Object[] | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 0 | attributes.cs:82:19:82:24 | ... + ... | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 1 | attributes.cs:82:27:82:47 | array creation of type Int32[] | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 2 | attributes.cs:82:50:82:53 | null | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 3 | attributes.cs:82:56:82:60 | (...) ... | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 4 | attributes.cs:82:63:82:66 | null | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 5 | attributes.cs:82:76:82:106 | array creation of type Object[] | +| attributes.cs:97:2:97:13 | [My3(...)] | 0 | attributes.cs:97:15:97:15 | 1 | +| attributes.cs:98:10:98:21 | [return: My3(...)] | 0 | attributes.cs:98:23:98:23 | 2 | +| attributes.cs:101:10:101:21 | [return: My3(...)] | 0 | attributes.cs:101:23:101:23 | 3 | +| attributes.cs:102:8:102:19 | [My3(...)] | 0 | attributes.cs:102:21:102:21 | 4 | +| attributes.cs:107:6:107:17 | [My3(...)] | 0 | attributes.cs:107:19:107:19 | 5 | +| attributes.cs:108:14:108:25 | [return: My3(...)] | 0 | attributes.cs:108:27:108:27 | 6 | +| attributes.cs:113:10:113:21 | [My3(...)] | 0 | attributes.cs:113:23:113:23 | 7 | +| attributes.cs:114:18:114:29 | [return: My3(...)] | 0 | attributes.cs:114:31:114:31 | 8 | +| attributes.cs:117:18:117:29 | [My3(...)] | 0 | attributes.cs:117:31:117:31 | 9 | +| attributes.cs:118:17:118:28 | [My3(...)] | 0 | attributes.cs:118:30:118:31 | 10 | +| attributes.cs:125:18:125:29 | [My3(...)] | 0 | attributes.cs:125:31:125:32 | 11 | +| attributes.cs:126:18:126:29 | [return: My3(...)] | 0 | attributes.cs:126:31:126:32 | 12 | +| attributes.cs:129:10:129:21 | [My3(...)] | 0 | attributes.cs:129:23:129:24 | 13 | +| attributes.cs:130:17:130:28 | [My3(...)] | 0 | attributes.cs:130:30:130:31 | 14 | +| attributes.cs:142:6:142:11 | [Params(...)] | 0 | attributes.cs:142:13:142:15 | "a" | +| attributes.cs:142:6:142:11 | [Params(...)] | 1 | attributes.cs:142:18:142:20 | "b" | +| attributes.cs:142:6:142:11 | [Params(...)] | 2 | attributes.cs:142:23:142:23 | 1 | +| attributes.cs:142:6:142:11 | [Params(...)] | 3 | attributes.cs:142:26:142:26 | 2 | +| attributes.cs:142:6:142:11 | [Params(...)] | 4 | attributes.cs:142:29:142:29 | 3 | +| attributes.cs:145:6:145:11 | [Params(...)] | 0 | attributes.cs:145:17:145:19 | "a" | +| attributes.cs:145:6:145:11 | [Params(...)] | 1 | attributes.cs:145:26:145:28 | "b" | +| attributes.cs:145:6:145:11 | [Params(...)] | 2 | attributes.cs:145:31:145:31 | 1 | +| attributes.cs:145:6:145:11 | [Params(...)] | 3 | attributes.cs:145:34:145:34 | 2 | +| attributes.cs:145:6:145:11 | [Params(...)] | 4 | attributes.cs:145:37:145:37 | 3 | +| attributes.cs:148:6:148:11 | [Params(...)] | 0 | attributes.cs:148:35:148:37 | "a" | +| attributes.cs:148:6:148:11 | [Params(...)] | 1 | attributes.cs:148:26:148:28 | "b" | +| attributes.cs:148:6:148:11 | [Params(...)] | 2 | attributes.cs:148:19:148:19 | 1 | +| attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:45:151:47 | "a" | +| attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:36:151:38 | "b" | +| attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:29 | array creation of type Int32[] | constructorArguments | Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 1 | | Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 3 | @@ -127,91 +127,91 @@ constructorArguments | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 2 | Assembly1.dll:0:0:0:0 | null | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 3 | Assembly1.dll:0:0:0:0 | (...) ... | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 4 | Assembly1.dll:0:0:0:0 | array creation of type Int32[] | -| attributes.cs:10:12:10:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:10:26:10:45 | "C# attributes test" | -| attributes.cs:11:12:11:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:11:32:11:56 | "A test of C# attributes" | -| attributes.cs:12:12:12:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:12:34:12:35 | "" | -| attributes.cs:13:12:13:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:13:28:13:39 | "Semmle Plc" | -| attributes.cs:14:12:14:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:14:28:14:34 | "Odasa" | -| attributes.cs:15:12:15:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:15:30:15:54 | "Copyright \u00a9 Semmle 2018" | -| attributes.cs:16:12:16:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:16:30:16:31 | "" | -| attributes.cs:17:12:17:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:17:28:17:29 | "" | -| attributes.cs:22:12:22:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:22:23:22:27 | false | -| attributes.cs:25:12:25:15 | [assembly: Guid(...)] | 0 | attributes.cs:25:17:25:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" | -| attributes.cs:37:12:37:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:37:28:37:36 | "1.0.0.0" | -| attributes.cs:38:12:38:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:38:32:38:40 | "1.0.0.0" | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 0 | attributes.cs:40:17:40:17 | 0 | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 1 | attributes.cs:40:20:40:46 | array creation of type Object[] | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 2 | attributes.cs:40:49:40:69 | typeof(...) | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 3 | attributes.cs:40:72:40:76 | (...) ... | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | 4 | attributes.cs:40:79:40:82 | null | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 0 | attributes.cs:41:15:41:15 | 0 | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 1 | attributes.cs:41:18:41:44 | array creation of type Object[] | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 2 | attributes.cs:41:47:41:67 | typeof(...) | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 3 | attributes.cs:41:70:41:74 | (...) ... | -| attributes.cs:41:10:41:13 | [module: Args(...)] | 4 | attributes.cs:41:77:41:80 | null | -| attributes.cs:43:2:43:22 | [AttributeUsage(...)] | 0 | attributes.cs:43:24:43:50 | access to constant All | -| attributes.cs:46:6:46:16 | [Conditional(...)] | 0 | attributes.cs:46:18:46:25 | "DEBUG2" | -| attributes.cs:54:6:54:16 | [My(...)] | 0 | attributes.cs:54:18:54:22 | false | -| attributes.cs:57:6:57:16 | [My(...)] | 0 | attributes.cs:57:18:57:21 | true | -| attributes.cs:58:6:58:8 | [My2(...)] | 0 | attributes.cs:58:28:58:32 | false | -| attributes.cs:58:6:58:8 | [My2(...)] | 1 | attributes.cs:58:13:58:16 | true | -| attributes.cs:58:6:58:8 | [My2(...)] | 2 | attributes.cs:58:6:58:8 | 12 | -| attributes.cs:58:6:58:8 | [My2(...)] | 3 | attributes.cs:58:22:58:22 | 1 | -| attributes.cs:77:2:77:5 | [Args(...)] | 0 | attributes.cs:77:7:77:8 | 42 | -| attributes.cs:77:2:77:5 | [Args(...)] | 1 | attributes.cs:77:11:77:14 | null | -| attributes.cs:77:2:77:5 | [Args(...)] | 2 | attributes.cs:77:17:77:25 | typeof(...) | -| attributes.cs:77:2:77:5 | [Args(...)] | 3 | attributes.cs:77:28:77:30 | access to constant A | -| attributes.cs:77:2:77:5 | [Args(...)] | 4 | attributes.cs:77:33:77:53 | array creation of type Int32[] | -| attributes.cs:80:6:80:9 | [Args(...)] | 0 | attributes.cs:80:11:80:16 | ... + ... | -| attributes.cs:80:6:80:9 | [Args(...)] | 1 | attributes.cs:80:19:80:39 | array creation of type Int32[] | -| attributes.cs:80:6:80:9 | [Args(...)] | 2 | attributes.cs:80:42:80:45 | null | -| attributes.cs:80:6:80:9 | [Args(...)] | 3 | attributes.cs:80:48:80:52 | (...) ... | -| attributes.cs:80:6:80:9 | [Args(...)] | 4 | attributes.cs:80:55:80:58 | null | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 0 | attributes.cs:81:19:81:24 | ... + ... | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 1 | attributes.cs:81:27:81:47 | array creation of type Int32[] | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 2 | attributes.cs:81:50:81:53 | null | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 3 | attributes.cs:81:56:81:60 | (...) ... | -| attributes.cs:81:14:81:17 | [return: Args(...)] | 4 | attributes.cs:81:63:81:66 | null | -| attributes.cs:96:2:96:13 | [My3(...)] | 0 | attributes.cs:96:15:96:15 | 1 | -| attributes.cs:97:10:97:21 | [return: My3(...)] | 0 | attributes.cs:97:23:97:23 | 2 | -| attributes.cs:100:10:100:21 | [return: My3(...)] | 0 | attributes.cs:100:23:100:23 | 3 | -| attributes.cs:101:8:101:19 | [My3(...)] | 0 | attributes.cs:101:21:101:21 | 4 | -| attributes.cs:106:6:106:17 | [My3(...)] | 0 | attributes.cs:106:19:106:19 | 5 | -| attributes.cs:107:14:107:25 | [return: My3(...)] | 0 | attributes.cs:107:27:107:27 | 6 | -| attributes.cs:112:10:112:21 | [My3(...)] | 0 | attributes.cs:112:23:112:23 | 7 | -| attributes.cs:113:18:113:29 | [return: My3(...)] | 0 | attributes.cs:113:31:113:31 | 8 | -| attributes.cs:116:18:116:29 | [My3(...)] | 0 | attributes.cs:116:31:116:31 | 9 | -| attributes.cs:117:17:117:28 | [My3(...)] | 0 | attributes.cs:117:30:117:31 | 10 | -| attributes.cs:124:18:124:29 | [My3(...)] | 0 | attributes.cs:124:31:124:32 | 11 | -| attributes.cs:125:18:125:29 | [return: My3(...)] | 0 | attributes.cs:125:31:125:32 | 12 | -| attributes.cs:128:10:128:21 | [My3(...)] | 0 | attributes.cs:128:23:128:24 | 13 | -| attributes.cs:129:17:129:28 | [My3(...)] | 0 | attributes.cs:129:30:129:31 | 14 | -| attributes.cs:141:6:141:11 | [Params(...)] | 0 | attributes.cs:141:13:141:15 | "a" | -| attributes.cs:141:6:141:11 | [Params(...)] | 1 | attributes.cs:141:18:141:20 | "b" | -| attributes.cs:141:6:141:11 | [Params(...)] | 2 | attributes.cs:141:23:141:23 | 1 | -| attributes.cs:141:6:141:11 | [Params(...)] | 3 | attributes.cs:141:26:141:26 | 2 | -| attributes.cs:141:6:141:11 | [Params(...)] | 4 | attributes.cs:141:29:141:29 | 3 | -| attributes.cs:144:6:144:11 | [Params(...)] | 0 | attributes.cs:144:17:144:19 | "a" | -| attributes.cs:144:6:144:11 | [Params(...)] | 1 | attributes.cs:144:26:144:28 | "b" | -| attributes.cs:144:6:144:11 | [Params(...)] | 2 | attributes.cs:144:31:144:31 | 1 | -| attributes.cs:144:6:144:11 | [Params(...)] | 3 | attributes.cs:144:34:144:34 | 2 | -| attributes.cs:144:6:144:11 | [Params(...)] | 4 | attributes.cs:144:37:144:37 | 3 | -| attributes.cs:147:6:147:11 | [Params(...)] | 0 | attributes.cs:147:35:147:37 | "a" | -| attributes.cs:147:6:147:11 | [Params(...)] | 1 | attributes.cs:147:26:147:28 | "b" | -| attributes.cs:147:6:147:11 | [Params(...)] | 2 | attributes.cs:147:19:147:19 | 1 | -| attributes.cs:150:6:150:11 | [Params(...)] | 0 | attributes.cs:150:45:150:47 | "a" | -| attributes.cs:150:6:150:11 | [Params(...)] | 1 | attributes.cs:150:36:150:38 | "b" | -| attributes.cs:150:6:150:11 | [Params(...)] | 2 | attributes.cs:150:19:150:29 | array creation of type Int32[] | +| attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:11:26:11:45 | "C# attributes test" | +| attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:12:32:12:56 | "A test of C# attributes" | +| attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:13:34:13:35 | "" | +| attributes.cs:14:12:14:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:14:28:14:39 | "Semmle Plc" | +| attributes.cs:15:12:15:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:15:28:15:34 | "Odasa" | +| attributes.cs:16:12:16:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:16:30:16:54 | "Copyright \u00a9 Semmle 2018" | +| attributes.cs:17:12:17:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:17:30:17:31 | "" | +| attributes.cs:18:12:18:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:18:28:18:29 | "" | +| attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:23:23:23:27 | false | +| attributes.cs:26:12:26:15 | [assembly: Guid(...)] | 0 | attributes.cs:26:17:26:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" | +| attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:38:28:38:36 | "1.0.0.0" | +| attributes.cs:39:12:39:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:39:32:39:40 | "1.0.0.0" | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 0 | attributes.cs:41:17:41:17 | 0 | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 1 | attributes.cs:41:20:41:46 | array creation of type Object[] | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 2 | attributes.cs:41:49:41:69 | typeof(...) | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 3 | attributes.cs:41:72:41:76 | (...) ... | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 4 | attributes.cs:41:79:41:82 | null | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 0 | attributes.cs:42:15:42:15 | 0 | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 1 | attributes.cs:42:18:42:44 | array creation of type Object[] | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 2 | attributes.cs:42:47:42:67 | typeof(...) | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 3 | attributes.cs:42:70:42:74 | (...) ... | +| attributes.cs:42:10:42:13 | [module: Args(...)] | 4 | attributes.cs:42:77:42:80 | null | +| attributes.cs:44:2:44:22 | [AttributeUsage(...)] | 0 | attributes.cs:44:24:44:50 | access to constant All | +| attributes.cs:47:6:47:16 | [Conditional(...)] | 0 | attributes.cs:47:18:47:25 | "DEBUG2" | +| attributes.cs:55:6:55:16 | [My(...)] | 0 | attributes.cs:55:18:55:22 | false | +| attributes.cs:58:6:58:16 | [My(...)] | 0 | attributes.cs:58:18:58:21 | true | +| attributes.cs:59:6:59:8 | [My2(...)] | 0 | attributes.cs:59:28:59:32 | false | +| attributes.cs:59:6:59:8 | [My2(...)] | 1 | attributes.cs:59:13:59:16 | true | +| attributes.cs:59:6:59:8 | [My2(...)] | 2 | attributes.cs:59:6:59:8 | 12 | +| attributes.cs:59:6:59:8 | [My2(...)] | 3 | attributes.cs:59:22:59:22 | 1 | +| attributes.cs:78:2:78:5 | [Args(...)] | 0 | attributes.cs:78:7:78:8 | 42 | +| attributes.cs:78:2:78:5 | [Args(...)] | 1 | attributes.cs:78:11:78:14 | null | +| attributes.cs:78:2:78:5 | [Args(...)] | 2 | attributes.cs:78:17:78:25 | typeof(...) | +| attributes.cs:78:2:78:5 | [Args(...)] | 3 | attributes.cs:78:28:78:30 | access to constant A | +| attributes.cs:78:2:78:5 | [Args(...)] | 4 | attributes.cs:78:33:78:53 | array creation of type Int32[] | +| attributes.cs:81:6:81:9 | [Args(...)] | 0 | attributes.cs:81:11:81:16 | ... + ... | +| attributes.cs:81:6:81:9 | [Args(...)] | 1 | attributes.cs:81:19:81:39 | array creation of type Int32[] | +| attributes.cs:81:6:81:9 | [Args(...)] | 2 | attributes.cs:81:42:81:45 | null | +| attributes.cs:81:6:81:9 | [Args(...)] | 3 | attributes.cs:81:48:81:52 | (...) ... | +| attributes.cs:81:6:81:9 | [Args(...)] | 4 | attributes.cs:81:55:81:58 | null | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 0 | attributes.cs:82:19:82:24 | ... + ... | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 1 | attributes.cs:82:27:82:47 | array creation of type Int32[] | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 2 | attributes.cs:82:50:82:53 | null | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 3 | attributes.cs:82:56:82:60 | (...) ... | +| attributes.cs:82:14:82:17 | [return: Args(...)] | 4 | attributes.cs:82:63:82:66 | null | +| attributes.cs:97:2:97:13 | [My3(...)] | 0 | attributes.cs:97:15:97:15 | 1 | +| attributes.cs:98:10:98:21 | [return: My3(...)] | 0 | attributes.cs:98:23:98:23 | 2 | +| attributes.cs:101:10:101:21 | [return: My3(...)] | 0 | attributes.cs:101:23:101:23 | 3 | +| attributes.cs:102:8:102:19 | [My3(...)] | 0 | attributes.cs:102:21:102:21 | 4 | +| attributes.cs:107:6:107:17 | [My3(...)] | 0 | attributes.cs:107:19:107:19 | 5 | +| attributes.cs:108:14:108:25 | [return: My3(...)] | 0 | attributes.cs:108:27:108:27 | 6 | +| attributes.cs:113:10:113:21 | [My3(...)] | 0 | attributes.cs:113:23:113:23 | 7 | +| attributes.cs:114:18:114:29 | [return: My3(...)] | 0 | attributes.cs:114:31:114:31 | 8 | +| attributes.cs:117:18:117:29 | [My3(...)] | 0 | attributes.cs:117:31:117:31 | 9 | +| attributes.cs:118:17:118:28 | [My3(...)] | 0 | attributes.cs:118:30:118:31 | 10 | +| attributes.cs:125:18:125:29 | [My3(...)] | 0 | attributes.cs:125:31:125:32 | 11 | +| attributes.cs:126:18:126:29 | [return: My3(...)] | 0 | attributes.cs:126:31:126:32 | 12 | +| attributes.cs:129:10:129:21 | [My3(...)] | 0 | attributes.cs:129:23:129:24 | 13 | +| attributes.cs:130:17:130:28 | [My3(...)] | 0 | attributes.cs:130:30:130:31 | 14 | +| attributes.cs:142:6:142:11 | [Params(...)] | 0 | attributes.cs:142:13:142:15 | "a" | +| attributes.cs:142:6:142:11 | [Params(...)] | 1 | attributes.cs:142:18:142:20 | "b" | +| attributes.cs:142:6:142:11 | [Params(...)] | 2 | attributes.cs:142:23:142:23 | 1 | +| attributes.cs:142:6:142:11 | [Params(...)] | 3 | attributes.cs:142:26:142:26 | 2 | +| attributes.cs:142:6:142:11 | [Params(...)] | 4 | attributes.cs:142:29:142:29 | 3 | +| attributes.cs:145:6:145:11 | [Params(...)] | 0 | attributes.cs:145:17:145:19 | "a" | +| attributes.cs:145:6:145:11 | [Params(...)] | 1 | attributes.cs:145:26:145:28 | "b" | +| attributes.cs:145:6:145:11 | [Params(...)] | 2 | attributes.cs:145:31:145:31 | 1 | +| attributes.cs:145:6:145:11 | [Params(...)] | 3 | attributes.cs:145:34:145:34 | 2 | +| attributes.cs:145:6:145:11 | [Params(...)] | 4 | attributes.cs:145:37:145:37 | 3 | +| attributes.cs:148:6:148:11 | [Params(...)] | 0 | attributes.cs:148:35:148:37 | "a" | +| attributes.cs:148:6:148:11 | [Params(...)] | 1 | attributes.cs:148:26:148:28 | "b" | +| attributes.cs:148:6:148:11 | [Params(...)] | 2 | attributes.cs:148:19:148:19 | 1 | +| attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:45:151:47 | "a" | +| attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:36:151:38 | "b" | +| attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:29 | array creation of type Int32[] | namedArguments | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | | Assembly1.dll:0:0:0:0 | [return: Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | -| attributes.cs:40:12:40:15 | [assembly: Args(...)] | Prop | attributes.cs:40:92:40:122 | array creation of type Object[] | -| attributes.cs:41:10:41:13 | [module: Args(...)] | Prop | attributes.cs:41:90:41:120 | array creation of type Object[] | -| attributes.cs:57:6:57:16 | [My(...)] | x | attributes.cs:57:36:57:36 | 0 | -| attributes.cs:57:6:57:16 | [My(...)] | y | attributes.cs:57:28:57:29 | "" | -| attributes.cs:58:6:58:8 | [My2(...)] | X | attributes.cs:58:39:58:40 | 42 | -| attributes.cs:77:2:77:5 | [Args(...)] | Prop | attributes.cs:77:63:77:93 | array creation of type Object[] | -| attributes.cs:80:6:80:9 | [Args(...)] | Prop | attributes.cs:80:68:80:98 | array creation of type Object[] | -| attributes.cs:81:14:81:17 | [return: Args(...)] | Prop | attributes.cs:81:76:81:106 | array creation of type Object[] | +| attributes.cs:41:12:41:15 | [assembly: Args(...)] | Prop | attributes.cs:41:92:41:122 | array creation of type Object[] | +| attributes.cs:42:10:42:13 | [module: Args(...)] | Prop | attributes.cs:42:90:42:120 | array creation of type Object[] | +| attributes.cs:58:6:58:16 | [My(...)] | x | attributes.cs:58:36:58:36 | 0 | +| attributes.cs:58:6:58:16 | [My(...)] | y | attributes.cs:58:28:58:29 | "" | +| attributes.cs:59:6:59:8 | [My2(...)] | X | attributes.cs:59:39:59:40 | 42 | +| attributes.cs:78:2:78:5 | [Args(...)] | Prop | attributes.cs:78:63:78:93 | array creation of type Object[] | +| attributes.cs:81:6:81:9 | [Args(...)] | Prop | attributes.cs:81:68:81:98 | array creation of type Object[] | +| attributes.cs:82:14:82:17 | [return: Args(...)] | Prop | attributes.cs:82:76:82:106 | array creation of type Object[] | diff --git a/csharp/ql/test/library-tests/attributes/AttributeComments.expected b/csharp/ql/test/library-tests/attributes/AttributeComments.expected index 55c71024afe..e1c01d720fd 100644 --- a/csharp/ql/test/library-tests/attributes/AttributeComments.expected +++ b/csharp/ql/test/library-tests/attributes/AttributeComments.expected @@ -1,4 +1,4 @@ -| attributes.cs:10:12:10:24 | [assembly: AssemblyTitle(...)] | attributes.cs:7:1:9:31 | // ... | -| attributes.cs:22:12:22:21 | [assembly: ComVisible(...)] | attributes.cs:19:1:21:58 | // ... | -| attributes.cs:25:12:25:15 | [assembly: Guid(...)] | attributes.cs:24:1:24:84 | // ... | -| attributes.cs:37:12:37:26 | [assembly: AssemblyVersion(...)] | attributes.cs:27:1:36:39 | // ... | +| attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | attributes.cs:8:1:10:31 | // ... | +| attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | attributes.cs:20:1:22:58 | // ... | +| attributes.cs:26:12:26:15 | [assembly: Guid(...)] | attributes.cs:25:1:25:84 | // ... | +| attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | attributes.cs:28:1:37:39 | // ... | diff --git a/csharp/ql/test/library-tests/attributes/AttributeElements.expected b/csharp/ql/test/library-tests/attributes/AttributeElements.expected index 11291a73338..51110ec1a8f 100644 --- a/csharp/ql/test/library-tests/attributes/AttributeElements.expected +++ b/csharp/ql/test/library-tests/attributes/AttributeElements.expected @@ -9,44 +9,44 @@ | Assembly1.dll:0:0:0:0 | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | Assembly1.dll:0:0:0:0 | [Debuggable(...)] | System.Diagnostics.DebuggableAttribute | | Assembly1.dll:0:0:0:0 | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | Assembly1.dll:0:0:0:0 | [RuntimeCompatibility(...)] | System.Runtime.CompilerServices.RuntimeCompatibilityAttribute | | Assembly1.dll:0:0:0:0 | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | Assembly1.dll:0:0:0:0 | [TargetFramework(...)] | System.Runtime.Versioning.TargetFrameworkAttribute | -| attributes.cs:44:7:44:9 | Foo | attributes.cs:43:2:43:22 | [AttributeUsage(...)] | System.AttributeUsageAttribute | -| attributes.cs:47:17:47:19 | foo | attributes.cs:46:6:46:16 | [Conditional(...)] | System.Diagnostics.ConditionalAttribute | -| attributes.cs:52:23:52:23 | x | attributes.cs:52:14:52:16 | [Foo(...)] | Foo | -| attributes.cs:55:10:55:11 | M1 | attributes.cs:54:6:54:16 | [My(...)] | MyAttribute | -| attributes.cs:59:10:59:11 | M2 | attributes.cs:57:6:57:16 | [My(...)] | MyAttribute | -| attributes.cs:59:10:59:11 | M2 | attributes.cs:58:6:58:8 | [My2(...)] | My2Attribute | -| attributes.cs:78:14:78:14 | X | attributes.cs:77:2:77:5 | [Args(...)] | ArgsAttribute | -| attributes.cs:82:9:82:18 | SomeMethod | attributes.cs:80:6:80:9 | [Args(...)] | ArgsAttribute | -| attributes.cs:82:9:82:18 | SomeMethod | attributes.cs:81:14:81:17 | [return: Args(...)] | ArgsAttribute | -| attributes.cs:98:14:98:24 | Invoke | attributes.cs:97:10:97:21 | [return: My3(...)] | My3Attribute | -| attributes.cs:98:14:98:24 | My1Delegate | attributes.cs:96:2:96:13 | [My3(...)] | My3Attribute | -| attributes.cs:102:17:102:27 | Invoke | attributes.cs:100:10:100:21 | [return: My3(...)] | My3Attribute | -| attributes.cs:102:17:102:27 | My2Delegate | attributes.cs:101:8:101:19 | [My3(...)] | My3Attribute | -| attributes.cs:108:32:108:32 | + | attributes.cs:106:6:106:17 | [My3(...)] | My3Attribute | -| attributes.cs:108:32:108:32 | + | attributes.cs:107:14:107:25 | [return: My3(...)] | My3Attribute | -| attributes.cs:114:9:114:11 | get_Item | attributes.cs:112:10:112:21 | [My3(...)] | My3Attribute | -| attributes.cs:114:9:114:11 | get_Item | attributes.cs:113:18:113:29 | [return: My3(...)] | My3Attribute | -| attributes.cs:118:9:118:11 | set_Item | attributes.cs:116:18:116:29 | [My3(...)] | My3Attribute | -| attributes.cs:118:9:118:11 | value | attributes.cs:117:17:117:28 | [My3(...)] | My3Attribute | -| attributes.cs:126:9:126:11 | get_Prop1 | attributes.cs:124:18:124:29 | [My3(...)] | My3Attribute | -| attributes.cs:126:9:126:11 | get_Prop1 | attributes.cs:125:18:125:29 | [return: My3(...)] | My3Attribute | -| attributes.cs:130:9:130:11 | set_Prop1 | attributes.cs:128:10:128:21 | [My3(...)] | My3Attribute | -| attributes.cs:130:9:130:11 | value | attributes.cs:129:17:129:28 | [My3(...)] | My3Attribute | -| attributes.cs:142:17:142:18 | M1 | attributes.cs:141:6:141:11 | [Params(...)] | Class1+ParamsAttribute | -| attributes.cs:145:17:145:18 | M2 | attributes.cs:144:6:144:11 | [Params(...)] | Class1+ParamsAttribute | -| attributes.cs:148:17:148:18 | M3 | attributes.cs:147:6:147:11 | [Params(...)] | Class1+ParamsAttribute | -| attributes.cs:151:17:151:18 | M4 | attributes.cs:150:6:150:11 | [Params(...)] | Class1+ParamsAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:10:12:10:24 | [assembly: AssemblyTitle(...)] | System.Reflection.AssemblyTitleAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:11:12:11:30 | [assembly: AssemblyDescription(...)] | System.Reflection.AssemblyDescriptionAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:12:12:12:32 | [assembly: AssemblyConfiguration(...)] | System.Reflection.AssemblyConfigurationAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:13:12:13:26 | [assembly: AssemblyCompany(...)] | System.Reflection.AssemblyCompanyAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:14:12:14:26 | [assembly: AssemblyProduct(...)] | System.Reflection.AssemblyProductAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:15:12:15:28 | [assembly: AssemblyCopyright(...)] | System.Reflection.AssemblyCopyrightAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:16:12:16:28 | [assembly: AssemblyTrademark(...)] | System.Reflection.AssemblyTrademarkAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:17:12:17:26 | [assembly: AssemblyCulture(...)] | System.Reflection.AssemblyCultureAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:22:12:22:21 | [assembly: ComVisible(...)] | System.Runtime.InteropServices.ComVisibleAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:25:12:25:15 | [assembly: Guid(...)] | System.Runtime.InteropServices.GuidAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:37:12:37:26 | [assembly: AssemblyVersion(...)] | System.Reflection.AssemblyVersionAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:38:12:38:30 | [assembly: AssemblyFileVersion(...)] | System.Reflection.AssemblyFileVersionAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:40:12:40:15 | [assembly: Args(...)] | ArgsAttribute | -| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:41:10:41:13 | [module: Args(...)] | ArgsAttribute | +| attributes.cs:45:7:45:9 | Foo | attributes.cs:44:2:44:22 | [AttributeUsage(...)] | System.AttributeUsageAttribute | +| attributes.cs:48:17:48:19 | foo | attributes.cs:47:6:47:16 | [Conditional(...)] | System.Diagnostics.ConditionalAttribute | +| attributes.cs:53:23:53:23 | x | attributes.cs:53:14:53:16 | [Foo(...)] | Foo | +| attributes.cs:56:10:56:11 | M1 | attributes.cs:55:6:55:16 | [My(...)] | MyAttribute | +| attributes.cs:60:10:60:11 | M2 | attributes.cs:58:6:58:16 | [My(...)] | MyAttribute | +| attributes.cs:60:10:60:11 | M2 | attributes.cs:59:6:59:8 | [My2(...)] | My2Attribute | +| attributes.cs:79:14:79:14 | X | attributes.cs:78:2:78:5 | [Args(...)] | ArgsAttribute | +| attributes.cs:83:9:83:18 | SomeMethod | attributes.cs:81:6:81:9 | [Args(...)] | ArgsAttribute | +| attributes.cs:83:9:83:18 | SomeMethod | attributes.cs:82:14:82:17 | [return: Args(...)] | ArgsAttribute | +| attributes.cs:99:14:99:24 | Invoke | attributes.cs:98:10:98:21 | [return: My3(...)] | My3Attribute | +| attributes.cs:99:14:99:24 | My1Delegate | attributes.cs:97:2:97:13 | [My3(...)] | My3Attribute | +| attributes.cs:103:17:103:27 | Invoke | attributes.cs:101:10:101:21 | [return: My3(...)] | My3Attribute | +| attributes.cs:103:17:103:27 | My2Delegate | attributes.cs:102:8:102:19 | [My3(...)] | My3Attribute | +| attributes.cs:109:32:109:32 | + | attributes.cs:107:6:107:17 | [My3(...)] | My3Attribute | +| attributes.cs:109:32:109:32 | + | attributes.cs:108:14:108:25 | [return: My3(...)] | My3Attribute | +| attributes.cs:115:9:115:11 | get_Item | attributes.cs:113:10:113:21 | [My3(...)] | My3Attribute | +| attributes.cs:115:9:115:11 | get_Item | attributes.cs:114:18:114:29 | [return: My3(...)] | My3Attribute | +| attributes.cs:119:9:119:11 | set_Item | attributes.cs:117:18:117:29 | [My3(...)] | My3Attribute | +| attributes.cs:119:9:119:11 | value | attributes.cs:118:17:118:28 | [My3(...)] | My3Attribute | +| attributes.cs:127:9:127:11 | get_Prop1 | attributes.cs:125:18:125:29 | [My3(...)] | My3Attribute | +| attributes.cs:127:9:127:11 | get_Prop1 | attributes.cs:126:18:126:29 | [return: My3(...)] | My3Attribute | +| attributes.cs:131:9:131:11 | set_Prop1 | attributes.cs:129:10:129:21 | [My3(...)] | My3Attribute | +| attributes.cs:131:9:131:11 | value | attributes.cs:130:17:130:28 | [My3(...)] | My3Attribute | +| attributes.cs:143:17:143:18 | M1 | attributes.cs:142:6:142:11 | [Params(...)] | Class1+ParamsAttribute | +| attributes.cs:146:17:146:18 | M2 | attributes.cs:145:6:145:11 | [Params(...)] | Class1+ParamsAttribute | +| attributes.cs:149:17:149:18 | M3 | attributes.cs:148:6:148:11 | [Params(...)] | Class1+ParamsAttribute | +| attributes.cs:152:17:152:18 | M4 | attributes.cs:151:6:151:11 | [Params(...)] | Class1+ParamsAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | System.Reflection.AssemblyTitleAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | System.Reflection.AssemblyDescriptionAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | System.Reflection.AssemblyConfigurationAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:14:12:14:26 | [assembly: AssemblyCompany(...)] | System.Reflection.AssemblyCompanyAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:15:12:15:26 | [assembly: AssemblyProduct(...)] | System.Reflection.AssemblyProductAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:16:12:16:28 | [assembly: AssemblyCopyright(...)] | System.Reflection.AssemblyCopyrightAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:17:12:17:28 | [assembly: AssemblyTrademark(...)] | System.Reflection.AssemblyTrademarkAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:18:12:18:26 | [assembly: AssemblyCulture(...)] | System.Reflection.AssemblyCultureAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | System.Runtime.InteropServices.ComVisibleAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:26:12:26:15 | [assembly: Guid(...)] | System.Runtime.InteropServices.GuidAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | System.Reflection.AssemblyVersionAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:39:12:39:30 | [assembly: AssemblyFileVersion(...)] | System.Reflection.AssemblyFileVersionAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:41:12:41:15 | [assembly: Args(...)] | ArgsAttribute | +| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:42:10:42:13 | [module: Args(...)] | ArgsAttribute | diff --git a/csharp/ql/test/library-tests/attributes/PrintAst.expected b/csharp/ql/test/library-tests/attributes/PrintAst.expected index 77be3f7461d..2ac02c93a3a 100644 --- a/csharp/ql/test/library-tests/attributes/PrintAst.expected +++ b/csharp/ql/test/library-tests/attributes/PrintAst.expected @@ -1,70 +1,41 @@ attributes.cs: -# 10| [AssemblyAttribute] [assembly: AssemblyTitle(...)] -# 10| -1: [TypeMention] AssemblyTitleAttribute -# 10| 0: [StringLiteralUtf16] "C# attributes test" -# 11| [AssemblyAttribute] [assembly: AssemblyDescription(...)] -# 11| -1: [TypeMention] AssemblyDescriptionAttribute -# 11| 0: [StringLiteralUtf16] "A test of C# attributes" -# 12| [AssemblyAttribute] [assembly: AssemblyConfiguration(...)] -# 12| -1: [TypeMention] AssemblyConfigurationAttribute -# 12| 0: [StringLiteralUtf16] "" -# 13| [AssemblyAttribute] [assembly: AssemblyCompany(...)] -# 13| -1: [TypeMention] AssemblyCompanyAttribute -# 13| 0: [StringLiteralUtf16] "Semmle Plc" -# 14| [AssemblyAttribute] [assembly: AssemblyProduct(...)] -# 14| -1: [TypeMention] AssemblyProductAttribute -# 14| 0: [StringLiteralUtf16] "Odasa" -# 15| [AssemblyAttribute] [assembly: AssemblyCopyright(...)] -# 15| -1: [TypeMention] AssemblyCopyrightAttribute -# 15| 0: [StringLiteralUtf16] "Copyright © Semmle 2018" -# 16| [AssemblyAttribute] [assembly: AssemblyTrademark(...)] -# 16| -1: [TypeMention] AssemblyTrademarkAttribute -# 16| 0: [StringLiteralUtf16] "" -# 17| [AssemblyAttribute] [assembly: AssemblyCulture(...)] -# 17| -1: [TypeMention] AssemblyCultureAttribute +# 11| [AssemblyAttribute] [assembly: AssemblyTitle(...)] +# 11| -1: [TypeMention] AssemblyTitleAttribute +# 11| 0: [StringLiteralUtf16] "C# attributes test" +# 12| [AssemblyAttribute] [assembly: AssemblyDescription(...)] +# 12| -1: [TypeMention] AssemblyDescriptionAttribute +# 12| 0: [StringLiteralUtf16] "A test of C# attributes" +# 13| [AssemblyAttribute] [assembly: AssemblyConfiguration(...)] +# 13| -1: [TypeMention] AssemblyConfigurationAttribute +# 13| 0: [StringLiteralUtf16] "" +# 14| [AssemblyAttribute] [assembly: AssemblyCompany(...)] +# 14| -1: [TypeMention] AssemblyCompanyAttribute +# 14| 0: [StringLiteralUtf16] "Semmle Plc" +# 15| [AssemblyAttribute] [assembly: AssemblyProduct(...)] +# 15| -1: [TypeMention] AssemblyProductAttribute +# 15| 0: [StringLiteralUtf16] "Odasa" +# 16| [AssemblyAttribute] [assembly: AssemblyCopyright(...)] +# 16| -1: [TypeMention] AssemblyCopyrightAttribute +# 16| 0: [StringLiteralUtf16] "Copyright © Semmle 2018" +# 17| [AssemblyAttribute] [assembly: AssemblyTrademark(...)] +# 17| -1: [TypeMention] AssemblyTrademarkAttribute # 17| 0: [StringLiteralUtf16] "" -# 22| [AssemblyAttribute] [assembly: ComVisible(...)] -# 22| -1: [TypeMention] ComVisibleAttribute -# 22| 0: [BoolLiteral] false -# 25| [AssemblyAttribute] [assembly: Guid(...)] -# 25| -1: [TypeMention] GuidAttribute -# 25| 0: [StringLiteralUtf16] "2f70fdd6-14aa-4850-b053-d547adb1f476" -# 37| [AssemblyAttribute] [assembly: AssemblyVersion(...)] -# 37| -1: [TypeMention] AssemblyVersionAttribute -# 37| 0: [StringLiteralUtf16] "1.0.0.0" -# 38| [AssemblyAttribute] [assembly: AssemblyFileVersion(...)] -# 38| -1: [TypeMention] AssemblyFileVersionAttribute +# 18| [AssemblyAttribute] [assembly: AssemblyCulture(...)] +# 18| -1: [TypeMention] AssemblyCultureAttribute +# 18| 0: [StringLiteralUtf16] "" +# 23| [AssemblyAttribute] [assembly: ComVisible(...)] +# 23| -1: [TypeMention] ComVisibleAttribute +# 23| 0: [BoolLiteral] false +# 26| [AssemblyAttribute] [assembly: Guid(...)] +# 26| -1: [TypeMention] GuidAttribute +# 26| 0: [StringLiteralUtf16] "2f70fdd6-14aa-4850-b053-d547adb1f476" +# 38| [AssemblyAttribute] [assembly: AssemblyVersion(...)] +# 38| -1: [TypeMention] AssemblyVersionAttribute # 38| 0: [StringLiteralUtf16] "1.0.0.0" -# 40| [AssemblyAttribute] [assembly: Args(...)] -# 40| -1: [TypeMention] ArgsAttribute -# 40| 0: [IntLiteral] 0 -# 40| 1: [ArrayCreation] array creation of type Object[] -# 40| -2: [TypeMention] Object[] -# 40| 1: [TypeMention] object -# 40| -1: [ArrayInitializer] { ..., ... } -# 40| 0: [CastExpr] (...) ... -# 40| 1: [IntLiteral] 1 -# 40| 1: [CastExpr] (...) ... -# 40| 1: [IntLiteral] 2 -# 40| 2: [NullLiteral] null -# 40| 2: [TypeofExpr] typeof(...) -# 40| 0: [TypeAccess] access to type ArgsAttribute -# 40| 0: [TypeMention] ArgsAttribute -# 40| 3: [CastExpr] (...) ... -# 40| 0: [TypeAccess] access to type E -# 40| 0: [TypeMention] E -# 40| 1: [IntLiteral] 12 -# 40| 4: [NullLiteral] null -# 40| 5: [ArrayCreation] array creation of type Object[] -# 40| -2: [TypeMention] Object[] -# 40| 1: [TypeMention] object -# 40| -1: [ArrayInitializer] { ..., ... } -# 40| 0: [CastExpr] (...) ... -# 40| 1: [IntLiteral] 1 -# 40| 1: [TypeofExpr] typeof(...) -# 40| 0: [TypeAccess] access to type Int32 -# 40| 0: [TypeMention] int -# 41| [ModuleAttribute] [module: Args(...)] +# 39| [AssemblyAttribute] [assembly: AssemblyFileVersion(...)] +# 39| -1: [TypeMention] AssemblyFileVersionAttribute +# 39| 0: [StringLiteralUtf16] "1.0.0.0" +# 41| [AssemblyAttribute] [assembly: Args(...)] # 41| -1: [TypeMention] ArgsAttribute # 41| 0: [IntLiteral] 0 # 41| 1: [ArrayCreation] array creation of type Object[] @@ -93,162 +64,164 @@ attributes.cs: # 41| 1: [TypeofExpr] typeof(...) # 41| 0: [TypeAccess] access to type Int32 # 41| 0: [TypeMention] int -# 44| [Class] Foo +# 42| [ModuleAttribute] [module: Args(...)] +# 42| -1: [TypeMention] ArgsAttribute +# 42| 0: [IntLiteral] 0 +# 42| 1: [ArrayCreation] array creation of type Object[] +# 42| -2: [TypeMention] Object[] +# 42| 1: [TypeMention] object +# 42| -1: [ArrayInitializer] { ..., ... } +# 42| 0: [CastExpr] (...) ... +# 42| 1: [IntLiteral] 1 +# 42| 1: [CastExpr] (...) ... +# 42| 1: [IntLiteral] 2 +# 42| 2: [NullLiteral] null +# 42| 2: [TypeofExpr] typeof(...) +# 42| 0: [TypeAccess] access to type ArgsAttribute +# 42| 0: [TypeMention] ArgsAttribute +# 42| 3: [CastExpr] (...) ... +# 42| 0: [TypeAccess] access to type E +# 42| 0: [TypeMention] E +# 42| 1: [IntLiteral] 12 +# 42| 4: [NullLiteral] null +# 42| 5: [ArrayCreation] array creation of type Object[] +# 42| -2: [TypeMention] Object[] +# 42| 1: [TypeMention] object +# 42| -1: [ArrayInitializer] { ..., ... } +# 42| 0: [CastExpr] (...) ... +# 42| 1: [IntLiteral] 1 +# 42| 1: [TypeofExpr] typeof(...) +# 42| 0: [TypeAccess] access to type Int32 +# 42| 0: [TypeMention] int +# 45| [Class] Foo #-----| 0: (Attributes) -# 43| 1: [DefaultAttribute] [AttributeUsage(...)] -# 43| -1: [TypeMention] AttributeUsageAttribute -# 43| 0: [MemberConstantAccess] access to constant All -# 43| -1: [TypeAccess] access to type AttributeTargets -# 43| 0: [TypeMention] AttributeTargets +# 44| 1: [DefaultAttribute] [AttributeUsage(...)] +# 44| -1: [TypeMention] AttributeUsageAttribute +# 44| 0: [MemberConstantAccess] access to constant All +# 44| -1: [TypeAccess] access to type AttributeTargets +# 44| 0: [TypeMention] AttributeTargets #-----| 3: (Base types) -# 44| 0: [TypeMention] Attribute -# 47| 5: [Method] foo -# 47| -1: [TypeMention] Void +# 45| 0: [TypeMention] Attribute +# 48| 5: [Method] foo +# 48| -1: [TypeMention] Void #-----| 0: (Attributes) -# 46| 1: [DefaultAttribute] [Conditional(...)] -# 46| -1: [TypeMention] ConditionalAttribute -# 46| 0: [StringLiteralUtf16] "DEBUG2" -# 47| 4: [BlockStmt] {...} -# 50| [Class] Bar -# 52| 5: [Method] inc -# 52| -1: [TypeMention] int +# 47| 1: [DefaultAttribute] [Conditional(...)] +# 47| -1: [TypeMention] ConditionalAttribute +# 47| 0: [StringLiteralUtf16] "DEBUG2" +# 48| 4: [BlockStmt] {...} +# 51| [Class] Bar +# 53| 5: [Method] inc +# 53| -1: [TypeMention] int #-----| 2: (Parameters) -# 52| 0: [Parameter] x -# 52| -1: [TypeMention] int +# 53| 0: [Parameter] x +# 53| -1: [TypeMention] int #-----| 0: (Attributes) -# 52| 1: [DefaultAttribute] [Foo(...)] -# 52| 0: [TypeMention] Foo -# 52| 4: [BlockStmt] {...} -# 52| 0: [ReturnStmt] return ...; -# 52| 0: [AddExpr] ... + ... -# 52| 0: [ParameterAccess] access to parameter x -# 52| 1: [IntLiteral] 1 -# 55| 6: [Method] M1 -# 55| -1: [TypeMention] Void +# 53| 1: [DefaultAttribute] [Foo(...)] +# 53| 0: [TypeMention] Foo +# 53| 4: [BlockStmt] {...} +# 53| 0: [ReturnStmt] return ...; +# 53| 0: [AddExpr] ... + ... +# 53| 0: [ParameterAccess] access to parameter x +# 53| 1: [IntLiteral] 1 +# 56| 6: [Method] M1 +# 56| -1: [TypeMention] Void #-----| 0: (Attributes) -# 54| 1: [DefaultAttribute] [My(...)] -# 54| -1: [TypeMention] MyAttribute -# 54| 0: [BoolLiteral] false -# 55| 4: [BlockStmt] {...} -# 59| 7: [Method] M2 -# 59| -1: [TypeMention] Void +# 55| 1: [DefaultAttribute] [My(...)] +# 55| -1: [TypeMention] MyAttribute +# 55| 0: [BoolLiteral] false +# 56| 4: [BlockStmt] {...} +# 60| 7: [Method] M2 +# 60| -1: [TypeMention] Void #-----| 0: (Attributes) -# 57| 1: [DefaultAttribute] [My(...)] -# 57| -1: [TypeMention] MyAttribute -# 57| 0: [BoolLiteral] true -# 57| 1: [StringLiteralUtf16] "" -# 57| 2: [IntLiteral] 0 -# 58| 2: [DefaultAttribute] [My2(...)] -# 58| -1: [TypeMention] My2Attribute -# 58| 0: [BoolLiteral] false -# 58| 1: [BoolLiteral] true -# 58| 3: [IntLiteral] 1 -# 58| 4: [IntLiteral] 42 -# 59| 4: [BlockStmt] {...} -# 62| [Class] MyAttribute +# 58| 1: [DefaultAttribute] [My(...)] +# 58| -1: [TypeMention] MyAttribute +# 58| 0: [BoolLiteral] true +# 58| 1: [StringLiteralUtf16] "" +# 58| 2: [IntLiteral] 0 +# 59| 2: [DefaultAttribute] [My2(...)] +# 59| -1: [TypeMention] My2Attribute +# 59| 0: [BoolLiteral] false +# 59| 1: [BoolLiteral] true +# 59| 3: [IntLiteral] 1 +# 59| 4: [IntLiteral] 42 +# 60| 4: [BlockStmt] {...} +# 63| [Class] MyAttribute #-----| 3: (Base types) -# 62| 0: [TypeMention] Attribute -# 64| 4: [Field] x -# 64| -1: [TypeMention] int -# 65| 5: [Property] y -# 65| -1: [TypeMention] string -# 65| 3: [Getter] get_y -# 65| 4: [Setter] set_y +# 63| 0: [TypeMention] Attribute +# 65| 4: [Field] x +# 65| -1: [TypeMention] int +# 66| 5: [Property] y +# 66| -1: [TypeMention] string +# 66| 3: [Getter] get_y +# 66| 4: [Setter] set_y #-----| 2: (Parameters) -# 65| 0: [Parameter] value -# 66| 6: [InstanceConstructor] MyAttribute +# 66| 0: [Parameter] value +# 67| 6: [InstanceConstructor] MyAttribute #-----| 2: (Parameters) -# 66| 0: [Parameter] b -# 66| -1: [TypeMention] bool -# 66| 4: [BlockStmt] {...} -# 69| [Enum] E -# 69| 5: [Field] A -# 69| 1: [AssignExpr] ... = ... -# 69| 0: [MemberConstantAccess] access to constant A -# 69| 1: [IntLiteral] 42 -# 71| [Class] ArgsAttribute +# 67| 0: [Parameter] b +# 67| -1: [TypeMention] bool +# 67| 4: [BlockStmt] {...} +# 70| [Enum] E +# 70| 5: [Field] A +# 70| 1: [AssignExpr] ... = ... +# 70| 0: [MemberConstantAccess] access to constant A +# 70| 1: [IntLiteral] 42 +# 72| [Class] ArgsAttribute #-----| 3: (Base types) -# 71| 0: [TypeMention] Attribute -# 73| 4: [Property] Prop -# 73| -1: [TypeMention] Object[] -# 73| 1: [TypeMention] object -# 73| 3: [Getter] get_Prop -# 73| 4: [Setter] set_Prop +# 72| 0: [TypeMention] Attribute +# 74| 4: [Property] Prop +# 74| -1: [TypeMention] Object[] +# 74| 1: [TypeMention] object +# 74| 3: [Getter] get_Prop +# 74| 4: [Setter] set_Prop #-----| 2: (Parameters) -# 73| 0: [Parameter] value -# 74| 5: [InstanceConstructor] ArgsAttribute +# 74| 0: [Parameter] value +# 75| 5: [InstanceConstructor] ArgsAttribute #-----| 2: (Parameters) -# 74| 0: [Parameter] i -# 74| -1: [TypeMention] int -# 74| 1: [Parameter] o -# 74| -1: [TypeMention] object -# 74| 2: [Parameter] t -# 74| -1: [TypeMention] Type -# 74| 3: [Parameter] e -# 74| -1: [TypeMention] E -# 74| 4: [Parameter] arr -# 74| -1: [TypeMention] Int32[] -# 74| 1: [TypeMention] int -# 74| 4: [BlockStmt] {...} -# 78| [Class] X +# 75| 0: [Parameter] i +# 75| -1: [TypeMention] int +# 75| 1: [Parameter] o +# 75| -1: [TypeMention] object +# 75| 2: [Parameter] t +# 75| -1: [TypeMention] Type +# 75| 3: [Parameter] e +# 75| -1: [TypeMention] E +# 75| 4: [Parameter] arr +# 75| -1: [TypeMention] Int32[] +# 75| 1: [TypeMention] int +# 75| 4: [BlockStmt] {...} +# 79| [Class] X #-----| 0: (Attributes) -# 77| 1: [DefaultAttribute] [Args(...)] -# 77| -1: [TypeMention] ArgsAttribute -# 77| 0: [IntLiteral] 42 -# 77| 1: [NullLiteral] null -# 77| 2: [TypeofExpr] typeof(...) -# 77| 0: [TypeAccess] access to type X -# 77| 0: [TypeMention] X -# 77| 3: [MemberConstantAccess] access to constant A -# 77| -1: [TypeAccess] access to type E -# 77| 0: [TypeMention] E -# 77| 4: [ArrayCreation] array creation of type Int32[] -# 77| -2: [TypeMention] Int32[] -# 77| 1: [TypeMention] int -# 77| -1: [ArrayInitializer] { ..., ... } -# 77| 0: [IntLiteral] 1 -# 77| 1: [IntLiteral] 2 -# 77| 2: [IntLiteral] 3 -# 77| 5: [ArrayCreation] array creation of type Object[] -# 77| -2: [TypeMention] Object[] -# 77| 1: [TypeMention] object -# 77| -1: [ArrayInitializer] { ..., ... } -# 77| 0: [CastExpr] (...) ... -# 77| 1: [IntLiteral] 1 -# 77| 1: [TypeofExpr] typeof(...) -# 77| 0: [TypeAccess] access to type Int32 -# 77| 0: [TypeMention] int -# 82| 5: [Method] SomeMethod -# 82| -1: [TypeMention] int +# 78| 1: [DefaultAttribute] [Args(...)] +# 78| -1: [TypeMention] ArgsAttribute +# 78| 0: [IntLiteral] 42 +# 78| 1: [NullLiteral] null +# 78| 2: [TypeofExpr] typeof(...) +# 78| 0: [TypeAccess] access to type X +# 78| 0: [TypeMention] X +# 78| 3: [MemberConstantAccess] access to constant A +# 78| -1: [TypeAccess] access to type E +# 78| 0: [TypeMention] E +# 78| 4: [ArrayCreation] array creation of type Int32[] +# 78| -2: [TypeMention] Int32[] +# 78| 1: [TypeMention] int +# 78| -1: [ArrayInitializer] { ..., ... } +# 78| 0: [IntLiteral] 1 +# 78| 1: [IntLiteral] 2 +# 78| 2: [IntLiteral] 3 +# 78| 5: [ArrayCreation] array creation of type Object[] +# 78| -2: [TypeMention] Object[] +# 78| 1: [TypeMention] object +# 78| -1: [ArrayInitializer] { ..., ... } +# 78| 0: [CastExpr] (...) ... +# 78| 1: [IntLiteral] 1 +# 78| 1: [TypeofExpr] typeof(...) +# 78| 0: [TypeAccess] access to type Int32 +# 78| 0: [TypeMention] int +# 83| 5: [Method] SomeMethod +# 83| -1: [TypeMention] int #-----| 0: (Attributes) -# 80| 1: [DefaultAttribute] [Args(...)] -# 80| -1: [TypeMention] ArgsAttribute -# 80| 0: [AddExpr] ... + ... -# 80| 0: [IntLiteral] 42 -# 80| 1: [IntLiteral] 0 -# 80| 1: [ArrayCreation] array creation of type Int32[] -# 80| -2: [TypeMention] Int32[] -# 80| 1: [TypeMention] int -# 80| -1: [ArrayInitializer] { ..., ... } -# 80| 0: [IntLiteral] 1 -# 80| 1: [IntLiteral] 2 -# 80| 2: [IntLiteral] 3 -# 80| 2: [NullLiteral] null -# 80| 3: [CastExpr] (...) ... -# 80| 0: [TypeAccess] access to type E -# 80| 0: [TypeMention] E -# 80| 1: [IntLiteral] 12 -# 80| 4: [NullLiteral] null -# 80| 5: [ArrayCreation] array creation of type Object[] -# 80| -2: [TypeMention] Object[] -# 80| 1: [TypeMention] object -# 80| -1: [ArrayInitializer] { ..., ... } -# 80| 0: [CastExpr] (...) ... -# 80| 1: [IntLiteral] 1 -# 80| 1: [TypeofExpr] typeof(...) -# 80| 0: [TypeAccess] access to type Int32 -# 80| 0: [TypeMention] int -# 81| 2: [ReturnAttribute] [return: Args(...)] +# 81| 1: [DefaultAttribute] [Args(...)] # 81| -1: [TypeMention] ArgsAttribute # 81| 0: [AddExpr] ... + ... # 81| 0: [IntLiteral] 42 @@ -275,189 +248,216 @@ attributes.cs: # 81| 1: [TypeofExpr] typeof(...) # 81| 0: [TypeAccess] access to type Int32 # 81| 0: [TypeMention] int -# 82| 4: [BlockStmt] {...} -# 82| 0: [ReturnStmt] return ...; -# 82| 0: [IntLiteral] 1 -# 85| [Class] My2Attribute +# 82| 2: [ReturnAttribute] [return: Args(...)] +# 82| -1: [TypeMention] ArgsAttribute +# 82| 0: [AddExpr] ... + ... +# 82| 0: [IntLiteral] 42 +# 82| 1: [IntLiteral] 0 +# 82| 1: [ArrayCreation] array creation of type Int32[] +# 82| -2: [TypeMention] Int32[] +# 82| 1: [TypeMention] int +# 82| -1: [ArrayInitializer] { ..., ... } +# 82| 0: [IntLiteral] 1 +# 82| 1: [IntLiteral] 2 +# 82| 2: [IntLiteral] 3 +# 82| 2: [NullLiteral] null +# 82| 3: [CastExpr] (...) ... +# 82| 0: [TypeAccess] access to type E +# 82| 0: [TypeMention] E +# 82| 1: [IntLiteral] 12 +# 82| 4: [NullLiteral] null +# 82| 5: [ArrayCreation] array creation of type Object[] +# 82| -2: [TypeMention] Object[] +# 82| 1: [TypeMention] object +# 82| -1: [ArrayInitializer] { ..., ... } +# 82| 0: [CastExpr] (...) ... +# 82| 1: [IntLiteral] 1 +# 82| 1: [TypeofExpr] typeof(...) +# 82| 0: [TypeAccess] access to type Int32 +# 82| 0: [TypeMention] int +# 83| 4: [BlockStmt] {...} +# 83| 0: [ReturnStmt] return ...; +# 83| 0: [IntLiteral] 1 +# 86| [Class] My2Attribute #-----| 3: (Base types) -# 85| 0: [TypeMention] Attribute -# 87| 4: [Property] X -# 87| -1: [TypeMention] int -# 87| 3: [Getter] get_X -# 87| 4: [Setter] set_X +# 86| 0: [TypeMention] Attribute +# 88| 4: [Property] X +# 88| -1: [TypeMention] int +# 88| 3: [Getter] get_X +# 88| 4: [Setter] set_X #-----| 2: (Parameters) -# 87| 0: [Parameter] value -# 88| 5: [InstanceConstructor] My2Attribute +# 88| 0: [Parameter] value +# 89| 5: [InstanceConstructor] My2Attribute #-----| 2: (Parameters) -# 88| 0: [Parameter] a -# 88| -1: [TypeMention] bool -# 88| 1: [Parameter] b -# 88| -1: [TypeMention] bool -# 88| 2: [Parameter] i -# 88| -1: [TypeMention] int -# 88| 1: [IntLiteral] 12 -# 88| 3: [Parameter] j -# 88| -1: [TypeMention] int -# 88| 1: [IntLiteral] 13 -# 88| 4: [BlockStmt] {...} -# 91| [Class] My3Attribute +# 89| 0: [Parameter] a +# 89| -1: [TypeMention] bool +# 89| 1: [Parameter] b +# 89| -1: [TypeMention] bool +# 89| 2: [Parameter] i +# 89| -1: [TypeMention] int +# 89| 1: [IntLiteral] 12 +# 89| 3: [Parameter] j +# 89| -1: [TypeMention] int +# 89| 1: [IntLiteral] 13 +# 89| 4: [BlockStmt] {...} +# 92| [Class] My3Attribute #-----| 3: (Base types) -# 91| 0: [TypeMention] Attribute -# 93| 4: [InstanceConstructor] My3Attribute +# 92| 0: [TypeMention] Attribute +# 94| 4: [InstanceConstructor] My3Attribute #-----| 2: (Parameters) -# 93| 0: [Parameter] x -# 93| -1: [TypeMention] int -# 93| 4: [BlockStmt] {...} -# 98| [DelegateType] My1Delegate +# 94| 0: [Parameter] x +# 94| -1: [TypeMention] int +# 94| 4: [BlockStmt] {...} +# 99| [DelegateType] My1Delegate #-----| 0: (Attributes) -# 96| 1: [DefaultAttribute] [My3(...)] -# 96| -1: [TypeMention] My3Attribute -# 96| 0: [IntLiteral] 1 +# 97| 1: [DefaultAttribute] [My3(...)] +# 97| -1: [TypeMention] My3Attribute +# 97| 0: [IntLiteral] 1 #-----| 2: (Parameters) -# 98| 0: [Parameter] message -# 98| -1: [TypeMention] string -# 102| [DelegateType] My2Delegate +# 99| 0: [Parameter] message +# 99| -1: [TypeMention] string +# 103| [DelegateType] My2Delegate #-----| 0: (Attributes) -# 101| 1: [DefaultAttribute] [My3(...)] -# 101| -1: [TypeMention] My3Attribute -# 101| 0: [IntLiteral] 4 +# 102| 1: [DefaultAttribute] [My3(...)] +# 102| -1: [TypeMention] My3Attribute +# 102| 0: [IntLiteral] 4 #-----| 2: (Parameters) -# 102| 0: [Parameter] message -# 102| -1: [TypeMention] string -# 104| [Class] MyAttributeUsage -# 108| 5: [AddOperator] + -# 108| -1: [TypeMention] int +# 103| 0: [Parameter] message +# 103| -1: [TypeMention] string +# 105| [Class] MyAttributeUsage +# 109| 5: [AddOperator] + +# 109| -1: [TypeMention] int #-----| 0: (Attributes) -# 106| 1: [DefaultAttribute] [My3(...)] -# 106| -1: [TypeMention] My3Attribute -# 106| 0: [IntLiteral] 5 -# 107| 2: [ReturnAttribute] [return: My3(...)] +# 107| 1: [DefaultAttribute] [My3(...)] # 107| -1: [TypeMention] My3Attribute -# 107| 0: [IntLiteral] 6 +# 107| 0: [IntLiteral] 5 +# 108| 2: [ReturnAttribute] [return: My3(...)] +# 108| -1: [TypeMention] My3Attribute +# 108| 0: [IntLiteral] 6 #-----| 2: (Parameters) -# 108| 0: [Parameter] a -# 108| -1: [TypeMention] MyAttributeUsage -# 108| 1: [Parameter] b -# 108| -1: [TypeMention] MyAttributeUsage -# 108| 4: [IntLiteral] 0 -# 110| 6: [Indexer] Item -# 110| -1: [TypeMention] int +# 109| 0: [Parameter] a +# 109| -1: [TypeMention] MyAttributeUsage +# 109| 1: [Parameter] b +# 109| -1: [TypeMention] MyAttributeUsage +# 109| 4: [IntLiteral] 0 +# 111| 6: [Indexer] Item +# 111| -1: [TypeMention] int #-----| 1: (Parameters) -# 110| 0: [Parameter] x -# 110| -1: [TypeMention] int -# 114| 3: [Getter] get_Item +# 111| 0: [Parameter] x +# 111| -1: [TypeMention] int +# 115| 3: [Getter] get_Item #-----| 0: (Attributes) -# 112| 1: [DefaultAttribute] [My3(...)] -# 112| -1: [TypeMention] My3Attribute -# 112| 0: [IntLiteral] 7 -# 113| 2: [ReturnAttribute] [return: My3(...)] +# 113| 1: [DefaultAttribute] [My3(...)] # 113| -1: [TypeMention] My3Attribute -# 113| 0: [IntLiteral] 8 +# 113| 0: [IntLiteral] 7 +# 114| 2: [ReturnAttribute] [return: My3(...)] +# 114| -1: [TypeMention] My3Attribute +# 114| 0: [IntLiteral] 8 #-----| 2: (Parameters) -# 110| 0: [Parameter] x -# 114| 4: [BlockStmt] {...} -# 114| 0: [ReturnStmt] return ...; -# 114| 0: [AddExpr] ... + ... -# 114| 0: [ParameterAccess] access to parameter x -# 114| 1: [IntLiteral] 1 -# 118| 4: [Setter] set_Item +# 111| 0: [Parameter] x +# 115| 4: [BlockStmt] {...} +# 115| 0: [ReturnStmt] return ...; +# 115| 0: [AddExpr] ... + ... +# 115| 0: [ParameterAccess] access to parameter x +# 115| 1: [IntLiteral] 1 +# 119| 4: [Setter] set_Item #-----| 0: (Attributes) -# 116| 1: [DefaultAttribute] [My3(...)] -# 116| -1: [TypeMention] My3Attribute -# 116| 0: [IntLiteral] 9 +# 117| 1: [DefaultAttribute] [My3(...)] +# 117| -1: [TypeMention] My3Attribute +# 117| 0: [IntLiteral] 9 #-----| 2: (Parameters) -# 110| 0: [Parameter] x -# 118| 1: [Parameter] value +# 111| 0: [Parameter] x +# 119| 1: [Parameter] value #-----| 0: (Attributes) -# 117| 1: [DefaultAttribute] [My3(...)] -# 117| -1: [TypeMention] My3Attribute -# 117| 0: [IntLiteral] 10 -# 118| 4: [BlockStmt] {...} -# 118| 0: [ReturnStmt] return ...; -# 121| 7: [Field] p -# 121| -1: [TypeMention] int -# 122| 8: [Property] Prop1 +# 118| 1: [DefaultAttribute] [My3(...)] +# 118| -1: [TypeMention] My3Attribute +# 118| 0: [IntLiteral] 10 +# 119| 4: [BlockStmt] {...} +# 119| 0: [ReturnStmt] return ...; +# 122| 7: [Field] p # 122| -1: [TypeMention] int -# 126| 3: [Getter] get_Prop1 +# 123| 8: [Property] Prop1 +# 123| -1: [TypeMention] int +# 127| 3: [Getter] get_Prop1 #-----| 0: (Attributes) -# 124| 1: [DefaultAttribute] [My3(...)] -# 124| -1: [TypeMention] My3Attribute -# 124| 0: [IntLiteral] 11 -# 125| 2: [ReturnAttribute] [return: My3(...)] +# 125| 1: [DefaultAttribute] [My3(...)] # 125| -1: [TypeMention] My3Attribute -# 125| 0: [IntLiteral] 12 -# 126| 4: [BlockStmt] {...} -# 126| 0: [ReturnStmt] return ...; -# 126| 0: [FieldAccess] access to field p -# 130| 4: [Setter] set_Prop1 +# 125| 0: [IntLiteral] 11 +# 126| 2: [ReturnAttribute] [return: My3(...)] +# 126| -1: [TypeMention] My3Attribute +# 126| 0: [IntLiteral] 12 +# 127| 4: [BlockStmt] {...} +# 127| 0: [ReturnStmt] return ...; +# 127| 0: [FieldAccess] access to field p +# 131| 4: [Setter] set_Prop1 #-----| 0: (Attributes) -# 128| 1: [DefaultAttribute] [My3(...)] -# 128| -1: [TypeMention] My3Attribute -# 128| 0: [IntLiteral] 13 +# 129| 1: [DefaultAttribute] [My3(...)] +# 129| -1: [TypeMention] My3Attribute +# 129| 0: [IntLiteral] 13 #-----| 2: (Parameters) -# 130| 0: [Parameter] value +# 131| 0: [Parameter] value #-----| 0: (Attributes) -# 129| 1: [DefaultAttribute] [My3(...)] -# 129| -1: [TypeMention] My3Attribute -# 129| 0: [IntLiteral] 14 -# 130| 4: [BlockStmt] {...} -# 130| 0: [ExprStmt] ...; -# 130| 0: [AssignExpr] ... = ... -# 130| 0: [FieldAccess] access to field p -# 130| 1: [ParameterAccess] access to parameter value -# 134| [Class] Class1 -# 136| 5: [Class] ParamsAttribute +# 130| 1: [DefaultAttribute] [My3(...)] +# 130| -1: [TypeMention] My3Attribute +# 130| 0: [IntLiteral] 14 +# 131| 4: [BlockStmt] {...} +# 131| 0: [ExprStmt] ...; +# 131| 0: [AssignExpr] ... = ... +# 131| 0: [FieldAccess] access to field p +# 131| 1: [ParameterAccess] access to parameter value +# 135| [Class] Class1 +# 137| 5: [Class] ParamsAttribute #-----| 3: (Base types) -# 136| 0: [TypeMention] Attribute -# 138| 4: [InstanceConstructor] ParamsAttribute +# 137| 0: [TypeMention] Attribute +# 139| 4: [InstanceConstructor] ParamsAttribute #-----| 2: (Parameters) -# 138| 0: [Parameter] s1 -# 138| -1: [TypeMention] string -# 138| 1: [Parameter] s2 -# 138| -1: [TypeMention] string -# 138| 2: [Parameter] args -# 138| -1: [TypeMention] Int32[] -# 138| 1: [TypeMention] int -# 138| 4: [BlockStmt] {...} -# 142| 6: [Method] M1 -# 142| -1: [TypeMention] Void +# 139| 0: [Parameter] s1 +# 139| -1: [TypeMention] string +# 139| 1: [Parameter] s2 +# 139| -1: [TypeMention] string +# 139| 2: [Parameter] args +# 139| -1: [TypeMention] Int32[] +# 139| 1: [TypeMention] int +# 139| 4: [BlockStmt] {...} +# 143| 6: [Method] M1 +# 143| -1: [TypeMention] Void #-----| 0: (Attributes) -# 141| 1: [DefaultAttribute] [Params(...)] -# 141| -1: [TypeMention] ParamsAttribute -# 141| 0: [StringLiteralUtf16] "a" -# 141| 1: [StringLiteralUtf16] "b" -# 141| 2: [IntLiteral] 1 -# 141| 3: [IntLiteral] 2 -# 141| 4: [IntLiteral] 3 -# 142| 4: [BlockStmt] {...} -# 145| 7: [Method] M2 -# 145| -1: [TypeMention] Void +# 142| 1: [DefaultAttribute] [Params(...)] +# 142| -1: [TypeMention] ParamsAttribute +# 142| 0: [StringLiteralUtf16] "a" +# 142| 1: [StringLiteralUtf16] "b" +# 142| 2: [IntLiteral] 1 +# 142| 3: [IntLiteral] 2 +# 142| 4: [IntLiteral] 3 +# 143| 4: [BlockStmt] {...} +# 146| 7: [Method] M2 +# 146| -1: [TypeMention] Void #-----| 0: (Attributes) -# 144| 1: [DefaultAttribute] [Params(...)] -# 144| -1: [TypeMention] ParamsAttribute -# 144| 0: [StringLiteralUtf16] "a" -# 144| 1: [StringLiteralUtf16] "b" -# 144| 2: [IntLiteral] 1 -# 144| 3: [IntLiteral] 2 -# 144| 4: [IntLiteral] 3 -# 145| 4: [BlockStmt] {...} -# 148| 8: [Method] M3 -# 148| -1: [TypeMention] Void +# 145| 1: [DefaultAttribute] [Params(...)] +# 145| -1: [TypeMention] ParamsAttribute +# 145| 0: [StringLiteralUtf16] "a" +# 145| 1: [StringLiteralUtf16] "b" +# 145| 2: [IntLiteral] 1 +# 145| 3: [IntLiteral] 2 +# 145| 4: [IntLiteral] 3 +# 146| 4: [BlockStmt] {...} +# 149| 8: [Method] M3 +# 149| -1: [TypeMention] Void #-----| 0: (Attributes) -# 147| 1: [DefaultAttribute] [Params(...)] -# 147| -1: [TypeMention] ParamsAttribute -# 147| 0: [StringLiteralUtf16] "a" -# 147| 1: [StringLiteralUtf16] "b" -# 147| 2: [IntLiteral] 1 -# 148| 4: [BlockStmt] {...} -# 151| 9: [Method] M4 -# 151| -1: [TypeMention] Void +# 148| 1: [DefaultAttribute] [Params(...)] +# 148| -1: [TypeMention] ParamsAttribute +# 148| 0: [StringLiteralUtf16] "a" +# 148| 1: [StringLiteralUtf16] "b" +# 148| 2: [IntLiteral] 1 +# 149| 4: [BlockStmt] {...} +# 152| 9: [Method] M4 +# 152| -1: [TypeMention] Void #-----| 0: (Attributes) -# 150| 1: [DefaultAttribute] [Params(...)] -# 150| -1: [TypeMention] ParamsAttribute -# 150| 0: [StringLiteralUtf16] "a" -# 150| 1: [StringLiteralUtf16] "b" -# 150| 2: [ArrayCreation] array creation of type Int32[] -# 150| -1: [ArrayInitializer] { ..., ... } -# 150| 0: [IntLiteral] 1 -# 151| 4: [BlockStmt] {...} +# 151| 1: [DefaultAttribute] [Params(...)] +# 151| -1: [TypeMention] ParamsAttribute +# 151| 0: [StringLiteralUtf16] "a" +# 151| 1: [StringLiteralUtf16] "b" +# 151| 2: [ArrayCreation] array creation of type Int32[] +# 151| -1: [ArrayInitializer] { ..., ... } +# 151| 0: [IntLiteral] 1 +# 152| 4: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/attributes/attributes.cs b/csharp/ql/test/library-tests/attributes/attributes.cs index 3f1018c9416..74677fbc70a 100644 --- a/csharp/ql/test/library-tests/attributes/attributes.cs +++ b/csharp/ql/test/library-tests/attributes/attributes.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -149,4 +150,5 @@ class Class1 [Params(args: new[] { 1 }, s2: "b", s1: "a")] public void M4() { } -} \ No newline at end of file +} + From e5e0b4c537fa18c1f3d1f5e30e47539a881f7e30 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 26 Feb 2024 13:15:55 +0100 Subject: [PATCH 163/207] C#: Add some examples of uses of the Experimental attribute and update the expected test output. --- .../attributes/AttributeArguments.expected | 4 ++++ .../attributes/AttributeElements.expected | 2 ++ .../test/library-tests/attributes/PrintAst.expected | 12 ++++++++++++ .../ql/test/library-tests/attributes/attributes.cs | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/csharp/ql/test/library-tests/attributes/AttributeArguments.expected b/csharp/ql/test/library-tests/attributes/AttributeArguments.expected index ccd7e81d933..03e32644c07 100644 --- a/csharp/ql/test/library-tests/attributes/AttributeArguments.expected +++ b/csharp/ql/test/library-tests/attributes/AttributeArguments.expected @@ -106,6 +106,8 @@ arguments | attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:45:151:47 | "a" | | attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:36:151:38 | "b" | | attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:29 | array creation of type Int32[] | +| attributes.cs:155:2:155:13 | [Experimental(...)] | 0 | attributes.cs:155:15:155:35 | "MyExperimentalClass" | +| attributes.cs:158:6:158:17 | [Experimental(...)] | 0 | attributes.cs:158:19:158:40 | "MyExperimentalMethod" | constructorArguments | Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 1 | | Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 3 | @@ -202,6 +204,8 @@ constructorArguments | attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:45:151:47 | "a" | | attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:36:151:38 | "b" | | attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:29 | array creation of type Int32[] | +| attributes.cs:155:2:155:13 | [Experimental(...)] | 0 | attributes.cs:155:15:155:35 | "MyExperimentalClass" | +| attributes.cs:158:6:158:17 | [Experimental(...)] | 0 | attributes.cs:158:19:158:40 | "MyExperimentalMethod" | namedArguments | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | diff --git a/csharp/ql/test/library-tests/attributes/AttributeElements.expected b/csharp/ql/test/library-tests/attributes/AttributeElements.expected index 51110ec1a8f..358877e20cf 100644 --- a/csharp/ql/test/library-tests/attributes/AttributeElements.expected +++ b/csharp/ql/test/library-tests/attributes/AttributeElements.expected @@ -36,6 +36,8 @@ | attributes.cs:146:17:146:18 | M2 | attributes.cs:145:6:145:11 | [Params(...)] | Class1+ParamsAttribute | | attributes.cs:149:17:149:18 | M3 | attributes.cs:148:6:148:11 | [Params(...)] | Class1+ParamsAttribute | | attributes.cs:152:17:152:18 | M4 | attributes.cs:151:6:151:11 | [Params(...)] | Class1+ParamsAttribute | +| attributes.cs:156:14:156:32 | MyExperimentalClass | attributes.cs:155:2:155:13 | [Experimental(...)] | System.Diagnostics.CodeAnalysis.ExperimentalAttribute | +| attributes.cs:159:17:159:36 | MyExperimentalMethod | attributes.cs:158:6:158:17 | [Experimental(...)] | System.Diagnostics.CodeAnalysis.ExperimentalAttribute | | attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | System.Reflection.AssemblyTitleAttribute | | attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | System.Reflection.AssemblyDescriptionAttribute | | attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | System.Reflection.AssemblyConfigurationAttribute | diff --git a/csharp/ql/test/library-tests/attributes/PrintAst.expected b/csharp/ql/test/library-tests/attributes/PrintAst.expected index 2ac02c93a3a..cb085a16d85 100644 --- a/csharp/ql/test/library-tests/attributes/PrintAst.expected +++ b/csharp/ql/test/library-tests/attributes/PrintAst.expected @@ -461,3 +461,15 @@ attributes.cs: # 151| -1: [ArrayInitializer] { ..., ... } # 151| 0: [IntLiteral] 1 # 152| 4: [BlockStmt] {...} +# 156| [Class] MyExperimentalClass +#-----| 0: (Attributes) +# 155| 1: [DefaultAttribute] [Experimental(...)] +# 155| -1: [TypeMention] ExperimentalAttribute +# 155| 0: [StringLiteralUtf16] "MyExperimentalClass" +# 159| 5: [Method] MyExperimentalMethod +# 159| -1: [TypeMention] Void +#-----| 0: (Attributes) +# 158| 1: [DefaultAttribute] [Experimental(...)] +# 158| -1: [TypeMention] ExperimentalAttribute +# 158| 0: [StringLiteralUtf16] "MyExperimentalMethod" +# 159| 4: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/attributes/attributes.cs b/csharp/ql/test/library-tests/attributes/attributes.cs index 74677fbc70a..26adfded71e 100644 --- a/csharp/ql/test/library-tests/attributes/attributes.cs +++ b/csharp/ql/test/library-tests/attributes/attributes.cs @@ -152,3 +152,9 @@ class Class1 public void M4() { } } +[Experimental("MyExperimentalClass")] +public class MyExperimentalClass +{ + [Experimental("MyExperimentalMethod")] + public void MyExperimentalMethod() { } +} From 8a670fe9a2972bd4648c0e9914c60d61cb792ab9 Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Mon, 26 Feb 2024 12:26:04 +0000 Subject: [PATCH 164/207] Ruby: formatting --- ruby/ql/src/experimental/cwe-502/Yaml.qll | 1 - 1 file changed, 1 deletion(-) diff --git a/ruby/ql/src/experimental/cwe-502/Yaml.qll b/ruby/ql/src/experimental/cwe-502/Yaml.qll index 85f1889d243..3751faba312 100644 --- a/ruby/ql/src/experimental/cwe-502/Yaml.qll +++ b/ruby/ql/src/experimental/cwe-502/Yaml.qll @@ -6,7 +6,6 @@ private import codeql.ruby.dataflow.FlowSteps private import codeql.ruby.DataFlow private import codeql.ruby.ApiGraphs - /** * Gets A Node ends with YAML parse, parse_stream, parse_file methods */ From 20bb6314566bf1e3e2855a577bf61a0b9e334726 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 26 Feb 2024 13:45:19 +0100 Subject: [PATCH 165/207] Dataflow: Prevent bad join. --- shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index 25a276d41a7..f3e840720ab 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -1081,8 +1081,8 @@ module Make Input> { SummaryComponentStack outputContents | summary(c, inputContents, outputContents, preservesValue) and - pred = summaryNodeInputState(c, inputContents) and - succ = summaryNodeOutputState(c, outputContents) + pred = summaryNodeInputState(pragma[only_bind_into](c), inputContents) and + succ = summaryNodeOutputState(pragma[only_bind_into](c), outputContents) | preservesValue = true or From dd0c721e8cef09c3b0fa72d81f02465556bd035a Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 26 Feb 2024 13:48:19 +0100 Subject: [PATCH 166/207] C#: Add change note --- csharp/ql/lib/change-notes/2024-02-21-getonly-properties.md | 2 +- csharp/ql/lib/change-notes/2024-02-22-no-db-stats.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 csharp/ql/lib/change-notes/2024-02-22-no-db-stats.md diff --git a/csharp/ql/lib/change-notes/2024-02-21-getonly-properties.md b/csharp/ql/lib/change-notes/2024-02-21-getonly-properties.md index 3e8940a44e6..6bb8e99c71e 100644 --- a/csharp/ql/lib/change-notes/2024-02-21-getonly-properties.md +++ b/csharp/ql/lib/change-notes/2024-02-21-getonly-properties.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* C#: Data flow via get only properties like `public object Obj { get; }` is now captured by the data flow library. +* Data flow via get only properties like `public object Obj { get; }` is now captured by the data flow library. diff --git a/csharp/ql/lib/change-notes/2024-02-22-no-db-stats.md b/csharp/ql/lib/change-notes/2024-02-22-no-db-stats.md new file mode 100644 index 00000000000..d6ffbd523ac --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-02-22-no-db-stats.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* We no longer make use of CodeQL database stats, which may affect join-orders in custom queries. It is therefore recommended to test performance of custom queries after upgrading to this version. From bf4e3a7d1cedc12d46df0b2ee694f0f31a806f6d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 15:31:07 +0100 Subject: [PATCH 167/207] C#: Merge expr_compiler_generated and compiler_generated and add compiler generated statements. --- .../Semmle.Extraction.CSharp/Entities/Expression.cs | 2 +- .../Semmle.Extraction.CSharp/Entities/Statement`1.cs | 7 +++++++ csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs | 3 --- csharp/ql/lib/semmle/code/csharp/Stmt.qll | 3 +++ csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll | 2 +- csharp/ql/lib/semmlecode.csharp.dbscheme | 9 ++++----- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs index 04cce8a5c79..58b01891add 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs @@ -54,7 +54,7 @@ namespace Semmle.Extraction.CSharp.Entities } if (info.IsCompilerGenerated) - trapFile.expr_compiler_generated(this); + trapFile.compiler_generated(this); if (info.ExprValue is string value) trapFile.expr_value(this, value); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs index d58698ff2eb..0d7bdd31354 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Statement`1.cs @@ -9,12 +9,14 @@ namespace Semmle.Extraction.CSharp.Entities { protected readonly TSyntax Stmt; private readonly Location location; + private readonly bool isCompilerGenerated; protected Statement(Context cx, TSyntax stmt, Kinds.StmtKind kind, IStatementParentEntity parent, int child, Location location, bool isCompilerGenerated = false) : base(cx, kind, parent, child) { Stmt = stmt; this.location = location; + this.isCompilerGenerated = isCompilerGenerated; if (!isCompilerGenerated) { cx.BindComments(this, location.Symbol); @@ -29,6 +31,11 @@ namespace Semmle.Extraction.CSharp.Entities base.Populate(trapFile); trapFile.stmt_location(this, location); + + if (isCompilerGenerated) + { + trapFile.compiler_generated(this); + } } public override Microsoft.CodeAnalysis.Location ReportingLocation => Stmt.GetLocation(); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs b/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs index 6f61119eb77..71ed85cb201 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs @@ -164,9 +164,6 @@ namespace Semmle.Extraction.CSharp internal static void expr_call(this TextWriter trapFile, Expression expr, Method target) => trapFile.WriteTuple("expr_call", expr, target); - internal static void expr_compiler_generated(this TextWriter trapFile, Expression expr) => - trapFile.WriteTuple("expr_compiler_generated", expr); - internal static void expr_flowstate(this TextWriter trapFile, Expression expr, int flowState) => trapFile.WriteTuple("expr_flowstate", expr, flowState); diff --git a/csharp/ql/lib/semmle/code/csharp/Stmt.qll b/csharp/ql/lib/semmle/code/csharp/Stmt.qll index a37255ab7eb..a7bbfb93861 100644 --- a/csharp/ql/lib/semmle/code/csharp/Stmt.qll +++ b/csharp/ql/lib/semmle/code/csharp/Stmt.qll @@ -43,6 +43,9 @@ class Stmt extends ControlFlowElement, @stmt { * For example converts `{ { return x; } }` to `return x;`. */ Stmt stripSingletonBlocks() { result = this } + + /** Holds if this statement is compiler generated. */ + predicate isCompilerGenerated() { compiler_generated(this) } } /** diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll index 77334e709f3..98e5b6f340a 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll @@ -65,7 +65,7 @@ class Expr extends DotNet::Expr, ControlFlowElement, @expr { * Holds if this expression is generated by the compiler and does not appear * explicitly in the source code. */ - predicate isImplicit() { expr_compiler_generated(this) } + predicate isImplicit() { compiler_generated(this) } /** * Gets an expression that is the result of stripping (recursively) all diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme index c9ee11bd1ee..21ede72308c 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme @@ -682,8 +682,6 @@ has_modifiers( int id: @modifiable_direct ref, int mod_id: @modifier ref); -compiler_generated(unique int id: @modifiable ref); - /** MEMBERS **/ @member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; @@ -1271,9 +1269,6 @@ 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); @@ -1316,6 +1311,10 @@ lambda_expr_return_type( unique int id: @lambda_expr ref, int type_id: @type_or_ref ref); +/* Compiler generated */ + +compiler_generated(unique int id: @element ref); + /** CONTROL/DATA FLOW **/ @control_flow_element = @stmt | @expr; From e6f4263eff851ee9ca581e127b1b24a8ded82bd7 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 15:56:58 +0100 Subject: [PATCH 168/207] C#: Do not print compiler generated statements. --- csharp/ql/lib/semmle/code/csharp/PrintAst.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/PrintAst.qll b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll index ca4b37eb51b..eb5ca6b4727 100644 --- a/csharp/ql/lib/semmle/code/csharp/PrintAst.qll +++ b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll @@ -27,7 +27,8 @@ class PrintAstConfiguration extends TPrintAstConfiguration { } private predicate shouldPrint(Element e, Location l) { - exists(PrintAstConfiguration config | config.shouldPrint(e, l)) + exists(PrintAstConfiguration config | config.shouldPrint(e, l)) and + not e.(Stmt).isCompilerGenerated() } private predicate isImplicitExpression(ControlFlowElement element) { From ff32cf90fde414e629b84cd58081583f12028dc2 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 16:11:13 +0100 Subject: [PATCH 169/207] C#: Add a test for compiler generated statements. --- .../test/library-tests/statements/CompilerGenerated.expected | 3 +++ csharp/ql/test/library-tests/statements/CompilerGenerated.ql | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 csharp/ql/test/library-tests/statements/CompilerGenerated.expected create mode 100644 csharp/ql/test/library-tests/statements/CompilerGenerated.ql diff --git a/csharp/ql/test/library-tests/statements/CompilerGenerated.expected b/csharp/ql/test/library-tests/statements/CompilerGenerated.expected new file mode 100644 index 00000000000..26ad2f9db10 --- /dev/null +++ b/csharp/ql/test/library-tests/statements/CompilerGenerated.expected @@ -0,0 +1,3 @@ +| fixed.cs:3:7:3:11 | {...} | fixed.cs:3:7:3:11 | Fixed | +| statements.cs:7:11:7:15 | {...} | statements.cs:7:11:7:15 | Class | +| statements.cs:243:15:243:25 | {...} | statements.cs:243:15:243:25 | AccountLock | diff --git a/csharp/ql/test/library-tests/statements/CompilerGenerated.ql b/csharp/ql/test/library-tests/statements/CompilerGenerated.ql new file mode 100644 index 00000000000..259e0ed84e8 --- /dev/null +++ b/csharp/ql/test/library-tests/statements/CompilerGenerated.ql @@ -0,0 +1,5 @@ +import csharp + +from Stmt stmt +where stmt.isCompilerGenerated() +select stmt, stmt.getEnclosingCallable() From 80513d846dcad603a7364aba288189e07ceb447d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 18:18:18 +0100 Subject: [PATCH 170/207] C#: Update PrintAst test expected outputs. --- .../ql/test/library-tests/constructors/PrintAst.expected | 2 -- csharp/ql/test/library-tests/csharp9/PrintAst.expected | 7 ------- .../test/library-tests/dataflow/tuples/PrintAst.expected | 1 - csharp/ql/test/library-tests/expressions/PrintAst.expected | 2 -- 4 files changed, 12 deletions(-) diff --git a/csharp/ql/test/library-tests/constructors/PrintAst.expected b/csharp/ql/test/library-tests/constructors/PrintAst.expected index c917d5c7fa1..fc5c19ac2df 100644 --- a/csharp/ql/test/library-tests/constructors/PrintAst.expected +++ b/csharp/ql/test/library-tests/constructors/PrintAst.expected @@ -25,7 +25,6 @@ constructors.cs: # 23| -1: [TypeMention] object # 23| 1: [Parameter] s # 23| -1: [TypeMention] string -# 23| 4: [BlockStmt] {...} # 25| 5: [InstanceConstructor] C1 #-----| 2: (Parameters) # 25| 0: [Parameter] o @@ -48,4 +47,3 @@ constructors.cs: # 28| 3: [ConstructorInitializer] call to constructor C1 # 28| 0: [ParameterAccess] access to parameter o # 28| 1: [ParameterAccess] access to parameter s -# 28| 4: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/csharp9/PrintAst.expected b/csharp/ql/test/library-tests/csharp9/PrintAst.expected index a46ffa3257b..eacbfd8fd45 100644 --- a/csharp/ql/test/library-tests/csharp9/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp9/PrintAst.expected @@ -884,7 +884,6 @@ Record.cs: # 27| -1: [TypeMention] string # 27| 1: [Parameter] LastName # 27| -1: [TypeMention] string -# 27| 4: [BlockStmt] {...} # 27| 16: [Property] FirstName # 27| 3: [Getter] get_FirstName # 27| 4: [Setter] set_FirstName @@ -917,7 +916,6 @@ Record.cs: # 30| 3: [ConstructorInitializer] call to constructor Person1 # 30| 0: [ParameterAccess] access to parameter FirstName # 30| 1: [ParameterAccess] access to parameter LastName -# 29| 4: [BlockStmt] {...} # 29| 17: [Property] Subject # 29| 3: [Getter] get_Subject # 29| 4: [Setter] set_Subject @@ -945,7 +943,6 @@ Record.cs: # 33| 3: [ConstructorInitializer] call to constructor Person1 # 33| 0: [ParameterAccess] access to parameter FirstName # 33| 1: [ParameterAccess] access to parameter LastName -# 32| 4: [BlockStmt] {...} # 32| 17: [Property] Level # 32| 3: [Getter] get_Level # 32| 4: [Setter] set_Level @@ -966,7 +963,6 @@ Record.cs: #-----| 2: (Parameters) # 35| 0: [Parameter] Name # 35| -1: [TypeMention] string -# 35| 4: [BlockStmt] {...} # 35| 16: [Property] Name # 35| 3: [Getter] get_Name # 35| 4: [Setter] set_Name @@ -993,7 +989,6 @@ Record.cs: # 41| -1: [TypeMention] string # 41| 3: [ConstructorInitializer] call to constructor Pet # 41| 0: [ParameterAccess] access to parameter Name -# 41| 4: [BlockStmt] {...} # 41| 15: [Property] EqualityContract # 41| 3: [Getter] get_EqualityContract # 43| 16: [Method] WagTail @@ -1035,7 +1030,6 @@ Record.cs: #-----| 2: (Parameters) # 54| 0: [Parameter] A # 54| -1: [TypeMention] string -# 54| 4: [BlockStmt] {...} # 54| 16: [Property] A # 54| 3: [Getter] get_A # 54| 4: [Setter] set_A @@ -1060,7 +1054,6 @@ Record.cs: # 56| -1: [TypeMention] string # 56| 3: [ConstructorInitializer] call to constructor R1 # 56| 0: [ParameterAccess] access to parameter A -# 56| 4: [BlockStmt] {...} # 56| 17: [Property] B # 56| 3: [Getter] get_B # 56| 4: [Setter] set_B diff --git a/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected b/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected index 97fb24fb239..7cbddb9d3d5 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected @@ -369,7 +369,6 @@ Tuples.cs: # 95| -1: [TypeMention] string # 95| 1: [Parameter] j # 95| -1: [TypeMention] int -# 95| 4: [BlockStmt] {...} # 95| 16: [Property] i # 95| 3: [Getter] get_i # 95| 4: [Setter] set_i diff --git a/csharp/ql/test/library-tests/expressions/PrintAst.expected b/csharp/ql/test/library-tests/expressions/PrintAst.expected index d6e677602e3..e865a36d549 100644 --- a/csharp/ql/test/library-tests/expressions/PrintAst.expected +++ b/csharp/ql/test/library-tests/expressions/PrintAst.expected @@ -2411,7 +2411,6 @@ expressions.cs: #-----| 2: (Parameters) # 518| 0: [Parameter] oc1 # 518| -1: [TypeMention] object -# 518| 4: [BlockStmt] {...} # 520| 23: [Class] ClassC2 #-----| 3: (Base types) # 520| 0: [TypeMention] ClassC1 @@ -2421,4 +2420,3 @@ expressions.cs: # 520| -1: [TypeMention] object # 520| 3: [ConstructorInitializer] call to constructor ClassC1 # 520| 0: [ParameterAccess] access to parameter oc2 -# 520| 4: [BlockStmt] {...} From 4dd368f7a65409a72eca889d27ce8ccce279761f Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 22 Feb 2024 18:40:41 +0100 Subject: [PATCH 171/207] C#: Add upgrade script. --- .../compiler_generated.ql | 7 + .../old.dbscheme | 2100 +++++++++++++++++ .../semmlecode.csharp.dbscheme | 2099 ++++++++++++++++ .../upgrade.properties | 4 + 4 files changed, 4210 insertions(+) create mode 100644 csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/compiler_generated.ql create mode 100644 csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/old.dbscheme create mode 100644 csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/semmlecode.csharp.dbscheme create mode 100644 csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/upgrade.properties diff --git a/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/compiler_generated.ql b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/compiler_generated.ql new file mode 100644 index 00000000000..d732cac6730 --- /dev/null +++ b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/compiler_generated.ql @@ -0,0 +1,7 @@ +class Element extends @element { + Element() { expr_compiler_generated(this) or compiler_generated(this) } + + string toString() { none() } +} + +select any(Element e) diff --git a/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/old.dbscheme b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/old.dbscheme new file mode 100644 index 00000000000..c9ee11bd1ee --- /dev/null +++ b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/old.dbscheme @@ -0,0 +1,2100 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 | f1.cs + * 3 | f2.cs + * 4 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 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 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 +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @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; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** 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); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: 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_global( + unique int id: @using_directive ref +); + +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, 3: span */ + +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_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int 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 +| 34 = @inline_array_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 | @void_type | @inline_array_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 kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +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 ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event | @operator; + +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); + +@has_scoped_annotation = @local_scope_variable + +scoped_annotation( + int id: @has_scoped_annotation ref, + int kind: int ref // scoped ref = 1, scoped value = 2 + ); + +/** 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 = @utf16_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 +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_expr +| 135 = @utf8_string_literal_expr +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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; +@string_literal_expr = @utf16_string_literal_expr | @utf8_string_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 | @assign_urshift_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 | @urshift_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); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref 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_field | @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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/semmlecode.csharp.dbscheme b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..21ede72308c --- /dev/null +++ b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/semmlecode.csharp.dbscheme @@ -0,0 +1,2099 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 | f1.cs + * 3 | f2.cs + * 4 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 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 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 +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @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; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** 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); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: 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_global( + unique int id: @using_directive ref +); + +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, 3: span */ + +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_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int 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 +| 34 = @inline_array_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 | @void_type | @inline_array_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 kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +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); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event | @operator; + +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); + +@has_scoped_annotation = @local_scope_variable + +scoped_annotation( + int id: @has_scoped_annotation ref, + int kind: int ref // scoped ref = 1, scoped value = 2 + ); + +/** 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 = @utf16_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 +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_expr +| 135 = @utf8_string_literal_expr +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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; +@string_literal_expr = @utf16_string_literal_expr | @utf8_string_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 | @assign_urshift_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 | @urshift_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_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); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/* Compiler generated */ + +compiler_generated(unique int id: @element 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_field | @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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/upgrade.properties b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/upgrade.properties new file mode 100644 index 00000000000..1efc867850c --- /dev/null +++ b/csharp/ql/lib/upgrades/c9ee11bd1ee96e925a35cedff000be924634447f/upgrade.properties @@ -0,0 +1,4 @@ +description: Merge `expr_compiler_generated` into `compiler_generated` and add support for compiler generated statements. +compatibility: backwards +compiler_generated.rel: run compiler_generated.qlo +expr_compiler_generated.rel: delete From f9934ed5e72e2827841d663722472059e3ecf062 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 23 Feb 2024 10:44:44 +0100 Subject: [PATCH 172/207] C#: Add downgrade script. --- .../compiler_generated.ql | 7 + .../expr_compiler_generated.ql | 7 + .../old.dbscheme | 2099 ++++++++++++++++ .../semmlecode.csharp.dbscheme | 2100 +++++++++++++++++ .../upgrade.properties | 4 + 5 files changed, 4217 insertions(+) create mode 100644 csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/compiler_generated.ql create mode 100644 csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/expr_compiler_generated.ql create mode 100644 csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme create mode 100644 csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme create mode 100644 csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/compiler_generated.ql b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/compiler_generated.ql new file mode 100644 index 00000000000..7d51351f1dd --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/compiler_generated.ql @@ -0,0 +1,7 @@ +class Modifiable extends @modifiable { + Modifiable() { compiler_generated(this) } + + string toString() { none() } +} + +select any(Modifiable m) diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/expr_compiler_generated.ql b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/expr_compiler_generated.ql new file mode 100644 index 00000000000..16051ecb5f6 --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/expr_compiler_generated.ql @@ -0,0 +1,7 @@ +class Expression extends @expr { + Expression() { compiler_generated(this) } + + string toString() { none() } +} + +select any(Expression e) diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme new file mode 100644 index 00000000000..21ede72308c --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/old.dbscheme @@ -0,0 +1,2099 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 | f1.cs + * 3 | f2.cs + * 4 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 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 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 +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @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; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** 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); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: 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_global( + unique int id: @using_directive ref +); + +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, 3: span */ + +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_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int 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 +| 34 = @inline_array_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 | @void_type | @inline_array_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 kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +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); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event | @operator; + +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); + +@has_scoped_annotation = @local_scope_variable + +scoped_annotation( + int id: @has_scoped_annotation ref, + int kind: int ref // scoped ref = 1, scoped value = 2 + ); + +/** 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 = @utf16_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 +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_expr +| 135 = @utf8_string_literal_expr +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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; +@string_literal_expr = @utf16_string_literal_expr | @utf8_string_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 | @assign_urshift_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 | @urshift_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_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); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/* Compiler generated */ + +compiler_generated(unique int id: @element 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_field | @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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..c9ee11bd1ee --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/semmlecode.csharp.dbscheme @@ -0,0 +1,2100 @@ +/* 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 +); + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: 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 | f1.cs + * 3 | f2.cs + * 4 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@someFile.rsp` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_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 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 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 +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @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; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** 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); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: 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_global( + unique int id: @using_directive ref +); + +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, 3: span */ + +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_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int 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 +| 34 = @inline_array_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 | @void_type | @inline_array_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 kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +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 ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event | @operator; + +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); + +@has_scoped_annotation = @local_scope_variable + +scoped_annotation( + int id: @has_scoped_annotation ref, + int kind: int ref // scoped ref = 1, scoped value = 2 + ); + +/** 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 = @utf16_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 +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_expr +| 135 = @utf8_string_literal_expr +/* C# 12.0 */ +| 136 = @collection_expr +| 137 = @spread_element_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; +@string_literal_expr = @utf16_string_literal_expr | @utf8_string_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 | @assign_urshift_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 | @urshift_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); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref 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_field | @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; + +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties new file mode 100644 index 00000000000..2cf7c647937 --- /dev/null +++ b/csharp/downgrades/21ede72308c41493f19b37720d8259d5eb307f12/upgrade.properties @@ -0,0 +1,4 @@ +description: Split `compiler_generated` into `expr_compiler_generated` and `compiler_generated`. +compatibility: backwards +compiler_generated.rel: run compiler_generated.qlo +expr_compiler_generated.rel: run expr_compiler_generated.qlo From cba247788aa96b507dd3dfff1f3fd933e91b1337 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 23 Feb 2024 12:51:24 +0100 Subject: [PATCH 173/207] C#: Add change note. --- csharp/ql/lib/change-notes/2024-02-23-compiler-generated.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2024-02-23-compiler-generated.md diff --git a/csharp/ql/lib/change-notes/2024-02-23-compiler-generated.md b/csharp/ql/lib/change-notes/2024-02-23-compiler-generated.md new file mode 100644 index 00000000000..9b1739b9b6d --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-02-23-compiler-generated.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C#: The table `expr_compiler_generated` has been deleted and its content has been added to `compiler_generated`. From b86643fab2dcb382b932fc697aac15cef69514ff Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Mon, 26 Feb 2024 12:57:21 +0000 Subject: [PATCH 174/207] Ruby: doc fixes --- .../src/experimental/cwe-502/UnsafeYamlDeserialization.qll | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll index cf3b129714f..6a4c06689ac 100644 --- a/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll +++ b/ruby/ql/src/experimental/cwe-502/UnsafeYamlDeserialization.qll @@ -29,10 +29,12 @@ private module UnsafeYamlDeserializationConfig implements DataFlow::StateConfigS predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } /** - * A taint step related to the result of `YAML.parse` calls, or similar. + * Holds if taint with state `stateFrom` can flow from `pred` to `succ` with state `stateTo`. + * + * This is a taint step related to the result of `YAML.parse` calls, or similar. * In the following example, this step will propagate taint from * `source` to `sink`: - * this contains two seperate steps: + * this contains two separate steps: * ```rb * x = source * sink = YAML.parse(x) From 8212f5de1bd7b3a4f0d0afc834e5d9560b8dce35 Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Mon, 26 Feb 2024 13:10:27 +0000 Subject: [PATCH 175/207] Ruby: Update test --- .../UnsafeYamlDeserialization.expected | 123 ++++++++---------- 1 file changed, 52 insertions(+), 71 deletions(-) diff --git a/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected index b79057a8479..c0bf81ce21a 100644 --- a/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected +++ b/ruby/ql/test/query-tests/experimental/cwe-502/UnsafeYamlDeserialization.expected @@ -1,75 +1,56 @@ edges -| unicode_normalization.rb:7:5:7:17 | unicode_input | unicode_normalization.rb:8:23:8:35 | unicode_input | -| unicode_normalization.rb:7:5:7:17 | unicode_input | unicode_normalization.rb:9:22:9:34 | unicode_input | -| unicode_normalization.rb:7:21:7:26 | call to params | unicode_normalization.rb:7:21:7:42 | ...[...] | -| unicode_normalization.rb:7:21:7:42 | ...[...] | unicode_normalization.rb:7:5:7:17 | unicode_input | -| unicode_normalization.rb:15:5:15:17 | unicode_input | unicode_normalization.rb:16:27:16:39 | unicode_input | -| unicode_normalization.rb:15:5:15:17 | unicode_input | unicode_normalization.rb:16:27:16:39 | unicode_input | -| unicode_normalization.rb:15:21:15:26 | call to params | unicode_normalization.rb:15:21:15:42 | ...[...] | -| unicode_normalization.rb:15:21:15:26 | call to params | unicode_normalization.rb:15:21:15:42 | ...[...] | -| unicode_normalization.rb:15:21:15:42 | ...[...] | unicode_normalization.rb:15:5:15:17 | unicode_input | -| unicode_normalization.rb:15:21:15:42 | ...[...] | unicode_normalization.rb:15:5:15:17 | unicode_input | -| unicode_normalization.rb:16:5:16:23 | unicode_input_manip | unicode_normalization.rb:17:23:17:41 | unicode_input_manip | -| unicode_normalization.rb:16:5:16:23 | unicode_input_manip | unicode_normalization.rb:18:22:18:40 | unicode_input_manip | -| unicode_normalization.rb:16:27:16:39 | unicode_input | unicode_normalization.rb:16:27:16:59 | call to sub | -| unicode_normalization.rb:16:27:16:39 | unicode_input | unicode_normalization.rb:16:27:16:59 | call to sub | -| unicode_normalization.rb:16:27:16:59 | call to sub | unicode_normalization.rb:16:5:16:23 | unicode_input_manip | -| unicode_normalization.rb:24:5:24:17 | unicode_input | unicode_normalization.rb:25:37:25:49 | unicode_input | -| unicode_normalization.rb:24:21:24:26 | call to params | unicode_normalization.rb:24:21:24:42 | ...[...] | -| unicode_normalization.rb:24:21:24:42 | ...[...] | unicode_normalization.rb:24:5:24:17 | unicode_input | -| unicode_normalization.rb:25:5:25:21 | unicode_html_safe | unicode_normalization.rb:26:23:26:39 | unicode_html_safe | -| unicode_normalization.rb:25:5:25:21 | unicode_html_safe | unicode_normalization.rb:27:22:27:38 | unicode_html_safe | -| unicode_normalization.rb:25:25:25:50 | call to html_escape | unicode_normalization.rb:25:5:25:21 | unicode_html_safe | -| unicode_normalization.rb:25:37:25:49 | unicode_input | unicode_normalization.rb:25:25:25:50 | call to html_escape | -| unicode_normalization.rb:33:5:33:17 | unicode_input | unicode_normalization.rb:34:40:34:52 | unicode_input | -| unicode_normalization.rb:33:21:33:26 | call to params | unicode_normalization.rb:33:21:33:42 | ...[...] | -| unicode_normalization.rb:33:21:33:42 | ...[...] | unicode_normalization.rb:33:5:33:17 | unicode_input | -| unicode_normalization.rb:34:5:34:21 | unicode_html_safe | unicode_normalization.rb:35:23:35:39 | unicode_html_safe | -| unicode_normalization.rb:34:5:34:21 | unicode_html_safe | unicode_normalization.rb:36:22:36:38 | unicode_html_safe | -| unicode_normalization.rb:34:25:34:53 | call to escapeHTML | unicode_normalization.rb:34:25:34:63 | call to html_safe | -| unicode_normalization.rb:34:25:34:63 | call to html_safe | unicode_normalization.rb:34:5:34:21 | unicode_html_safe | -| unicode_normalization.rb:34:40:34:52 | unicode_input | unicode_normalization.rb:34:25:34:53 | call to escapeHTML | +| UnsafeYamlDeserialization.rb:10:5:10:13 | yaml_data | UnsafeYamlDeserialization.rb:11:25:11:33 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:10:17:10:22 | call to params | UnsafeYamlDeserialization.rb:10:17:10:28 | ...[...] | provenance | | +| UnsafeYamlDeserialization.rb:10:17:10:28 | ...[...] | UnsafeYamlDeserialization.rb:10:5:10:13 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:17:5:17:13 | yaml_data | UnsafeYamlDeserialization.rb:18:25:18:33 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:17:17:17:22 | call to params | UnsafeYamlDeserialization.rb:17:17:17:28 | ...[...] | provenance | | +| UnsafeYamlDeserialization.rb:17:17:17:28 | ...[...] | UnsafeYamlDeserialization.rb:17:5:17:13 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:33:32:33:40 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:34:37:34:45 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:35:32:35:40 | yaml_data | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:37:14:37:33 | call to to_ruby | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:38:14:38:43 | call to to_ruby | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:39:14:39:48 | call to to_ruby | provenance | | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | UnsafeYamlDeserialization.rb:49:14:49:32 | call to to_ruby | provenance | | +| UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:32:17:32:28 | ...[...] | provenance | | +| UnsafeYamlDeserialization.rb:32:17:32:28 | ...[...] | UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | provenance | | nodes -| unicode_normalization.rb:7:5:7:17 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:7:21:7:26 | call to params | semmle.label | call to params | -| unicode_normalization.rb:7:21:7:42 | ...[...] | semmle.label | ...[...] | -| unicode_normalization.rb:8:23:8:35 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:9:22:9:34 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:15:5:15:17 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:15:5:15:17 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:15:21:15:26 | call to params | semmle.label | call to params | -| unicode_normalization.rb:15:21:15:42 | ...[...] | semmle.label | ...[...] | -| unicode_normalization.rb:15:21:15:42 | ...[...] | semmle.label | ...[...] | -| unicode_normalization.rb:16:5:16:23 | unicode_input_manip | semmle.label | unicode_input_manip | -| unicode_normalization.rb:16:27:16:39 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:16:27:16:39 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:16:27:16:59 | call to sub | semmle.label | call to sub | -| unicode_normalization.rb:17:23:17:41 | unicode_input_manip | semmle.label | unicode_input_manip | -| unicode_normalization.rb:18:22:18:40 | unicode_input_manip | semmle.label | unicode_input_manip | -| unicode_normalization.rb:24:5:24:17 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:24:21:24:26 | call to params | semmle.label | call to params | -| unicode_normalization.rb:24:21:24:42 | ...[...] | semmle.label | ...[...] | -| unicode_normalization.rb:25:5:25:21 | unicode_html_safe | semmle.label | unicode_html_safe | -| unicode_normalization.rb:25:25:25:50 | call to html_escape | semmle.label | call to html_escape | -| unicode_normalization.rb:25:37:25:49 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:26:23:26:39 | unicode_html_safe | semmle.label | unicode_html_safe | -| unicode_normalization.rb:27:22:27:38 | unicode_html_safe | semmle.label | unicode_html_safe | -| unicode_normalization.rb:33:5:33:17 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:33:21:33:26 | call to params | semmle.label | call to params | -| unicode_normalization.rb:33:21:33:42 | ...[...] | semmle.label | ...[...] | -| unicode_normalization.rb:34:5:34:21 | unicode_html_safe | semmle.label | unicode_html_safe | -| unicode_normalization.rb:34:25:34:53 | call to escapeHTML | semmle.label | call to escapeHTML | -| unicode_normalization.rb:34:25:34:63 | call to html_safe | semmle.label | call to html_safe | -| unicode_normalization.rb:34:40:34:52 | unicode_input | semmle.label | unicode_input | -| unicode_normalization.rb:35:23:35:39 | unicode_html_safe | semmle.label | unicode_html_safe | -| unicode_normalization.rb:36:22:36:38 | unicode_html_safe | semmle.label | unicode_html_safe | +| UnsafeYamlDeserialization.rb:10:5:10:13 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:10:17:10:22 | call to params | semmle.label | call to params | +| UnsafeYamlDeserialization.rb:10:17:10:28 | ...[...] | semmle.label | ...[...] | +| UnsafeYamlDeserialization.rb:11:25:11:33 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:17:5:17:13 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:17:17:17:22 | call to params | semmle.label | call to params | +| UnsafeYamlDeserialization.rb:17:17:17:28 | ...[...] | semmle.label | ...[...] | +| UnsafeYamlDeserialization.rb:18:25:18:33 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:32:5:32:13 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | semmle.label | call to params | +| UnsafeYamlDeserialization.rb:32:17:32:28 | ...[...] | semmle.label | ...[...] | +| UnsafeYamlDeserialization.rb:33:32:33:40 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:34:37:34:45 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:35:32:35:40 | yaml_data | semmle.label | yaml_data | +| UnsafeYamlDeserialization.rb:37:14:37:33 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeYamlDeserialization.rb:38:14:38:43 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeYamlDeserialization.rb:39:14:39:48 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeYamlDeserialization.rb:49:14:49:32 | call to to_ruby | semmle.label | call to to_ruby | +| UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | semmle.label | call to read | +| UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | semmle.label | call to gets | +| UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | semmle.label | call to read | +| UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | semmle.label | call to gets | +| UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | semmle.label | call to readlines | subpaths #select -| unicode_normalization.rb:8:23:8:35 | unicode_input | unicode_normalization.rb:7:21:7:26 | call to params | unicode_normalization.rb:8:23:8:35 | unicode_input | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:8:23:8:35 | unicode_input | Unicode transformation (Unicode normalization) | unicode_normalization.rb:7:21:7:26 | call to params | remote user-controlled data | -| unicode_normalization.rb:9:22:9:34 | unicode_input | unicode_normalization.rb:7:21:7:26 | call to params | unicode_normalization.rb:9:22:9:34 | unicode_input | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:9:22:9:34 | unicode_input | Unicode transformation (Unicode normalization) | unicode_normalization.rb:7:21:7:26 | call to params | remote user-controlled data | -| unicode_normalization.rb:17:23:17:41 | unicode_input_manip | unicode_normalization.rb:15:21:15:26 | call to params | unicode_normalization.rb:17:23:17:41 | unicode_input_manip | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:17:23:17:41 | unicode_input_manip | Unicode transformation (Unicode normalization) | unicode_normalization.rb:15:21:15:26 | call to params | remote user-controlled data | -| unicode_normalization.rb:18:22:18:40 | unicode_input_manip | unicode_normalization.rb:15:21:15:26 | call to params | unicode_normalization.rb:18:22:18:40 | unicode_input_manip | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:18:22:18:40 | unicode_input_manip | Unicode transformation (Unicode normalization) | unicode_normalization.rb:15:21:15:26 | call to params | remote user-controlled data | -| unicode_normalization.rb:26:23:26:39 | unicode_html_safe | unicode_normalization.rb:24:21:24:26 | call to params | unicode_normalization.rb:26:23:26:39 | unicode_html_safe | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:26:23:26:39 | unicode_html_safe | Unicode transformation (Unicode normalization) | unicode_normalization.rb:24:21:24:26 | call to params | remote user-controlled data | -| unicode_normalization.rb:27:22:27:38 | unicode_html_safe | unicode_normalization.rb:24:21:24:26 | call to params | unicode_normalization.rb:27:22:27:38 | unicode_html_safe | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:27:22:27:38 | unicode_html_safe | Unicode transformation (Unicode normalization) | unicode_normalization.rb:24:21:24:26 | call to params | remote user-controlled data | -| unicode_normalization.rb:35:23:35:39 | unicode_html_safe | unicode_normalization.rb:33:21:33:26 | call to params | unicode_normalization.rb:35:23:35:39 | unicode_html_safe | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:35:23:35:39 | unicode_html_safe | Unicode transformation (Unicode normalization) | unicode_normalization.rb:33:21:33:26 | call to params | remote user-controlled data | -| unicode_normalization.rb:36:22:36:38 | unicode_html_safe | unicode_normalization.rb:33:21:33:26 | call to params | unicode_normalization.rb:36:22:36:38 | unicode_html_safe | This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters. | unicode_normalization.rb:36:22:36:38 | unicode_html_safe | Unicode transformation (Unicode normalization) | unicode_normalization.rb:33:21:33:26 | call to params | remote user-controlled data | +| UnsafeYamlDeserialization.rb:11:25:11:33 | yaml_data | UnsafeYamlDeserialization.rb:10:17:10:22 | call to params | UnsafeYamlDeserialization.rb:11:25:11:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:10:17:10:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:18:25:18:33 | yaml_data | UnsafeYamlDeserialization.rb:17:17:17:22 | call to params | UnsafeYamlDeserialization.rb:18:25:18:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:17:17:17:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:33:32:33:40 | yaml_data | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:33:32:33:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:34:37:34:45 | yaml_data | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:34:37:34:45 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:35:32:35:40 | yaml_data | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:35:32:35:40 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:37:14:37:33 | call to to_ruby | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:37:14:37:33 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:38:14:38:43 | call to to_ruby | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:38:14:38:43 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:39:14:39:48 | call to to_ruby | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:39:14:39:48 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:49:14:49:32 | call to to_ruby | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | UnsafeYamlDeserialization.rb:49:14:49:32 | call to to_ruby | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:32:17:32:22 | call to params | user-provided value | +| UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:61:24:61:34 | call to read | value from stdin | +| UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:64:24:64:33 | call to gets | value from stdin | +| UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:67:24:67:32 | call to read | value from stdin | +| UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:70:24:70:27 | call to gets | value from stdin | +| UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeYamlDeserialization.rb:73:24:73:32 | call to readlines | value from stdin | From e9b5394cd567e456412f7f310c428072126cbf97 Mon Sep 17 00:00:00 2001 From: Cornelius Riemenschneider Date: Mon, 26 Feb 2024 15:26:44 +0100 Subject: [PATCH 176/207] JS: Remove empty build target. The `resources` folder never existed, this was probably introduced as a copy-paste mistake. Remove the rule. --- javascript/extractor/BUILD.bazel | 7 ------- 1 file changed, 7 deletions(-) diff --git a/javascript/extractor/BUILD.bazel b/javascript/extractor/BUILD.bazel index bd7159eea11..6793287c22f 100644 --- a/javascript/extractor/BUILD.bazel +++ b/javascript/extractor/BUILD.bazel @@ -26,12 +26,6 @@ codeql_java_project( ], ) -pkg_files( - name = "javascript-extractor-resources", - srcs = glob(["resources/**"]), - strip_prefix = "resources", -) - codeql_fat_jar( name = "extractor-javascript", srcs = [ @@ -49,7 +43,6 @@ codeql_fat_jar( "@semmle_code//util-java7", "@semmle_code//util-java8", ], - files = [":javascript-extractor-resources"], main_class = "com.semmle.js.extractor.Main", ) From 5c4543f16727be78f9e2f40ceb66715c5a17674a Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 26 Feb 2024 14:36:18 +0000 Subject: [PATCH 177/207] C++: Mark internal files in the old dataflow library as deprecated (the public imports already are). --- cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll | 2 ++ .../semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll | 4 ++++ cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll | 4 ++++ .../semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll | 4 ++++ .../code/cpp/dataflow/internal/DataFlowImplConsistency.qll | 2 ++ .../code/cpp/dataflow/internal/DataFlowImplSpecific.qll | 2 ++ .../lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll | 4 ++++ cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll | 2 ++ cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll | 2 ++ .../lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll | 2 ++ .../code/cpp/dataflow/internal/TaintTrackingImplSpecific.qll | 2 ++ .../semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll | 2 ++ .../internal/tainttracking1/TaintTrackingParameter.qll | 4 ++++ .../internal/tainttracking2/TaintTrackingParameter.qll | 4 ++++ 14 files changed, 40 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll index f6072763e1a..30029a5c762 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides a local analysis for identifying where a variable address * is effectively taken. Array-like offsets are allowed to pass through but * not field-like offsets. diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll index b8870cefd32..895cc09a048 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + */ + private import cpp private import DataFlowPrivate private import DataFlowUtil diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll index f5c51b43e37..115e145bec0 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + */ + private import DataFlowImplSpecific private import codeql.dataflow.internal.DataFlowImpl import MakeImpl diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll index 868c3ef6a2b..5d61aac1561 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + */ + private import DataFlowImplSpecific private import codeql.dataflow.internal.DataFlowImplCommon import MakeImplCommon diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll index 229031e0149..8abc7a8760a 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides consistency queries for checking invariants in the language-specific * data-flow classes and predicates. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll index 7fa662bd691..e8686419aac 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides C++-specific definitions for use in the data flow library. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll index 80a1ea28dea..9b111de7a04 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + */ + private import cpp private import DataFlowUtil private import DataFlowDispatch diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll index 10338b18927..83efaf1511f 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides C++-specific definitions for use in the data flow library. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll index 6632a4af18c..4385c4e268a 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides a class for handling variables in the data flow analysis. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll index 9ee0fa3131b..8cd80f0df5b 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll @@ -7,6 +7,8 @@ // non-monotonic recursion errors in queries that use both the data flow // library and the `SubBasicBlocks` library. /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides the `SubBasicBlock` class, used for partitioning basic blocks in * smaller pieces. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingImplSpecific.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingImplSpecific.qll index 3f917d69802..e1549ea57a3 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingImplSpecific.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingImplSpecific.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides C++-specific definitions for use in the taint tracking library. */ diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll index 89a8eba2199..4f097fa4bf3 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. + * * Provides classes for performing local (intra-procedural) and * global (inter-procedural) taint-tracking analyses. * diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll index 0d73207dad9..f9346e28434 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `Global` and `GlobalWithState` instead. + */ + import semmle.code.cpp.dataflow.internal.TaintTrackingUtil as Public module Private { diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll index fb4862fd06b..e935b8d4d08 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll @@ -1,3 +1,7 @@ +/** + * DEPRECATED: Use `Global` and `GlobalWithState` instead. + */ + import semmle.code.cpp.dataflow.internal.TaintTrackingUtil as Public module Private { From cb733dcf85b48dfa26a6d30bf94eed2eb9de2d6c Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 26 Feb 2024 14:59:03 +0000 Subject: [PATCH 178/207] Simplify model defenition --- ruby/ql/lib/codeql/ruby/frameworks/Arel.qll | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll b/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll index 0dd4f3e44a1..d4336cd35c5 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Arel.qll @@ -48,13 +48,7 @@ module Arel { SqlLiteralNewSummary() { this = "Arel::Nodes::SqlLiteral.new" } override MethodCall getACall() { - result = - API::getTopLevelMember("Arel") - .getMember("Nodes") - .getMember("SqlLiteral") - .getAMethodCall("new") - .asExpr() - .getExpr() + result = any(ArelSqlLiteralNewConstruction c).asExpr().getExpr() } override predicate propagatesFlow(string input, string output, boolean preservesValue) { From 2e66392353fa909b9837c0f22f4114cc43bc810f Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 26 Feb 2024 16:38:08 +0000 Subject: [PATCH 179/207] C++: Update deprecated note to respect identical files. --- cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll | 2 +- .../lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll index 9ee0fa3131b..3d97281daa5 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll @@ -1,6 +1,6 @@ // NOTE: There are two copies of this file, and they must be kept identical: // - semmle/code/cpp/controlflow/SubBasicBlocks.qll -// - semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll +// - semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll [now DEPRECATED] // // The second one is a private copy of the `SubBasicBlocks` library for // internal use by the data flow library. Having an extra copy prevents diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll index 8cd80f0df5b..3d97281daa5 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll @@ -1,14 +1,12 @@ // NOTE: There are two copies of this file, and they must be kept identical: // - semmle/code/cpp/controlflow/SubBasicBlocks.qll -// - semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll +// - semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll [now DEPRECATED] // // The second one is a private copy of the `SubBasicBlocks` library for // internal use by the data flow library. Having an extra copy prevents // non-monotonic recursion errors in queries that use both the data flow // library and the `SubBasicBlocks` library. /** - * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow` instead. - * * Provides the `SubBasicBlock` class, used for partitioning basic blocks in * smaller pieces. */ From a513598a4dfa3a6c6a289aa6ed667d70a47fe44c Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Mon, 26 Feb 2024 19:20:54 +0000 Subject: [PATCH 180/207] C++: Change note for IR named destructors. --- cpp/ql/lib/change-notes/2024-02-26-ir-named-destructors.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2024-02-26-ir-named-destructors.md diff --git a/cpp/ql/lib/change-notes/2024-02-26-ir-named-destructors.md b/cpp/ql/lib/change-notes/2024-02-26-ir-named-destructors.md new file mode 100644 index 00000000000..4e35decaf8e --- /dev/null +++ b/cpp/ql/lib/change-notes/2024-02-26-ir-named-destructors.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added destructors for named objects to the intermediate representation. \ No newline at end of file From 03f01a0121a2d12da5cdadec22e54aafb2784ede Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Fri, 16 Feb 2024 21:02:09 +0000 Subject: [PATCH 181/207] Add tests for Maven wrapper --- .../maven_wrapper_test_utils.py | 12 + .../maven-wrapper-script-only/.gitattributes | 6 + .../.mvn/wrapper/maven-wrapper.properties | 18 ++ .../java/maven-wrapper-script-only/mvnw | 287 ++++++++++++++++++ .../java/maven-wrapper-script-only/mvnw.cmd | 187 ++++++++++++ .../java/maven-wrapper-script-only/pom.xml | 114 +++++++ .../src/main/java/com/example/App.java | 30 ++ .../src/main/resources/my-app.properties | 1 + .../src/main/resources/page.xml | 8 + .../src/main/resources/struts.xml | 4 + .../src/test/java/com/example/AppTest.java | 20 ++ .../maven-wrapper-script-only/test.expected | 16 + .../java/maven-wrapper-script-only/test.py | 7 + .../java/maven-wrapper-script-only/test.ql | 9 + .../maven-wrapper-source-only/.gitattributes | 6 + .../.mvn/wrapper/MavenWrapperDownloader.java | 162 ++++++++++ .../.mvn/wrapper/maven-wrapper.properties | 18 ++ .../java/maven-wrapper-source-only/mvnw | 287 ++++++++++++++++++ .../java/maven-wrapper-source-only/mvnw.cmd | 187 ++++++++++++ .../java/maven-wrapper-source-only/pom.xml | 114 +++++++ .../src/main/java/com/example/App.java | 30 ++ .../src/main/resources/my-app.properties | 1 + .../src/main/resources/page.xml | 8 + .../src/main/resources/struts.xml | 4 + .../src/test/java/com/example/AppTest.java | 20 ++ .../maven-wrapper-source-only/test.expected | 16 + .../java/maven-wrapper-source-only/test.py | 7 + .../java/maven-wrapper-source-only/test.ql | 9 + .../java/maven-wrapper/.gitattributes | 6 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 59925 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 ++ .../all-platforms/java/maven-wrapper/mvnw | 287 ++++++++++++++++++ .../all-platforms/java/maven-wrapper/mvnw.cmd | 187 ++++++++++++ .../all-platforms/java/maven-wrapper/pom.xml | 114 +++++++ .../src/main/java/com/example/App.java | 30 ++ .../src/main/resources/my-app.properties | 1 + .../maven-wrapper/src/main/resources/page.xml | 8 + .../src/main/resources/struts.xml | 4 + .../src/test/java/com/example/AppTest.java | 20 ++ .../java/maven-wrapper/test.expected | 16 + .../all-platforms/java/maven-wrapper/test.py | 7 + .../all-platforms/java/maven-wrapper/test.ql | 9 + 42 files changed, 2295 insertions(+) create mode 100644 java/integration-tests-lib/maven_wrapper_test_utils.py create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.gitattributes create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.mvn/wrapper/maven-wrapper.properties create mode 100755 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw.cmd create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/pom.xml create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/java/com/example/App.java create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/my-app.properties create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/page.xml create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/struts.xml create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/test/java/com/example/AppTest.java create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.expected create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.py create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.ql create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.gitattributes create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/maven-wrapper.properties create mode 100755 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw.cmd create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/pom.xml create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/java/com/example/App.java create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/my-app.properties create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/page.xml create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/struts.xml create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/test/java/com/example/AppTest.java create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.expected create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.py create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.ql create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/.gitattributes create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.jar create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.properties create mode 100755 java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw.cmd create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/pom.xml create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/java/com/example/App.java create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/my-app.properties create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/page.xml create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/struts.xml create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/src/test/java/com/example/AppTest.java create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/test.expected create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/test.py create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/test.ql diff --git a/java/integration-tests-lib/maven_wrapper_test_utils.py b/java/integration-tests-lib/maven_wrapper_test_utils.py new file mode 100644 index 00000000000..fd3b727ff77 --- /dev/null +++ b/java/integration-tests-lib/maven_wrapper_test_utils.py @@ -0,0 +1,12 @@ +import sys +import os.path + +def check_maven_wrapper_exists(expected_version): + if not os.path.exists(".mvn/wrapper/maven-wrapper.jar"): + print("Maven wrapper jar file expected but not found", file = sys.stderr) + sys.exit(1) + with open(".mvn/wrapper/maven-wrapper.properties", "r") as f: + content = f.read() + if ("apache-maven-%s-" % expected_version) not in content: + print("Expected Maven wrapper to fetch version %s, but actual properties file said:\n\n%s" % (expected_version, content), file = sys.stderr) + sys.exit(1) diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.gitattributes b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.gitattributes new file mode 100644 index 00000000000..36e4b9d7df9 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.mvn/wrapper/maven-wrapper.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..9527f33d801 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 +# +# https://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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.4/apache-maven-3.9.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw new file mode 100755 index 00000000000..b7f064624f8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw.cmd b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw.cmd new file mode 100644 index 00000000000..474c9d6b74c --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/pom.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/pom.xml new file mode 100644 index 00000000000..ec4aaf128c1 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + com.example + maven-sample + 1.0-SNAPSHOT + + maven-sample + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + + + + exec-maven-plugin + org.codehaus.mojo + 1.1.1 + + + check-maven-version + package + + java + + + + + com.example.App + + + + com.diffplug.spotless + spotless-maven-plugin + 2.19.1 + + + + check + + compile + + + + + + /* FAIL ME */ + + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + \ No newline at end of file diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/java/com/example/App.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/java/com/example/App.java new file mode 100644 index 00000000000..c9eec918587 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/java/com/example/App.java @@ -0,0 +1,30 @@ +package com.example; + +import java.util.regex.Pattern; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + String expectedVersion = System.getenv("EXPECT_MAVEN"); + Path mavenHome = Paths.get(System.getProperty("maven.home")).normalize(); + String observedVersion = mavenHome.getFileName().toString(); + if (expectedVersion != null && !expectedVersion.equals(observedVersion)) { + System.err.println("Wrong maven version, expected '" + expectedVersion + "' but got '" + observedVersion + "'" + mavenHome); + System.exit(1); + } + String commandMatcher = System.getenv("EXPECT_COMMAND_REGEX"); + String command = System.getProperty("sun.java.command"); + if (commandMatcher != null && !Pattern.matches(commandMatcher, command)) { + System.err.println("Wrong command line, '" + command + "' does not match '" + commandMatcher + "'"); + System.exit(1); + } + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/my-app.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/my-app.properties new file mode 100644 index 00000000000..e566b49a29a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/my-app.properties @@ -0,0 +1 @@ +version=1.0 diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/page.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/page.xml new file mode 100644 index 00000000000..2bab459cb03 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/page.xml @@ -0,0 +1,8 @@ + + +A sample + + +

    Hello world!

    + + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/struts.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/struts.xml new file mode 100644 index 00000000000..73fc0c6b9cb --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/main/resources/struts.xml @@ -0,0 +1,4 @@ + + +This is a sample file + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/test/java/com/example/AppTest.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/test/java/com/example/AppTest.java new file mode 100644 index 00000000000..22a94ca6f01 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/src/test/java/com/example/AppTest.java @@ -0,0 +1,20 @@ +package com.example; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.expected b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.expected new file mode 100644 index 00000000000..dd77a3fab0a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.expected @@ -0,0 +1,16 @@ +#select +| src/main/java/com/example/App.java:0:0:0:0 | App | +| src/test/java/com/example/AppTest.java:0:0:0:0 | AppTest | +xmlFiles +| pom.xml:0:0:0:0 | pom.xml | +| src/main/resources/page.xml:0:0:0:0 | src/main/resources/page.xml | +| src/main/resources/struts.xml:0:0:0:0 | src/main/resources/struts.xml | +| target/classes/page.xml:0:0:0:0 | target/classes/page.xml | +| target/classes/struts.xml:0:0:0:0 | target/classes/struts.xml | +propertiesFiles +| .mvn/wrapper/maven-wrapper.properties:0:0:0:0 | .mvn/wrapper/maven-wrapper.properties | +| src/main/resources/my-app.properties:0:0:0:0 | src/main/resources/my-app.properties | +| target/classes/my-app.properties:0:0:0:0 | target/classes/my-app.properties | +| target/maven-archiver/pom.properties:0:0:0:0 | target/maven-archiver/pom.properties | +| test-db/log/ext/javac-1.properties:0:0:0:0 | test-db/log/ext/javac-1.properties | +| test-db/log/ext/javac.properties:0:0:0:0 | test-db/log/ext/javac.properties | diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.py b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.py new file mode 100644 index 00000000000..5311b982c2b --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.py @@ -0,0 +1,7 @@ +import sys + +from create_database_utils import * +from maven_wrapper_test_utils import * + +run_codeql_database_create([], lang="java") +check_maven_wrapper_exists("3.9.4") diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.ql b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.ql new file mode 100644 index 00000000000..25cd26fdd14 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/test.ql @@ -0,0 +1,9 @@ +import java + +from File f +where f.isSourceFile() +select f + +query predicate xmlFiles(XmlFile x) { any() } + +query predicate propertiesFiles(File f) { f.getExtension() = "properties" } diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.gitattributes b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.gitattributes new file mode 100644 index 00000000000..36e4b9d7df9 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/MavenWrapperDownloader.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 00000000000..732313c4311 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,162 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +import java.util.Properties; + +public final class MavenWrapperDownloader +{ + private static final String WRAPPER_VERSION = "3.1.1"; + + private static final boolean VERBOSE = Boolean.parseBoolean( System.getenv( "MVNW_VERBOSE" ) ); + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/" + WRAPPER_VERSION + + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to use instead of the + * default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main( String[] args ) + { + if ( args.length == 0 ) + { + System.err.println( " - ERROR projectBasedir parameter missing" ); + System.exit( 1 ); + } + + log( " - Downloader started" ); + final String dir = args[0].replace( "..", "" ); // Sanitize path + final Path projectBasedir = Paths.get( dir ).toAbsolutePath().normalize(); + if ( !Files.isDirectory( projectBasedir, LinkOption.NOFOLLOW_LINKS ) ) + { + System.err.println( " - ERROR projectBasedir not exists: " + projectBasedir ); + System.exit( 1 ); + } + + log( " - Using base directory: " + projectBasedir ); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + Path mavenWrapperPropertyFile = projectBasedir.resolve( MAVEN_WRAPPER_PROPERTIES_PATH ); + String url = readWrapperUrl( mavenWrapperPropertyFile ); + + try + { + Path outputFile = projectBasedir.resolve( MAVEN_WRAPPER_JAR_PATH ); + createDirectories( outputFile.getParent() ); + downloadFileFromURL( url, outputFile ); + log( "Done" ); + System.exit( 0 ); + } + catch ( IOException e ) + { + System.err.println( "- Error downloading" ); + e.printStackTrace(); + System.exit( 1 ); + } + } + + private static void downloadFileFromURL( String urlString, Path destination ) throws IOException + { + log( " - Downloading to: " + destination ); + if ( System.getenv( "MVNW_USERNAME" ) != null && System.getenv( "MVNW_PASSWORD" ) != null ) + { + final String username = System.getenv( "MVNW_USERNAME" ); + final char[] password = System.getenv( "MVNW_PASSWORD" ).toCharArray(); + Authenticator.setDefault( new Authenticator() + { + @Override + protected PasswordAuthentication getPasswordAuthentication() + { + return new PasswordAuthentication( username, password ); + } + } ); + } + URL website = new URL( urlString ); + try ( InputStream inStream = website.openStream() ) { + Files.copy( inStream, destination, StandardCopyOption.REPLACE_EXISTING ); + } + log( " - Downloader complete" ); + } + + private static void createDirectories(Path outputPath) throws IOException + { + if ( !Files.isDirectory( outputPath, LinkOption.NOFOLLOW_LINKS ) ) { + Path createDirectories = Files.createDirectories( outputPath ); + log( " - Directories created: " + createDirectories ); + } + } + + private static String readWrapperUrl( Path mavenWrapperPropertyFile ) + { + String url = DEFAULT_DOWNLOAD_URL; + if ( Files.exists( mavenWrapperPropertyFile, LinkOption.NOFOLLOW_LINKS ) ) + { + log( " - Reading property file: " + mavenWrapperPropertyFile ); + try ( InputStream in = Files.newInputStream( mavenWrapperPropertyFile, StandardOpenOption.READ ) ) + { + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load( in ); + url = mavenWrapperProperties.getProperty( PROPERTY_NAME_WRAPPER_URL, DEFAULT_DOWNLOAD_URL ); + } + catch ( IOException e ) + { + System.err.println( " - ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'" ); + } + } + log( " - Downloading from: " + url ); + return url; + } + + private static void log( String msg ) + { + if ( VERBOSE ) + { + System.out.println( msg ); + } + } + +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/maven-wrapper.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..9527f33d801 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 +# +# https://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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.4/apache-maven-3.9.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw new file mode 100755 index 00000000000..b7f064624f8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw.cmd b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw.cmd new file mode 100644 index 00000000000..474c9d6b74c --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/pom.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/pom.xml new file mode 100644 index 00000000000..ec4aaf128c1 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + com.example + maven-sample + 1.0-SNAPSHOT + + maven-sample + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + + + + exec-maven-plugin + org.codehaus.mojo + 1.1.1 + + + check-maven-version + package + + java + + + + + com.example.App + + + + com.diffplug.spotless + spotless-maven-plugin + 2.19.1 + + + + check + + compile + + + + + + /* FAIL ME */ + + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + \ No newline at end of file diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/java/com/example/App.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/java/com/example/App.java new file mode 100644 index 00000000000..c9eec918587 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/java/com/example/App.java @@ -0,0 +1,30 @@ +package com.example; + +import java.util.regex.Pattern; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + String expectedVersion = System.getenv("EXPECT_MAVEN"); + Path mavenHome = Paths.get(System.getProperty("maven.home")).normalize(); + String observedVersion = mavenHome.getFileName().toString(); + if (expectedVersion != null && !expectedVersion.equals(observedVersion)) { + System.err.println("Wrong maven version, expected '" + expectedVersion + "' but got '" + observedVersion + "'" + mavenHome); + System.exit(1); + } + String commandMatcher = System.getenv("EXPECT_COMMAND_REGEX"); + String command = System.getProperty("sun.java.command"); + if (commandMatcher != null && !Pattern.matches(commandMatcher, command)) { + System.err.println("Wrong command line, '" + command + "' does not match '" + commandMatcher + "'"); + System.exit(1); + } + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/my-app.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/my-app.properties new file mode 100644 index 00000000000..e566b49a29a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/my-app.properties @@ -0,0 +1 @@ +version=1.0 diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/page.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/page.xml new file mode 100644 index 00000000000..2bab459cb03 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/page.xml @@ -0,0 +1,8 @@ + + +A sample + + +

    Hello world!

    + + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/struts.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/struts.xml new file mode 100644 index 00000000000..73fc0c6b9cb --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/main/resources/struts.xml @@ -0,0 +1,4 @@ + + +This is a sample file + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/test/java/com/example/AppTest.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/test/java/com/example/AppTest.java new file mode 100644 index 00000000000..22a94ca6f01 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/src/test/java/com/example/AppTest.java @@ -0,0 +1,20 @@ +package com.example; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.expected b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.expected new file mode 100644 index 00000000000..dd77a3fab0a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.expected @@ -0,0 +1,16 @@ +#select +| src/main/java/com/example/App.java:0:0:0:0 | App | +| src/test/java/com/example/AppTest.java:0:0:0:0 | AppTest | +xmlFiles +| pom.xml:0:0:0:0 | pom.xml | +| src/main/resources/page.xml:0:0:0:0 | src/main/resources/page.xml | +| src/main/resources/struts.xml:0:0:0:0 | src/main/resources/struts.xml | +| target/classes/page.xml:0:0:0:0 | target/classes/page.xml | +| target/classes/struts.xml:0:0:0:0 | target/classes/struts.xml | +propertiesFiles +| .mvn/wrapper/maven-wrapper.properties:0:0:0:0 | .mvn/wrapper/maven-wrapper.properties | +| src/main/resources/my-app.properties:0:0:0:0 | src/main/resources/my-app.properties | +| target/classes/my-app.properties:0:0:0:0 | target/classes/my-app.properties | +| target/maven-archiver/pom.properties:0:0:0:0 | target/maven-archiver/pom.properties | +| test-db/log/ext/javac-1.properties:0:0:0:0 | test-db/log/ext/javac-1.properties | +| test-db/log/ext/javac.properties:0:0:0:0 | test-db/log/ext/javac.properties | diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.py b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.py new file mode 100644 index 00000000000..5311b982c2b --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.py @@ -0,0 +1,7 @@ +import sys + +from create_database_utils import * +from maven_wrapper_test_utils import * + +run_codeql_database_create([], lang="java") +check_maven_wrapper_exists("3.9.4") diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.ql b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.ql new file mode 100644 index 00000000000..25cd26fdd14 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/test.ql @@ -0,0 +1,9 @@ +import java + +from File f +where f.isSourceFile() +select f + +query predicate xmlFiles(XmlFile x) { any() } + +query predicate propertiesFiles(File f) { f.getExtension() = "properties" } diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/.gitattributes b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.gitattributes new file mode 100644 index 00000000000..36e4b9d7df9 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.jar b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 GIT binary patch literal 59925 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

    dy!05UMhSKsK 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 VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N literal 0 HcmV?d00001 diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..9527f33d801 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 +# +# https://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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.4/apache-maven-3.9.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw b/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw new file mode 100755 index 00000000000..b7f064624f8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw.cmd b/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw.cmd new file mode 100644 index 00000000000..474c9d6b74c --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/pom.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper/pom.xml new file mode 100644 index 00000000000..ec4aaf128c1 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + com.example + maven-sample + 1.0-SNAPSHOT + + maven-sample + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + + + + + exec-maven-plugin + org.codehaus.mojo + 1.1.1 + + + check-maven-version + package + + java + + + + + com.example.App + + + + com.diffplug.spotless + spotless-maven-plugin + 2.19.1 + + + + check + + compile + + + + + + /* FAIL ME */ + + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + \ No newline at end of file diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/java/com/example/App.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/java/com/example/App.java new file mode 100644 index 00000000000..c9eec918587 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/java/com/example/App.java @@ -0,0 +1,30 @@ +package com.example; + +import java.util.regex.Pattern; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + String expectedVersion = System.getenv("EXPECT_MAVEN"); + Path mavenHome = Paths.get(System.getProperty("maven.home")).normalize(); + String observedVersion = mavenHome.getFileName().toString(); + if (expectedVersion != null && !expectedVersion.equals(observedVersion)) { + System.err.println("Wrong maven version, expected '" + expectedVersion + "' but got '" + observedVersion + "'" + mavenHome); + System.exit(1); + } + String commandMatcher = System.getenv("EXPECT_COMMAND_REGEX"); + String command = System.getProperty("sun.java.command"); + if (commandMatcher != null && !Pattern.matches(commandMatcher, command)) { + System.err.println("Wrong command line, '" + command + "' does not match '" + commandMatcher + "'"); + System.exit(1); + } + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/my-app.properties b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/my-app.properties new file mode 100644 index 00000000000..e566b49a29a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/my-app.properties @@ -0,0 +1 @@ +version=1.0 diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/page.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/page.xml new file mode 100644 index 00000000000..2bab459cb03 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/page.xml @@ -0,0 +1,8 @@ + + +A sample + + +

    Hello world!

    + + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/struts.xml b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/struts.xml new file mode 100644 index 00000000000..73fc0c6b9cb --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/main/resources/struts.xml @@ -0,0 +1,4 @@ + + +This is a sample file + diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/test/java/com/example/AppTest.java b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/test/java/com/example/AppTest.java new file mode 100644 index 00000000000..22a94ca6f01 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/src/test/java/com/example/AppTest.java @@ -0,0 +1,20 @@ +package com.example; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.expected b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.expected new file mode 100644 index 00000000000..dd77a3fab0a --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.expected @@ -0,0 +1,16 @@ +#select +| src/main/java/com/example/App.java:0:0:0:0 | App | +| src/test/java/com/example/AppTest.java:0:0:0:0 | AppTest | +xmlFiles +| pom.xml:0:0:0:0 | pom.xml | +| src/main/resources/page.xml:0:0:0:0 | src/main/resources/page.xml | +| src/main/resources/struts.xml:0:0:0:0 | src/main/resources/struts.xml | +| target/classes/page.xml:0:0:0:0 | target/classes/page.xml | +| target/classes/struts.xml:0:0:0:0 | target/classes/struts.xml | +propertiesFiles +| .mvn/wrapper/maven-wrapper.properties:0:0:0:0 | .mvn/wrapper/maven-wrapper.properties | +| src/main/resources/my-app.properties:0:0:0:0 | src/main/resources/my-app.properties | +| target/classes/my-app.properties:0:0:0:0 | target/classes/my-app.properties | +| target/maven-archiver/pom.properties:0:0:0:0 | target/maven-archiver/pom.properties | +| test-db/log/ext/javac-1.properties:0:0:0:0 | test-db/log/ext/javac-1.properties | +| test-db/log/ext/javac.properties:0:0:0:0 | test-db/log/ext/javac.properties | diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.py b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.py new file mode 100644 index 00000000000..5311b982c2b --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.py @@ -0,0 +1,7 @@ +import sys + +from create_database_utils import * +from maven_wrapper_test_utils import * + +run_codeql_database_create([], lang="java") +check_maven_wrapper_exists("3.9.4") diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.ql b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.ql new file mode 100644 index 00000000000..25cd26fdd14 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/test.ql @@ -0,0 +1,9 @@ +import java + +from File f +where f.isSourceFile() +select f + +query predicate xmlFiles(XmlFile x) { any() } + +query predicate propertiesFiles(File f) { f.getExtension() = "properties" } From f7cdcd4981d05a8a5e8ee6c295a49e3bde8d0e13 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Fri, 23 Feb 2024 15:58:55 +0000 Subject: [PATCH 182/207] Force Maven wrapper tests to run sequentially --- .../maven-wrapper-script-only/force_sequential_test_execution | 1 + .../maven-wrapper-source-only/force_sequential_test_execution | 1 + .../java/maven-wrapper/force_sequential_test_execution | 1 + 3 files changed, 3 insertions(+) create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/force_sequential_test_execution create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/force_sequential_test_execution create mode 100644 java/ql/integration-tests/all-platforms/java/maven-wrapper/force_sequential_test_execution diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/force_sequential_test_execution b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/force_sequential_test_execution new file mode 100644 index 00000000000..44bcad8d582 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-script-only/force_sequential_test_execution @@ -0,0 +1 @@ +The wrapper downloading a Maven distribution multiple times in parallel is not safe. diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/force_sequential_test_execution b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/force_sequential_test_execution new file mode 100644 index 00000000000..44bcad8d582 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper-source-only/force_sequential_test_execution @@ -0,0 +1 @@ +The wrapper downloading a Maven distribution multiple times in parallel is not safe. diff --git a/java/ql/integration-tests/all-platforms/java/maven-wrapper/force_sequential_test_execution b/java/ql/integration-tests/all-platforms/java/maven-wrapper/force_sequential_test_execution new file mode 100644 index 00000000000..44bcad8d582 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/maven-wrapper/force_sequential_test_execution @@ -0,0 +1 @@ +The wrapper downloading a Maven distribution multiple times in parallel is not safe. From fbb0ffcadd980e49823add8b5cd2c0d3acf4a815 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 27 Feb 2024 12:53:46 +0000 Subject: [PATCH 183/207] C++: Add testcase with invalid IR from vacuous destructor call. --- .../library-tests/ir/ir/PrintAST.expected | 161 ++++++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 140 +++++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 1 + .../aliased_ssa_consistency_unsound.expected | 1 + cpp/ql/test/library-tests/ir/ir/ir.cpp | 20 +++ .../ir/ir/operand_locations.expected | 111 ++++++++++++ .../ir/ir/raw_consistency.expected | 3 + .../test/library-tests/ir/ir/raw_ir.expected | 143 ++++++++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 1 + ...unaliased_ssa_consistency_unsound.expected | 1 + 10 files changed, 582 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 4423145ca31..c9e5845474b 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -17160,6 +17160,167 @@ ir.cpp: # 2190| getExpr(): [ConstructorCall] call to ClassWithDestructor # 2190| Type = [VoidType] void # 2190| ValueCategory = prvalue +# 2194| [FunctionTemplateInstantiation,TopLevelFunction] ClassWithDestructor& vacuous_destructor_call::get(ClassWithDestructor&) +# 2194| : +# 2194| getParameter(0): [Parameter] t +# 2194| Type = [LValueReferenceType] ClassWithDestructor & +# 2194| getEntryPoint(): [BlockStmt] { ... } +# 2194| getStmt(0): [ReturnStmt] return ... +# 2194| getExpr(): [VariableAccess] t +# 2194| Type = [LValueReferenceType] ClassWithDestructor & +# 2194| ValueCategory = prvalue(load) +# 2194| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2194| Type = [LValueReferenceType] ClassWithDestructor & +# 2194| ValueCategory = prvalue +# 2194| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2194| Type = [Class] ClassWithDestructor +# 2194| ValueCategory = lvalue +# 2194| [TemplateFunction,TopLevelFunction] T& vacuous_destructor_call::get(T&) +# 2194| : +# 2194| getParameter(0): [Parameter] t +# 2194| Type = [LValueReferenceType] T & +# 2194| getEntryPoint(): [BlockStmt] { ... } +# 2194| getStmt(0): [ReturnStmt] return ... +# 2194| getExpr(): [VariableAccess] t +# 2194| Type = [LValueReferenceType] T & +# 2194| ValueCategory = prvalue(load) +# 2194| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2194| Type = [TemplateParameter] T +# 2194| ValueCategory = lvalue +# 2194| [FunctionTemplateInstantiation,TopLevelFunction] int& vacuous_destructor_call::get(int&) +# 2194| : +# 2194| getParameter(0): [Parameter] t +# 2194| Type = [LValueReferenceType] int & +# 2194| getEntryPoint(): [BlockStmt] { ... } +# 2194| getStmt(0): [ReturnStmt] return ... +# 2194| getExpr(): [VariableAccess] t +# 2194| Type = [LValueReferenceType] int & +# 2194| ValueCategory = prvalue(load) +# 2194| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 2194| Type = [LValueReferenceType] int & +# 2194| ValueCategory = prvalue +# 2194| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2194| Type = [IntType] int +# 2194| ValueCategory = lvalue +# 2197| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor(ClassWithDestructor&) +# 2197| : +# 2197| getParameter(0): [Parameter] t +# 2197| Type = [LValueReferenceType] ClassWithDestructor & +# 2197| getEntryPoint(): [BlockStmt] { ... } +# 2198| getStmt(0): [ExprStmt] ExprStmt +# 2198| getExpr(): [DestructorCall] call to ~ClassWithDestructor +# 2198| Type = [VoidType] void +# 2198| ValueCategory = prvalue +# 2198| getQualifier(): [FunctionCall] call to get +# 2198| Type = [LValueReferenceType] ClassWithDestructor & +# 2198| ValueCategory = prvalue +# 2198| getArgument(0): [VariableAccess] t +# 2198| Type = [LValueReferenceType] ClassWithDestructor & +# 2198| ValueCategory = prvalue(load) +# 2198| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2198| Type = [LValueReferenceType] ClassWithDestructor & +# 2198| ValueCategory = prvalue +# 2198| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [Class] ClassWithDestructor +# 2198| ValueCategory = lvalue +# 2198| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [Class] ClassWithDestructor +# 2198| ValueCategory = lvalue +# 2199| getStmt(1): [ReturnStmt] return ... +# 2197| [TemplateFunction,TopLevelFunction] void vacuous_destructor_call::call_destructor(T&) +# 2197| : +# 2197| getParameter(0): [Parameter] t +# 2197| Type = [LValueReferenceType] T & +# 2197| getEntryPoint(): [BlockStmt] { ... } +# 2198| getStmt(0): [ExprStmt] ExprStmt +# 2198| getExpr(): [ExprCall] call to expression +# 2198| Type = [UnknownType] unknown +# 2198| ValueCategory = prvalue +# 2198| getExpr(): [Literal] Unknown literal +# 2198| Type = [UnknownType] unknown +# 2198| ValueCategory = prvalue +# 2198| getChild(-1): [ExprCall] call to expression +# 2198| Type = [UnknownType] unknown +# 2198| ValueCategory = prvalue +# 2198| getExpr(): [Literal] Unknown literal +# 2198| Type = [UnknownType] unknown +# 2198| ValueCategory = prvalue +# 2198| getArgument(0): [VariableAccess] t +# 2198| Type = [LValueReferenceType] T & +# 2198| ValueCategory = prvalue(load) +# 2198| getArgument(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [TemplateParameter] T +# 2198| ValueCategory = lvalue +# 2199| getStmt(1): [ReturnStmt] return ... +# 2197| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor(int&) +# 2197| : +# 2197| getParameter(0): [Parameter] t +# 2197| Type = [LValueReferenceType] int & +# 2197| getEntryPoint(): [BlockStmt] { ... } +# 2198| getStmt(0): [ExprStmt] ExprStmt +# 2198| getExpr(): [VacuousDestructorCall] (vacuous destructor call) +# 2198| Type = [VoidType] void +# 2198| ValueCategory = prvalue +# 2198| getChild(0): [FunctionCall] call to get +# 2198| Type = [LValueReferenceType] int & +# 2198| ValueCategory = prvalue +# 2198| getArgument(0): [VariableAccess] t +# 2198| Type = [LValueReferenceType] int & +# 2198| ValueCategory = prvalue(load) +# 2198| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2198| Type = [LValueReferenceType] int & +# 2198| ValueCategory = prvalue +# 2198| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [IntType] int +# 2198| ValueCategory = lvalue +# 2198| getChild(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2198| Type = [IntType] int +# 2198| ValueCategory = lvalue +# 2199| getStmt(1): [ReturnStmt] return ... +# 2201| [TopLevelFunction] void vacuous_destructor_call::non_vacuous_destructor_call() +# 2201| : +# 2201| getEntryPoint(): [BlockStmt] { ... } +# 2202| getStmt(0): [DeclStmt] declaration +# 2202| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c +# 2202| Type = [Class] ClassWithDestructor +# 2202| getVariable().getInitializer(): [Initializer] initializer for c +# 2202| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2202| Type = [VoidType] void +# 2202| ValueCategory = prvalue +# 2203| getStmt(1): [ExprStmt] ExprStmt +# 2203| getExpr(): [FunctionCall] call to call_destructor +# 2203| Type = [VoidType] void +# 2203| ValueCategory = prvalue +# 2203| getArgument(0): [VariableAccess] c +# 2203| Type = [Class] ClassWithDestructor +# 2203| ValueCategory = lvalue +# 2203| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2203| Type = [LValueReferenceType] ClassWithDestructor & +# 2203| ValueCategory = prvalue +# 2204| getStmt(2): [ReturnStmt] return ... +# 2204| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2204| Type = [VoidType] void +# 2204| ValueCategory = prvalue +# 2204| getQualifier(): [VariableAccess] c +# 2204| Type = [Class] ClassWithDestructor +# 2204| ValueCategory = lvalue +# 2206| [TopLevelFunction] void vacuous_destructor_call::vacuous_destructor_call() +# 2206| : +# 2206| getEntryPoint(): [BlockStmt] { ... } +# 2207| getStmt(0): [DeclStmt] declaration +# 2207| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i +# 2207| Type = [IntType] int +# 2208| getStmt(1): [ExprStmt] ExprStmt +# 2208| getExpr(): [FunctionCall] call to call_destructor +# 2208| Type = [VoidType] void +# 2208| ValueCategory = prvalue +# 2208| getArgument(0): [VariableAccess] i +# 2208| Type = [IntType] int +# 2208| ValueCategory = lvalue +# 2208| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2208| Type = [LValueReferenceType] int & +# 2208| ValueCategory = prvalue +# 2209| getStmt(2): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index d9b4056f20e..a516eeccb13 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -13269,6 +13269,146 @@ ir.cpp: # 2190| v2190_11(void) = AliasedUse : ~m2190_9 # 2190| v2190_12(void) = ExitFunction : +# 2194| ClassWithDestructor& vacuous_destructor_call::get(ClassWithDestructor&) +# 2194| Block 0 +# 2194| v2194_1(void) = EnterFunction : +# 2194| m2194_2(unknown) = AliasedDefinition : +# 2194| m2194_3(unknown) = InitializeNonLocal : +# 2194| m2194_4(unknown) = Chi : total:m2194_2, partial:m2194_3 +# 2194| r2194_5(glval) = VariableAddress[t] : +# 2194| m2194_6(ClassWithDestructor &) = InitializeParameter[t] : &:r2194_5 +# 2194| r2194_7(ClassWithDestructor &) = Load[t] : &:r2194_5, m2194_6 +# 2194| m2194_8(unknown) = InitializeIndirection[t] : &:r2194_7 +# 2194| r2194_9(glval) = VariableAddress[#return] : +# 2194| r2194_10(glval) = VariableAddress[t] : +# 2194| r2194_11(ClassWithDestructor &) = Load[t] : &:r2194_10, m2194_6 +# 2194| r2194_12(glval) = CopyValue : r2194_11 +# 2194| r2194_13(ClassWithDestructor &) = CopyValue : r2194_12 +# 2194| m2194_14(ClassWithDestructor &) = Store[#return] : &:r2194_9, r2194_13 +# 2194| v2194_15(void) = ReturnIndirection[t] : &:r2194_7, m2194_8 +# 2194| r2194_16(glval) = VariableAddress[#return] : +# 2194| v2194_17(void) = ReturnValue : &:r2194_16, m2194_14 +# 2194| v2194_18(void) = AliasedUse : m2194_3 +# 2194| v2194_19(void) = ExitFunction : + +# 2194| int& vacuous_destructor_call::get(int&) +# 2194| Block 0 +# 2194| v2194_1(void) = EnterFunction : +# 2194| m2194_2(unknown) = AliasedDefinition : +# 2194| m2194_3(unknown) = InitializeNonLocal : +# 2194| m2194_4(unknown) = Chi : total:m2194_2, partial:m2194_3 +# 2194| r2194_5(glval) = VariableAddress[t] : +# 2194| m2194_6(int &) = InitializeParameter[t] : &:r2194_5 +# 2194| r2194_7(int &) = Load[t] : &:r2194_5, m2194_6 +# 2194| m2194_8(unknown) = InitializeIndirection[t] : &:r2194_7 +# 2194| r2194_9(glval) = VariableAddress[#return] : +# 2194| r2194_10(glval) = VariableAddress[t] : +# 2194| r2194_11(int &) = Load[t] : &:r2194_10, m2194_6 +# 2194| r2194_12(glval) = CopyValue : r2194_11 +# 2194| r2194_13(int &) = CopyValue : r2194_12 +# 2194| m2194_14(int &) = Store[#return] : &:r2194_9, r2194_13 +# 2194| v2194_15(void) = ReturnIndirection[t] : &:r2194_7, m2194_8 +# 2194| r2194_16(glval) = VariableAddress[#return] : +# 2194| v2194_17(void) = ReturnValue : &:r2194_16, m2194_14 +# 2194| v2194_18(void) = AliasedUse : m2194_3 +# 2194| v2194_19(void) = ExitFunction : + +# 2197| void vacuous_destructor_call::call_destructor(ClassWithDestructor&) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| m2197_2(unknown) = AliasedDefinition : +# 2197| m2197_3(unknown) = InitializeNonLocal : +# 2197| m2197_4(unknown) = Chi : total:m2197_2, partial:m2197_3 +# 2197| r2197_5(glval) = VariableAddress[t] : +# 2197| m2197_6(ClassWithDestructor &) = InitializeParameter[t] : &:r2197_5 +# 2197| r2197_7(ClassWithDestructor &) = Load[t] : &:r2197_5, m2197_6 +# 2197| m2197_8(unknown) = InitializeIndirection[t] : &:r2197_7 +# 2198| r2198_1(glval) = FunctionAddress[get] : +# 2198| r2198_2(glval) = VariableAddress[t] : +# 2198| r2198_3(ClassWithDestructor &) = Load[t] : &:r2198_2, m2197_6 +# 2198| r2198_4(glval) = CopyValue : r2198_3 +# 2198| r2198_5(ClassWithDestructor &) = CopyValue : r2198_4 +# 2198| r2198_6(ClassWithDestructor &) = Call[get] : func:r2198_1, 0:r2198_5 +# 2198| m2198_7(unknown) = ^CallSideEffect : ~m2197_4 +# 2198| m2198_8(unknown) = Chi : total:m2197_4, partial:m2198_7 +# 2198| v2198_9(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m2197_8 +# 2198| m2198_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5 +# 2198| m2198_11(unknown) = Chi : total:m2197_8, partial:m2198_10 +# 2198| r2198_12(glval) = CopyValue : r2198_6 +# 2198| r2198_13(glval) = FunctionAddress[~ClassWithDestructor] : +# 2198| v2198_14(void) = Call[~ClassWithDestructor] : func:r2198_13 +# 2198| m2198_15(unknown) = ^CallSideEffect : ~m2198_8 +# 2198| m2198_16(unknown) = Chi : total:m2198_8, partial:m2198_15 +# 2198| v2198_17(void) = ^IndirectReadSideEffect[-1] : &:r2198_12, ~m2198_11 +# 2198| m2198_18(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2198_12 +# 2198| m2198_19(unknown) = Chi : total:m2198_11, partial:m2198_18 +# 2199| v2199_1(void) = NoOp : +# 2197| v2197_9(void) = ReturnIndirection[t] : &:r2197_7, m2198_19 +# 2197| v2197_10(void) = ReturnVoid : +# 2197| v2197_11(void) = AliasedUse : ~m2198_16 +# 2197| v2197_12(void) = ExitFunction : + +# 2197| void vacuous_destructor_call::call_destructor(int&) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| m2197_2(unknown) = AliasedDefinition : +# 2197| m2197_3(unknown) = InitializeNonLocal : +# 2197| m2197_4(unknown) = Chi : total:m2197_2, partial:m2197_3 +# 2197| r2197_5(glval) = VariableAddress[t] : +# 2197| m2197_6(int &) = InitializeParameter[t] : &:r2197_5 +# 2197| r2197_7(int &) = Load[t] : &:r2197_5, m2197_6 +# 2197| m2197_8(unknown) = InitializeIndirection[t] : &:r2197_7 + +# 2201| void vacuous_destructor_call::non_vacuous_destructor_call() +# 2201| Block 0 +# 2201| v2201_1(void) = EnterFunction : +# 2201| m2201_2(unknown) = AliasedDefinition : +# 2201| m2201_3(unknown) = InitializeNonLocal : +# 2201| m2201_4(unknown) = Chi : total:m2201_2, partial:m2201_3 +# 2202| r2202_1(glval) = VariableAddress[c] : +# 2202| m2202_2(ClassWithDestructor) = Uninitialized[c] : &:r2202_1 +# 2202| r2202_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2202| v2202_4(void) = Call[ClassWithDestructor] : func:r2202_3, this:r2202_1 +# 2202| m2202_5(unknown) = ^CallSideEffect : ~m2201_4 +# 2202| m2202_6(unknown) = Chi : total:m2201_4, partial:m2202_5 +# 2202| m2202_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1 +# 2202| m2202_8(ClassWithDestructor) = Chi : total:m2202_2, partial:m2202_7 +# 2203| r2203_1(glval) = FunctionAddress[call_destructor] : +# 2203| r2203_2(glval) = VariableAddress[c] : +# 2203| r2203_3(ClassWithDestructor &) = CopyValue : r2203_2 +# 2203| v2203_4(void) = Call[call_destructor] : func:r2203_1, 0:r2203_3 +# 2203| m2203_5(unknown) = ^CallSideEffect : ~m2202_6 +# 2203| m2203_6(unknown) = Chi : total:m2202_6, partial:m2203_5 +# 2203| v2203_7(void) = ^BufferReadSideEffect[0] : &:r2203_3, ~m2202_8 +# 2203| m2203_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r2203_3 +# 2203| m2203_9(ClassWithDestructor) = Chi : total:m2202_8, partial:m2203_8 +# 2204| v2204_1(void) = NoOp : +# 2201| v2201_5(void) = ReturnVoid : +# 2201| v2201_6(void) = AliasedUse : ~m2203_6 +# 2201| v2201_7(void) = ExitFunction : + +# 2206| void vacuous_destructor_call::vacuous_destructor_call() +# 2206| Block 0 +# 2206| v2206_1(void) = EnterFunction : +# 2206| m2206_2(unknown) = AliasedDefinition : +# 2206| m2206_3(unknown) = InitializeNonLocal : +# 2206| m2206_4(unknown) = Chi : total:m2206_2, partial:m2206_3 +# 2207| r2207_1(glval) = VariableAddress[i] : +# 2207| m2207_2(int) = Uninitialized[i] : &:r2207_1 +# 2208| r2208_1(glval) = FunctionAddress[call_destructor] : +# 2208| r2208_2(glval) = VariableAddress[i] : +# 2208| r2208_3(int &) = CopyValue : r2208_2 +# 2208| v2208_4(void) = Call[call_destructor] : func:r2208_1, 0:r2208_3 +# 2208| m2208_5(unknown) = ^CallSideEffect : ~m2206_4 +# 2208| m2208_6(unknown) = Chi : total:m2206_4, partial:m2208_5 +# 2208| v2208_7(void) = ^BufferReadSideEffect[0] : &:r2208_3, ~m2207_2 +# 2208| m2208_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r2208_3 +# 2208| m2208_9(int) = Chi : total:m2207_2, partial:m2208_8 +# 2209| v2209_1(void) = NoOp : +# 2206| v2206_5(void) = ReturnVoid : +# 2206| v2206_6(void) = AliasedUse : ~m2208_6 +# 2206| v2206_7(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index b93c7d2649f..b034af530e4 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index b93c7d2649f..b034af530e4 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 1de5f8d5b8f..12aef1f3d1b 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2189,4 +2189,24 @@ void static_variable_with_destructor_3() { static ClassWithDestructor global_class_with_destructor; +namespace vacuous_destructor_call { + template + T& get(T& t) { return t; } + + template + void call_destructor(T& t) { + get(t).~T(); + } + + void non_vacuous_destructor_call() { + ClassWithDestructor c; + call_destructor(c); + } + + void vacuous_destructor_call() { + int i; + call_destructor(i); + } +} + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index fe7bebfa3cb..738d0c48ae8 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -10796,6 +10796,117 @@ | ir.cpp:2190:28:2190:55 | ChiTotal | total:m2190_7 | | ir.cpp:2190:28:2190:55 | SideEffect | ~m2190_2 | | ir.cpp:2190:28:2190:55 | SideEffect | ~m2190_9 | +| ir.cpp:2194:8:2194:8 | Address | &:r2194_16 | +| ir.cpp:2194:8:2194:8 | Address | &:r2194_16 | +| ir.cpp:2194:8:2194:8 | ChiPartial | partial:m2194_3 | +| ir.cpp:2194:8:2194:8 | ChiPartial | partial:m2194_3 | +| ir.cpp:2194:8:2194:8 | ChiTotal | total:m2194_2 | +| ir.cpp:2194:8:2194:8 | ChiTotal | total:m2194_2 | +| ir.cpp:2194:8:2194:8 | Load | m2194_14 | +| ir.cpp:2194:8:2194:8 | Load | m2194_14 | +| ir.cpp:2194:8:2194:8 | SideEffect | m2194_3 | +| ir.cpp:2194:8:2194:8 | SideEffect | m2194_3 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 | +| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 | +| ir.cpp:2194:15:2194:15 | Load | m2194_6 | +| ir.cpp:2194:15:2194:15 | Load | m2194_6 | +| ir.cpp:2194:15:2194:15 | SideEffect | m2194_8 | +| ir.cpp:2194:15:2194:15 | SideEffect | m2194_8 | +| ir.cpp:2194:20:2194:28 | Address | &:r2194_9 | +| ir.cpp:2194:20:2194:28 | Address | &:r2194_9 | +| ir.cpp:2194:27:2194:27 | Address | &:r2194_10 | +| ir.cpp:2194:27:2194:27 | Address | &:r2194_10 | +| ir.cpp:2194:27:2194:27 | Load | m2194_6 | +| ir.cpp:2194:27:2194:27 | Load | m2194_6 | +| ir.cpp:2194:27:2194:27 | StoreValue | r2194_13 | +| ir.cpp:2194:27:2194:27 | StoreValue | r2194_13 | +| ir.cpp:2194:27:2194:27 | Unary | r2194_11 | +| ir.cpp:2194:27:2194:27 | Unary | r2194_11 | +| ir.cpp:2194:27:2194:27 | Unary | r2194_12 | +| ir.cpp:2194:27:2194:27 | Unary | r2194_12 | +| ir.cpp:2197:10:2197:10 | ChiPartial | partial:m2197_3 | +| ir.cpp:2197:10:2197:10 | ChiPartial | partial:m2197_3 | +| ir.cpp:2197:10:2197:10 | ChiTotal | total:m2197_2 | +| ir.cpp:2197:10:2197:10 | ChiTotal | total:m2197_2 | +| ir.cpp:2197:10:2197:10 | SideEffect | ~m2198_16 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | +| ir.cpp:2197:29:2197:29 | Load | m2197_6 | +| ir.cpp:2197:29:2197:29 | Load | m2197_6 | +| ir.cpp:2197:29:2197:29 | SideEffect | m2198_19 | +| ir.cpp:2198:9:2198:11 | CallTarget | func:r2198_1 | +| ir.cpp:2198:9:2198:11 | ChiPartial | partial:m2198_7 | +| ir.cpp:2198:9:2198:11 | ChiTotal | total:m2197_4 | +| ir.cpp:2198:9:2198:11 | SideEffect | ~m2197_4 | +| ir.cpp:2198:9:2198:11 | Unary | r2198_6 | +| ir.cpp:2198:12:2198:15 | Address | &:r2198_12 | +| ir.cpp:2198:12:2198:15 | Address | &:r2198_12 | +| ir.cpp:2198:12:2198:15 | ChiPartial | partial:m2198_18 | +| ir.cpp:2198:12:2198:15 | ChiTotal | total:m2198_11 | +| ir.cpp:2198:12:2198:15 | SideEffect | ~m2198_11 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_2 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | +| ir.cpp:2198:13:2198:13 | Arg(0) | 0:r2198_5 | +| ir.cpp:2198:13:2198:13 | ChiPartial | partial:m2198_10 | +| ir.cpp:2198:13:2198:13 | ChiTotal | total:m2197_8 | +| ir.cpp:2198:13:2198:13 | Load | m2197_6 | +| ir.cpp:2198:13:2198:13 | SideEffect | ~m2197_8 | +| ir.cpp:2198:13:2198:13 | Unary | r2198_3 | +| ir.cpp:2198:13:2198:13 | Unary | r2198_4 | +| ir.cpp:2198:16:2198:17 | CallTarget | func:r2198_13 | +| ir.cpp:2198:16:2198:17 | ChiPartial | partial:m2198_15 | +| ir.cpp:2198:16:2198:17 | ChiTotal | total:m2198_8 | +| ir.cpp:2198:16:2198:17 | SideEffect | ~m2198_8 | +| ir.cpp:2201:10:2201:36 | ChiPartial | partial:m2201_3 | +| ir.cpp:2201:10:2201:36 | ChiTotal | total:m2201_2 | +| ir.cpp:2201:10:2201:36 | SideEffect | ~m2203_6 | +| ir.cpp:2202:29:2202:29 | Address | &:r2202_1 | +| ir.cpp:2202:29:2202:29 | Address | &:r2202_1 | +| ir.cpp:2202:29:2202:29 | Arg(this) | this:r2202_1 | +| ir.cpp:2202:29:2202:29 | CallTarget | func:r2202_3 | +| ir.cpp:2202:29:2202:29 | ChiPartial | partial:m2202_5 | +| ir.cpp:2202:29:2202:29 | ChiPartial | partial:m2202_7 | +| ir.cpp:2202:29:2202:29 | ChiTotal | total:m2201_4 | +| ir.cpp:2202:29:2202:29 | ChiTotal | total:m2202_2 | +| ir.cpp:2202:29:2202:29 | SideEffect | ~m2201_4 | +| ir.cpp:2203:9:2203:23 | CallTarget | func:r2203_1 | +| ir.cpp:2203:9:2203:23 | ChiPartial | partial:m2203_5 | +| ir.cpp:2203:9:2203:23 | ChiTotal | total:m2202_6 | +| ir.cpp:2203:9:2203:23 | SideEffect | ~m2202_6 | +| ir.cpp:2203:25:2203:25 | Address | &:r2203_3 | +| ir.cpp:2203:25:2203:25 | Address | &:r2203_3 | +| ir.cpp:2203:25:2203:25 | Arg(0) | 0:r2203_3 | +| ir.cpp:2203:25:2203:25 | ChiPartial | partial:m2203_8 | +| ir.cpp:2203:25:2203:25 | ChiTotal | total:m2202_8 | +| ir.cpp:2203:25:2203:25 | SideEffect | ~m2202_8 | +| ir.cpp:2203:25:2203:25 | Unary | r2203_2 | +| ir.cpp:2206:10:2206:32 | ChiPartial | partial:m2206_3 | +| ir.cpp:2206:10:2206:32 | ChiTotal | total:m2206_2 | +| ir.cpp:2206:10:2206:32 | SideEffect | ~m2208_6 | +| ir.cpp:2207:13:2207:13 | Address | &:r2207_1 | +| ir.cpp:2208:9:2208:23 | CallTarget | func:r2208_1 | +| ir.cpp:2208:9:2208:23 | ChiPartial | partial:m2208_5 | +| ir.cpp:2208:9:2208:23 | ChiTotal | total:m2206_4 | +| ir.cpp:2208:9:2208:23 | SideEffect | ~m2206_4 | +| ir.cpp:2208:25:2208:25 | Address | &:r2208_3 | +| ir.cpp:2208:25:2208:25 | Address | &:r2208_3 | +| ir.cpp:2208:25:2208:25 | Arg(0) | 0:r2208_3 | +| ir.cpp:2208:25:2208:25 | ChiPartial | partial:m2208_8 | +| ir.cpp:2208:25:2208:25 | ChiTotal | total:m2207_2 | +| ir.cpp:2208:25:2208:25 | SideEffect | ~m2207_2 | +| ir.cpp:2208:25:2208:25 | Unary | r2208_2 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index aefdbf9d134..f223394c95b 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -6,6 +6,8 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | +| ir.cpp:2198:12:2198:15 | CopyValue: (reference dereference) | Instruction 'CopyValue: (reference dereference)' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -21,6 +23,7 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1488:8:1488:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1488:8:1488:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | +| ir.cpp:2197:29:2197:29 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 9913148c609..832428b5f2e 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12366,6 +12366,149 @@ ir.cpp: # 2190| v2190_9(void) = AliasedUse : ~m? # 2190| v2190_10(void) = ExitFunction : +# 2194| ClassWithDestructor& vacuous_destructor_call::get(ClassWithDestructor&) +# 2194| Block 0 +# 2194| v2194_1(void) = EnterFunction : +# 2194| mu2194_2(unknown) = AliasedDefinition : +# 2194| mu2194_3(unknown) = InitializeNonLocal : +# 2194| r2194_4(glval) = VariableAddress[t] : +# 2194| mu2194_5(ClassWithDestructor &) = InitializeParameter[t] : &:r2194_4 +# 2194| r2194_6(ClassWithDestructor &) = Load[t] : &:r2194_4, ~m? +# 2194| mu2194_7(unknown) = InitializeIndirection[t] : &:r2194_6 +# 2194| r2194_8(glval) = VariableAddress[#return] : +# 2194| r2194_9(glval) = VariableAddress[t] : +# 2194| r2194_10(ClassWithDestructor &) = Load[t] : &:r2194_9, ~m? +# 2194| r2194_11(glval) = CopyValue : r2194_10 +# 2194| r2194_12(ClassWithDestructor &) = CopyValue : r2194_11 +# 2194| mu2194_13(ClassWithDestructor &) = Store[#return] : &:r2194_8, r2194_12 +# 2194| v2194_14(void) = ReturnIndirection[t] : &:r2194_6, ~m? +# 2194| r2194_15(glval) = VariableAddress[#return] : +# 2194| v2194_16(void) = ReturnValue : &:r2194_15, ~m? +# 2194| v2194_17(void) = AliasedUse : ~m? +# 2194| v2194_18(void) = ExitFunction : + +# 2194| int& vacuous_destructor_call::get(int&) +# 2194| Block 0 +# 2194| v2194_1(void) = EnterFunction : +# 2194| mu2194_2(unknown) = AliasedDefinition : +# 2194| mu2194_3(unknown) = InitializeNonLocal : +# 2194| r2194_4(glval) = VariableAddress[t] : +# 2194| mu2194_5(int &) = InitializeParameter[t] : &:r2194_4 +# 2194| r2194_6(int &) = Load[t] : &:r2194_4, ~m? +# 2194| mu2194_7(unknown) = InitializeIndirection[t] : &:r2194_6 +# 2194| r2194_8(glval) = VariableAddress[#return] : +# 2194| r2194_9(glval) = VariableAddress[t] : +# 2194| r2194_10(int &) = Load[t] : &:r2194_9, ~m? +# 2194| r2194_11(glval) = CopyValue : r2194_10 +# 2194| r2194_12(int &) = CopyValue : r2194_11 +# 2194| mu2194_13(int &) = Store[#return] : &:r2194_8, r2194_12 +# 2194| v2194_14(void) = ReturnIndirection[t] : &:r2194_6, ~m? +# 2194| r2194_15(glval) = VariableAddress[#return] : +# 2194| v2194_16(void) = ReturnValue : &:r2194_15, ~m? +# 2194| v2194_17(void) = AliasedUse : ~m? +# 2194| v2194_18(void) = ExitFunction : + +# 2197| void vacuous_destructor_call::call_destructor(ClassWithDestructor&) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| mu2197_2(unknown) = AliasedDefinition : +# 2197| mu2197_3(unknown) = InitializeNonLocal : +# 2197| r2197_4(glval) = VariableAddress[t] : +# 2197| mu2197_5(ClassWithDestructor &) = InitializeParameter[t] : &:r2197_4 +# 2197| r2197_6(ClassWithDestructor &) = Load[t] : &:r2197_4, ~m? +# 2197| mu2197_7(unknown) = InitializeIndirection[t] : &:r2197_6 +# 2198| r2198_1(glval) = FunctionAddress[get] : +# 2198| r2198_2(glval) = VariableAddress[t] : +# 2198| r2198_3(ClassWithDestructor &) = Load[t] : &:r2198_2, ~m? +# 2198| r2198_4(glval) = CopyValue : r2198_3 +# 2198| r2198_5(ClassWithDestructor &) = CopyValue : r2198_4 +# 2198| r2198_6(ClassWithDestructor &) = Call[get] : func:r2198_1, 0:r2198_5 +# 2198| mu2198_7(unknown) = ^CallSideEffect : ~m? +# 2198| v2198_8(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m? +# 2198| mu2198_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5 +# 2198| r2198_10(glval) = CopyValue : r2198_6 +# 2198| r2198_11(glval) = FunctionAddress[~ClassWithDestructor] : +# 2198| v2198_12(void) = Call[~ClassWithDestructor] : func:r2198_11 +# 2198| mu2198_13(unknown) = ^CallSideEffect : ~m? +# 2198| v2198_14(void) = ^IndirectReadSideEffect[-1] : &:r2198_10, ~m? +# 2198| mu2198_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2198_10 +# 2199| v2199_1(void) = NoOp : +# 2197| v2197_8(void) = ReturnIndirection[t] : &:r2197_6, ~m? +# 2197| v2197_9(void) = ReturnVoid : +# 2197| v2197_10(void) = AliasedUse : ~m? +# 2197| v2197_11(void) = ExitFunction : + +# 2197| void vacuous_destructor_call::call_destructor(int&) +# 2197| Block 0 +# 2197| v2197_1(void) = EnterFunction : +# 2197| mu2197_2(unknown) = AliasedDefinition : +# 2197| mu2197_3(unknown) = InitializeNonLocal : +# 2197| r2197_4(glval) = VariableAddress[t] : +# 2197| mu2197_5(int &) = InitializeParameter[t] : &:r2197_4 +# 2197| r2197_6(int &) = Load[t] : &:r2197_4, ~m? +# 2197| mu2197_7(unknown) = InitializeIndirection[t] : &:r2197_6 + +# 2198| Block 1 +# 2198| r2198_1(glval) = FunctionAddress[get] : +# 2198| r2198_2(glval) = VariableAddress[t] : +# 2198| r2198_3(int &) = Load[t] : &:r2198_2, ~m? +# 2198| r2198_4(glval) = CopyValue : r2198_3 +# 2198| r2198_5(int &) = CopyValue : r2198_4 +# 2198| r2198_6(int &) = Call[get] : func:r2198_1, 0:r2198_5 +# 2198| mu2198_7(unknown) = ^CallSideEffect : ~m? +# 2198| v2198_8(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m? +# 2198| mu2198_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5 +# 2198| r2198_10(glval) = CopyValue : r2198_6 + +# 2199| Block 2 +# 2199| v2199_1(void) = NoOp : +# 2197| v2197_8(void) = ReturnIndirection[t] : &:r2197_6, ~m? +# 2197| v2197_9(void) = ReturnVoid : +# 2197| v2197_10(void) = AliasedUse : ~m? +# 2197| v2197_11(void) = ExitFunction : + +# 2201| void vacuous_destructor_call::non_vacuous_destructor_call() +# 2201| Block 0 +# 2201| v2201_1(void) = EnterFunction : +# 2201| mu2201_2(unknown) = AliasedDefinition : +# 2201| mu2201_3(unknown) = InitializeNonLocal : +# 2202| r2202_1(glval) = VariableAddress[c] : +# 2202| mu2202_2(ClassWithDestructor) = Uninitialized[c] : &:r2202_1 +# 2202| r2202_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2202| v2202_4(void) = Call[ClassWithDestructor] : func:r2202_3, this:r2202_1 +# 2202| mu2202_5(unknown) = ^CallSideEffect : ~m? +# 2202| mu2202_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1 +# 2203| r2203_1(glval) = FunctionAddress[call_destructor] : +# 2203| r2203_2(glval) = VariableAddress[c] : +# 2203| r2203_3(ClassWithDestructor &) = CopyValue : r2203_2 +# 2203| v2203_4(void) = Call[call_destructor] : func:r2203_1, 0:r2203_3 +# 2203| mu2203_5(unknown) = ^CallSideEffect : ~m? +# 2203| v2203_6(void) = ^BufferReadSideEffect[0] : &:r2203_3, ~m? +# 2203| mu2203_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r2203_3 +# 2204| v2204_1(void) = NoOp : +# 2201| v2201_4(void) = ReturnVoid : +# 2201| v2201_5(void) = AliasedUse : ~m? +# 2201| v2201_6(void) = ExitFunction : + +# 2206| void vacuous_destructor_call::vacuous_destructor_call() +# 2206| Block 0 +# 2206| v2206_1(void) = EnterFunction : +# 2206| mu2206_2(unknown) = AliasedDefinition : +# 2206| mu2206_3(unknown) = InitializeNonLocal : +# 2207| r2207_1(glval) = VariableAddress[i] : +# 2207| mu2207_2(int) = Uninitialized[i] : &:r2207_1 +# 2208| r2208_1(glval) = FunctionAddress[call_destructor] : +# 2208| r2208_2(glval) = VariableAddress[i] : +# 2208| r2208_3(int &) = CopyValue : r2208_2 +# 2208| v2208_4(void) = Call[call_destructor] : func:r2208_1, 0:r2208_3 +# 2208| mu2208_5(unknown) = ^CallSideEffect : ~m? +# 2208| v2208_6(void) = ^BufferReadSideEffect[0] : &:r2208_3, ~m? +# 2208| mu2208_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r2208_3 +# 2209| v2209_1(void) = NoOp : +# 2206| v2206_4(void) = ReturnVoid : +# 2206| v2206_5(void) = AliasedUse : ~m? +# 2206| v2206_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index b93c7d2649f..b034af530e4 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index b93c7d2649f..b034af530e4 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From e62a0805db04e31b4faaa8e13066ce557e2ba1f2 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Tue, 27 Feb 2024 13:44:52 +0000 Subject: [PATCH 184/207] Add test for map literal --- .../semmle/go/dataflow/MapReadsAndStores/test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go index b27443a6d89..4a7b757d165 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go @@ -15,3 +15,11 @@ func main() { sink(val) // $ hasValueFlow="val" } } + +func testLiteral() { + someMap := map[string]string {"someKey": source()} + + for _, val := range someMap { + sink(val) // $ hasValueFlow="val" + } +} From 74448c092a862aaf75cd87d0fa093324fb87bd78 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Tue, 27 Feb 2024 13:49:12 +0000 Subject: [PATCH 185/207] Autoformat / uglify --- .../library-tests/semmle/go/dataflow/MapReadsAndStores/test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go index 4a7b757d165..7e42e4c038e 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go @@ -17,7 +17,7 @@ func main() { } func testLiteral() { - someMap := map[string]string {"someKey": source()} + someMap := map[string]string{"someKey": source()} for _, val := range someMap { sink(val) // $ hasValueFlow="val" From 9eaa4e19ad575dae54d0c8a62f70cb95b1abc2d3 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 27 Feb 2024 12:54:04 +0000 Subject: [PATCH 186/207] C++: Add IR construction for vacuous destructor calls. --- .../raw/internal/TranslatedExpr.qll | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 4bf21a43f63..a9f1f7f603e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -2208,6 +2208,43 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St private TranslatedExpr getDestructorCall() { result = getTranslatedExpr(expr.getExpr()) } } +/** + * The IR translation of a vacuous destructor call. That is, an expression that + * looks like a destructor call, but has no effect. + * + * Note that, even though there's no destructor call, we should still evaluate + * the qualifier. + */ +class TranslatedVacuousDestructorCall extends TranslatedNonConstantExpr { + override VacuousDestructorCall expr; + + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + + final TranslatedExpr getQualifier() { + result = getTranslatedExpr(expr.getQualifier().getFullyConverted()) + } + + override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getQualifier().getFirstInstruction(kind) + } + + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + child = this.getQualifier() and + result = this.getParent().getChildSuccessor(this, kind) + } + + override TranslatedElement getChild(int id) { + id = 0 and + result = this.getQualifier() + } + + override Instruction getResult() { none() } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + none() + } +} + /** * The IR translation of the `?:` operator. This class has the portions of the implementation that * are shared between the standard three-operand form (`a ? b : c`) and the GCC-extension From 4a501e5b3cc3abfe3f813eb1107dc14dd3e4e92a Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 27 Feb 2024 13:51:10 +0000 Subject: [PATCH 187/207] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 33 ++++++++++++++----- .../ir/ir/aliased_ssa_consistency.expected | 1 - .../aliased_ssa_consistency_unsound.expected | 1 - .../ir/ir/operand_locations.expected | 18 ++++++++++ .../ir/ir/raw_consistency.expected | 3 -- .../test/library-tests/ir/ir/raw_ir.expected | 28 +++++++--------- .../ir/ir/unaliased_ssa_consistency.expected | 1 - ...unaliased_ssa_consistency_unsound.expected | 1 - 8 files changed, 55 insertions(+), 31 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index a516eeccb13..0860cacdc7a 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -13350,14 +13350,31 @@ ir.cpp: # 2197| void vacuous_destructor_call::call_destructor(int&) # 2197| Block 0 -# 2197| v2197_1(void) = EnterFunction : -# 2197| m2197_2(unknown) = AliasedDefinition : -# 2197| m2197_3(unknown) = InitializeNonLocal : -# 2197| m2197_4(unknown) = Chi : total:m2197_2, partial:m2197_3 -# 2197| r2197_5(glval) = VariableAddress[t] : -# 2197| m2197_6(int &) = InitializeParameter[t] : &:r2197_5 -# 2197| r2197_7(int &) = Load[t] : &:r2197_5, m2197_6 -# 2197| m2197_8(unknown) = InitializeIndirection[t] : &:r2197_7 +# 2197| v2197_1(void) = EnterFunction : +# 2197| m2197_2(unknown) = AliasedDefinition : +# 2197| m2197_3(unknown) = InitializeNonLocal : +# 2197| m2197_4(unknown) = Chi : total:m2197_2, partial:m2197_3 +# 2197| r2197_5(glval) = VariableAddress[t] : +# 2197| m2197_6(int &) = InitializeParameter[t] : &:r2197_5 +# 2197| r2197_7(int &) = Load[t] : &:r2197_5, m2197_6 +# 2197| m2197_8(unknown) = InitializeIndirection[t] : &:r2197_7 +# 2198| r2198_1(glval) = FunctionAddress[get] : +# 2198| r2198_2(glval) = VariableAddress[t] : +# 2198| r2198_3(int &) = Load[t] : &:r2198_2, m2197_6 +# 2198| r2198_4(glval) = CopyValue : r2198_3 +# 2198| r2198_5(int &) = CopyValue : r2198_4 +# 2198| r2198_6(int &) = Call[get] : func:r2198_1, 0:r2198_5 +# 2198| m2198_7(unknown) = ^CallSideEffect : ~m2197_4 +# 2198| m2198_8(unknown) = Chi : total:m2197_4, partial:m2198_7 +# 2198| v2198_9(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m2197_8 +# 2198| m2198_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5 +# 2198| m2198_11(unknown) = Chi : total:m2197_8, partial:m2198_10 +# 2198| r2198_12(glval) = CopyValue : r2198_6 +# 2199| v2199_1(void) = NoOp : +# 2197| v2197_9(void) = ReturnIndirection[t] : &:r2197_7, m2198_11 +# 2197| v2197_10(void) = ReturnVoid : +# 2197| v2197_11(void) = AliasedUse : ~m2198_8 +# 2197| v2197_12(void) = ExitFunction : # 2201| void vacuous_destructor_call::non_vacuous_destructor_call() # 2201| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index b034af530e4..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index b034af530e4..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 738d0c48ae8..bcfa7aec155 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -10834,6 +10834,7 @@ | ir.cpp:2197:10:2197:10 | ChiPartial | partial:m2197_3 | | ir.cpp:2197:10:2197:10 | ChiTotal | total:m2197_2 | | ir.cpp:2197:10:2197:10 | ChiTotal | total:m2197_2 | +| ir.cpp:2197:10:2197:10 | SideEffect | ~m2198_8 | | ir.cpp:2197:10:2197:10 | SideEffect | ~m2198_16 | | ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | | ir.cpp:2197:29:2197:29 | Address | &:r2197_5 | @@ -10842,13 +10843,20 @@ | ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | | ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | | ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | +| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 | | ir.cpp:2197:29:2197:29 | Load | m2197_6 | | ir.cpp:2197:29:2197:29 | Load | m2197_6 | +| ir.cpp:2197:29:2197:29 | SideEffect | m2198_11 | | ir.cpp:2197:29:2197:29 | SideEffect | m2198_19 | | ir.cpp:2198:9:2198:11 | CallTarget | func:r2198_1 | +| ir.cpp:2198:9:2198:11 | CallTarget | func:r2198_1 | +| ir.cpp:2198:9:2198:11 | ChiPartial | partial:m2198_7 | | ir.cpp:2198:9:2198:11 | ChiPartial | partial:m2198_7 | | ir.cpp:2198:9:2198:11 | ChiTotal | total:m2197_4 | +| ir.cpp:2198:9:2198:11 | ChiTotal | total:m2197_4 | | ir.cpp:2198:9:2198:11 | SideEffect | ~m2197_4 | +| ir.cpp:2198:9:2198:11 | SideEffect | ~m2197_4 | +| ir.cpp:2198:9:2198:11 | Unary | r2198_6 | | ir.cpp:2198:9:2198:11 | Unary | r2198_6 | | ir.cpp:2198:12:2198:15 | Address | &:r2198_12 | | ir.cpp:2198:12:2198:15 | Address | &:r2198_12 | @@ -10856,14 +10864,24 @@ | ir.cpp:2198:12:2198:15 | ChiTotal | total:m2198_11 | | ir.cpp:2198:12:2198:15 | SideEffect | ~m2198_11 | | ir.cpp:2198:13:2198:13 | Address | &:r2198_2 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_2 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | +| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | | ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | | ir.cpp:2198:13:2198:13 | Address | &:r2198_5 | | ir.cpp:2198:13:2198:13 | Arg(0) | 0:r2198_5 | +| ir.cpp:2198:13:2198:13 | Arg(0) | 0:r2198_5 | +| ir.cpp:2198:13:2198:13 | ChiPartial | partial:m2198_10 | | ir.cpp:2198:13:2198:13 | ChiPartial | partial:m2198_10 | | ir.cpp:2198:13:2198:13 | ChiTotal | total:m2197_8 | +| ir.cpp:2198:13:2198:13 | ChiTotal | total:m2197_8 | +| ir.cpp:2198:13:2198:13 | Load | m2197_6 | | ir.cpp:2198:13:2198:13 | Load | m2197_6 | | ir.cpp:2198:13:2198:13 | SideEffect | ~m2197_8 | +| ir.cpp:2198:13:2198:13 | SideEffect | ~m2197_8 | | ir.cpp:2198:13:2198:13 | Unary | r2198_3 | +| ir.cpp:2198:13:2198:13 | Unary | r2198_3 | +| ir.cpp:2198:13:2198:13 | Unary | r2198_4 | | ir.cpp:2198:13:2198:13 | Unary | r2198_4 | | ir.cpp:2198:16:2198:17 | CallTarget | func:r2198_13 | | ir.cpp:2198:16:2198:17 | ChiPartial | partial:m2198_15 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index f223394c95b..aefdbf9d134 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -6,8 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | -| ir.cpp:2198:12:2198:15 | CopyValue: (reference dereference) | Instruction 'CopyValue: (reference dereference)' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -23,7 +21,6 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1488:8:1488:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1488:8:1488:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | -| ir.cpp:2197:29:2197:29 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 832428b5f2e..f297449e7f6 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -12440,15 +12440,13 @@ ir.cpp: # 2197| void vacuous_destructor_call::call_destructor(int&) # 2197| Block 0 -# 2197| v2197_1(void) = EnterFunction : -# 2197| mu2197_2(unknown) = AliasedDefinition : -# 2197| mu2197_3(unknown) = InitializeNonLocal : -# 2197| r2197_4(glval) = VariableAddress[t] : -# 2197| mu2197_5(int &) = InitializeParameter[t] : &:r2197_4 -# 2197| r2197_6(int &) = Load[t] : &:r2197_4, ~m? -# 2197| mu2197_7(unknown) = InitializeIndirection[t] : &:r2197_6 - -# 2198| Block 1 +# 2197| v2197_1(void) = EnterFunction : +# 2197| mu2197_2(unknown) = AliasedDefinition : +# 2197| mu2197_3(unknown) = InitializeNonLocal : +# 2197| r2197_4(glval) = VariableAddress[t] : +# 2197| mu2197_5(int &) = InitializeParameter[t] : &:r2197_4 +# 2197| r2197_6(int &) = Load[t] : &:r2197_4, ~m? +# 2197| mu2197_7(unknown) = InitializeIndirection[t] : &:r2197_6 # 2198| r2198_1(glval) = FunctionAddress[get] : # 2198| r2198_2(glval) = VariableAddress[t] : # 2198| r2198_3(int &) = Load[t] : &:r2198_2, ~m? @@ -12459,13 +12457,11 @@ ir.cpp: # 2198| v2198_8(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m? # 2198| mu2198_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5 # 2198| r2198_10(glval) = CopyValue : r2198_6 - -# 2199| Block 2 -# 2199| v2199_1(void) = NoOp : -# 2197| v2197_8(void) = ReturnIndirection[t] : &:r2197_6, ~m? -# 2197| v2197_9(void) = ReturnVoid : -# 2197| v2197_10(void) = AliasedUse : ~m? -# 2197| v2197_11(void) = ExitFunction : +# 2199| v2199_1(void) = NoOp : +# 2197| v2197_8(void) = ReturnIndirection[t] : &:r2197_6, ~m? +# 2197| v2197_9(void) = ReturnVoid : +# 2197| v2197_10(void) = AliasedUse : ~m? +# 2197| v2197_11(void) = ExitFunction : # 2201| void vacuous_destructor_call::non_vacuous_destructor_call() # 2201| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index b034af530e4..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index b034af530e4..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor(int&) | void vacuous_destructor_call::call_destructor(int&) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From a6480a4ca195496d655036151559ed03a8fdf665 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Tue, 27 Feb 2024 13:55:26 +0000 Subject: [PATCH 188/207] Autoformat again / tabify --- .../semmle/go/dataflow/MapReadsAndStores/test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go index 7e42e4c038e..b6dedf748b3 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/MapReadsAndStores/test.go @@ -17,9 +17,9 @@ func main() { } func testLiteral() { - someMap := map[string]string{"someKey": source()} + someMap := map[string]string{"someKey": source()} - for _, val := range someMap { - sink(val) // $ hasValueFlow="val" - } + for _, val := range someMap { + sink(val) // $ hasValueFlow="val" + } } From dc3b78dd7c2dc4f9fdd3ecb8d5805028b1762ae6 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 27 Feb 2024 14:30:19 +0000 Subject: [PATCH 189/207] C++: Accept more test changes. --- .../library-tests/syntax-zoo/aliased_ssa_consistency.expected | 1 - cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected | 4 ---- .../syntax-zoo/unaliased_ssa_consistency.expected | 1 - 3 files changed, 6 deletions(-) diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index c2e0783d70f..48f73fa8d87 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -7,7 +7,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index caff6369ad9..9c9cad3aefb 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -8,9 +8,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | -| VacuousDestructorCall.cpp:3:3:3:3 | VariableAddress: x | Instruction 'VariableAddress: x' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | -| VacuousDestructorCall.cpp:4:3:4:3 | Load: y | Instruction 'Load: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | @@ -30,7 +27,6 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition -| VacuousDestructorCall.cpp:2:29:2:29 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | ms_try_except.cpp:9:19:9:19 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_except.cpp:9:19:9:19 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_except.cpp:19:17:19:21 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index c2e0783d70f..48f73fa8d87 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -7,7 +7,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | From aedd3badf7bf8f58b5f53f86f252fffcccf14d00 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Tue, 27 Feb 2024 15:41:43 +0000 Subject: [PATCH 190/207] Add change note for https://github.com/github/codeql/pull/15646 --- java/ql/lib/change-notes/2024-02-27-mvnw-versions.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 java/ql/lib/change-notes/2024-02-27-mvnw-versions.md diff --git a/java/ql/lib/change-notes/2024-02-27-mvnw-versions.md b/java/ql/lib/change-notes/2024-02-27-mvnw-versions.md new file mode 100644 index 00000000000..a0227088ae9 --- /dev/null +++ b/java/ql/lib/change-notes/2024-02-27-mvnw-versions.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed the Java autobuilder overriding the version of Maven used by a project when the Maven wrapper `mvnw` is in use and the `maven-wrapper.jar` file is not present in the repository. From f9c2b4d23c1d2899706b8af42e2684705383b201 Mon Sep 17 00:00:00 2001 From: Felicity Chapman Date: Tue, 27 Feb 2024 16:47:13 +0000 Subject: [PATCH 191/207] MVP changes for C# library expansion support --- .../using-the-codeql-model-editor.rst | 8 +++++--- docs/codeql/reusables/beta-note-model-pack-editor-vsc.rst | 2 +- docs/codeql/reusables/beta-note-model-packs-java.rst | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst index 0eaa4518118..11840db8417 100644 --- a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst +++ b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst @@ -18,9 +18,9 @@ When you open the model editor, it analyzes the currently selected CodeQL databa The model editor has two different modes: -- Application mode (default view): The editor lists each external framework used by the selected CodeQL database. When you expand a framework, a list of all calls to and from the external API is shown with the options available to model dataflow through each call. This mode is most useful for improving the CodeQL results for a specific codebase. +- **Application mode (default view):** The editor lists each external framework used by the selected CodeQL database. When you expand a framework, a list of all calls to and from the external API is shown with the options available to model dataflow through each call. This mode is most useful for improving the CodeQL results for a specific codebase. -- Dependency mode: The editor identifies all of the publicly accessible APIs in the selected CodeQL database. This view guides you through modeling each public API that the codebase makes available. When you have finished modeling the entire API, you can save the model and use it to improve the CodeQL analysis for all codebases that use the dependency. +- **Dependency mode:** The editor identifies all of the publicly accessible APIs in the selected CodeQL database. This view guides you through modeling each public API that the codebase makes available. When you have finished modeling the entire API, you can save the model and use it to improve the CodeQL analysis for all codebases that use the dependency. Displaying the CodeQL model editor ---------------------------------- @@ -39,7 +39,7 @@ Displaying the CodeQL model editor Modeling the calls your codebase makes to external APIs ------------------------------------------------------- -You typically use this approach when you are looking at a specific codebase where you want to improve the precision of CodeQL results. This is useful when the codebase uses frameworks or libraries that are not supported by CodeQL and if the source code of the framework or library is not included in the analysis. +You typically use this approach when you are looking at a specific codebase where you want to improve the precision of CodeQL results. This is useful when the codebase uses frameworks or libraries that are not supported by CodeQL and if the source code of the framework or library is not included in the analysis. This section uses an open source Java project called "sofa-jraft" as an example. The experience of modeling other static languages is similar. #. Select the CodeQL database that you want to improve CodeQL coverage for. #. Display the CodeQL model editor. By default the editor runs in application mode, so the list of external APIs used by the selected codebase is shown. @@ -90,6 +90,8 @@ The models are stored in a series of YAML data extension files, one for each ext Modeling the public API of a codebase ------------------------------------- +This section uses an open source Java project called "sofa-jraft" as an example. The experience of modeling other static languages is similar. + You typically use this method when you want to model a framework or library that your organization uses in more than one codebase. Once you have finished creating and testing the model, you can publish the CodeQL model pack to the GitHub Container Registry for your whole organization to use. #. Select the CodeQL database that you want to model. diff --git a/docs/codeql/reusables/beta-note-model-pack-editor-vsc.rst b/docs/codeql/reusables/beta-note-model-pack-editor-vsc.rst index 161a837d71a..aed5fdae17e 100644 --- a/docs/codeql/reusables/beta-note-model-pack-editor-vsc.rst +++ b/docs/codeql/reusables/beta-note-model-pack-editor-vsc.rst @@ -2,4 +2,4 @@ Note - The CodeQL model editor and CodeQL model packs are currently in beta and subject to change. During the beta, model packs are supported only by Java/Kotlin analysis. To use this beta functionality, install the latest version of the CodeQL extension for Visual Studio Code. + The CodeQL model editor and CodeQL model packs are currently in beta and subject to change. During the beta, model packs are supported only by Java/Kotlin and C# analysis. To use this beta functionality, install the latest version of the CodeQL extension for Visual Studio Code. diff --git a/docs/codeql/reusables/beta-note-model-packs-java.rst b/docs/codeql/reusables/beta-note-model-packs-java.rst index 049621a57f7..f8286086034 100644 --- a/docs/codeql/reusables/beta-note-model-packs-java.rst +++ b/docs/codeql/reusables/beta-note-model-packs-java.rst @@ -2,4 +2,4 @@ Note - CodeQL model packs are currently in beta and subject to change. During the beta, model packs are supported only by Java/Kotlin analysis. To use this beta functionality, install the latest version of the CodeQL CLI bundle from: https://github.com/github/codeql-action/releases. + CodeQL model packs are currently in beta and subject to change. During the beta, model packs are supported only by Java/Kotlin (CodeQL CLI 2.15.0+) and C# (CodeQL CLI 2.16.0+) analysis. To use this beta functionality, install the latest version of the CodeQL CLI bundle from: https://github.com/github/codeql-action/releases. From 892f97cd7a9a3a48039097c5ac55619f67d6609d Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 27 Feb 2024 17:40:49 +0000 Subject: [PATCH 192/207] C++: Add testcase with invalid IR from constructing a 'RoutineType'. --- .../library-tests/ir/ir/PrintAST.expected | 19 +++++++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 8 ++++++++ .../ir/ir/aliased_ssa_consistency.expected | 1 + .../aliased_ssa_consistency_unsound.expected | 1 + cpp/ql/test/library-tests/ir/ir/ir.cpp | 15 +++++++++++++++ .../ir/ir/operand_locations.expected | 2 ++ .../ir/ir/raw_consistency.expected | 3 +++ .../test/library-tests/ir/ir/raw_ir.expected | 14 ++++++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 1 + ...unaliased_ssa_consistency_unsound.expected | 1 + 10 files changed, 65 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 216d455ed9a..24501a4bcae 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -18076,6 +18076,25 @@ ir.cpp: # 2317| getQualifier(): [VariableAccess] s # 2317| Type = [Struct] String # 2317| ValueCategory = lvalue +# 2320| [CopyAssignmentOperator] return_routine_type::HasVoidToIntFunc& return_routine_type::HasVoidToIntFunc::operator=(return_routine_type::HasVoidToIntFunc const&) +# 2320| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const HasVoidToIntFunc & +# 2320| [MoveAssignmentOperator] return_routine_type::HasVoidToIntFunc& return_routine_type::HasVoidToIntFunc::operator=(return_routine_type::HasVoidToIntFunc&&) +# 2320| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] HasVoidToIntFunc && +# 2322| [MemberFunction] void return_routine_type::HasVoidToIntFunc::VoidToInt(int) +# 2322| : +# 2322| getParameter(0): [Parameter] (unnamed parameter 0) +# 2322| Type = [IntType] int +# 2327| [TopLevelFunction] return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() +# 2327| : +# 2328| getEntryPoint(): [BlockStmt] { ... } +# 2329| getStmt(0): [ReturnStmt] return ... +# 2329| getExpr(): [FunctionAccess] VoidToInt +# 2329| Type = [RoutineType] ..()(..) +# 2329| ValueCategory = prvalue perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index fc84fc40a74..d463f72dbcb 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -14579,6 +14579,14 @@ ir.cpp: # 2314| v2314_6(void) = AliasedUse : ~m2317_5 # 2314| v2314_7(void) = ExitFunction : +# 2327| return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() +# 2327| Block 0 +# 2327| v2327_1(void) = EnterFunction : +# 2327| m2327_2(unknown) = AliasedDefinition : +# 2327| m2327_3(unknown) = InitializeNonLocal : +# 2327| m2327_4(unknown) = Chi : total:m2327_2, partial:m2327_3 +# 2329| r2329_1(glval<..:: *>) = VariableAddress[#return] : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index b93c7d2649f..599bbe8d2b8 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index b93c7d2649f..599bbe8d2b8 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index a9d21afd5f9..b63449d96f0 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2316,4 +2316,19 @@ void VoidReturnDestructors() { return VoidFunc(); } +namespace return_routine_type { + struct HasVoidToIntFunc + { + void VoidToInt(int); + }; + + typedef void (HasVoidToIntFunc::*VoidToIntMemberFunc)(int); + + static VoidToIntMemberFunc GetVoidToIntFunc() + { + return &HasVoidToIntFunc::VoidToInt; + } + +} + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 3fd4e251e9a..346a58a2580 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -12029,6 +12029,8 @@ | ir.cpp:2317:1:2317:1 | ChiTotal | total:m2316_4 | | ir.cpp:2317:1:2317:1 | SideEffect | m2315_8 | | ir.cpp:2317:1:2317:1 | SideEffect | ~m2316_4 | +| ir.cpp:2327:32:2327:47 | ChiPartial | partial:m2327_3 | +| ir.cpp:2327:32:2327:47 | ChiTotal | total:m2327_2 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index aefdbf9d134..38746cc411b 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,4 +1,5 @@ missingOperand +| ir.cpp:2329:16:2329:43 | Store: VoidToInt | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | unexpectedOperand duplicateOperand missingPhiOperand @@ -6,6 +7,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -21,6 +23,7 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1488:8:1488:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1488:8:1488:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | +| ir.cpp:2329:9:2329:44 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index a93f2a95b96..595ea4fe7b2 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -13510,6 +13510,20 @@ ir.cpp: # 2314| v2314_5(void) = AliasedUse : ~m? # 2314| v2314_6(void) = ExitFunction : +# 2327| return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() +# 2327| Block 0 +# 2327| v2327_1(void) = EnterFunction : +# 2327| mu2327_2(unknown) = AliasedDefinition : +# 2327| mu2327_3(unknown) = InitializeNonLocal : +# 2329| r2329_1(glval<..:: *>) = VariableAddress[#return] : + +# 2329| Block 1 +# 2329| mu2329_2(..:: *) = Store[#return] : &:r2329_1 +# 2327| r2327_4(glval<..:: *>) = VariableAddress[#return] : +# 2327| v2327_5(void) = ReturnValue : &:r2327_4, ~m? +# 2327| v2327_6(void) = AliasedUse : ~m? +# 2327| v2327_7(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index b93c7d2649f..599bbe8d2b8 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index b93c7d2649f..599bbe8d2b8 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From ddd5113c02a16cba85f1fda270c5f721c8999456 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 27 Feb 2024 17:41:19 +0000 Subject: [PATCH 193/207] C++: Ensure that we can construct an 'IRType' from a 'RoutineType'. --- cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll index c1d97d36360..f61a3a52c6b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll @@ -11,7 +11,7 @@ private int getTypeSizeWorkaround(Type type) { exists(Type unspecifiedType | unspecifiedType = type.getUnspecifiedType() and ( - unspecifiedType instanceof FunctionReferenceType and + (unspecifiedType instanceof FunctionReferenceType or unspecifiedType instanceof RoutineType) and result = getPointerSize() or exists(PointerToMemberType ptmType | @@ -176,7 +176,7 @@ private IRType getIRTypeForPRValue(Type type) { isPointerIshType(unspecifiedType) and result.(IRAddressType).getByteSize() = getTypeSize(unspecifiedType) or - unspecifiedType instanceof FunctionPointerIshType and + (unspecifiedType instanceof FunctionPointerIshType or unspecifiedType instanceof RoutineType) and result.(IRFunctionAddressType).getByteSize() = getTypeSize(type) or unspecifiedType instanceof VoidType and result instanceof IRVoidType From b8c141f2921fdfeb6b3bd77ea535b50053ca6b01 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 27 Feb 2024 17:43:44 +0000 Subject: [PATCH 194/207] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 16 +++++++++----- .../ir/ir/aliased_ssa_consistency.expected | 1 - .../aliased_ssa_consistency_unsound.expected | 1 - .../ir/ir/operand_locations.expected | 5 +++++ .../ir/ir/raw_consistency.expected | 3 --- .../test/library-tests/ir/ir/raw_ir.expected | 21 +++++++++---------- .../ir/ir/unaliased_ssa_consistency.expected | 1 - ...unaliased_ssa_consistency_unsound.expected | 1 - 8 files changed, 26 insertions(+), 23 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index d463f72dbcb..510a271b7ac 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -14581,11 +14581,17 @@ ir.cpp: # 2327| return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() # 2327| Block 0 -# 2327| v2327_1(void) = EnterFunction : -# 2327| m2327_2(unknown) = AliasedDefinition : -# 2327| m2327_3(unknown) = InitializeNonLocal : -# 2327| m2327_4(unknown) = Chi : total:m2327_2, partial:m2327_3 -# 2329| r2329_1(glval<..:: *>) = VariableAddress[#return] : +# 2327| v2327_1(void) = EnterFunction : +# 2327| m2327_2(unknown) = AliasedDefinition : +# 2327| m2327_3(unknown) = InitializeNonLocal : +# 2327| m2327_4(unknown) = Chi : total:m2327_2, partial:m2327_3 +# 2329| r2329_1(glval<..:: *>) = VariableAddress[#return] : +# 2329| r2329_2(..()(..)) = FunctionAddress[VoidToInt] : +# 2329| m2329_3(..:: *) = Store[#return] : &:r2329_1, r2329_2 +# 2327| r2327_5(glval<..:: *>) = VariableAddress[#return] : +# 2327| v2327_6(void) = ReturnValue : &:r2327_5, m2329_3 +# 2327| v2327_7(void) = AliasedUse : m2327_3 +# 2327| v2327_8(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 599bbe8d2b8..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 599bbe8d2b8..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 346a58a2580..6d9a76dc068 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -12029,8 +12029,13 @@ | ir.cpp:2317:1:2317:1 | ChiTotal | total:m2316_4 | | ir.cpp:2317:1:2317:1 | SideEffect | m2315_8 | | ir.cpp:2317:1:2317:1 | SideEffect | ~m2316_4 | +| ir.cpp:2327:32:2327:47 | Address | &:r2327_5 | | ir.cpp:2327:32:2327:47 | ChiPartial | partial:m2327_3 | | ir.cpp:2327:32:2327:47 | ChiTotal | total:m2327_2 | +| ir.cpp:2327:32:2327:47 | Load | m2329_3 | +| ir.cpp:2327:32:2327:47 | SideEffect | m2327_3 | +| ir.cpp:2329:9:2329:44 | Address | &:r2329_1 | +| ir.cpp:2329:16:2329:43 | StoreValue | r2329_2 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 38746cc411b..aefdbf9d134 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,5 +1,4 @@ missingOperand -| ir.cpp:2329:16:2329:43 | Store: VoidToInt | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | unexpectedOperand duplicateOperand missingPhiOperand @@ -7,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -23,7 +21,6 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1488:8:1488:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1488:8:1488:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | -| ir.cpp:2329:9:2329:44 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 595ea4fe7b2..91760c805b9 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -13512,17 +13512,16 @@ ir.cpp: # 2327| return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() # 2327| Block 0 -# 2327| v2327_1(void) = EnterFunction : -# 2327| mu2327_2(unknown) = AliasedDefinition : -# 2327| mu2327_3(unknown) = InitializeNonLocal : -# 2329| r2329_1(glval<..:: *>) = VariableAddress[#return] : - -# 2329| Block 1 -# 2329| mu2329_2(..:: *) = Store[#return] : &:r2329_1 -# 2327| r2327_4(glval<..:: *>) = VariableAddress[#return] : -# 2327| v2327_5(void) = ReturnValue : &:r2327_4, ~m? -# 2327| v2327_6(void) = AliasedUse : ~m? -# 2327| v2327_7(void) = ExitFunction : +# 2327| v2327_1(void) = EnterFunction : +# 2327| mu2327_2(unknown) = AliasedDefinition : +# 2327| mu2327_3(unknown) = InitializeNonLocal : +# 2329| r2329_1(glval<..:: *>) = VariableAddress[#return] : +# 2329| r2329_2(..()(..)) = FunctionAddress[VoidToInt] : +# 2329| mu2329_3(..:: *) = Store[#return] : &:r2329_1, r2329_2 +# 2327| r2327_4(glval<..:: *>) = VariableAddress[#return] : +# 2327| v2327_5(void) = ReturnValue : &:r2327_4, ~m? +# 2327| v2327_6(void) = AliasedUse : ~m? +# 2327| v2327_7(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 599bbe8d2b8..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 599bbe8d2b8..b93c7d2649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2329:9:2329:44 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2327:32:2327:47 | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | return_routine_type::VoidToIntMemberFunc return_routine_type::GetVoidToIntFunc() | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From cc178ab58f65788cd08a184b6da03e5c0ee53029 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 03:24:58 +0000 Subject: [PATCH 195/207] Bump rayon from 1.8.1 to 1.9.0 in /ql Bumps [rayon](https://github.com/rayon-rs/rayon) from 1.8.1 to 1.9.0. - [Changelog](https://github.com/rayon-rs/rayon/blob/main/RELEASES.md) - [Commits](https://github.com/rayon-rs/rayon/compare/rayon-core-v1.8.1...rayon-core-v1.9.0) --- updated-dependencies: - dependency-name: rayon dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- ql/Cargo.lock | Bin 34042 -> 34042 bytes ql/buramu/Cargo.toml | 2 +- ql/extractor/Cargo.toml | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ql/Cargo.lock b/ql/Cargo.lock index 6ea3f99faf5a892ffe3c3edc328b7047b4f8f366..3b8e780468888420b460ff3e6f04582a07c8de31 100644 GIT binary patch delta 88 zcmey>$@Hs}X~PC*M$5^CIYIU&mS)DODTYbO7G|j?X~wCkMuz4FMn*{~7N(|2MwaHu ssc8o0X-Sr;iOHrZX^Dnu<`x!7Mn(onCYDLYNhy;La*1vZcUkNJ03%2oqW}N^ delta 87 zcmey>$@Hs}X~PER$ Date: Wed, 28 Feb 2024 11:20:43 +0100 Subject: [PATCH 196/207] C#: Add ExperimentalAttribute class. --- .../system/diagnostics/CodeAnalysis.qll | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 csharp/ql/lib/semmle/code/csharp/frameworks/system/diagnostics/CodeAnalysis.qll diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/diagnostics/CodeAnalysis.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/diagnostics/CodeAnalysis.qll new file mode 100644 index 00000000000..d0392f8fc3b --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/diagnostics/CodeAnalysis.qll @@ -0,0 +1,15 @@ +/** Provides definitions related to the namespace `System.Diagnostics.CodeAnalysis`. */ + +private import csharp + +/** An attribute of type `System.Diagnostics.CodeAnalysis.ExperimentalAttribute`. */ +class ExperimentalAttribute extends Attribute { + ExperimentalAttribute() { + this.getType().hasFullyQualifiedName("System.Diagnostics.CodeAnalysis", "ExperimentalAttribute") + } + + /** + * Gets the diagnostic ID. + */ + string getId() { result = this.getConstructorArgument(0).getValue() } +} From 7535a15fda800de5ae0a9e5fd1cf9e878e002cc0 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 28 Feb 2024 11:22:12 +0100 Subject: [PATCH 197/207] C#: Add tests and update expected test output. --- .../library-tests/attributes/AttributeArguments.expected | 8 ++++---- .../attributes/ExperimentalAttributes.expected | 2 ++ .../library-tests/attributes/ExperimentalAttributes.ql | 6 ++++++ csharp/ql/test/library-tests/attributes/PrintAst.expected | 4 ++-- csharp/ql/test/library-tests/attributes/attributes.cs | 4 ++-- 5 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 csharp/ql/test/library-tests/attributes/ExperimentalAttributes.expected create mode 100644 csharp/ql/test/library-tests/attributes/ExperimentalAttributes.ql diff --git a/csharp/ql/test/library-tests/attributes/AttributeArguments.expected b/csharp/ql/test/library-tests/attributes/AttributeArguments.expected index 03e32644c07..aef0c30408b 100644 --- a/csharp/ql/test/library-tests/attributes/AttributeArguments.expected +++ b/csharp/ql/test/library-tests/attributes/AttributeArguments.expected @@ -106,8 +106,8 @@ arguments | attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:45:151:47 | "a" | | attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:36:151:38 | "b" | | attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:29 | array creation of type Int32[] | -| attributes.cs:155:2:155:13 | [Experimental(...)] | 0 | attributes.cs:155:15:155:35 | "MyExperimentalClass" | -| attributes.cs:158:6:158:17 | [Experimental(...)] | 0 | attributes.cs:158:19:158:40 | "MyExperimentalMethod" | +| attributes.cs:155:2:155:13 | [Experimental(...)] | 0 | attributes.cs:155:15:155:37 | "MyExperimentalClassId" | +| attributes.cs:158:6:158:17 | [Experimental(...)] | 0 | attributes.cs:158:19:158:42 | "MyExperimentalMethodId" | constructorArguments | Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 1 | | Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 3 | @@ -204,8 +204,8 @@ constructorArguments | attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:45:151:47 | "a" | | attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:36:151:38 | "b" | | attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:29 | array creation of type Int32[] | -| attributes.cs:155:2:155:13 | [Experimental(...)] | 0 | attributes.cs:155:15:155:35 | "MyExperimentalClass" | -| attributes.cs:158:6:158:17 | [Experimental(...)] | 0 | attributes.cs:158:19:158:40 | "MyExperimentalMethod" | +| attributes.cs:155:2:155:13 | [Experimental(...)] | 0 | attributes.cs:155:15:155:37 | "MyExperimentalClassId" | +| attributes.cs:158:6:158:17 | [Experimental(...)] | 0 | attributes.cs:158:19:158:42 | "MyExperimentalMethodId" | namedArguments | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | | Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] | diff --git a/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.expected b/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.expected new file mode 100644 index 00000000000..dba8c9d047f --- /dev/null +++ b/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.expected @@ -0,0 +1,2 @@ +| attributes.cs:156:14:156:32 | MyExperimentalClass | attributes.cs:155:2:155:13 | [Experimental(...)] | MyExperimentalClassId | +| attributes.cs:159:17:159:36 | MyExperimentalMethod | attributes.cs:158:6:158:17 | [Experimental(...)] | MyExperimentalMethodId | diff --git a/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.ql b/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.ql new file mode 100644 index 00000000000..5cb058f7e9f --- /dev/null +++ b/csharp/ql/test/library-tests/attributes/ExperimentalAttributes.ql @@ -0,0 +1,6 @@ +import csharp +import semmle.code.csharp.frameworks.system.diagnostics.CodeAnalysis + +from Attributable element, ExperimentalAttribute attribute +where attribute = element.getAnAttribute() and attribute.fromSource() +select element, attribute, attribute.getId() diff --git a/csharp/ql/test/library-tests/attributes/PrintAst.expected b/csharp/ql/test/library-tests/attributes/PrintAst.expected index cb085a16d85..62106d43664 100644 --- a/csharp/ql/test/library-tests/attributes/PrintAst.expected +++ b/csharp/ql/test/library-tests/attributes/PrintAst.expected @@ -465,11 +465,11 @@ attributes.cs: #-----| 0: (Attributes) # 155| 1: [DefaultAttribute] [Experimental(...)] # 155| -1: [TypeMention] ExperimentalAttribute -# 155| 0: [StringLiteralUtf16] "MyExperimentalClass" +# 155| 0: [StringLiteralUtf16] "MyExperimentalClassId" # 159| 5: [Method] MyExperimentalMethod # 159| -1: [TypeMention] Void #-----| 0: (Attributes) # 158| 1: [DefaultAttribute] [Experimental(...)] # 158| -1: [TypeMention] ExperimentalAttribute -# 158| 0: [StringLiteralUtf16] "MyExperimentalMethod" +# 158| 0: [StringLiteralUtf16] "MyExperimentalMethodId" # 159| 4: [BlockStmt] {...} diff --git a/csharp/ql/test/library-tests/attributes/attributes.cs b/csharp/ql/test/library-tests/attributes/attributes.cs index 26adfded71e..25cbf258ab1 100644 --- a/csharp/ql/test/library-tests/attributes/attributes.cs +++ b/csharp/ql/test/library-tests/attributes/attributes.cs @@ -152,9 +152,9 @@ class Class1 public void M4() { } } -[Experimental("MyExperimentalClass")] +[Experimental("MyExperimentalClassId")] public class MyExperimentalClass { - [Experimental("MyExperimentalMethod")] + [Experimental("MyExperimentalMethodId")] public void MyExperimentalMethod() { } } From 3c15b213859370c105aaee90114a2aaacf9000d0 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 28 Feb 2024 11:25:23 +0100 Subject: [PATCH 198/207] C#: Add change note. --- .../ql/lib/change-notes/2024-02-28-experimental-attribute.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2024-02-28-experimental-attribute.md diff --git a/csharp/ql/lib/change-notes/2024-02-28-experimental-attribute.md b/csharp/ql/lib/change-notes/2024-02-28-experimental-attribute.md new file mode 100644 index 00000000000..8749c790954 --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-02-28-experimental-attribute.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C# 12: Add QL library support (`ExperimentalAttribute`) for the experimental attribute. From 00ad7854dcdea5e38c6b524cff6ceab2a0e9713d Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 3 Jan 2024 13:24:56 +0100 Subject: [PATCH 199/207] C++: Accept test changes after frontend upgrade * The `specifiers2` tests have a different result now due to the implementation of CWG 2387. * The `special_members/generated_copy` has improved results as the frontend has improved support for deleted copy constructors. --- .../special_members/generated_copy/functions.expected | 3 +-- cpp/ql/test/library-tests/specifiers2/specifiers2.expected | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected b/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected index fa8f9be95b9..e60a795b9c0 100644 --- a/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected +++ b/cpp/ql/test/library-tests/special_members/generated_copy/functions.expected @@ -11,8 +11,7 @@ | copy.cpp:13:9:13:9 | operator= | protected_cc::Sub2& protected_cc::Sub2::operator=(protected_cc::Sub2 const&) | | | | copy.cpp:13:9:13:9 | operator= | protected_cc::Sub2& protected_cc::Sub2::operator=(protected_cc::Sub2&&) | | | | copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember() | deleted | | -| copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember(protected_cc::HasMember const&) | | | -| copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember(protected_cc::HasMember&&) | | | +| copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember(protected_cc::HasMember const&) | deleted | | | copy.cpp:17:9:17:9 | operator= | protected_cc::HasMember& protected_cc::HasMember::operator=(protected_cc::HasMember const&) | | | | copy.cpp:17:9:17:9 | operator= | protected_cc::HasMember& protected_cc::HasMember::operator=(protected_cc::HasMember&&) | | | | copy.cpp:25:5:25:5 | C | void deleted_cc::C::C(deleted_cc::C const&) | deleted | | diff --git a/cpp/ql/test/library-tests/specifiers2/specifiers2.expected b/cpp/ql/test/library-tests/specifiers2/specifiers2.expected index 8950906cb63..b4dd73b148f 100644 --- a/cpp/ql/test/library-tests/specifiers2/specifiers2.expected +++ b/cpp/ql/test/library-tests/specifiers2/specifiers2.expected @@ -186,7 +186,6 @@ | Variable | specifiers2pp.cpp:16:13:16:22 | privateInt | privateInt | private | | Variable | specifiers2pp.cpp:17:21:17:30 | mutableInt | mutableInt | private | | Variable | specifiers2pp.cpp:20:13:20:24 | protectedInt | protectedInt | protected | -| Variable | specifiers2pp.cpp:52:25:52:27 | vci | vci | static | | VariableDeclarationEntry | specifiers2.c:5:12:5:12 | declaration of i | i | extern | | VariableDeclarationEntry | specifiers2.c:6:12:6:12 | declaration of i | i | extern | | VariableDeclarationEntry | specifiers2.c:8:12:8:12 | declaration of j | j | extern | From 897786dc99b4c7febc1b492edeb140828b2a7f20 Mon Sep 17 00:00:00 2001 From: Felicity Chapman Date: Wed, 28 Feb 2024 11:28:59 +0000 Subject: [PATCH 200/207] Minor updates to model editor article --- .../using-the-codeql-model-editor.rst | 6 ++++-- .../model-application-mode.png | Bin 76341 -> 88333 bytes .../model-dependency-mode-expanded.png | Bin 118508 -> 73305 bytes .../model-dependency-mode.png | Bin 85033 -> 95757 bytes 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst index 11840db8417..06d7fcac8a0 100644 --- a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst +++ b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst @@ -39,7 +39,9 @@ Displaying the CodeQL model editor Modeling the calls your codebase makes to external APIs ------------------------------------------------------- -You typically use this approach when you are looking at a specific codebase where you want to improve the precision of CodeQL results. This is useful when the codebase uses frameworks or libraries that are not supported by CodeQL and if the source code of the framework or library is not included in the analysis. This section uses an open source Java project called "sofa-jraft" as an example. The experience of modeling other static languages is similar. +You typically use this approach when you are looking at a specific codebase where you want to improve the precision of CodeQL results. This is useful when the codebase uses frameworks or libraries that are not supported by CodeQL and if the source code of the framework or library is not included in the analysis. + +This section uses an open source Java project called "sofa-jraft" as an example. The experience of modeling calls to external APIs written in other static languages is similar. #. Select the CodeQL database that you want to improve CodeQL coverage for. #. Display the CodeQL model editor. By default the editor runs in application mode, so the list of external APIs used by the selected codebase is shown. @@ -90,7 +92,7 @@ The models are stored in a series of YAML data extension files, one for each ext Modeling the public API of a codebase ------------------------------------- -This section uses an open source Java project called "sofa-jraft" as an example. The experience of modeling other static languages is similar. +This section uses an open source Java project called "sofa-jraft" as an example. The experience of modeling the public API written using other static languages is similar. You typically use this method when you want to model a framework or library that your organization uses in more than one codebase. Once you have finished creating and testing the model, you can publish the CodeQL model pack to the GitHub Container Registry for your whole organization to use. diff --git a/docs/codeql/images/codeql-for-visual-studio-code/model-application-mode.png b/docs/codeql/images/codeql-for-visual-studio-code/model-application-mode.png index c364d58beb549e61d61cd2b84c3924eb11aac287..9071596b7286fc5922cacbc73704b4f2dedc7d61 100644 GIT binary patch literal 88333 zcmeEuby$?`x-Sh4>qgu*jZ1d903wMWl^| zg+oO|0KOxZD0Tv#uwB&UA7YjC-B<=+yf)W;YN4cr#RXmyVc}uZVc}yo0S`%R`u}__ zhs}Y7`;YJAU}3$t#=`s8Hp<``^DhECFu(K9XWVq`e{BuEmyYuvTN7!gw{eT(I(GZjU|$E*0* zmn>xOy_A!c?XiXQmW->k8&cZ#(HgeDxq^G^!<#2GtSp~d6|S0^M-1m*K!V=j@a#{y8wYSh@FhDQ z|83nL>XY21?nEB%Zybi|K#9vW*IrwOsUG6*iViIX2mJf={Pinw9cE)C{LJ69S#qDA zUH`zRT@+tskAN(8IaNNmGO)`;g-6jzk1eU+p>-}S%kW$82Epq{kA-Wy z2BF}Yy7edRNxJ14b6MsL@=?j(p4tDrevk;zpTvn`9WJ<}|NI58?-aUfn;SQE{$yXU zaKxXyX%1n)Q>eM%{Qk4*RX6d8iZ~7rBDnu^_x^4s_%pCdo3xV$H5*^H-pty_!bQmQ-{1V5KT*w;*DHe4Iq`}pyrq30d3 zvqT}=BF%ht?MkaboYmSaWdq4Vozm(lccjE{|4^71;j!$6mlP7+?9h^K^*wCmLBpwX z>Vt9cp0TbX_;MVtnGN-798yjXVCPk-5?&K&erE|K*0se3b-}}=>+K3Sc8L4}F0m+2V$ z2rciM#dx8r;y?@O?z=zt(JaaR`P4whBNx{qy$XwQ6{%CR=Y45XNc=W%zB|MqYgT)! z@P73);=H5Hw##kRaR$y$s|n8bNPUjx<7gTQreM5=^=6*r!%(FPY+QnPNh9K!e4SFG z*No2x>-IK~NT_1Mi+W!CLqYoqL8#KM60*t1kXfm`DHHVzPOZB;D9@x9L`=Q*Q$s}v zpT=BUF6@T2CuhXsgl%aRzj+tyTINj7V3s`MveXI1&bX>m`x$y;qlA6r%e3ce@!S5~ zfH%8(MY>-y(c}XX%GB4R?amJ=HOr#cYxr;p$pw92mA3G{MsJ^bbB8cWq~r2X&Q#TM z{Vs#f*VkKzYb$7@vsww6JoFKNB?T1@)Q_Zi+(}P?U=^ns#`ovMaB1l0p zBX*Lt+L-{7HGe|JCrb-aDw3~YKXtx;D2fiIWM?BQ7-+Ig^{^P?o%T5}TpcaeAF^NO zqW&;cWve4T`<8Mo#eMqA_I!7)ZE9&X8I$DX8MyTA$x#8^yFqt7bk*4uzz+@AONl zOca6Ig&fYlXSdUEY7t#bj#5oa3E^uxY{j?tK3>k%Bj@T=KKGc?PPpN%8l>o|5^ZnV z9zwl8Zkblcb7^9_++0C}=8dNL=1dDTotW%}ZJAVqYyvNpK{^jHvD^R^H}RV4z_;wD zQ3jC6_l%w#3pZkU^j?(0&O8+f-kWu3Q3M5WiMg+@LG9Jpf)>;Krp^5ZDroN1uS@zI z*K*-=Wq19em|`EPFITWijQ@OF0c!K&_{L#+h}kEqL+1nFHtBKdSw#`XLVE-j3J zQ%K@ry>YW;l?EBamO`irG`v=_-yQH(9|#mDSXto;s!%?hQM*Xj?qewQL#MrJkkog$ zv7i0Hv{$KLQfb`Fjxe`Hc)go#od08uM;!6#>N(HWbvkp{WWpCrC1_I=^{KN&(m#D7iZ$Em4t5$|C+%J6f&?q`<_YI{NeqD_?Mqi3oDX` zGl9{F?e2GB4C3{+&uC6En*;S)b{V-qgLCgb^pgu`wAaX0cJn7r+`q*xtKpf)5&AIl zRxr~QrlKwM2CT!iRFTB60n+Q*6;q&9SbyrhK!_i_Bnn<@k0FP06b#>dAefoUCA>s$ z{xZiNQQh~r;{;WM{Jbveedwf9%1kb`$z-3mx+in<{SD_Qt{ScN>uIU>)Jh{!Q<*$B z!Hjlk_(U(l+t9GMx<68=b2(7mtmF;#g_QlbvHv%-)c_t^xwD*pZ$eUC<^zR>0QCf?LdNO+9F))J6>-*^p{MNp7Ox7`a{EmDo z@Q_0~LnTeJR*?w4k)QNkV(FR8xaRqr?Sxkk5AtIrt<07NGI&Ef z-H|?vi8d=lF?aN<$HX_j&W$#>ty%yu=e}BZB(KqXNJ=T@;647;!{s`&>x@6)cSpzu z_1bJ`YE@4NR9S5+HK8gTxsJ=d(4WQx`_ZTajo0L(UC?^!Mmn;%d;g4fU?++T{mdvu z>h#~#^{-z^uj7TxI~*7`)Icvi(XMx0egSq#v6{0;gDn8m-{?s?r1qxnpexZabsaSI zLo5IS{Y_`bt5z}kaOOjR#8L;QMGUI#5-OR~_|;TZwbNW+S^UOJv?H#ZD?0#xY$mnZQG@AkrF#vQ zSwzFNl@@vkIrD+^_irr5o!uWSV)jikh7xZ+(b_oZUgy{H%U=;#m8v&Zt}rr#kXEx? zK*yw~iCCFL`;wa6pYfS@MgQ1(rLMFWQSgXNk=s_*H3Cti#r8(ipE@6ky*!xp9w}j= zS81iz-Rs6#C}YY2+Vt1uoJ=0Z#7x=Y67Q3(4u`~WOmDNNi}&4VJeWMr&rP-QEg;v4 z4D^e(#(rdUa807{f^X6c`&EH;4YwQ!*wg7 zN;)(=x--J^0^ZrSOfVFfyzW~0sf&dr^d(()H3fsJq@_9>WFz_{4kokxsS~Szfw8AFCO=L+ z?RS3q)>A7PGGYC6RiIFF;gXU}#_ATIVHA{VK>8#rTryGb8oq-USe#0H<{y>-fF`?f zf56+MJzVO{iY`x^<_+MSbw!uYaI(h9qsboX-J~L&t+;sz8O#Y20IV|FpPIN{b#QCj zS=GDw4Ysgl-wk)e-XszCjsdS2qG16H6Unx1j z3L)mdE^HT%7VMvkVZ1NfrOVKKAd^XVjT3yYG#-Y4W4<9>YyuI7nH(yWu$Pifa-cgWaKOqcMEo= zL(vZ2^eRl@@GO`;)oB%O;PQ#2nMmYYv1Xxm??_Logt$ZZXpLml!{X;vpB?(2=BzJY zGxnZME!I#Ly}kA@K}>Uh!j`W_Q~CqHO@gbnZ`+$wW8pZe43=sgmbG-B$Aoj*7 zg*nIGfae=90S3{OwD8S6Z%0dw-dON%sU7Xvv5${-99@r&Nl*Yw6M9`-!w=vCVJ6kj z1xzWS0enM;FjFP}K+rm!y)~U&P#o^{!)zdeqae=g8uYGQAGgwe!_)*A)An z9z&T)@y&Ko2sm%U8h@c`MgWP!z}BfIv*-GDW}b?&_ zP|RiT$mkdDmt_J02O}GeVUz`eV6(mFVNz$W=_NcXNfKW#=fo*uKO`U$B>@|)7e`xLhyG5#Bzi3#`)o1IkNmo^=DX_p$=CpybvVCH7s3)+@Ai!RHumo$n7e7{pwk&~9d?qTNK=1 zN)KFH$_lTx=uOn?O%yU5#WrW;FmCz^K;@|5{2ORwr^6r>DQH1orT`JU)UXfKE&E{t zC9=;&$u51OKMLCF^&RSN8>m!c`m+L>|L`3t z?XQ&>`-lEl^f=GPe3uUf7iETXIqpAc;W;xng}@ZGL2LMj5U_t;$R^r$CD&?@ekwOB zOsoqdf(sVP0o~N+;GV)134XlQ3I#r2PM2$>&3Sy^_KcDdqr5+3y|DQ~L})7Ch0KDA z)PE{q_mtMdt$>nU*%kIYd_x8H4*tf&LKeoV!}i8ZcAQi2?s7Ni43k*vK)PHmY|SCC zk~%w_QzV4N7(T@9`4PfT$x6SpZ|`@yr(^pwFVc^mSLOaJ-Zd&_Z6)?A3{KiCWMch5 zf>bA)2)ll-6<_HsgPb<#36>a0LZAFelfB4yvxN{k6MC45ebf?2*rBsAaM1NDGO666 zm+l&t1`q-&^(37=N%2MUSV@>w8>?*-$?<17I!yuZb{#gdLiF*95#r;4KJRVGBsRY# zC=@K2bbMpwt6)k(QFTc3J3A5%laCi$7b?su0@_xd@67zk6M1JcLwUP)3k2^x zEXefVvl^@<{SlTU>~p;PLon|l3iOaH*{~4bs#5H}!)E_~2vc!OC%*!@T$x3)i3fmSR!A(k%b~|^#qMYv6Mke9bfZs&bpze;@A4YxS9g~o!>Q?CY1OT zY8O=rmVYakDk~pf5vbg!4Z}aF^f&=(dp4nHy));BUD_O^DLd?Emg9Z82iLQXEmsO> zl=$qhiiG)fSxaL&yepG&em*UjeG-u)EvH4E?Be8Z7a_ENV6`$sW))m+a*5pml!W}K z`gT|nhOwP_tv*@!5+sh(j+9WHrnmCXhbl8j)1 ztd6?pra+#T+pHpL9EWVJM~f1w?8f<*C7Yag7J7Y!Eb4$b8Gn#J&GGU(=;RTuF7=AE zPu-~?o&<+uwq^IznqdfHTW6=T$3=*w?$MT+k~uhcgI%A6$T zX5$@qZvzP?p7_=`%9ksdj_UaKj}c{Ie?JcX^-~1?wqRN2qxa+puQ2^25yw;#i`vza z21OYh4XEN5AhzrFr%KoZSg%a?VW#0pENv!$nZ7Qq>cjTC>r)6}`w6NFU=Nz_1Iauo z-~p!VRNTpRtasl?oi~ia|L|>NvdpyYuwe5PObtiycgT=vYI9rB@0p@;nN>gFlZ!2-KlFAp zpu51mJNicrFKw3qC3hIh*C-mGh7OF35p6i-)JDcxV;xv-X65-2D4P=2svi zT^tWaT{S@GM3#(84C;2}`^*aWb!Mc&CDf<}tSgK2k(_c!xgJKW5givYO)FAtd4-ur zYjFh+TR6w9nNW*wDV56rZj^l9E_T5||MS}ZR%PzT<#uK4!nmgQKUY30h-8#l&VowZ?MzT60FCAF92Cw(Pd9q$ z1AV{ZYdD>e=W@A>f8+X zJ7F<5UQBT}>ax!l=FsQ>bJZG5qdEqco_qO;b)I#f7$qi*ytiaAurY>HgUuQZ92oXu zWMs_vtI5bk86*)E0dSmyW_g{-{=N+Gl}u_rrmuaBGOBaVQA(4Xf-0x17>O+a4pO9D z{G8Y28>l}=x7E?!y?k&~-@k`3*pkrjlwp*!h2ErMAY}7KV1%2xbw3@qGN;*xN%vo6 zHk7<*4@q#)2k>LkEr!?7Qzu0m+L7|Wqa45lo?(a}AbLIcTskFopo#W=y?N)NDZt#1 z2YGHHo0@Wuftte~Fq;OuTl&>@oT`hxKW;@J@uG`gfJP-`UXgLpC2Q`ZWG;KLsCRB3 zo;?#%=dw5fLI)qQLSd+v%|VN*(%961=~RM&O{p3A=n>@6-!Fb<5ga`2-*VwT7g=!s zc$;)p5-QH0Ivwpd|E&i6-K#oG0O;E5wUGa^;{N)}AbnthxBB?iiT#mJ-5CTN`MTzp zI)Ah^$0RsVs&#bt$RF*yG%p@eQ71lQ!=Hr-W@$i}zzJzwLjDJX4;#<kOywW@&U_8C)N#TM|7@u{ zVG%QUiB7Hz9H37O@ zO^Vlgo%mifn{u)h-`C9mVEgs~;MSxOj=C)DcjiqGcpjL8Em}X)jT$|DT~c}Dcnxhp zdZQ8rWFZI;b})A6cBP-##YMH9)C_{4KOEU(qIQn@{mx$2OhNQ}O1QO)%804CzWqEk zM1EutADyVQp5ul2ou5H|s>#oP$OImju1+;~770Dyk zHD$Pn=kC(xX`k*EqgZSJ{Y15Wg8(@_j2t8^@(rnI<}b`NrhtgKEMSN_;(DQf83sZrTYhGt57D673V-P`o z14gO9lskxMm280Zpbx|f0f|1KG#ernVtIa4+E@Db*#hzvJ9V1rll@#LZN&>HJNb#M z#c)xj6tNLZ!f1OsavtoF%M_E_Pc@(&Hr$qoUe|$?zU+>@Qw<;$8pxvdfPYs5)iK*g zo*Q0bxH=7zI3mweoF#IbIK_Kr-vR1(KTY$1OT2#pFw(Y)Jg~xRQ<=0~Rrc!Oi&CDc z;wzKe-KSG(aCz8&>AnB$%d%BGfN0x6unGmV(rS#EZoCUG)aehQ;(WoL;`$jJ0r&if zjfo-bE1w4RBdVfbaI>*?c!q(Ep8+!$y&J|tA%+433 z&c6T&Gm&3E&(YjSwE-kwkgDDhgMY^Vv3g1lMGtdm@2HbG?x+Pa=*ihYI zd?sdgI_c7%L;7*+AR8DbP`ED|wYaVV$ik!qMnHcNmPJZ-c6J7?ivt2p-cGT~-7uQU$q*gT^Oe3Zi@kwajPIF6t8+b4`9a2fj&7R4xr-)0^Mh)o|!ll z?L@2t(xfXW{&c7cE^Hi7L{1CntOCOQE>`kA;D*6M^$GmRXaQe*(qK%1_4&)|trzen zU^ZGKfG+#q^t>hARgOY2vfAfvudG}|65RGW;`)7K1u9Q#xjI!ScST&*6bJ`j0uMf)O3 zGULb{kxR=h7!-I;?Q@sI;h4G}ihT$O9STUum%i)tMq5k6w!>qOb{6#)`%#O ziLj@roSi0+A#g~H#zgE^2PL#3<-O$sFk!P@@&M5_Pzn6zkb%a!g+$v)-$a^hU>QJ{ z?`cM#HtVlE(B!RO$}C$4aW*%%WA@x8Q$mm0OxxkbS#Ta)$;-#U$(y?3yluxt^5Moh z?EGw#2ZXm6#5m@jLQ>nyq6~_bQVIR}O)v8`?taF{W^|Z{>R|NhF*h5O^LZC@`dF5r z9>xVUSjfXzsuAu-@Aw8kvK}p;9q+shz6hWOX{75K8I6KmLfg9M-ikRP7W>_6>@>237iqyKc&LSjji43X_J@w5`7s12jOc8@1&0vf8eE0c(UMa*LVF zBz`KldM67mZw?4vE(K&DE@za-{YyHk)CZ#sq0I>{< z7%na64Izei>ow3wwe$}G`bK`IZX#C3AmWPG&81bq`g8s}JmoRtdDfyiKvAYnGL`7$ z2TAo7jhVw!KTD0J1U1j6xhg=N^496;P-r5m?G3LTpQOJ26>RG68M|j-_^O?{#Nlvr z)}fxF@e+S)ExOe5;oceTmNVPk+LFaB;KBr&6jg&9b7kf*)+%JH{aS+}8QsVI7ThMK`ka6(>eOU2#!fBx zP+_`nI-BodVIZpgu3;H|fC*O|8rfs^dD91?{VbZp6i7E7U4~T5R}@QU`DG66D4M?X z-^eJU5t)9SRZ1TBiB6~-_+GvE(7zKLtp-`?E6A3n#<-mY9`OhuPSy>SR~(H zD{Fg^_?pFhXrSBjg=&_>{um2scJR8O!({DdF@FMxVwUmi9)a|&J@JHUbMJ>MESX9C zhW(!$p(%^$EpBkbI3VL2&hL)*v{2&N%snaCKJPLGk7&2m>%h9mQ=#0aEhgB{VOey80)9$baGsE%TjeO%4S#0n+h`#PW`f3^4B ztbi(pXK6Qidmy!1)xQ(tB#62|>Eq!$F(aQTksxZ)z#Qe;p&IcGOwhEFr>(+Ldy1{^ z?5RaPgf;eJraXPl%#uqublJFNv8ezoEEU+*K%1FMG3jQ^B!ijANjg3FQ;^G(Jo*aD zb7yD2EOf=iK82YU=5)HM;jJ`Y z>fOc>^Ex4s0weEb|Fg z1uO6#Zem%h4_koEi3_-xvEUrXUz1m+JhpycQ0X7l@SNyXUf#Z+Mb=r`RX0i!S z=>)B2B=w26Rkf*X~6(NOwBSDG z2889@v}!Px+XW@IJ6YQ7n0y}zzMccMzdtf=)Fq=Q^*gTzryfF9wrcPzl%UpU^a{Q< zD|h+NN>0y4K(Za23|j;M;m;;1SNl$a@3@qcY5forrwc3QA$y7FH*4_9N6%pk~oy=qY=GQQaNlfXy^D{CiW*-FNOCC=UB&6BnrtM3;|q ze0Ykj*!B8XnrI3c+VPMltgF(Dry9E z>|MB2H?;Ubl7g+GnMJ~ni&%5WJur;`0}|H-7KI(qx#^S0CDDt^8ea!f)tE%-@C^D( z2jeQilQ})XQ-Jt*@O@_t63D>)QKCpzgELSi7_nx!Q72svpr9=l7#fjd8B(Q5Sg6oP;W*_EUd8dLH7QYgosx03z_*uKxOQ-1mf z;6=0MaWKmaKlv61Ze*&TAxYT*iVP!6bioHCM-1O#X?4jZkVMPedhV*?9emkp&}Z;; zbQNIUz24Rw{?8nUx6fSD8$r>U(knH70jq7Z(YOx8i45dO8g=d}LY_HzSGXikR)3Pz z821sb@LcOjZ777^s|u$nU&aOb4yhU z`S;`upVz9Y3V`ps?n$-egz266Qi9i;ypNnkR8IhZZg>YeLMqUS#MW{ls0onf4jxe+ ze%>jQ7vudrSaoV2c-FNp&W`1WD&Q); z{_wy$Hpx<;kUe6&B7Ve|-*z!Ka&U2XrLYu|h6E%G=wNEi%76v)ueM@tKZ1WJT;}-D zbwEE=_ooY8m-#wgf5lZr)5t5NG?sWbtc{s`4^3O|v4fE271C_z)CO4o3S%nNz!?og zl!E&MpVknz5L%-F=CQ4ni08ez#zG|6NrWTWYX75zo5;B{{{E{Mwc*B>aIRe4-+?pW zC1tx2<7n~+EUQhPwUi$E#Le;(-T(2Eizv2}C_uW^CxG=7QVSgU6-9xVYsxzx#~ zlNZI16%KX8{1S{=L07;xLCNpoq#h&WV<^Id@8@n&cWU zDMDW7q~a=G;^V?8PX`}LF-476z_Wc1r?4NzFngnZwSv#XmKvw{GIF!`V(;k3u29e} zr?y9n=ZsO{DFt<$05zsf+mkKuO}>-luG1*wV9zJGbq!P6L?>mlm9S zET@s1=|vZnK{HYt6OLH}J(qW`86)yoXb}-SG2DVlrtzDHqyR+PBxWFNJ@hS_Ap
  • HUYRL$<(N6@3#>q}AuKm7n&{58fMa4Tsw2pS=3 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 LUaVBa(EtAciA5am literal 76341 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 z zOt!0lYZu)P3sCwJ{F9H4G>G3m)&w}BPA7D38CtM6;-T>zli%j6i=?ZVs#9LQw{s|% zfwBkTOvek7Kj1+7$OS7^VV9WrN2cAB0W3#pQvp0VW zCO<#M)^BS>bQ?$}-0j)J;~w(sj6evgmX0}2&bW%%6U+-uUE7*05liruH<%Za%_vu8 zprI{~rbc#kdN{~X&N%rCR}@=L+y6lALo7a6qM%(KEiTp5Ytuy-g6(NWIW>qHr(%`a zNzFofzLUyA-d6~-#>+ip^bU$Q;*+Vhf5u6T@3OLfs8^JyChPM)i9=nl{G>@(iT+}I zO56+=ziK|4?Yj`Zl#6W#S9qMq4*xY5^>=>*=9aU`!RH72&EYU0g**WH9ArO7@$xI?L8)l~X;227$A35Kj@=EvX7t;91~|(l8JhY!y%7(pzh` zshu^y&Y==e9O)*IUw%-k;`%BBc0<8pV5lA*langl)=mp3XPYk-EB7CE)u&z!E=g4AB1NUQc_J%jI0()w znL39CMKD*y_=Y-X8_C4Hy4zd*lE2&I>ZAVOQ2PIkJQ6m8YHE1kW&%SFa$an8@G;>M zo4wAEWbZ(!Hd$Y}!ImPK$Y#%39F;2}>Cc}=L(ceaYEYooKlQ86%prq{ue|%YR#pj4 z$~iABnBk<8Ef=3cE#);zY<%TlpNk(yms;$Eh!9f+ihTdAJ0efAK5=nL zZMKeIMj6l)Gfh4_Q?DUi8cET#(W?EL6c;E(&LfVP`9)II93$IS6@=$v96MRXOHRLb%KXLDDSzyTp0mrrgJN~3!H?Lkv` z>@UW7;!Er7cW>jIvwdAG48Byh*$9}*E%WC<#LR}yd#pTrF{2!d3iFD*3(S&)OnMwz z;`+a+mMa&^)h24O=H&Y8RFG}CZgGu}Vbx7dSkQ|ZS&ifLy_yD9fJE%*S~v0c9leUj zg7)*oP&}8#=2^;jyqorT0e%jxJ<}UP$cR%#7h@dE3^Li^o1;U+>2UR|qaEIre}VQO z2Zz<47?V&Lfeo+t5-Cvbmv5hg{VCB%Wd&N$M7ESB2orgG=-u#)$P_Yrj$CMU4iQN` z&mjB6SD%{&aR;4j7=+Ef*YVfXquIJ)TD%xhLWsytQRfHtAYydo4^FM%--rR;=^BkA z&^t5~nr0e0fN{5%1fRTKHWpb^Lmm&|(MLRcmDzSx-5KF~a@1C$``)Whl>kqaq3;#V zMO`Yh#M>*cT$NnIMn$FS#mG52E*_@dQ*p@!CBKu;vX4swht1C4sm{UCMFejrkmHoi zI>;-&TQ?Gy`7+KYoHwp#=mycmYh_vD%Yl!pV^fL6xIHQ9L;R-S6#wK+Z~d{0px$kE zGR;&wlf_F0zS&6@EL|QdCeZ#m~PkBoFYS9QeVY)09FxZni-PS4sxG$8c|$xUY$}Bv7OOJK7C{5Lf&V# zYJI1dHJKdd$&PpADdqr*TLKV$EsvetgfM@2tWT~PD!JbCb`L)%E>)#Y*Dm@^vE*99 zu6fhFA!Cmo_ir*lr>8bg97zp^%6y+?h)$!kok}zs2&a^N9(yBrf46!6u}y052N9o> zDRu_dG!xqDhh5io+=Ns0-_c7(%V_9>FbK>HVyM;Io9CTqER2CTqrfa20YOVJ=5_Mm zJ{+dt*XaY8*Bbf0+Es7BCguQe|K-hcy_K2ljm4y16*`l6A#WBtgRP1}k#8XLAQ-9O zEY#OGUm!F0jUf}f8UTsq@X{rNe3SbKpfJ7t$ctF@)oI3WSt!*3%xKE=#b-&jwXn44>_j6~T*OOUYgw)GF z=)?y-*QZ^eUD8iQnOr`6g1Qx3mTt#`k-tTpfBjn=l$93&(KY~-kR0+$&E-gz!QqB4 z|HK8rRMFaQ7Y@D7qv+94GpIZpHsXuUD8xotD zH_zhMq6EtNXFh7iBp|r2r?-{zYc{g=zw7O{bOey~Z$7oo%u?jOE+a2SfR)cR^^*^R z>R2gwq%T7uelS##OT=>Jvm>8*ON5#p!iGgzJG|x9ZN(@dN)C%!y=-qG0|&=HsDUSf z^rlAy@-pQq{;gS(>#Aqmh}^rF?I^1re9ee(_v<*@-UF_9L%-|E<$f<>x(vvedL`dC zhDi1=-*o$SehY-bsTys!3zm+iiwHbc5rh%s!HZS&AFhQ|e zZ{I`OnhO}$L~a3q_gNLonqNC!=ZoAIvX8dg)-4eD-R~M|D!h4*dhA93PT3AL`mU~7 zdPn`{B_ospBq?d$yw_1xQ6q>^`9bbuM$JT44={1z=%hR54QcQ}>p@|@sQ7}O1G-77 zNsR6f0W1@N>b*XR`E^a?~{e#oB&L>K@*r^*~7^X+V9 z{Cs)Kg-!+frP;HR@$CoWAb=NadOH{4P=46BTc*x*>e=@BJ1q<%gIEyP;1%1Lx%V6>78L3Mke?yEQfN`Gx$Z>#BDPfx znjsIa#F{M|Zvx=Io;K}%XC6BnF$FSBE6bY;c!E&vXD1mAS_A3kZ~M7t8M5`3u3DFc zv>2GUXh3x*Pbz&fmP0l zkD!KeT&^Fa5d&0K>Iw+>_`U#QqLcCZgGOBizPVQlfB{;W#SW5!b4~{Xpb!JE$W4C! zhPT1-2%_cpyKuw1tjbb1^qA3GfR!oz>H2d7fr#uxJQx|=l3?Jq<8Zm){Zl0Qu@7jbVjfwfp$*467&F$ z(M&V`sPVpL&CfR1S?ban|8@AQ0>Lfcm^nM3I)PmBbH%yvm-qVVJJCR`LY*qn zcPM7}L%8FTL++Iz5&(^f8@zgTiP=Qq5VRZ%XaWk}Mg#caD}WJU2s_ZRjPwOqIL#4@ z_Yv@>A9v)9Z-H(aUID1lGhu){{&HXOq>^r344%!^w=ufrhfcAj`snQ;RHjn#np;25 zCUNYW;8DOB9cYL^*QUZmKy5q0tSO^76AC}rRM{r?-X=|(R9gvY2%v4I;&pIayR7gD7*=pTQ@wOsrxW)B~v0DnBO_FeScLU`Z;D+wOI zR54Dp5H}*#F`7nGZvV`AHi8GvF5ndcp!gzu(Ku&&s^T}TcaR5b{ohUzeZ;rY^bhOz2uCSnatjS-x&Ksztf_L(g znNz~!7!i395v%pdO+cf{!5z` z@~!;cvkO)+ZJ#=a2p6%J8X*9N!Y(g(+%3t22S4AvM>{3Yp)m18QScQA2N~%6q7*#- z9dIP0!&3@f%)F5_^Vj3{?@8H1j!hg1h~P6#SoT2npx}jcR;({1;&FU>G>I`p#}eGh z`5b2R3SPodkAw~)RWY8bG;G?z?h`#;gEPGo?SJeREG79pBiMdJvXTJOX+nhpl2wK4Ies-(*%1c3Y~w$ zzzm7Nt6*nfmbd=3D2tM2Ui0Br$M$L>vNd&D5=f;44yMx_>|72?)1-P_rSPNns!Hr{0A+2XT!@6E zz+tf$%}Bk9eUb}5ewNQ76A(~$)*HL#FPlS#8hz+>tpH^ZW3nDsq)`aIhF0d=XVhwC z+~5l9@K-}Qr`xZB%HH$q0;f|dkkc9VV=220n-(WoW`%}n!{;d{`2sQ=g6WVjFVrOR z%{1==lllpNAB@*p+?c$}0*r1b5(KE=e$PnQCoa@e2c5_Fdln+aB#5)D{j{AH&lhle zmf_j^Y+BBLNFIslCGN@*q!Mbqiow2oPW0A9Bb1i~Ku=I&D6yyr0;!R2D3zm`Ns+TM z$Ax+Uwu7WLLRpd=S;L*nWPJz?s^=AVzHpg^VN9Aa$%*p{8Dfx5dYN5g-sMe zUK<9nPr#)6Ll)Ot?eLB2rAwbCvs>QywEKEUzZIGe|ly3bbEQ-Zl=s+58( z0C*Y^Ki)LI|FDB|L2!4oPuKq0lod)UQXgxouRQy}b992->{~kKJ`19_4ETuH7ILj9 zTijUDcr2Y__u8X}HbDF%Cqh^M;NxcpWX`$C)I*4uZfUD&K}iH6bzds7(J)3KcDyIn zIGBMjSe3acfQCsD^^vz_!rG=MjYZY%F;-z{dUu$&uMJ2!;}NHhNyRqbd!;k&TtH=P ztWN9wCa<-RaOPGyqBR@EC`2KH_NcH}T_Kn(!2+j-UI#l4dUZBBDG6a!K<)yT2Kadb5prn{yKE zGEyCr&mR5bNL5M5RsC@^l@Al_YPlkBtyn98pl_4(GwJ+xm0eA%1<>lOh&)~^eGL49 zj#d3I%;4yCGgHVJX?3vHDtxn@Z4y)W^u?x3bfiG(_^vvAuj?8E(`T9Jk(&G(!50^& zvYGWZQsuXYZT=ID-1<=jo7Hx)2l!sf^o((Dl~ZgDNICTle;Q?vDr{}N6#$^ z-f4XyT6v;zTpTTqY4NQ3a>>61T5 zZPaplw@yQCompJfELRl5&#SQlu$taya`C-5-AOY7v@zwVdD7DZA$%f}Kc=3*62W;q z#;ZTy+I8hr9Q3ITr%uNQpuv5_zUd{@S66<3e$^PzyRcMJxLi1gS$A(yZ?z4x4}BAI zJ#YloT?wzBe!k60T7KV1d;lTxa3G&*0bR1fBAdnCn>G0XSw|O8Zm2fF&q3PXfW=6g1g)x)68(VrIc zROg%-&>vl!_US$sokj)taK(=c@6ZW7lK|1zsZ7*w+y4*pm30}g*$^Hj%;1vPfLwSg zCSDP93GQQ4zd9RoIeDT~ggLVQY+W07bp<<8qrCj4KBD}$iOfI#f&LOQ>h2(jHMZ#d z+6V@9+}$&q9cWZ=B+p{~1l8zno+u!o<@P@6Kyr89Ei3!Gjss?$N2mtQ-+(7t2hs?N z)Y%&27!!n+rYOLcw_7+*oe+Wmi&5kb5KA&GAVVmj$@z{T-S5z}|7ttyI6|<`y@FMr zj32P1_Ge0O)iO3f(ZV;D9ssz{Fh}|(f~}K%h*6d3a37+Q{VE91-|#m>)sjFjkUuN( zTO|Ur!!CfFCV()SPcERz~;NL^GP!K6YBSZh39+Cc=0b2g=sq+5=9I_fA{KU^NQvC(%E$3gRHAm9_H%ajSCH5x#3Ru0+XXJK6U;Lk&{`S?lJ3L_E5}59!{;fLq zpKfB*4p^dCjaW+Q^8S8F{PkbJvH`4%Lp`+Um%l^X{)zp7z%m#GbOy9krzQR_Cjaw2 zeWieeyw#aW5a)O2{XgFmu>`O?!Cg#x{b#`c_i+8cJm7E6&N;jRt?}&*rI*j2?4fFX zBS4yKcgx1f55qyvIq8`8CyNZV`lS)nz!`5-I1mZdpDUEDtp3UE=*RUTP=$3<^7iD7 zx$-tnGQ*$j#tcyoVDoZjZ&d!-O=y6?(Ad2x`)5~20DEA>vZ3UUdhQ|v>@VhuhEIQV zH77K+=Fnj-{^u?F+g9o00C7RirtD9AUjd*IWWWj<5kK^Aj*EYUIMD=XJp0dZ|MNWj zXSn~z8vf7f{vVrj{QvL4nkf4CBhnXH!a;fHqvCVi+J>Ni?*KgMx=HFNOiSJ_KqXfw~WS$~3jj z;sDVz+S!G1J>b9lr<^on8s6)~UD@#Q$&7XXf%IP~xh8@~?d48>dNA}1*1X&u1=93O z_=mH6ksv7OKeOU@yZ;obr(K-8=JCF{U3w&g8fi?@eSYi#ezTTFe|Knt`wjOm2w-tI zE#=|3kNk3dv#Dht;Kewhc+*NKT^ceJD4(%N_w6+B-v921>=x*Ujx2yU@}GAm~;6n4~#x`42)D=VD&nUwE70&LkB)Ei`?1a%Jb z0uB@}g-{ZX2xk(F=Qq(XV@XhZsKc1h<$I{tEDkOmFxiA}^$V`OnE~vV`}mf5X~7il zq0(=sc219oNHVB5@91LAUUQR8UP#404j_;ONu2sAdk&D5Jpd`6xApXa6!6)hqD>&0 zkqqT6L_WYb7X}l=n~Zr3IHu@_dDkKwUytkpts>N7A$aJQ?^|;*fV$$|1I{{jDAk=x za$-Bov*d$FuZH64yABK!dUZr-P>3VPFslT~`M=WpgySIi6{w9e&Y1*SG#&!L+n`4a z1h6r(rMUgHQm^s{j96!H1H`|N-u5H!3n72|FuU)8)w2Fc?&4$iDJ$Zqc0ie~dF~V1 ziwE~Yv}214ZpZFi?-xqUDwI0GtXuT5-l5`*UnPI?5o%gkz4a`q=mqQ73gF%j-Hsg2 z9O#)%+XjhR>{>z9b+W3d4870U)sr715!)-ixVO;ZR8Nm>|6-|r4k%@D&!aHeN9Joh{o-X zHH_`(?IFm_W1C1BVJbnBV@S)AS?x;IDVX! z6q%>#gjQUHY1_^B@=n0K2|gu(?o`C8_QwrZl3@_dmfw^DPn`S{^_?@>r~S0d72P;1 zP>IDuDik+dCs`2g7U#hNC}=&X*)nDQf53AsRPFYY*5xg=E3Hs**il{Eed!AOsMhywof;*uoS`PQ!fqR?oPbuQw zmq__reXx~n9>VZZF^km(D}CJnLW4`@wVlbj;4&3Nez%Nd43*v0d6?bk+PC1Rd8~$- zJOb`sh94Vu0#yfe={`7Q{&&Yz2n~!pJ>v`!a#@#R#`Y z3;^bg2DgP+<-U3vj>c52ObC3!E~%61l$B}w;lNCdgx>WC&k}mhYW@*%$`W8SyKGzA zV+BMM1XB#SpCI*QpRZE+0SU}g=OMp0P*`RK29h6vYlU0D zoQ0G|VS@QDZYncj}stJj{9+ZbV+$mj`u*2YeyN+v*xdOVJCP3swNkN4U}Uh95p#QEiTHJni#`s$qYnD8(D>L-nI+pAiAsc)P2ljMZ{ zyuIT7Vn`$oqBPPgEdJMW`G6dUdr}j84?I=iNHzd;dR1v<769^Z{$$R69~ja16`+BG zp?;msXz{@3lWMU*Ty^G!5@~8Cj`|NC4+BbmI8t(kK%X84&m=JTatf4}%#&@wQ-sTX z;1}Xg^<5?$CM2H*>ATJ5ZfXIJjIpD+rH9(LExetWHj|XcMl>u?Mau-w+qWw7tVl@ouIAZ z^xb;qA>i11<_0L%eKe-lSX$0rt9*0WREB89mW5vz=Zd{+$L$%ug|XadUGd_L<7j0 zEF)y#zH#y%0uDKeiAcFwF~IgmCRv9$e0v=2PXcu{4w}F}?+GrsW9nO~;PlA#KC1po z=E`pd3FaKmNqZ;HXqCxkao5C|dhiv<>BcqTpM~h3$7S#JtknZHt)h!pxkCPoJ>orH zi?RTuyl1^w2@w(0RYykUy;^=}?f1TS|MQp6C|MclRR^&^VwDd@rmzcV z(eeZ2%STW}#+epMB`=Vlt%Bn;AEYFP74DM_4 zes4~FsQfKQ{ug_1{Z-}qwS7ysbV-YJNOz-1ry|`Q(%s!5jkKhKAl;qPp>#JQ9gF5U z*S_C-ynBD|eg6f|GX_7QW3kq?u4|ri9`l%=>Fv93SNlu7P*-{~W{Wn%Mzx82A4j7d zbnFnchP7_mJD}q*I!9IJs8CbNtl#53N%jlNlA%Ccjfg(B)@yPr_uSF9xfIC9ciacE z5dY?3p-ULIxhry!rR*thn;W;$~*AR`*>KaM->DcVmn?7 zRo2z(X{1_hdqg`eZqaeb z9++j+Q`T-y!%#7!q@#$?zPvp{f-5i@r1p29E(xY!Px90xUU&8Rr<+~?XBJF!GewQl zebC%;o)6^IZL3M@y3tOw^st_8P&C)y3#58Tk)K&}bIKF} z7EAo<0mb;grYFf*LO1NprTElu7+IP29N`a(cY06Z1+WS}5;SSc`=Om>B&i?QtSaQV zV6Da%;Vadz*+1fhv#_UX7)5+mL4cTQxlc>D%!ME0YcHZ$& zV7ffw!P~WjnXD-`{rH+d=8as~4>Q~xn5rjZWJ7KFa_>K|RSF)}FW>1{Yzx+P?g_{R zkYiISzr4RqYwsUOSd5g&!pI^1xuN`C!bePNz$U@$!E71iJ-TY|U+c=<@anZGHYxn| z^}C`*PmE?kYJH}T@Fy%P%i3;!_fqsn|Ln@Iq`HUg@xJ1?BT)7NP`Z9;7j*AInFShV>86oe z(uLRg6!#^J#;}-n(l4c{eCT12PUI5B;J{>ip$O*3Ndy0=mu-Ad=tghTUBCSw!Q_`V zfy`IW^?~Uz(hpiy(PZHa*#QsLYhGM*UPkBI`1ypdoVE(b00Kei<6DIR`)vJ$b2R7) z`O}_<>?^9Vn%VV`6eQqkK9?_$kk{sqj|i|qbMUE47F{(G{f~2k7{)g!UN$At(l5>bp_26()LTc#@H_Qita|bt3pO#cjohH=dX(B{tR?Bz%~6 z1Vy*fsKmq@b|3m=@j+p8m@C4qH;Ik`;*X0ewMTOZ$$e}QKOAP1z^5IqO-3KNycC6Nif z0<#rjw8Mimqlg|=A*`>tf8v)N0H)miIrF9`!cV{{KgAu4y-w{ zmWSDvU<*QI&%xw|bKB3;X!vtO^@{kE@G$(P>p)%0!sM^yN#n%~b3~I}n9CZogyMLX z9v}l_%C~$^RP#iJBD)d`bH;ra4~^w@lQwd!G~f^D4c}qa--E%%p3V*m3`;6G33OHi z0Y8&sOoX%)SEhsyQDIW>Yz6zqpG1$1NdDt?&kCrRa-L>7cpytc zta6Gj_#E4b5vYRM2j@A#jo`hD{#ZzY1TZ z7Li;GN5@GK61i7{jW~yIWG_+K!TX5)YRuJ`>dDGvJA#EWZV)aXZZ^^ZfFix4gBr}= z#uQUS0S(yESWIuyfXiaxU2R{1xV&a+@}4WHx>x`fKu~G+#+x;K`}8peRKG1&vTa#k z(_7ircO+g?Hb;rPj0gVL4wIS>rfYUh=eMaJ+9&0u0NBXe)XiBTivX4cOuJ28Yx9j< z#2PcVK*yTQwvjyG^lKoK|zE0|K#>zA3*R(I>B{Lqp1 z$4fFyy}o~dgjfi8#<*e5_xNia(;kASR_smWH9+kgsap_(afLBk62c7gSkN{qx2T@^ z02HV&fV`rEhQN2kH@lzNY~is|m8!3>ca{8lQy!SU?|zP&CiQ->d5)3rgK#@t^5Mad zI6JZTgH(h0F70!_&_uf-2L!}sv4=%Yv#GrSnz0r(FgxQ`BO5mgamst+vE(jF0QGl9 zwbKp#Hu@yY(nQBpik1eTUW{{TQ%81HRE0FQHYCMoZZv+P2?xVKSV2AK2Hl;u*5^th z*Cy|_I7FMIZHeTxR7Sa~=$-MvFvB;9Y)Vi~uWaj<0Ovhud6#IFElb8gnMbN9@r z>UXX$M%t8l+Bv5z3MWgFOwFaK;ip`#;Y3`cu!<9Pb5&%RZb?{XESBG@DZCR9EE*a% zpHz@$cE(UuzmlZJun(V!ojLDRZoSw60J5qP0foPJRPiii{Zp>a9poUsc#PloJ{<)h zk(W4E^mnUj8FPPqYY92Z6%q@02oPj+MoTll+PBCmAMKA*uV$ZuTe8G@E0(ivDb>p5 zWIWfl4brZvAKaSQe7sGf!_`#BB#rqiKMJ1Ko!bQfnAPWP_`&S^I;?&K z;*`-as4D&M5e5-XcOr%S4&|xBSy`@KCp}u(|LjQE(Kp9EP>NB)&Xr$+TX1kKfg$RN z5(k}Iu{`GpS7GT)X_&OA5_0I*_c`4waftLulL9I*2=mOK`&>_$Th<&@6C&xGrIGz4 zD1!DAea<`XY^lKn^{_TJ%VZ_dB+J39ugOhp39fJ*zt2N7FX6cCxFP9Y&=&?grbLD}R$CHM$Jzv&W#QI2IpLDjEd}%uy73{v4 z(bvzU6>ouZcPiY9u^yK9z&#|V;;Gi|@tZAz5%_3DI z54%~Bw4Zzd(#={Jg?g<>Bxd;4hS?xPaoOeu(aO^!Z|0NHqzf`xnLIA# zQlRribDtH}3_8%pe;okWh31cWxzx@Y&)A$P(nN~a0tCO>urp*EZv zx!fkTK3B5W84xdkYkTiP(E*nRbj-@_6_**^_bvs_XXEc>A3~BucEkIndp$ngaQKDe zrtX(km}G@-0pZh&w9FGYV3eXzeV-F`vql5$sLZfE1_x@CH1DYS_p)gt-}Ez{x5Q8yef>X3z?!&52dG$$m88v)$2^2aCrCaj_Tx^@tXwo{L1mqf;>s- zfW)w|xqbmu=Za_M!MS;6vPwb~mS&HvrD9A7(}0rrb!1{TW^AcSf>K$p^SV0czO2fk zdD(8nm({*w4}!@ua;CoMo#S%;r_OPG1)b|ARw30%BOn_m4S=VZGKv76_>Eb4Ap+>G4(1N~_+5u|qHx2=)QUtIvdS^%d zq7M!eqUJhjB{MVne!{VJ7cS|hDPQJA??a0)O#y`@F{S8W=Shs#+cKUzCAeSrnG2Nkj^u4nD#j6{kVGrc{;IGRy`_f zE(kchC6r5GQiU-&fWrG&d}8JjOxP(;Q0~hzgT8>GG|9+cSSZv2s({DmL=$hNRzUE1=j8{a9xINE$#-mH0>+jzx8LT*5Mtc`XEQuZ zw`CHGDFukUba&gl?GgEf6(hd=DIaBa{;t?;an3fk>@&EAmlRCZ4TA~Ug z#eq($$oe2%V8vAVz5n(n9IAF82K?5avgPx4JxUNEouapYIF4d~48^h>;U*wq`Q$|d zEsrWLLEGv}A*?ulX?c^CgW_Et2^x!`x{gCH-~3BG53Ixo4CK}{DukH~y*0Y&4jVt$60GE96`Kiov#M7fAs^o7i;ZdB6(5G^$=u zn*uHCn{4l^qVTouFv7i6i!7{L=9mS@Kf55i3%ClBskZp=O?0gtVZ=y4@u=i&B9{~{xCrTs2n1x`ecwb8`19^PY<#fOQL zjOZ<_5FPbC(wOFM*A{5El?wO;>P{w@@0w&nV8#mEVAvezvL3HC zJ=eu^lZ@+Fg&FWDFXQBr{H`If{Z0E+=(s~~?j96&B(XxL17Ce6WB}EC``s0aPGEfiFagaP&}u#iwhXzOsa#bvgDJwwV26vA{uF#`7rx{Nb@6{L_<$ z7&E=0SmCS`3b+Nuoz$4AM+Sz@(?iB}2keL;iYFets173EWOlo#AL00fSI!$I_Z&!C ziiS4(hb4tBC8Gjs+G`s`Zbg7d{=0~SI`9TuTr|s6g0i6tLFmvtXb0o-zH8aOt@yMD z4Hy4^SMK=RlXi3CAAbACBpeD;+4Tiusbl@OT}PBvV#i**!g20xciGRWm%wZ;*??kd z$~i>WS8vbJv|H$Wi*Yfbcq zSoF%WNwn^ey(OPok1JsQUw|VO@9H!Zz4P5E7}~^T&OVAAjF>ezfxgGW+Wu>K)#LnkiS$ zR&T-o@MO2rj1&4IwSsYoUORU3->2FQ%KLFGZieerNES&8pbB>cDpg zBUxXYZW@64!-PQ#3YXSn0D-|v=SKb`!zA-N;+Q;l#X4IQN}-|p=3iE?DAEc-JpMNr>XnECT+nSgy)z6QoiBZP5BH@y|hnJMZ$;`mcu| z3Au(z%y8W8MA?xg^I!abz;Fo$py{=$SQgk|K%h(N!86B&5$4-X!dTwJ{ zf0fJN%lXSh!s|u^NvX5s(*n12f^ z{~chyK`qzZu^;{^oc#Tj|NbYRL9LZf`ZfO^p#J-n{>Sgep8-8WYhzda@9vxb>bw8_ zHUGbV%?$vB;QxEuf4?&ScUW)x7(8q3tq&1{qp#<5GiC#&t1s-VrvI( zEy?qqG&Gi9k;rZPx(j{(kc2kdZBK8-uMJA4rp(!FfW6mS1=920PyS)xkI2$0uVCc@ z=ilWo$+HH$-GmO{bC~*aK@02(iYznl2~S%W-d9BT|007~XF#4;Juen6B9sTfzoIp!bffu;BqmcCZYyl^5|NyYuDv(fI_=6 zfxjX7q>a!1r^=fUs4swzYt$G>G=HMPG(F|-=UUH$Z+`UPD)Lc96S05hn=j7s6@XIb z?>7eo{nEf<6DxO6$XcmWUfBRs90TllDB#|4w!gz|x?OSvy@s&AObPZWpo?Y?5Y0d3 zkC<@h50)8`VCA6;8IA#S8XqzNnD&GOfR+JWfPmL&@NHg6$*#Zsji*+_qis$(3iCJo z@tWG~5C2pzp_k&O9)zg-+Z&Jb))(W6_-_Ge*+nGY*u7rWeQ2cbPu>Q)c%+Ozrc|r+aOp9@s9sz8cP9(p+7oM zg80_}e%;QUXHgK!;wA!&&hD)yj_T$WmL=VGrhc6|#ph4t>CNM5YI`sgw&3y4gRPU`dc|M4|L zBlE5XF!9I6=tu;72iW{zFgsQ9yi;-w3@_Gl9CmaNN^`y_1KzdQArRn}(8;_i08>-P zF!Ro#OAgTDK5DQVd^RU#1bSr$*VP@M$$L5(6BfaXiWy6|WC z(6^q{b=EMzuX5b;5lW;d1zqWE_lk=GFE>Lle31=0(M)e`Lm`^OW!BZEPW(mQ|jL#u!IgE&fXv~v7dRe+Jnc`E-u zKX1S^7)~13QmQW!D@OPLCXdC?wxB82)P94(Ej-lHG&m~bBMSTh@A_`LpXf#?8%m`c zMKauUQxW#ht}NYRIR6O139klj3VbK%gPA~sI9&j3S~G*uyeZeNWg4BDE_*IG7uu($40YYf z^c83vML|hHZ3T5$?k_dhOBxD&SmX;6$CG*v99m93x0fz-SjWeNUadPe}9 zZ~gklAHkshBnz;yPHdHfhH<&|Ou28-9SFS}=KXQRoPFN_5<-RiTase#WCQR8-p0E6 z+kjwo2vjdu0xP%*0YEee)&`Z@ov(yuCJ^e%EvJfno7*0yAksdqoL^Is!~OsLhf5xo zL)jt?!d+2%1Kf2>K-}Fo55^fwnY)9Ua2CPuj?(xAfhQr5}M_EMP=X z(YXDo+_*pX10bfzzFmfbEDnL(czWIT_}~Q@ppLtOxhHd5oFD_m`5}1HTtRJHaSPrv zDclxR-m_k)vt7TAQpgl=`D&c93h?@eeQ^{=4G+ND`;!SLT%{fObZMqrXU}@$ynsb{ zsYE4z{l^CYE^z_Oe$5zXIRk?2)y|;%Z2$>cGsXl9Db5}Q=4-8YJX9db>RLaZeyQ7R zbIh^lAMx3q2VM|2KRrBqdW~sd60z$44wC~sy#vMhNh@IAjMZi({2_(I(MPbkK-8s> z);27?1VsA?yEiOaHTHm)m9{^g7qkG3L`y)d*!aXfbjJsx&5Tetz>o{fuP~ODtv6gk zN#HECKUH0cf29n6dU}-Fs1UXSrPZ>$v=s$?WR1gLsH}!Tt`9&&ouSW@Nu)gleV-qt z-*6?fG&j!^;hyq!)JH&%Tnq}4MJ8*NK3iZWDmNd?_PzX`RhHDIj_PLQ1Wd#`>M`^@ zLV85&5cH6BfC(YpQgAYzud$3ZCqIbc=^3_~N4^g?*GrJk=;dT8W%^p-oYJf0LoSaz=BRzFMz68xBkP@*Q`<=9%bfkG&qD8Kg9Bq zF7-%e;`d2=Tc(DVW=_{eUGS%7+(Q-8IeJf+g}}xd97(qE9blI-d-Rdig$nco$ZMd- z6&`;GII1d5G^aY7t%ICtmvRep20<7$^_;G@^ED?sbm;K+nLCU}4mUSofkB4GOTlR{ zkDjW3XO%bBVATHRPfM@;jz*fQd3mD9J<$H#6+wfcD5!tly5az!_V`j+Y$n0MvzHCF zFSC^2r!&b~TZ`E$}rxXb0M%c`1?tI~4Isr8mp_6I%cR?-!NBqnSaY^;C%3E)EEx^8Eb zsqXL|suKU@ea58k3E!|q1h<;Pm%;X(+znyu2{YUcdO0nMtp1>$Loa^mL0_#9+`3Gc z!EYbP(tBIN$QEFlt<=(DAkjgS!kdFH$#Hw4a6hFglbKjs66T zyF$;qSJQy4oqdE!|6ZZt&0?wd7Wlf)QD@wJ!Anld;zVaab=(47k#9+DePGoc7FP{S`e6Meuy?5mz zKS7Ad5f*xFgA`vcLfkVV;i~8%kge?AmUw&*KQi|MXUe4%rOd6YOgCGg-FJYVFO*_m zq(i4>LzZL{3MUagjcx%7BW?^TU+58b8x#8?@)ii=5UN*QH8%T1`L27DG}SAyN{?S>Eq~Ee zy;UYbwdc}QYu-oFFmy5vhPYXuUO@S6pD@F$&n8uOhj0)l8uNGm3^qfF0{GX4GQ%!O z*R-2+zy-Ak0{_twogPsd0y!aGsadAKBmb0797XCF&jEer)@a!)9rLj?_HL#w0M%ev z(UT}QY;0KO*?=#n*m_$1V=eeO$?G3LuUT6VTeKCd+?9mO0zJbCLWPA6HEDVoa{9`Cx1*cVF@L$5!^QDL{NO3%6T5es|P*pV1|{B{2uBln*5_8byNvf_Qr zOX}Vd7}PUc$mobT*qbVDhJi!8svC5Qo12@9)*m)Nq2ZK5bFXY@9*jrq#DYJfI#<9o z!wiFb60zj;uw2>14B631FyIQPj6sQ%zA+F{mDNWZsy}mTcTYKq-e~o=KhSZz^X%G~ z(&{hm0AYVW`6I|u1dZyP=?m*1-^=FpUT$USmA9q5gs9#;LwwZ&@uIjbU&QlzW1|OXr zUn^$R@(>kiKlI_H^p|VO{crJjkeU(`HQ8-U_NxQmLL!VR;;ssEXkZ|@TOWE|XmuGe z-Wpv;qUgx$(lwW6RKJ17d^}E;Aa==*m$zj@rxr6hZq6oWShm+sonSf z^VzjL&0RMjTOf@F7>TmxrNSni=cx*1ryi)9H>&o5nkqdjh3hu^p4MVE;09nF8{eg9ymP7IQhY` zkL|agf!_Z=gyU6VFlpnBT0tHBN~HSemn@)r7NaY*lqTyd3E6SW<;MOVu=x2E2FVCV^wU^qID$Jh^nM&i`TnUa@l@@zbn z58=(eT`Ufwh8BGq=R@|iqKFIxzW#L*?TR=z^$g1@uQK{+PCp?bOf$e?iUl)C&_BjY zK8?Ve3+Czi&YFlfD6GbR?HiXgxb$02_?S;Dr^@bWG&-`I!6`5Vz8+JWY%nJ>rn0{U zo&EeH`W%gmI5#dmmUTU38^21q=yNuKO4k6YV4qT>x7`rz86zA>uD>{Xo)?yc>Paj1 zGp!S$dNwU0y?9ZzS;nq|BE0^3fNtTQs>3+Inq_y6}Uqb1To6YOdED(juPAb3}Lz$=~X@ zXzGF3%k^z2YP!)n=Se6WEq%sDAIcwX!w~!ySRO7#N?}ri9Su%J0}4bW!?|>wAx<{y zHLR|9w4xF;e1l*jX*nWfDe(-G%nttHR=$0nv$TsF+J=;;F}NiZk@9#c$WmkuAO6rO zx|Y1XOfP+4M+0S3T>XfJ*=L&Et9s%+A}O{rK|CSl^P`m&x=tR24S3YohK5FinhRz> z;)IjN=!MsfE}q{*JCb=CJ^p?3-5mjNtwz*(QVa`)_Aj?uwgghmKZ zeMV>RL)4dMu&S;o4nxeVxav(*PlI9e-qA~GBP)Bll|I<(nGc4NXs{=n_?{e@g|+J= zN;S?ix_Clk=0uz96!|qJy)JT79CYpxz5pTm!V@VYqvf|Y&8(@G_L%!|Z|FG{Danqc zpd*1v2ylbS$i=3C=IQa3g=Z{Dbq=tm8!-Lzy$=0kgv4NzlO#KuLyv2Mfr+U^GinU3 z^bQHp%V)@a2G@)WcQ7|}u+J&~?MIma);+hjy(%;JBjJ46M}5EiW^Xf;=k(+DPCDVM z>lB6^A`ERTaOJ^K9WElArzpf&Peq(;EPi5XZD|O(;yI$*GE z9EGl+v3E#boI!1!wWsCIHcOaiShJH)Gt7|L9a}q_I5k8Lbb~kfGg}#fXqHmXlWKWc zdwgv)p7}t(7v_do zGz|(wS^ovgp$_KJ{5V^8`2_m&xxVkz=+!36xU+AGmI9e{AI7~E0ab#SA2V9mqjb4C1nNexPEuD8&ty2OoVt;s&j?l4+X2@yrp z`UQK36&z%Z(n`pfuR+MLE74cAEb%@wyusab}U8R(V~+DKyO8R<*1O`@=}8M`Cz?XSxcbR_07p{8M*0hzRKx7=kHt%R-Dh}B*=G7^G1%bF zfYF>k3OObfvOC7Z83ZN!W;Y@BG(!Ep&{>z}^5(am%j{`EVUu@%Jo6T({#Xa=f4{X_ z;cI!%CM|=5cGS@}-oc(dgZ@N@7jD>{ypFRmlv?Pchf|ler2BG#qZKua!r@vqbD5Wg zPDEIdvb*nTRsb&?{E@J?(>hAD@;h(BV5yk3%EI!E+P)W4{9Q+ELqj<4{b`9bfRZc6 zCYJcW2_E5MlC+d?AwoxoWt!FAvq2!^Szwp+S!{67V+fcGhB13kzTuoDgFK7hVHnJ2 zaZb&#wC7W!ks$0{W3F?5u&*PL&0x!B^XN|7Tk|Bcp1~WH89cqZK3y{Vo_f``_UBD3 z1_tA>JM~-UO>JM>Ewt;<9duo?Fi5(PJ92n)MA1^6&rD$*`g8ws689m(J%_fs23CzNlr%J-v>Fc*}BgcQ>V5rk~h&9PA%#+8RoLk=b< zH9`lQl{JaBzeHVd-D>%G`8oO_+Xe=}1|mg`i{+^)Nsrz~CLGRHj;Ok!+1e743*R&4XL_)Ra_0V<1#pCb+orj`MrNbmfSz+< z*fjlG4E`A=O!QCpvEvLT^e7Efn6CcS*KuyLJEK{046^-^|5MHq`vGr~8xKb%x~?L9 zO!#!yiAdJPEO!2n$~rM_*kx|e(^J+U&XMRLhrz0Yr^&Nxs~#eB=u0u?PVY%a-Ak1s zY4M(d(`5j5U8LWFlmC!??ZS7jpIM)6+vy+8WQS65|n64IF9OkuK781Av z^H27{0t2)St9@cHod*6y!#q(RYd}gH_gWJ^4n?=w)dddesdGikX(X>An<)(BeAYPb z;_!IGkd(-qTA$YJEze@AnU_M8m!>~~3O#C`cVQm%A)Gl48Jn>g8?c{tp(Q*qY_2)g z3|-cpw5eF*kJPLfYEzf@K@&zar8^SK=Isf?ECk;gP0JLggHmV!jFjfC2db+!whcFJJ? za0`@4MrJsKENm(f9s-=hb3o|T{?+CL@|>Y@3-q9^7eTGWoMtZwD4wwzEC#4fJ2>d>M6D>N5FUaZ z_Y_%*$N>((<&99i@QU|fQV1%?eLTVjnM48*iFP~jD zf7cB$t@=}iqf4n)koVGvYqGZ_Y%ZIyqF4C8!I#SdSkE} zHd(oN(3<3iMwL}1l|>Gs;JnvuMwL@wqtiCgYD{ykDeXGwdXVC$+A50-zU>(V z8uS`;N0`+c$2bmR`e3+w`mYIQTP>ik^J{RZ7JIaagx|4%+RVjv05ql2OMcQVy?FaP zxbFqg^os}v^Mp&yX9ub2el?~^yyqBd(`z4}=Un>qV879D@Rji!oDriE!YVw33gs3< zV7Yd}dub@f%8;Nv7Iro`Kz03XKLSmtOhQ-ZC4Q59l;93aO)H_+4A)s|enqmX=wh*P zE{-S5Kz)nEg7xgt@%cx*?rgs8?fW32vvm0Uq!*oR{V%k=Z0D*9P0wa1Y?CYtS#P!6 zWr(y5h44|ypUQG8uV!>)yCvCXzZ{%cmh-7+)6Qu+&F{l#r!v~SrqCAVj-o^!>4 z3#qx8hi*k5G1CWr?UuYQ;BDVNX6*TM2Zgt@dt>Q^UrkHu0nEWGpw;NPQ#EBmTaa3D z730OtF8k^%#NBvixYX_?)fY>RuB2IZ_H!YB?&Lc=c?O+)P`1#_GT z&N7j69NcZ7bEu{7a-70e+Se2h^N5koMn0D6hxXHc)7HRRw)J+~IlE7O8$0>GbyHsD zvZ8=`CUIuQ33rSffjP*(r`EL3J;6aj_5Oz&m}2vKiP|vHpV0+c64^<$ij&7&23z!Lkp>yi>9EINBj?eYQ_S8@H`RP&kKxc#kQ#rzD~z} zl5N{{j9i$MzNe97LeGz#)GZ{rVWjs)daOXmm;%ux2^)2cVVQ*%YCHcntr2=~1ZG3O zR*D`3H~q1;)R$`!$|gzG_w`7MX8*)+KlIo49vu18p1{u;rc?IQ(Rt0S7SEyOId}G> z_kKF)rV2l_;UNCNJ0U9Slk|-D1J7|)_acbxd&a?UP~I`Ms2%XN5UgbjCfa-7EkS2> z-;h6Z91&8?@GA05$VP4}-cxG$L`FlV^EQKtOmn%BH8;hK@uO1!| zEYy6Rq^U%GChn_wlkrPlFcxi1NZxSRg#th|o{k}Yf9*laxMMLULq)l6 zy4{>b3-KP)q&Q6m!NO73eNN22e-vHYOn%DELT>oGg4*%$WV72*iS+!7Y%KS3#|NhJ zhAv&unDP}xWIrKpm zT}OiorN@XEas@q+ZyPZC9fFwT3WtbppEsdb?mKF82Rh_GAS~JV?s~{EFdO9JWqNhY zpO}-HuoNjw!P@yFG-G>yVtGXngI*n#98ZN zpZm%FAHj1Hx5>nu2DR*)pCdQcuHJ6zmuSYcx5j*jrC&I`vpbE8n>NTPHa>X!vOO~^LmnUXc)*eRth`1NzT;A~qUC)XO~T8%@lbH4LV+G%g1go4heS(eY}x*BQ!1*@ zlW#MWQL{hvqs_(~CaSpLL-X{){x)+(8`o0W)D^ToyrI7cpd zEb3RKi4e2JQC|6`FfZ`lhcXunvs1TYM0C(hXJCWd5R8H&UlO!MdKnlI8RPjc%qeCG z@F$VEFa(Qt2*L*)qJPe<8QAvaE87Q9q~Flp(iW5{;w}&Cf!61$x>o%|%q}FoxgK#1 zU`~(BFK_ia5QZUblX`fu9n9yE4vGfPIq{I>*qWJ#qS~DkzEVx2vLwIBl3vc$HQ2 z)Q6*xHtnzPimZZo!aI>8?GAl%M0`FoyZa#{T~B!z1Nkv>O;1*TL$FT>=|mUn8Qzmp zxm4B%ZLBd_Z(M`LK3+rmbCw(4Bf7z=(=H(*{E$AxH4*Kd`(Dn$Y_*ipgrm~&S^7ou z{azq{c>y_AeMdDlcxClvV#kXNnD<2+j)ha?$aKBDL@R1ge~>dWq!QQzxR=>e@)R<7 z4ne>4cxCxqu5IXwNs3Li_Lx~_#U=RQGsaBH-9x{PTmQn!)s$_ktYH1c;DKZI4e+%% zceiC9Zrie_?pNQF1~nBaIFc8k$HYHDM5fEM4{UeLp0Qo1bAjgbx4`5}{mh-a%Rl_s zF0UtUs~L^D>Wf;j)ZEp#*Nxy*spn-Zv}vhLJ67ydjy{%=37nuC%Ws%q8iVhe4e1*{ z*y^)Rn~&GfC&=Vr%}TuoMH)3VV)J*? zAFq(JBd(GAQ0~lje4XM>$*Kp6ZMHx&bwFVi7^5!6cvGTHCo#{kqj8UsLtyX|%{hc6 z&lu!9Kn@W}4fIh`UNRb37X>k&`tl?HQGG&qAg1QV!X}BMM593WIvFUPl%gA)NoHz3 zlNr2Qmt%d9Hd|~3<9E(+H;wNNtJk0+(S5*{8$IW<6ST$;7D&BUvRq7|9!-t7)}yBrDq7EBBtfUcCsph zJ$%Q|fbPdYNC1C}M%uoEU@XN)_haNG+yxQ5EPCDH3%0%VQS1KT4||Q<4Q~*JQfs0) zpToC+KPBNG%>^XMr3ir#V|fav)+9`+S9D}ENr2-=KUdBbwzjl6T@_Lg8YFV zf0~R{cK9tb9gF@Nw~Pa_6^ajPVZaG9%sx)mp7J84@y1t!Xa9slcF)>SGyS(AoRQ(O zdsafMf-G9xP+g8a3fM>z!s~Ao>NLr`=U4-gSY}zPofVMv2PVAsP%3SlX3#WsWz{B_ zpOM|tv(X0`J>+>l#-ZIL1a&4jVF8bdz6RK`RGQzm_c&qokrM^=ggk^g?tpI3=#AnQ znLJ-uf%z2Fi`62bgg=$xM_qPc$}1c5o5!7r zS1{=J+Uz5-i*9)pa(&jA!shp7zu7JG>_DC$PD*}IbFqP;-D?A$<8aB6omc6Mza5Ro zwmrAm5b|yjB?AQd>Y+jYA(hZRamqW_UNL02v2i{aRQH#wyvv{^qKYBw&P)#b1E|yS z#4qXH<-4d++xH|k;4e3RJ;@)X@VomsV%0TFD^$`GgF6sRh11@?9$KmX3$eVaO4gL-m+?q%=-|xs3hNXX$;JaO8_Qkc zF0;j?0RJji2>$Al%7!2mk%)A2Lxze=aaBViSOz>URyqDRb_bj@#IGqaV1GATDi7-- zw&P#7CLiV8*D+rB16>J~_w%J287j*o81Xoh;v@~ra6QCaCJ)7=I5f{)-J_;J5QI}&G$+Ce z%q5b$%##fB454%B{KZd>Y9&cjV1yON^Tuy|nO&0OM>wsTPa2DoH0GiwZhb~O*R4m< zSy893+FVG%22Eh6YOweaFj}_9ccYDJNBDeOjT&}*GNzu*NhF=yvrhbDxLsbtug(oF zXlr=4``ycBB_i+QG4;VGO1c-d@;27gtyDD-S?^*eJG299%X*}?0A=5kn10^Z<#V^g z(Y;SkhpPRer8V|4*I&3bF;En`^I`l!b>xj(P0WS8Ud{SSz>ZOc>)Sf*)b%89(1 z5st+!bc7O?sBjg#mVKrW+8ORMWx~-mpswBs`tvGN1A$I19>+V+ivKJhNkY8e%_5pi zzRqY;cN%*~9Y>?Xxyj^q=#+Cik{YYm@1n`mp8nI-yO0@e?S00~TWwo(NkJhZgW(X! zN1aI^RoF3$i3p9(9m%vkvJ-LUwXa?D35gh%8D|HueQgC$_xu%?6XQnL=*+8!;>Wc{ zS}y5TcOlGU^ldi+JtgGI5a8H(3f)jqZFPmkDQ~fQi{6=rO(V229ZkJzJK87klyB94 zU^S*C6PKEYvu3qb+=4LM_^!Oqenet6KIbM_Z*z69@tb#aqsnqOI>KjuNJR-w;AbOwHGqmYjz_N%L&EfvR>A@x&Z@@Ym*Kw;b8?2edd6ux1*xt6q-hFbT z{_}2Hym4Z*b$YMyJW|+i{36)3Qmxl$ug{1N( zS7f|N3bY?`2PASUBQC{PSz(55jUkoU@`+YMK8Hqw72i$*-Io%IOZuI-18tpZ2W`4) zkoXwlI#J9x7Xg>(BhFV515<+}m=hhi-!d+}8~z?-()0QhQ$%H*LBYMY<#8^<#ftO- ziDn1ft@i`X?p zOIkMUVepao8EAK%p0-X#5YOM?GZB%~c*rxgrE=Jd^OM=y4N(1RkZS z-fB$>kMLs9a0k^EN>{EJ7G_reG~SOC-04;3q)_50)HANz*gK=8XJ8i)mv^wbO-Q+8 zWt03-aG#t~HzpAE1`+k;TVlpPP210jU#a+S?^osa4g1@xiueDuU7Fp|> zB3Hi3ASi!b?blLmDpcvpg$x_q@cAgsz}_E7&Q^GjL~Zich|yetwtl=Q9aA0$vd zfTG0CZr9{iC3k}z0qz0RSXw;oJ(9`9bOsInFhMAxh%LBm5~~_QoCf{|QiLF0c$#GT zcV)7<)Wxl!->G*}b`I7%+D5#g;8X;Tmer+@m2e_C!&f1dlB({aOhYLr94x{kH0@gk zR-s7DiP6x2XBJPhB~z`(2&|cuf-r4P?15bt%R&q+{h=(tjag+UV@n+ zQM~Xv9See&V7lvrb4%Uc_~^)j5i4Y9xP7skLVnmH_qhGY*TIsU6!)qk*_ZkLlXBrhrC1%>RQ!ZZp(zW-N zzIPugHa)-|F!>3Ui#^~FtOCuGU%(->;H5bP{vt9J2}L8qHuyj6y=7F@d%G?y-Hn9O zA*eJ6k`fAnh=hPhcS+YoT1uo0Qjic)6s5ZxBo*myq?<`|?z#5f&w9@DthLA4?|8qQ zG0qt41J1FOIp_Zu_kG=0fUh<%Sq9aXez^#aq17#@^oQ*wAp8 zut>LUa>2L-&z(!Y2{=||B$me3)4dVw31Oz`&l^sIW(9c(fqj-*WPd0So9L>{Z;hzw zu=v0<8)TBTOhd+b3$5X~g`oQL%P@zXe{mb`t#!Pt^MO-IRifKzG;lpNt9G2zM6@4v zXm8fFZpcbtZgVKc`x8=rL6Fb*N84}(B;HpePX8&mDHGTde7C$?BdQ|1v*n&Yts;uo zOA<+{-ga?Tv@?5eghTpfC|D{TQnb$gLebod4VmAm{pXXrmH>q?&83}EpmQT0=pkID z^ldkEdijm4p7ee>)U(f32`{glIBX%JJIzQ^pPx>%%U-y_C$aStsrDFIOcgnxlSqG? z?!?x;>vtdx$8H%i!=`mezBYaGX-2Rm@y1*hK|wFeHsWt;Zkbj51@jl(;wv{elPm+3+G?Jh>Huh7hdxXZpoNQ9DTc9G}(1 zB*qL|QE~q9p|KCY6(0tcmqFTBhw+MH^V|}`Xd(|sdjg^@=&mb(qZ(3~;kJ|aGJ3T4 zg8<%jEuQaYALJvY~n9$Ty3Zi*~mr^Ar{S^);8_fR2l;Z?As*r&8EK-=o}*Xzcy=p{@_HW zI%%hetmHTR1`lYxhKQ2VL{vjL!x#IGi-i$%)>ylvc$ur#UpMDklU&XASx_qLY!G|4tk~{)#j|6iv)x!z zs%3?Og0eFWC*kqa3i0Jv(fYMMS}yn1Bt-0H+#k6aBUNJ+LhDmcO(TpJy>r?*>&<>} zycti`lqaJz-5y!gI9(RI*R?@qqyKBDVcS~A3saz(iR9SgZ_4L`$+G{q-S51X~USPL3+;k?%j7bWR*{QdLg` zR^WXu-fy=FNpJ^c4(<{1@RZMy8ww2ui4e%@wcTXq9tn;WbX$JN$iOzLHcXi|9QCWF zo#W*P&gm~^$*M?XobUG?sU*Iu4|)-(Ei~yB{qt&yLm}Q|kbr8NeAe{3#-v>tQcHWE z1aLpR!i~%4l9re=l0{qse42RO1Q~t1|)dhWHsD#2NAYk+v2j#}lXK?{X67yCYumJK z-KCu$c4A%+l-TJyJa+^w`5lI<@crZebd56aM7yIXd{tqz+g)lc+Yoc+1-T7J51yM} z^zV2H?Lx(Dt#1Wu12yu}(x;`q6J|Ao&U=QDje|X2+PcN+li#>|#UALBy$q0*PPrK~ zPpNm8#W_q{rJX2um6%@a=Gn3=N;psosP;hfXSZ&0T-UXc;-CySD}B-_oUo(E`Y#7X z@1(ioJt-NsDE5+l$9)66%&XPvq57K(1_Z>*1s^IAKd9IDct1Wh#U!LsW;k|y{jGvt z+wkV&p5pD%ueII>*xT>Q`?p^?$s)$)#dCfWQQke?98G1#2)=(_Y!tILehnkcPAk#$ ziO~evWlI`=rMrU8ust@sTARhr{QhY72Iz*4=d$3}jx=-(c)@&PsfI5GJR$AkUC ze6={sHxF)|_HDHM{#0}QRyPR?PG>W}nAB_N>_z zK{TxB>m9|maV0T9d5+&@ZV8d2)R!b1-ZwaS87_-y1|wclsxT2c@Y(cbeZ}G%J%@}Zq-Uq8 z-T=lj!m`k!ORv)1B|^U?iase{*uqr?TTs==2dwZcr}-w@gft{I%7ebNEsmXGdY)ZZ zNc2n@v7Ajw1s#CYTwsG3rL2nQoiuwqzNAu(PbvZ`S)-$Ah2hd_@CAi8duJOiq(Ew8XI5J$Sy6dgphL8+q~k_H7zKzZ~{Qu)<^`S)!@P;0eabF>+LhJzv+m% zv-Bsa=|>jc*B|x_q1xy{d?Z&8Tuc$@1;~+b9cP0MlG@W&>FF2ot>yNm)u{)T!9#^O>E7QB)v*1fl56N?rl>%Rhtc$j^B_w zqiUD8)-+e=ob8eq4j;zhK9?55RE^=w&|pDlQT2qc@A^i{=N6U=XnXp_fgyL9&aZM2 zZ7rYId_I!g)d{o-(g2JB-G*wx zb&gPN3|aQCWscWHrZzT-33|j!M~hBx8B=eUuinb8;!WV1bZ032ed01|QOv%m=a6_f z-mA%cS$5dDxn%u|cFW<>$?kEg{aD{*bv~w>PDXnrdivFY&)cv41JFY#D|5=9do4MT z5YTYmeZiUsQnRPXNk-p;bk-(g07&&f4l;()M@Uk?uWN0r11xC6&&!2MmhqtyZZb+I zQz^VCvNaohYyIPc)OAa8iV^g{g#Zkkqm_jUP{-8T7+>d`paHggqYEY>>V{MpQNPDM z4+73L1H^Q2)8t4@uFrMEc~m%Ww=w6v-KR2 zh{`06VlC4B^K1IYyio~7IJg!YffKRX=BPwvgRVpFND>TnZ$o9>=p}iW7*FM{(>vG3q0sb3&LMTDN<+_m-spNU=CES zQ)qEm&!@M-UC_p|l=>Ad?(Sudfvd8*>%E!xy0ax zBP5J2o>P)1zWg)#)clszw%4HTo6PZ3zfg}Mhw)~D{kwS!6cDQJ_D=~*OT?|@Zj5ZzXM%Nf7BW3ahd{B5YEA2-`b(v`Qi3o4EydT`pZh3 z5P@YM$)0W5!-&eqT(O5JU5@2V)owKfdQBUr&vfUY>!|=&v`Mfavatu`&>gH_!nAAl zm-{<<3}lv00nQn`N$n)U?k0C(mX`1?&8pZ&)y~P250Gfv*m?tHSES)k>gEzVFS)`R zEkPb^QAjzi&F(q9$N{q}~Nc#c%-PQR|E0Tp&+BE@pL?G(Ln_7_!>HW$Y8 z-xEj9Du_@`D!a9~7oMhV#~<2%;|YDPdiPEa!GP^?9YwyKJ2C=*73wVEl`AHbl)+BFNHvX7eqY&eWQ=D<|JDI1FJl3o|Z-1xdtYBaEFsAfZ>_%CS?@8Am z{q}PHN_i}m^~E()^WL7qF$0fi*IKREe1+CK<4d|c+ID`>r2R3}8{zG1k8kYWT6CD9 z$`be}efIX$&;Ij{;Z8auS5H_H_X^MIK5uPpf?ww5^#$)k1`X}$1B;%NHKIulpcVO^ z?rA$j_`gokIa3V5J2ZIU^BoB@53gt(gpk#*kCCjq#;?`n)O`-QMaVdx*d3mX_#8!qI`lIOp~arn)8uhs(BCsvPd#PGcsk(@>Uba4CL$ z$EWo5M#^$Z7@!(g1eB-)j_&`#3g2h|jr4ruZ{rW$hH|kLmv|2>+hyd~b?e-wYu?EO zz&w4l8f2tcbcv$ZTP}3kFJ{DSuRMOPSpG{z{LYKDKw`1B*2)uxMP&ehP zvJ#4f7ZPqbLr}y`38B8?F;M)gU5t|4e*_LqgPMgWIw0b%)>V{HBt4T+M`EIc=vm}V z;%gJtl_H4g=`xsvi$g6AxgWl|{Q~k+;5rl&w3Dries7g7_g1> zat*5Sd05vl62cfSagrVjyqWJ&zjr$O_{Q2(+er2|A_?gcM(V_If<#WOxL$wQ?Ax{y3kObpyTdekW?I906>bC=~10AqSM* zVaQvZNk!c|bwMQ$v#7Dfwf;$`WYvbbzg(16x!*4uGBGa3HAi(gnj!nq)_&xJVo`Sc zSxLw$45LD)8|QhWcP1zr2vL}axJ&jtMK#Bxnl)|Rw()}_L~XhGGmoJA7(E1i9w`fW zv3U(el>frK{I5T9CQ83K&wl;--qrX1N2@IK8P8zd4MV}^bJnhU8CgZEV*kOd?$$GkDO$#`k*dF2)JRZ$sQ4w$95_QlGQj^zRtdxM9dO} z%G}n292-1}m3ooj=-yD!axg zM+648K-b$-Q;{J4(B={yC?0)iqVkk=QEr~&;Bhx6g0i^Ett#~a!}PLT))q#Z?k22^ zaHtk~IZP7@C!Ve}7nYeUt1w$TetJL;0I}4`-N+Z3>_%fULs)uWEXW(;ha_)-3+0%m zwtnnY+X2_12oUXGPW1-E3Qt;jGj3IJAT)t+U+7Gnkduws+KBZ%J-X9^$GO5!rvvBL zc+6FeF|Z|hi%_nLC@SH9R@a7MiXp~3*bA_U$kSb`4O(X36o|s;@aoHRZNNe~<`Z8j zx|~DbgTt*`vfIKR=deBZz2wr>p^P9StXWz?)wHidnL`zy)Nmy3lYSZq+LwJ44*m^| zM07WQ6t+OTCm}dX#h7R3H}SP#_7F7VV_&7=be!CpsxOp=7VRH;8&z@4kz)JxgTK`Z zJmdj*%&goa2whtAMYwm>RYF>UrgL-Ars*S;bZpCyhOdtUkBBnM((WFO!84szZ9S)8 z+Y#69uN;IjAn+A;_#H5lm`M5#3=XvJ>?q011d>SoHmwb!&8gZ}LW0prh@!df`9hLI z6*aDe8On%+ID?8pf=2nBSif*JS~EDUt(EdyOdZLxi%w8&j%>mU< zJ3^UR7T3WdFN4C?AcG%Muuwk%6eo-r_JcMG*JU z*qC0mAhZQ zEX`u9fg5g&nuO|p%O{K!E(m^>SV*zbR>LFPb?X13PPl5fBS6)ssu4UDYDwMI%EHma%8R%?NDT+QDA zp2+5vwm!7iS_|KK59JyEv?r89nHAa1vR}Zn+zWLQ!ecik7YWL9jf11>S1gKb=%}r@ zlG#`NfkK;}&KVT~L0(=@!iycGlfQXQ5#rLw_SuW8KbXGmeOzi!&mL+nANKff9SHvG zwEqu(g0{O;jNdF;xJG`e;*ttqxWgj=1oKj0fDMjh!fneeHi&=yE9tk;>z&UH&0{sk z68KH4T3>Zw*V@ugG9o>8cy=-dIo--x7GRe6!Fq;p6k% zHXF>*ue{{hut}5tQz0@!lw5W;`UwNKGiAp3pIiAKd-~sh_`!+SCY??;z7L%dk8@(G z1&zNqDJ-^9wUQ^(ykLBU=aA-Ka0tj+E|pX|SZxr`Zv)t}EO&+UYzj`@T|dfhm7H)^X%pIO-v4+HbL_ixmf`D&Y;>s}PO8S=U;}<*XEB1Rl?xOCiL%&tm z?XFG;$VLIY7TM12iq**QhD{E4^i$@at>$0S;{WqS>HENr&-(tM{$tRKjW7z1fn~RD zumk#ehw59ucM+3Fz{m1JP6avU zIxg2YfEkQwY3Q5*cB9jw67r8Rj>S&me*!qSr3?X!aGeo%O(1ork4Q2H!1Jr3W;?|FigdxjVlx zlqC8Eld?P~*qKL9cDjNFAUo!&JXWe5Z**tp@Ol?sXWnM7js3qjBW}`L1O7b%U=Ta+0!G&3@pkv#`!iaE)5i#s?t!<5_YeFIrHsFBrjz3`Gt=g1@niN@n<^Ef?6!cmAn5D7nZ%~aZO049&18DGWa>J}c z<(hEEGF-)#HUQpGV)#k^Hax| zK`lNjX|!{cXr`hoMRF7hgf2-K!mRsa5a&JN`Cb-~hqEAw9xN3?i(r#BMn(Tss(xp@ z7}JaI1_kdoA8S+%H3~@qRRP%eZnDB@TpaWdNcBv|Fq(iuN7HWx_4Rt6#sfD-pWRo; z7DoWgE8z;beGDDcE?jt>7#O2~7bYBomY`aI@d0`tcT&t_qTYvdS`2OFX z7{>NB2fwF_0~U1z8OrU;vfnZr?Zr7t=%Pz?%f$y)$qxP;qD8R#W@E5Cp3n_Kyv`(P ziCR14%3#msyF(@1Td!YckDq}4YyZVE8!tX2@V$cjc)NkU9fiFgZS!BL!(~x~tO!9y z6|`pY6sGNq5u}^){?vhb+W^~pIZzl&^*Uc|?g24@2RQZxg&yvqTd4T9YWhD_X zEowL=%L?cnW4OjIgO5U)xkjOGkOGkS(y<^r%FO8-F!y~$ zB8<8JyxIdo?ixMn2_9d)Wg*mbFT2pzW~3@pcVmKadG$mr|F0Jy8(H4>amC~I#49BD z^B;5{bXbWV4R%-d`r;23!A^YP{V&P@-N^vfs?UWe?`<#wo8F4{lk#fSWWXl*v_ z(Jdr)D=P0btOd`^c;D}Y&RCS@w$Y=PX35f04Z3t-`8Cb#>y!PhWZRe+jHzZzVF8YD zzZG#<-x0DM_$n_tOpY5{Uu>NB>T@9l`s_0T9>?on^JF963xi$a2DcHcr`-JLAc_YP z{6B97_`spK7lO0p)g_$H4IQ*cfoIsHAo;y-URTF-i>#)rou?963GefNDsee`GXc`P z(k|iApzmQTC`R)Gj?PB7yAl#Ou5N*}BjWX&5!E7%>wi`cs?(SYI`&=owa<>UefYom zA#dLx|ErajC62zGrs}b}(v_GbZj|;$)W#?rp}520^4E%RjL^nPo~S^ zCIq6-gRX27TC5U|i1O8ebyb?*BcA6z_qDbU1>fl4NE zhpzpfDyCSasZY@%W&H804>eE4oQkwR4;A!PhUw0KJ+Bb9eGpB0b;9sFP~H8c-NctpAW*bG4;p?1Y0N&@685CMtVz2|zgl7P zYd$gB213s{xZB=wSMLA$?@KpR)ZH~c$)GNuY>j+a7Rs`5#h89GInNd80yB0tIr=OA z)XM$iL#P@+&BV!T7|VlB6j#@;ZMfDA8BL65GjPGU(~G-5$s2q-5bOgY-gT%Pb`5Bp zCB6L)rg4x^f_gn*MA-ecQ1M?svvej!TPExE!M*Q+vgK`G^vJUAprbDQq$dSow!;PH z+$ox${&ETZ`;nD(8&%~sReluvKfI4o??pP8EDM0hj~81M`+?T>@BixGy^>~&D8|26cmMXvwU@xny0-c8bNin=?H|wS?|x9V2KAS!wTJTF z|KMW<;IqLH55LO#OTk~Q&c9r;{p~x>I^cp^Yf;0d2A^x>1OhZR?6X*_azi|E4 z^81^Q6)O(|^jP=Shlc;}QT^4U%9_bk|1U3qzj<2!*n$5SJhrZDdEI}#6s1!zQCVCP zF4vN99})+UNF6ZcwxiT|p7YtciEuj_7-oNb8U`c`UzomCMcMxPc>j;V&))daQ_F|B z>L3A&lYP+oLVBFciVLECa928;Nnhdwn`8lVfhlV1D(WEr!l5~2ko zI78k>S-WCdbS6x{9-9)f8|mYQjPb~*P@W;tktWCinpc}DaeyWvXYkS4$<6~2l;7kB zMT)^Mn%PhF2cN`d3#||5+&R9T*5}ayw*bAL6I?}}KxJ8*`94DR-=AgyVyJn&SS{8U zX?9W+Jzx~N0E%oe&+WPQF~4B&kjlFO(3}%0tixnj>8l|oh<*uB&V-dHvdSqq1*^?J z-Ctd@uUPtMRVkID2X2Hp4^pLSZ1h@DIWdgciH|-hEu(0B9>h=xS4FCR^ zWkT(rmmvdpm@opIuVtb9mk2F2oqbsNP;*z5nDt@i`;~3KbEMxLM%_`IxCZ)+2zV&{ ze+#YMd0b!)GTbkAQ91Qh!ME{<%;r&7C6Kao2C~!Fk|A}_ z9vq~*-{vN~%dF8=lB`J(pu?P{{#v`ai7-#6=cH~p5E^b z@C2ibk(X!MeVGT7lM0vaPIQ_Vy?k^{k*H%s`TFWbLnwellqF#^+Knyv~92&bg|a z0vJ|@9k}fFM^MP-3IQ$h^(c(6#)_pG!1dRA!u4n)6r)V_J~y_xfU+_vj##G zWO^;Vy(TKQyV^vW;~}M7GKweQ+e3bj>($E)V|IO5b@pJJuuC1hNYp^O3#|(Z1OK%5 z`)6b2jsw&ojTM_>HE)&XP^XDPA8Hyo2+VvDKpZN7B~=cNZ2dlf71;v>nFE8}b#SMC zu{|(&(I>iZP(0)5pVipEoXXOTsAU-9Y3QbTQQ8QasciqpUtY*xXr_49P|_PgktI^- z)ks_OLG#%|F{F}F^5-bjY-Kh#zYX%nm*Swc|LqJTYPZ2+TWwUSUWUS4P@B`fGlAb8 z?2cb-TV=YU$F`vG0_2+i_15qPh%8&>>TCI zJTlX?6PS~`L-%rD!Y@AzfIzoSa+HP4I4GCt2T>6E(>v(=%P6;;rV47Wngb^kxN!M~ z%|nUdZ$JmK2M{^?l|5c(10D4GlM*mx@?M<=gkr)_0S-(F-sKvYe-1PE$Bk*PQ}BE$ z@6iLU!TEYmI65&F!FtCm`X4UG9RJ~RJfrj8?*FsP@zZ!@_Sb?JvmqY-kKTA;)%zh#9MGa|o0TS2ODfUR zIlv$`eHNen&1*QS(04aJ%h*)$dFNt}q zug1SSz4;_9#+w>U_*2Ju}i;GN-E+H2I z#@d;ubNwN6cGx6n4@Lm%K-t?}b)WFG1W2mXX7NiT5oO0_gEX2Vv>Tb#gDp4a#1#0! zISE3u8Ei zrMNbiSIBEUMkBm-mVrdVdE?zf#b6YbI(a18qd76Vy9YcAk$eO9uNU{>ogDPbraFOL z?2u>pbay^qX15-P&k{ztH)Q`f;#XLmBvThN); zQ(=oI^jJ&RZobr(Ey@M_V9TfMLXOi!xipNiJhb87$dXzhQmgRRM}w*53;TLc`&nFoG3 zT+puB#dYl9$FAdc5;iuHT*psAdxX79t9PF~rY5F(=EZfb(MVfQ?4~zC^?h)}=Z^4D zdh*sBm=qVO3ztzva2DVx*;0~hRdCR|K-6W0u0wVI##;%`f+TP*ep8@%Z>2vQwkXN` zI@p&yybYk07(VH;KtNYVTDma89XVICfwSvf}6V)#-6yk^W+7&YQJ}g>s7;TgEaIuvjTpyc9fk! zQBxCb!WpAjGV#>b0rR!BUp`n%ZW6h}W!J~~>^R666WbU!1jlJsA>|dy2j#sQTI;4{ zg9m%a<#as&8Ki>lCdAp%oA$9`6g_FRGMr_W7JmcQZ>;|@M^`*NY3a#M6Kn6Q^4t*< zD^$6TKF?g|p)d7}%$7a;$o`M{ItAL^q_SBI5BgpbYNoz-%+ohH(%+AeS-9G|7awb* z#ex>YpZ+?D_BZDZRRn*=3S`#pTheN-CYiETz}wh)+9Z`P}3lD=x5_?<{9 zu$P7)?Y9iLS<(g)j$|a5P+clqD7@O#P%;15(r6g-jxbL};^z zDrH=go%eff95+A9H2AhB$ICgllgeTapZy1;gerc4La+cN=(DPgD~Y8o%02$vH2Q4U-spPxlU62U>Q z=K|h8S~o7w{AxN!afulf-laClU8F~ONJCyv5ET;{`UXsMj!VemwEtM?A*vFF%Bv~q zzh%j2l|=P&GFHt?s_~MCQlxw;F7p}rJ7h~B6W+b+I%p=0Qw4<7pE|rUo6wq+P-c@s zc2dZA-w~0!^hWqi{QmtjRYW&Co;(H3XhPca4i2fN)` zb2%iWzPVN5qo^1LwAL+nMXVP0Le*`&NIJf(?Ws>J%`e*?I`d}c8cR2MrFvYRrunT~ zrK`*rB{Yk95ic2Bp{!l`kn0^xc#+l zS5h@251j%P`p|YWz^ldMLJv!gpXbC|C)tlChf)O_22qPi)U2u!a$EGB#XH^^r$5(~ z52Q#^H;Qy@1C1-@9h8kdSKk)@9h)ah0)<$5BENpP6j~@r%Vh4)5NyQB`P<2|)5!K_ z$J+px7=2tNU+l+SHv|M58|t+!!svmRrk1}T6X0Tk@NY%y4#+mgWEa3kpXt(FT|iMg z7Q^wcIb%`(=A^rc^WwBD$N*opH&kg0VNi1K-MkVl^hS&XxuinDA09kEC0J?U!QSGh z-|2ukzs zwtYAu>`B@XYZ2-!y7St?#}w1Q(j0qdHgKC$9arbskM#sinr`CO{$1F1>&OhI?;rWD zP{`ldO@--JgE7skdrH$O*{de|p~&zj)gKjIEkt~hx*-!U9YP?kw@g+ zn5Gmf(Pb+fW8_GR5Q~UAwS<=2rY}vVajdTIuCS&1CC$*^De}}~$@Nq8LinlB zOJQ^asl3}^n&$|G*?yMw;JSV4%BH&{85FkEG_pgb*W_<_Gdgi!aU#K|X(Fw_VP?BH zc{x4(Vvh?!M({M&pEXIez|*O&neQzfv%cPHbwh38pd5xF)<35Hqp|i ziOsZ^E)O#3zf;6)zXt-SDsRmS+?a6GDQmscILk+IC&7#y8JD{YAB@zmd3 z2BpvlagqeYiq+#$63DoF@U*mdC<^OypCe587}ZjNbUS9pWuMARm!5xk2^@OYFJo#}6k zpg^RXs+zXo#oW2f-WBwNeHc^jGhYOTyfG&aS&Sph7q?dSrVZbMS216@6Z&ANaReT= z{X8Y*OQ%`P?ocP)-a2>oQl!wtlJ$7FY}u!ugPXf@SvV9iHGKgk7RXe->+rWc`CA0O zFIa!4Jey-*Rl8EJ`YVE>El~ZE1KXA12x{&JcHFP{ zQk4$O9sy?4dyBf9cEC$-!H6mjhbD(d0NkTPOsHm_ud&s)wFkLh1Vf8%5k3PU(un$P z&5}cm-3Ncufu(U_Zc5wwnTyJ>@)qf^)}G0G9Cni5R!y5;C?lr2C)+>eYRX?G3qJ0uYq^Ne2SJ~BcDGKpFtG& zvj5Ky)#rHZq#`lXm)3k*pN3O$KVnm|N^aV@^`=R#=VdgKp(TLk9{GBD&E3aiBb@Y8MLJQ`&0&K~*nTl}at^bYx{15QZDhr_bAF3Nq8r-IdC&y?*QwYfm2JV{p_hYX&%Jd;x z934FY6zd<`doA*CBv>g0RKxOj5<`Pkofy`*jDzd?R@g*tg?82<-=tb9|-4G zl(75liQX6N3UwZkB{O(w$ z*3|Z!^Uh=A2Hgf{H^tjS|M^4=Sre7O%QWcGXZ_Vuh7~QBX8VFfEFhn7Yaq z1C)xkP+pd=1onfT3&Dj|-*v;*B)@q)ZTm8`CtLn$co4VN2-#obgvd2|`I?PtBETm- zz*Hia_QGp>?1U|eCzj4c3J8{+g`mNZ%__zDKKaLBlWVE-2>GLooaBD`=Er_0U#`5pM{3ZjzFEP~5My16>2}vzt916BH}lw*^dJCbXhh3=YV$?8P&a1AkP= zv6NoWCC&3 zJTHbFGQjKdE(4BCy+PVZ#*$P7BAJgDA2A}(!$Rqpo*p+(Fq)Z}PZ;ZwUclF>LA?TQ z;z#>ub7!O@m>5`?Bvk1zxhg>xL8WKoFkA)?E$bGuzpQB`1m87>k|@>|vwo%fIxtCg6unEgEJr!d4=28x z{WhDYtRR#u4GJkS7ER0vnV77IJPTZ)v4c-shx){^BK8lTTESdt-4a?bW%)4?NpJ z-io4#p*io@sL(R+> zUVzI$QQ^L}jG8?gKxnx`vQazw`Vuq*E929xjW_uYU? z3mb0C8SqZhL_7lPGW$sts#>b3mJq!hWSVmR5V%X*T)t z92%x*a;kU8B$!qqsNsyHnMet5ot1%}G=gsil!R$%%D2OU8g43rl@R&V6 zqWE?j!^@iMKJ)9g^ErNxeACx%ta=z%;&+&hTQF0!Fe~yarYN^I4zhLa+n7^Tenpw> zd7>iAknWs>%b&BG1={4+d9XKxds^5 z?)LWh<8!inJT_)}ZX!Lmd=ZNh&*XyIGbUP0H8x)K>*S|Bx~kPTs>cP#-xyEsNL1?U z>uc(tuB<1f;|lFd@gaO;#r9zG?T%v&@%&hh$Iy+riP{cfAd;F=$i{8$2caPm9)37s$d&O zm8cHdPB#R*@w=T2C?%7BuNv%>dp3kWbM@EMG}Ge%^c1|^Mf#C}6y6!9YK7zRXTwLo zuh)Es=TWuwUS zLDOdaQtE7WiIb@+nde!zJox2?mc$v4Bj#KhP9g$ZLr_&x*6~p3;fbw%lW5a^e&KS(6Yz#*MlK=c>U>kTb zrP!034U(D$Z{Nz|9j`uiWgz6+TyO0hc74iJ|KRj)M}uvEPu@j?>#he_Rkw51GD7;R zXhVmW=0&&p>SmhHwxazWH6I~295TK3SFJNm-_>16)1b3i#o<|ZBa*61MxQ zIo7)G&X;`;KoSW@3dcv02X~uZS4NLtskTBrd19sT3sb`_gwdq;lkDC2?}o^z&|rsd z(b|ZtxnUmK2U-qcqtTA=5v6Jz*#8{(qIvyYXTDHwt$9b>{1C%RgxQ2`z7&<0*TER% z!?IUpCFOmON9y#zTD)gYc=8(Js}=vvDDxBi9Z&xw6F8{Dt*_ z2Xn2@yt4Ki?E!pUKMlvLPr%H_&1NeF8Bf#zAztR>n1qE z?6FVQu?za2^yO(r_Zp&pl z2QgI_@Ql`P^R>|>g8^GqRNdR*NPz@V?D&0LzjPx0WQ}G%FCss_s!kuk-Oa#r#AbnZ z0LD-@U0S;%mM+rkkR+{^E)8tPjFI{$KF9tTx3Ngc6a1bUB0k$Ku&!O9lhJ9?HYl`+ zycQ@!8YJ}tJHGWJUsHt6i`f>@*24x*2xfaG=B_U?Mjj}=Zz38f7c$z1a-%@6lX62QVp4 zEkpkE8fnvz<<#Sg57-1EFJ&6B!wV}$Vt1C9JBXn(C1>7de+I(-x_hEPd+bpekp^g>GErdMC?(qx|RO1=c% zOX*eI&9g}QdnLEg!`SM)L|zq@=RRbrBPD6k@lWz26mATbsJfC2Bk>lkbHy?oc|z0Y z=u_?`up*w-N10t}U;-0mgNj*pd~9ynaz^3f$LX?IwEQMPu-$n3w=6}<8L{ z7;9)U4ow7$Ad6DX#pdQO9Qh6=ZQL4c&y;X|0(K$;?h~q@M*cE(##n+F)4e0%##Bs4 zABhIttB3;85akX}?f8&k@n<9woBoNJy)?>zcv$vr$qWVPgsTWr*OLco<`+G3i8h~{ z8Q1!{0k>)R&FzGA!p0l+wcTqN(LYxS+@_E8Cm)n8bk>^`+Tl)j_TacAsbti=*~AW< znZ`6qP>kp?Mi9%0!?^yFy%sl^mO7zb{Du)EQSF6H>&ma0IQ1>Xbi0!G%$D>S8KL*=*eysa(IP|m@fmKn!uk8wi<^8M z);=QYXG-9vo)JF&g>2|)mvu-}VmFm9I9*P`yWdzHe0+KGfz`cI%ea87HpP{KS6x-3flCCO~R1H z&nWAcFVA*{Kw?BU$zLHIM$SG56Jf2Mi89_Ty^z|wge;o$Da}je#Kx75L>%qJbW&Gx zeU6hx^pBsKfAAR>F!qo<2~Rbj=Jm=%q{kZ5XL4JZ=2Gl+Jq_4~^EFL#+>JqF`aXnHEQ~D`fRczJhArNGO zn>uGk>NB&`#`Cn<61`z4(ZtHj2N!>{64M0t*JhQu-vD3ficn1|imy*stIwR(uu=H9 z*k+(%$IuYDCpmB4mKOzccSc=sVVia1Fks^<*l= zw&&9a8f@~V>oX-`sght2Ar2ixB(oW3NbKyb^{GtoIb7OXFX(VKdP-0JP^g@q{|WRY zHkz*iqQwrmfo@fNjp58yT=}K8442zS247LP3t@QCRt-6kmrpg*RXwsAoULH+z16ydys#;cQ#>-;i9YPr_6U`vS~qrMI_Y2_969*oy0j%v6zw( zwoN~7?fvdZ%>R&jnyH0w`Aj0TEQ#bSNo}q`(l;jRMk22nf<8-64vUlynUx(nBL4{Lk!j*8a~v-#P#C z`(3kKFGH+%-sgGlysqnJ6hDwnDi>UIDm7s-terXyNUBVBB_^kT_*U<5_q!+i81GkN z3!@ZPXz$IP4|F)M5oJNwQ6z2X_cM-6i=JZ@O`B7FuKV+V1&V0=QOy!b)#G^7JaKdA z@Mc!sSa0?8Nv2WQYxB+L&IRl7mZQW~O!Jgjolbhs#h z7;=G6q>d|`q?H`yB>8~zTzA*A6bqtBw8B{#TlK)}43f2%Mg%~M0lCeHr9i*k1<}Eb z2plIpV!(G#2Uad-F8`QJQH&tB|2^O|coIo3CrO^HJ!2Y=ZhIu!ua!OR>LtM#H{~8t zCn)^#1fCzT?R~oP+Ma=NXCmD8cKpPYf?lqa7Xt{gwE9~RML+y+?{i$aawq)$gKJ&Z zxoH-qB|bXXW-jaP3n%G$Iyw6Bd9NivuKUm^|9ZKJF;ef=B!F{A-M%{M3GN z3r9KCFF=|>E1nH6>O#QkabbMpcvJem_4E1{8~UPll6*0e@Z|my1Y8zv9YG}noh8OF zIDlTftXgk91`&4sy%-d0I54>eG3XTQ^?*kxehT&<^~ zJH2&xDZ}ufvkm1Lbj_q^+8x{crM@RM=Gh1BN8Ij7U#K9b?$;6MP%j>OL;a6c*Dcc7 zENZ5DhLui8oM0C37dQy;Uzu_Egk=jJO4L&91mIObqM4<6P!liP1f}Vo2s)H}RDl@M z%-@Aak#Dfki-}CVaKD_%Cp2Xa(4zrjn+E_Fb}f$u@JOCsfQo`n7X7!t6t`3sl-Duf z(~Xc&qfRi_Tcc=I#rlo?5V)_nCusR}Gw`JbX=^1yLj&aL4Atj3m`lW`RmI$sSy$P! zoYu)Ldah&>OnY9j7d?JLEfSYJ*;{lSCk_6 z6U8T`NW|%Xi}HEU;a>ke#EZGVTOZ+P$rcpWwj$j=A9P)+6P>#Fnk0bY*ZoD#X84FU zk6nZ3wEAmi_!MO7W_A@de{z47L4V%_`-Q`#XVvrXX%DjXTpfh-A2TfB8{tyAzLd2h zAje0zw4Ex6F-W=y*^{Vk$=E}xgXY#* z(Uq%fhw634j~nzq*|qDopyj<#;{FpPSoIDOcmk2`jw!WZ$Hyi$_cdNAGOJRYhf^BY z$OUcDvT~hIAAY*!xk`mEk!E2ZQV>b5aHe4Py|-CD$bI1Xr|2OdJfTynSlRL7v)U{j zo6Wa7Il7KVWhrF}=;t^gf((1+=Hn3*G-6s?Rd8}6QVElgo9ApI@aR;j_wtj5S!*2Y zhAQ87#5Y$oYiCtIZ$C>Vmg{iJyV7$TZk*whOAG!65XH1DJRO9D9YpwY^Ls(gklb}ifs(~ zh7^|0hOba@JvsN#^*LS4peBa1@+5Jy2k%;XS-Q+z6HTSWMJx~u?Yk8fnMjOOq!8=2iGhYIny6BfCft9Nd6Pt;pfx z4K^NTquJFlk}{N@rPInFupkCegPH8Br!g`MgqYa}QZ8H9>TtQ$;F!*jHy#Nsm@fio z7Il(vfZKctg`m*U#>6|rhz|3+cJa6iG7#Z93NzR4_^So3wJy=xLWofN5BCUQD5uB? zD-0vlh1h*wEkO^M*MGdAFpQhO?Csv!o0jwK46sM7>)Yel8p_yCJzvucYQcEbLl!BX zZT{Ic9yQ(bQy;x5ewCfNOzWK147-~JEm4ed&Veg=BtfX!VvmH4mt5)^zLTt~KIat~ zOvCo}+Ir0Pz9I3v=}Zh>pGNtt52s;T8#4_3uO1%sywQ4c{`q$H%*BQ5a?{Ye=0{V< z$E{TY`@^HZoZDRH@<)ywB<>2Rl9!bBIK38w*=MC=LwiE%0V zNE?99uQu?Omaa%pyC_+Jx$?&P8-_9mrps)+yea@va+2+^MI*bDV#e{RM^>B#2ynhz+>5>4WYW&lkUlI}%i8;Vxq zd%x-|4(-6$BQEnVkUhF&&VR0rJeANQ!D8K)b30toHLQw9@5c^~6R|5ZM*UPUyl)pv zxoI$R!uPU%LOZ8(TH29sIC2z`9f3Lq`|Gz)my+l;OyXA@I8CKNa9Ew%9SDe1A`~*Bss+a^ z3!cOkSgTj-J}eIw=rmt|*M35ZZa=7*4NB>+`pz?={+djZ{vc}ZAhu^~_KQtkYv~5edN-j&)G)sNNc@@! zs)^bx71<0Sm+!q9w9vt-FOzltGN*@|c*6IL!zj{~Bu_Ug@B$}MP6T5G@O6l}6n_;V zRw8nggtynRO=SRZQ6kd~)Q>A!(d>A6@8=|p|p4IGXiOwwHJ7mV}G9V<56y!w?^ zd41D~#Gu~upfB#lN|oc0;M~XD?{zAgrKoMrh#N<7e88&FEm4GCPsgW?6{_!u>+?FabKGvs_zBFXMF7a@D145(XEHr(0b zx4=bjF=hRs{}6`JcXX-X+3m1ocrqJupF`2lSaym)rDiqz$qjDHoR1vmQqMGl9c1eK zlSV5$2rZiC>8lcCpdKnU8x^=j#r=HdmrezcF||drPUZfGQ4m3r+$27}IG7=wMR8vx zE|IPKS-w1R-gNcDA4$JP$&%r0F^P%qEu4W0flA-!&&D3y2B5e)NiwKfK<=YmYB(c7 zE#1}DEkp??%_L=Wpo=1HDMl-_?LW%sS>?bF+nl8;>)Wr#N>|?lDaEsdu%sQUVOvYg z2Js&va*}9i5@{|J2W^Wp;{LD_k`YQ0Z@fSR-k-7f7($vbmgIO)EA4}e`4!NmaDx(l z*YC(dOfGybDm*Ma{YCQeyCvp#9H7XiA5iqR8<$Q>z|n0#GNdm>wDaH*0MS3JDm|hd zODlK!(;@uB^!)k162!ld!NTk3iPeOgZFFe#Iln_XeA`bAVIADGzUVtyKWDQN-4gXh z2iW#w;U-o-vY@~L?W@HxH}W(e75n_!V@~5YDiUYj%{24Wvv!xO6nd)Q_9gUZN>oyC zXNaOdg8aq>ZZ8HOTc`Sh4^)-G4Ell>hjg?bI@>~FV#YzKBmvUEd$;j6WK!X383;(B5jDGVM#d3su1mLtDjN*T zDCtd?Ht5y6X+JYpFM_x$s^$hd^!5tLs{agk{t@&Laycr#W`mXD3I%x#;78-Z-$B-a zart^!`KX@5AOo{c%aHStH$RalEHGAPH*+R!bJhUAs!{{R-Icy~LuV_|GQejP5n-nn+fCOF>Wfl^CB2;3n-r-3 z!IpM^l|!zf6*FbG_AOuhB;u?qj;qicg)fB1@SWs<*2w!0gy{5*pazJr=!pjDw>eVC>aZ=OzI;<)AT@Nl+1@=2ieQ`@9Oii(>B=VwmnFuPuY_`~?G!$9J$v(=I$@R$egbPUwOltEK5+kU3L z+l3V$GjC#ivcI}kBYGGxK)|H}Pu-en;2ryZyops6ooH|`eRJ={08LMlV3O*spYlwi zQR|>q7)?$6Mn5pMl+<)jsncnk*1w$T$;R9wX(LtaO z;O964EJg2 z({30rjko}GI^V`&y4J}VOp5wcv?=X%_+@RRP`WA<6g66uDd_ugg#j3E{^{1ZQHBikfB|7bioC8{ZTI>_c%6;C0|18b zm^nAz-(i#4_kVt8!0&cL=1U;CIh4LxYws{zju8IaX8p&;MSjMm1BLqmK#|ePL8}jL z*<92Ap8PnPo(!PDYOhRw_a3_d^|=v<7=GIht+L-WlXl!fJMN>{X36d z5lcz7m$lUz(&-SK-pw{iBcy2#<|w5baFqB!_3_wqiB%6hZePPLE47CS7o2GG`3kMh zJJOZHz&KroA3##7opZhS_I5C22Rzhq1vec?3J@0_oH1PJv@G}S+1OXFGNmp_Xa&_Y z0=+7kUo_5?Tp6TK?b8o-zxVm1nY{n?O=Nxbmr4F!U-iBlN`7OmrR5Tj`ihxewi1QE z4ouV^(oT_>9K;Lylv?1nkO-^*rw0qvoKIi*! z5W<*$d&v~R9ZwDjV?lHs4im&Ki*kkw=wPML`R%{hjN_@}?*?at~Qmc{2MCQ`l~lC7GL z#9m}^LAL!dnzcT^JSVDblb)EH=O-`IWq0!Va+w6o^2%|(V3O1>l@OS}G?4!ysUBO# zF-wuyYd+l?zSn79tY5VRn39P&1Z3RN1Q;u|EP2AKz__UC66AIxaHRmllBeSnuv`g9 zDDzn*3jNyhDR9eTA=<9dl6HWA2**) zJmUD5umPJ^f|q|SB15LFRRZf~CaVgifWCNlq~BYAvv;pEmNq6TmczNy)r9X3_!Q8| zQ<;5!aW7%3qlpE0ta7684ELbqT)>e|)(^fL4n*VcIm7~Rioq(19i*{V9;z~r)LYy@ zRCv|Dz20?w2|y$$!fdgH-v9doT@uHNBY^65u4_14I9#1AcIYL@}CckylFdH+y->VeM9HGz2e$qM|Snchx zr!-d4Q>aE=-^<}|mhmYHfwg=Jlgr*L zXa1ji^d|HyJy=wNtKV}XCpjWsrdqW_$v`Z4%>>~E)SR4u46v?_6eihCKJ%t|kR2M9 z91BoH6^xQ@_enzl8T03>o0s-H;n&Il6ehVQrGRwd6SRm3ClEG(f7_iwkt9xij<>UZJ#fCq20X-a%KaP(J^j4?*P|D>SX z!Iv@K>wQt|`zy3cfhKcGrQtpNPVI4NHuoylIGk@huDDN;51ea)ubwA8Z!y*8%NU@u zZgV$jIreV`{hzoPq&vcot_idc)vIhqrkz>|Z*_01ULl-yD%c_`XP>|23;G5_Sqj8I z0ek!1wED^BHo%qf1A^Qi0xY0mzz5t<%^c@~db9QL`vCg0G7!>*lZl`$Egg-1g35VM zmO|tc(Ajf7#+U#`oD1$e0g#$vP41%TrV%vc13bC}JYt$JZGi;Kz(r9D?b-k=Q6eB0 z=prF{&E9qK{07>aEq6l6c+ULC+}N%j0fy$6RB;#TJGFy$K%gEw-atnKUJkV#FUwqO zDDC!dN2nohbO1tfhS(V(Mr%6$4F0nFfA^jY%!zg2-5+@LB1g3Y4D*!T1X4Uf9~wP& zbyINSsGN2C6#-x%bl%7=UTf+@Ky^)?o;tpv{_t)*qH?E0Ik%#_TV?NNVO2HREQLNp zI_P5lkpEAWq9P)2xywStvKXgz>&D>*cROa#P@W7m$u|hbGd|b z2$+qHms>kWfzP=UjQXN?U0fVNA+xzRcX6)s`6UAv;z?_upUzbC^M+}+si(@VCZmH{ zp@1K*#d$v&z1F@5e9NoZCa)B&1mu&BFp3Be@`fgWh?BRx^ZeIoVD;BjaSg>N#(a?d zC-1IAZ{|E-`a&T){S{Ep2sV#^+_{DaHlXWvH}D^e03`0bJ~cxH8<2_U!0;S(LB{kA z=*$hh*Ny($E;3cjkj+{6;Bd^5KE<1Q+hKfHC(S?>Q^UJnM#SPjKr*6yiRK%rz5n2b|8&M@RAHOkB^SSPpOALE3R(#Q@n$z*^>R5h9VDIrp^umQ z8xtBfqec1nKS9(cI92^L4xBnYfGFbv636M6?K)-C+$OCHUMf90?qnc}B81_M11>Nh zR;VravFZC;jd*-|ALJ7VLSMWfxvG}o=M6;NcvzT81sXQ4FHf{?-J1tLPD05Aq`X9w z_o1o~%zX@Cr-y8G0zuDs9iqqZ1BzH^7GYUu>jgOE*^cw==^bSCOoA$K?n*J}JX=Y_ zmc()wWERnilSLwkUrIFzf~%sq<|K>9n0GR5qH@~*w84K`VzDlG{8eok%w5nT``7pX zx)$>w1Ub;cvjFE5M40#>dj+7%5X z0OA3?eNH0}iXt9ZzzvE>zHS~7&!?x(v;e$myd~a}EH{|lgR0y6Dj7(IMe|gTUdxyR zt82?77Y?Sr=&m1j0C%$tlrq&P5OA3RW3r(|I-t&48pIZT>m-jzgrcxk2*~Sc8D1-M z*#L;OiA2$tfcBQ}QjEuP=rc72LRTB}dHwKjJlaK8TER*opoaRd4&c9E=RZU?s`hH$ z4iGyk^*mU+{^ScnugSBDk_Xuc#cyB#mVd?C+S(@Eb;&H`BH|LSCbysFB`&K+U>MlQ zJy~6R!S~YejE#ZJJN!(E?fEFwOC4TtuAzQcHv|#$=V7+)3-e+7R z<+1w(h%%IRAP=AF8r3>xCOodT)6*+6_OFT>pb{Fs(zfs^vUqcl6Bu$ck$LJ5IO&&> z^~nISsr8jVQ-NmOp4@+4yYs4%%cpAa7{xD{{7D*LYdd`Ap40x#+_i=k-${ce8pg!`Smyn4+#<8P#O(O;_fm-`qs(F*cx&qEsau z+j?GUJNEGM4J#xz$pcO~U+9v3!(8>#l&Y?MO=I(PrPc=jY5)bBq2xXTIw}%VBN~Bv zV?2yXt?PcP9<9`}$;-W1_N0A@Vgjf!RA|lht^1F~FvArx`GtiwxSk7wzKq$3)1t*C zpdq_UsDGz{BfF19~F&}b_P7`F-DKX>)k zB`6}o1p>_hoTNxgqte9O^L{e(RUVy^jdGeuP%!wdJu9;dUwSZGQn#XsjCu8nRm65w z^D!33#VGOYOSwUgN>cT1Uz-!}o;=KusuG(abA7tMJzoB?Ta*fL*hO`UpPirm%mJ+n zo0=J+*qv2($_`%Xep_klsN4Mw{LX z43KL={8SAgGxaLqaEnwA0zDUl%Cs1%6}+=x1o8Q)9)eeu5B%3q&GSRWq}O zgINm8AnwzdI@+ES1b0CNCqzFt1{Q4y4EHT8(SS`=siEIR---orvThI@;+`rp(EYf3 z4%As$0gO@mY04%jr2SzC#tp1He11VcYJsvBssSlu?_>z>q%9cS*_{G-@F4S4MGVb@ zn&K`vo!#JO7&LE9D}zp15gVAGS3P7%1*ApFBW3}cK>H2he|D~adD*`%l+0lsu!^>s z+^o*>6}s&AAmQi;r&>0;I7ynE0E*o_fU)%`ipebFqF1<|WYH#gubXy+G5&-TL;Hz<-RUpyOTT76E#_}YFpQM*Sm{gQB4xN)S%6*F z^k7^N;9k;r;jfs;rQNj{CVWR~Xch_jEVOcQlDwEmhT_|~ixJr7BT-WOh9^$sI{ z|1b^I`ZNdiMk#5pHS&msQ>o=W>52^yLSUSYYe3jEQu5V(&GKMv#C&VI4hs$DeH0{6 znuOqxIvh81{!DNAgRknDjbNT%dF*XpAG1vqf$8QYo*T z?00_w`*-~WVO^BmO9vw=H2-Xl{+C$xuT%EV3x7Daz7M^j&H9_a@aKeJ& z{I0jfK0zc5^s(e2FSY(3kMnx=?CU>3o||JBC|!#Z~g8M8~jdocfe8ot1rVLBso ze%HDDxdGUaGX8S71G>Tgn@7>g0)n=)9aHQ7&HerVE*1I$vfi}tBP}Bw4+8$(Q+Oy} JB4-@%e*lNsuw?)M literal 118508 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 Mqbyx6^)m3k02#2aDF6Tf diff --git a/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode.png b/docs/codeql/images/codeql-for-visual-studio-code/model-dependency-mode.png index be499cdbccccb59369308b19b0dbb32850d89b3c..f799cafb33d6ff6a76ed455818f38bf075aa72ab 100644 GIT binary patch literal 95757 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

    Wi|+G!N} zC6)aE6P&wJLXv0}k4&k9<4D#>ndZwW&4J^7pWOZ5Guxd!h{}c_rH=()Wz5EFUyJU-4Jb7 z37Jj|gUgJMqzLRT)&)_YY_R8clPhYD=S%9^U_TSPfya)&j+5*(WrtHlbQd4QGh{#T zya5(@!6X=X7Aj)vlORvIt4)4at4|vJ`laY1%T&}Ci5S*DgIN)|RUvfztx(Az+wBnq zR-nG4PNUZk&ihQG)XM)Pl-)GJQT^$Gk`OXdnKr+2zh6Nw{UVo6^5-if1~5+-=cYqX z6mr@30)>;Yia+8~5TA{%%d9^yK3>cv`}x)o8!a*@)1%GG`L9HGGkG9%V9B*WxPGGa zemuLDqg9d))`^>Ap-yLGrfSwJ=FHdP>|W_4)*M&A8z8*KOZU1(3MBXfGhf1vuZ+B# zgq7yXWv6oT{E=F;g`ss`O>`%S#QDBZ?T7xf3we5`QclK|@f{CB4LMwYF4LLF;57PX z^J}Dvw89tV^KgM7>Kf}lK8XEM>P`X7FDV1*vvEs|7c>gM<#bLpWFqrAIQE0w>`tO0lEhgjOLp z1fIK_wS_V&IjJ-Xf|Wp4Ecp<$ua(XogDYNXoJ&JXuE-fw{?K9OhH%O4e&3e{T3PF1|( zrtX~9pQlqX^FDIX&-c73RTCzWLSEQQSO~WZVvqeSHsgIE)k!PsRodixx|1?5)sL}{ zhJH8{&p^1c!t-lUQ|@1sQu&O2@~F(+$~5%G)hCO=%vp_=+Rd^N{lgB9f=W(uUXk+p z7-2^XRmb5$^Rdg~_R{)9Y3@Iux8Lgw7Z})TKb7hk@FSsI2es2lkG1eN!)N7EGZo7j zuE3OJQZCx>(8q)NGKcH~884k1$%S9gT_H_n#gp?P`=cXCwgWvq+R1<3NQr$kH(^FX z83h`8>(+CZTboiWRa|dMGIwmIYR90SDofFsh{;4AE%e5_o5+jPZ9+;;UVqNv3=)PT z6s-E+cC0)@UxTSJEB!$0-3O~ zqU`PG^$Pbja0l%~6MeXWsc5uBZ6Y@sFWxEzD=D6eM6cvU#szqOUq4kxD+PCRz-4<|fL(fjbgCaEMcHjjRfcVs z`>IANNgI*#cv9FzSm=xyyf zaHM3UUq;nB<-W!EIzxz7-zCM|SG?XVRWzb_+6yfs_&WI_vr4jdnT0yQceL@z$pqAp z->fkVvB&HR9Y6mR-_lC`lvG~GlUObYCa$v zSH*tumPa93p|S~lK2(I;MbNY-af1a--J9IgoT>8t)nVMKX*29l$a*}o7-1}eF;&yL zm-;*#?^B`kU{O`p#LeZM0HJ7G2VmMLD8bUR#+=?!BC@DX0HmJK?*F+x?A%wc1EXg?!${kHZU+0J@a z!>2K9!cObg?UUhV9}UuF@M%eHl#>JCG%Cjn5ifP^{Q2InhNr{Mu!jIDjfsemX&KTmU^LL1*{T?E^}-&T3aNYE`r9g-WfN7bW0tC!b*hoCyNWH{ zIQ#vL_wLZ_7j!qczF&A`T>S5r6P#HXzH<`WA}~&X8@v$NDE)Qf5Y-`FWY(8D6YF4I z&BC=@Xf?*?zLFBy@7RdFN8q*n6Tlwp25)>pm+cupyx=3LgLwaFqMZwj>54IPv5B6C zW86oQs1-mc%8vJzYpf`DFhAT2m?fwTc^y`iX$@1*q9$F}oizi=8DHJh2k^UMA+S3k z-!D2-#ZcBJ*!R)t*XVhSQOS-P-Q!3BY32%i?J*b8&m`y3NIu%pGy+a4vt)z)D|CE6 ziO3mN;2Xc<@07qhUL+eVTD}+2eYlh79Rg~WM!*rB&M+w3=o!*4k$@+0*B{M2W8|WwFen|AR_%LrceMjF2xHUucL78B zdJ~b56x-=~LX96%orbV4cVu*xf0FUk8iFz(_N3{`TNQ7=@%tRHc1aK3_zKuej+QD0 z8k{D70vz~6t^7?hQAM69E02sq+tKn7sJnVBWC!+uL;cvuSIbe)4-w-isNMawOC)S)Kw-Q9{dxq}!kM>q9TMP|^Hivhpp&><@_O6YQ)_`#j z8_ZL0H+JPK7Z1gNi;%}2fB~b7&XcpnQ45E=0;>fx_)$VrF3tOw{1qPkYPh0EyoIVL zTL=u*c)T2M|JIkpAynA$&$r^RTm!^ZSq#5vsQd4ppS9vP5MCUGP}=1nzNe>BPIVR& zCukj8cf1s5W7W}}lA2~k#kvcMLp7>Hf40JzS|0m-zD)NwD0{lwK5z+@EVUds+l0a! zo{mra@8+c4!4uqQzn^r8TMiX>K3s^FNYTGz3?#91gLd>7k<(z_z}HK$gNdTV3RqUVDfzbXFsCvCzzL7y))QVD-KOU%vIEp5AZIj`QrYAxS7#pr1_QFd zYehRL-GN^f!m@NErIW3oqt3xCvjF)wm%j?(&NL$l`amwsy6Xa=VSOfP)QkD7y(!c4 zG4Z#U=gBuXL!W1!W>M;~g1@v=eEKUbZ6K4(``#Yh54s!r%>HLNQm@+KUE@^%UhTD5 z_C44~b#J;<2g68_inz7A#qoha73Cx=sE1q{XlM@bY&RbJR&;0qY z4bUe&)VAw&Dr}qpMYyc1b>m+ks`Shb z)8>;tSoOkqHD4CW)ap+qSs`Z>)+{mkttg3)69Gx&=Xgc3pI&Log-vT|n^kFzoUchkkA4 z!Af6qX>Cig#77y)sl{gzof9Wu z2?y2Y(VH`p`|&d@8!g%e`gMMISCynKi;+oB!nO?eSNgbJ?$qmVO_W)h7StWa3Yhob zvv5{Mb&G6$^L;SaiR-cecLf(r+)QDkom-gODps zM>rS}{;`!-->FeNjNvPg7k&ec{WP7oz^nIJv3I!LylUvIlfP$;^hXMa6A82K{&AB>@Z)3-Z8 z4m$LAdZn&Fw&sQAE(p(|)-dK72{dZf7&I!Z77jS^2!N&3uAdF6%m-Lt{7Y(`ipH-Z zCFg;H7HSpCZZErluliTQyf-ClFJAEB#>9OnKKih4&%#WNvx^yTNl*ng}&CY5A~3!K6ZE8#8yc>;UOJ&oS?T@pSAsqih_kv6WB{SH z0>b;@e3&?kWvnv71}V&;Rc!p!)1w76t6ZQhvz5GA`F1z-Q4`UXn+!0QCU-7KDkn`A zfy8*Z^&0#JP7JdC6@Hs-BH*Rn=$pW?!Z*!LY7?F!>`cZrNs*LHK&TC5c>jzh^waIz z=QuPH=>(A2#;5n|mSQaxDUTs4hhwI<+_xJqMmRZcl#Q?;GZ;H!Q=t6%ZmVg(Wy_RV(8peLsH95wzoz1feH=n? z1AAD3VBS~*`j0|2&lov$(`7MAV;#)3a-%R&K`nj_o(ixuw5IDl^KeE0pfA4;f$kob zJDnI+^=>k8KG~MgDIG8ALqb+h)j2Db^}5fU$NFsF@?W8ffol}UYZRcAB!}-9r4rW;!U%IwUL)dc_Mdk1J*cYluNU)0jItIuviR^tnvN?Dv5Egl#`%VrCo|r z;*&8w4FKzuD)N9pv042*nmZxk!=bEz;~!O>Y6tV-&@i9dg?91(>r}FV~*im z(vU#tr0Lz_bVD3zQq_>HmZR(R1^le(@iV%c1QT)+V;sOj6MwCKgY+El69~(|vm@QA z<9K*iBfJIYkpZ+Mn=F%3Wqs*k5&>y$CV+rLc{7&3U|nC2&DchU*WS(0}ij*y7FD>9QgB(ruTnm|5xk# z|3>EjMh5TyU#p2V5n=@7bHxPVq1Lclw*02ur63D1s-~d_Wd;gtA(qTu4)CKAECyYp z@CexAdB7fYt&YDf6)?I!R)XC5V`>TqWTg@<`lg9cr_j&`K)atf(T-90M|;Hm3E*-V z0d=(m;J5W&d-Q!YKw8%8qeY-2-qT?IKy>-WQ4QI?BWN3kNAqD5H{I9YXz0H4kK)kC zmq2Im|Emf4U+|qt2l8pbg<0ofblf{6Fz%cNl!RIsian0s1AXbKB69O&33!Ahz<{al zy!FT~nGtYj*HklLqASHe>f^4QA#ew}^4_4FBtt1cbU4L)>5HJS=)sIKCH9co$vuQe*J-=w{^ixG`&q_<4uokN#}YXCya_?cf!8e z@14&uM%5rrA1~2Nd+aGG+WE7@1I%Qe_B?8w4W%?j1*AzW=S}|ZN6i3SmcMRQ>AkO4 zZ2XZdUm1Z*8%R1Q+Nwuaqh{BsAs9{? zu8!=dA}4h79_RJia7F?VTc=9A0vO<{lD1NTX_sNsm)gQj zX~_G2;g|PbxD+`_IruIRihT$2HH(@$qIquBPJf}tnGIkH*mH~g3hmZUS(HD0k3u?6 z%EvKCJ?Pfpu=Yn-%+No%8YlpzA-zN_W--(pLvECV-lu zI5km%bB6NK-^0YlKT)w!xUwS)CiU9@zqFoh@;?MwhY7IMtidY!;u**>lB+d81yGo{ zZi0hILA|_4*L)~Y_Jos+QS3rJOTbh1RT<3J6B+FexQu-5xp{DWCCuJEgiB|0>#$nv z+;Emp0#BhH0Vg0{+>O`*?#2hLR-W$ond}5O zdp(yK|@a=F`sCszdg~;!aEC4`00;!aKob>O0**G3s??6 z#DFYID>4bp<^g0xlGh2_(vyzSndxb9>{0Uuj&OYtMz-0thuKypsZLbCyz$zDCIo~* z9$k<2Ww)u_kwxX=3LoGE<0f-2ANnm)Vd`6yo48* z4|+0t=?3-BOEU+zx>eyB(HkKbSy@RdtnDwXit=~`hlDkrWf#=yu*@9=!~y?V^Ba*BTP0Wj{Mvh6pX-1Z9%teXrHT@19wq2k^H+kGa*{H}-;~ z7jI{Plp!1Xkj2-2sV8ac)|`GFUSK@XXw#o`lM%KbgNLby_QIT`S%Li577@lhV&Jj9 zvP{R})GqB~eZjz)>#%vC5-M6cg5R-hcIrhZ?&V>Z?{nee$CuU&@h-dRS#0wL8ntz65Vg{Gcl2-qd%D+?@2a2pdlOl6e}5U3qk&ACd=fnS zE@OgR{9^U3SqiVvrg;+EK=Ee%aCtk%5nX$w${fRq&J~K%F*=mcbz=JSie=#h8I>6k z8P~?lS@u*MgAj&Yuk!-XgLw|Y?{?qIHR*VgY=8;u1Okf%PCiDf!rB;}D~%2mJfLC9 zf@D#a1$D!b=8ZhsUJ_d5I0~$h=Hyl&zOmN{YzPWt1Dp=~o9uyIC#?sVWlq52tu#4V z!~jOP2_8mN(d=ThfzyO=Ae>9393S(3I_|2|fqvnK<1v93q6ezZHay{XR^&WSjD$hc z{@_OE;zPHI0htYBFur*pHrT1}u_J>Ez~!J=a(^4Zo5htC%pEo-9~br)={I~*ihbB# z+rHM24HWD{AnhLoGJARg2d*ow(g{7Zg>yrw*;SvJ71(FG_;7IR1WZem>u(3RuR-W5 z7hi*Vu$(W4QkA*6Lq`gxM}5Nt*`GoU1J9wzRY}wmu=pL?%&Wp}kkv8p-^wb2gwwC) zm8(F=??W}v2Kt9q#a$0B3$r#{){7In0^H9``|uXP%@@1FqfK9HNiNudZgTNEgOH8x zO!6hxDp#5hFLsMk+&3XzgrZM?>bC@Ot6WqD?eR@?ij2qsow^_uHQfp}yY_J0l0@sZ zYQbkZFA`JM_H^`GSeVAS3#Sb7iFRQTpd8MX{Fg~$PT+aepg_HQPdN*c%H?2M_6)fq zCM!T~s1;lO86V)KIt>5E20Z5 ze$)=L7oV@VIbdaiX{ww~!dSk{x0QNf+$u_gT7S&=>ey5_+V-K!Y%)+&@Xixf(y zvy;_OT9TWmZvSgsEsuV!i!U^aU5(<;?)(~&O2b*-9v?7dnSL=%dg>=C>6KucI%jZE zmItb5^=j3oyiee#Rvg#=fXK9+-pZc)+{gPw$W^Uj`vVl>3^^3S@VKArZmN)ez;)-d z1I5fKnC$5X3{-|n*}jXnt@4jm4Faoqt`6vi74GXTNXbn!Z|5Wo8BL#x1?t(akg$1TbA_0cn?;13!gcnOw#k$IuOC zS`1}NN+=yAgOnYiZPeJ$EBVCibs->RIh{Up88Y?xrl@c&$A*)a$AD8}AQ4!9j>dNW z)g5akF@bNaMx?YWY&H^WjPK*3k00>JMB_*YRaVE#aymby&agp+NiJ&UYL&D?1yyP~ zxof&0NHdX%&4N~G$#YZ&A3X!yz(%?@^5B$T^bpo{IboULeq>DYvoCkBn=@(%Sri!f zh#biedGxdO0+LB_c)@lC9qA81q(rCatv_0)>U~;g_)G=31iuUHRGPit<*op~e_%cN z1No=+n=`lKMn=GHfGVi!LmHT_m!Usgb0-+AkgGwTS}7N^JUe7l5a9WY;R1gXo?w2* z78A1e-qYIY$-;Q4Qy}t+NmsCJ7kuDmebSZPNC1~Objow5IhTeIf@JP8mj^1_w@biPgpr!n0oCvz# zc?#wgbR63IBH~D!e39AqIM}X1vX|+tQAZ@3WL~lELfH{8QuN30PDwV5G3GH8)La8I zJbH5#7_d^zaY~`ilB5>#L&^IMGt#fb=!lLD#0!mpY>BFQ?h;kxD`|qu z)T|tMK(%-0YJe?5YxVUH11Y=`V2alQ@}tW<@)3nbmNKA|8+$I6>nDlRWw4XRw*O!a zp99vJLjd-xcnrhxMNQUcrh}O(l2^mvxhj43$(QJ6zec0!#S*R0tL+j@6$FqQhA9yo ztdf*z+EXb&5tei!9Xi-VPGHRE1`QJL4B+4I91d^a(YAT&gEyOMMMnC$_Xh^_DT*oT z5>J3`YKs17gH*Yr&{zSHHo+pUyG3kB1zh5V3jQi(wQO6>NZRzJI5ncGRR$O{=T+J# zwS3*NQa?Ell8aA&bQE8O>1LyFNpqkddrDrFSJlx=>bNGy@TG7)h~WMd?96kZpBWcT zsM#VdRX*Myc!^Acd-Z)~&GKcN#E0xBogP`x#ey{dkGp*ooDi+uJu8}@k8n|ckdJ!P zkq??p!h3`hh(?Y?{$2o}?9w=U=5xu1C!bfV)XP6-rYbUn2zCY9ifvR%>s9HKUqHQH zk8KO%DL@JRnH)UNiohd?A*FKh_J5Jv;D3fjoY})-twt7ViUp2*E|GF;Ry$;=WvjBW zJb3euEIDIhr6{oSzLp117Xd27RQWWbF1BIl{aw(?F2}Mfv;b&$qc&{X3;=twAIeL< z06350vb-Sr_D+(9lwozOB;#0%ZZ0guO&n~5V5*$+qkK^a?rQSJL$j*``$sR2s22FP4qlX#S6~7qrjDsiU3$p?-V9-OqSVkI8O7h=U9_0ZV0~Rb<|ikvfyr0tg$du;j%M#2uzeJ`^}&;s-Gn> z)9(@;`sLFRr!)|$qa+mwKhm!GGA~N8)At_8k8MX5Pq2QI_fhQdo)fpfF+yh=e~rJk zc53?D3zrY)Wh;pnUK#2{N^)Q6Dy`z^aiKoHViC>d7DA4?nW=)E}j? z)ieMN;`+K6fLhjI7fYi%OsW%hvYcj=aA);6HQ2s!|pH z*dl_t;*erhPy9sHfw=!7HlVFb@I1MI%FBn~a$zN)P>K=T0C>m8v4$-76*BcTz{a4|Hf4pE8|geaY+arlzjN>L(aNhY@IahqrK zdeWlxEoQw2Wqk-i4vsjM3i69O1IRSs z#b=%I`M!43UERpKIUM+?WPhV0DVreT>~sJ!2in`~i7@Oji8Wa#M(O$^>hlPWawdfI zVZ&Qc%^kH^OZ@`i_h1jeefBGD08tv2r;P#NJ`0_x4;Sml{Z! z*^hkp4g}<XNx z#8v%+Bp_&fgF{vNydcG=Td*^Jh}ET=PewzQfzFsZ0=WWLI(UWM1yTnsC$7TIxUg^fN3n$yz6bKvm*#j6V&=#kx(mXrq}PTQUcU z2T?~SFHcHgMU{7;uU;IvYJ=OIl&s&QQv7wq^fkt{QMU0hoLet;o$7H`V#|+<%ww~V zmyqRCu&h3)yRpcS zYrD9GO%C!6=glrPX$t5_Ao8v%xt``66az9X-Adc7oK0#Ld z7LZ?G137jY4)v}&9O+T4J8LB)w;Q8A<)rhfgR{_q-Jptsm$@*r(YR1Q$jm5qTAQ8D zrq*-Utn*c<2J$(BjV(PpJuoc)(j&wc2>4b(>kAS$Kq$Q?$YDtEg281D6 zU=HMP$Te!Lp&rU`a;P_}w!_56WfbMqu%!0X0*DG;>UIT6=LCoufIX-rl4rA4WRhtW zDZDF*?9DPBeP18A(GXp_ZU~5c(6lw^uSH-&TwJ~^q^y3G3z-_INwoE!e+$5hRt1X7 zkq^yU?oTX^jBMQ(FL*Pb$$R3td@we+Gi!g;1E01%5*RAEZWEnkEgGR+z69j_mn%zv z{X1#to-)q9Lp!<+nM(E`48RVrS&+vuX~u-mU9~;W5;d&2%9?sLV#6^F%-mw2Z;vU( zvoqZux@YHdN!SK^dJG~Xvbb%2ao#=qqjusd6Nocx&1wP2l&e?0U(95YUn^w@h*oLD z!JwU@>HrYMtAX;ftLJ{}tvD)s7!duqxintNCF_e{>ow~7D32S0R^JLg%l*7fr@@BT zbj6}?m&Hq2s+hdAGzd=AcYuqq%v<&qb09E>aa{Vfqm19(BXk0djXDZ!ivb7cTHYNs z3ahF(#;`6fkL|Zb{1HHweEXvbON#by;X3<{(kCL@D{eii@zoIR)IO2%p>iYt3K4@` zTre_npPu%(6e4wweJ^21OF5bkwzqy8vT=T#5&!;^Cr~7oxNgnyMXWpF(dpWKmkrT< z;8X0Vm?S3p;V!9j1ZW3al7gfVdgjgtuPO_^_MIQJ_((7@9R6%l?zatRveiXgn1S-q z?ytMfMjuxca6IStm3-x3V}(rVTY5(p1|T>gvXcD4cZL-D<9220Hd0RZ^Lg0Dm6kOT zCH45d2Fca9ej{X#Ugm2}hLnGIbPxpy4?Oo5KKCa7@jIFBf!qV}2c^F}`Z?I+ z%}V{}f4$8Ak!|n^2M_G_CBgHi|9{-P4=c!Xq^f5ARptSo@G01w?)P9+`rnS+e_hi5 z4fy|jWdAP@_$N8FSO3_(sBA~DCTLTB5GQz%5zeVTc*t7MRnLXQ&PWLU&x`u+bKEck zw~c>b3~@6Z!z$e!AcNx)8Ox|yEYyamnb z;*(G;{i`Wz&1$Ap=CEZ@M(~$A<~LfvxiVJ|(S8C$<)B}CVl1G!3MCf9Y32eV+2(3F zs@2k!u0A%lleNsAvhTJumZ%7K?>yM3P&-^0vCmc7Aa$CRblmHQwEejHt$6zi`Y;2k z{u6D`L++?68$|V+43q!fovPvn_4BbwnVgN#e5H+_@FDB<$;HFNN`v*GKEx>2k)7(q zva1uaQgcGhLlzXh_lw+Gbu3n$CobBCBGlD!-$Q4MtF6D>#veH>h!4G}de5H6YC6N; zx>jUn_&w>rzHcWsA4UqpB9mqodSRoi%klNhnQuFIiV)TLD)o_!n~)a_V?VMTr!qcm zsMLPDe4^4w8*IJ3-(vH2=dta3@anHN`*LSEU0-Icf0C@yOnr!atfn|>zkhSN%TGeogz1?MJ_;T*{NTaWG|6?tC822~WGrRr%(?%wS~m*f^F}nYRa` zxxZf@O=Y;#`tA5|hVAzrgK@FVyh+UovV97bt;M@lbMR&0(6RHIvGDH2`gn7Dcs_4S znx4IJGXdHAUkj%>wOu!(_tD(~o^$KN5T{Kt{hM1SwJl^OV|pJn_;z?!1luRcCQ#;Y z=xrsZdqTOjAlQRh6F z@Sp%DOYzJz%5xQ><8d(mmVQntKQyVP3xhlx3sd*%p%_L@3J!ao#Y&#V*kn%6CowD% zJemtrN%qIq$M4pd*Cy%peQ7Uu`9a_@jSh|}fAc!DtiYfzbh<(t|FG7+=9R=%h|ei$ z{B(UNS>ch(+*6$@rw@$tkZ86CN@KA4{d(H41HRLRwA_ix_C&_R*LEvkrcgx$9eixK zf^xPl&TQs(f_10X443L20QeCBf4CeS|P3Ov$nq5shj>p?387dsFBfA_53kIQGJH!@~|T!BbdI;23C}l zIG=SsZT1X(&3(eiw2TjP<0Sk0jhH{GG-pNKQY?abJ{clX z#O8UsO}Zj$J-p~qr%y(VU~8kv{oVA$rc+SD8){tEjEDJeE$gf#Y+)4*(A-CDWYx;6 z%UlsE%8OYA6%d^tYkU5-%W0NPUWB_`;nvd`tJu7b@|`6#Q7`_#kzsxk|CHtUxz1iG z)KYi4SN9S*0!=wGX{Crep15_Gi6#17JU6v_bAw*J_7&%r)TpWQ@lg#p<(G`>AhkIrECo@t@qsu^VVh2Z}k^fJaZ;= zXm1))*IHelec$s@Noloyn*J;&M{Mu-o#1?Tw|c#*Rn0c9)!p7wH?1{$Z8D~-tja!n zB7;RLCDAUOeq9y8(B zWU|ZGrI^GC{5R00g&{)Xr~spXjaWt*Ax_V{Wv*2Zo$j+W#NXozT5Uz z!?rn-I|n&YMMBuv>$)ik&{~PmXt&a$RYYESJ0jOEhI14B7LIg&#qVsDeU^I&myRhr zddaa2ZOqg$e@SK_l|BFP-DB9Xw$361#%eD&#K-(vAZ${|y*;V>$D62rx+J0E?|D(x z@TBOxGKQ`C6>SG4k(vc(MVMR9NLNda9#K?>zHF4@CtnW}PHpQn1*#IaL@6(gvtHBL z5$ZLo)ugq&>WWKBm$!HZmVe%|)z5Dh7aYoIO<(?1v$(0P0IF2BYvIdAmAzWi#g{xm zSw+!~jc4&hm%m!AR8F61+9F)X-u`hLv*xS2FJC>uoYP~a)0yw-{?&5>+TXX!fF5Eu z&HJNX`f(3F;Xch%x;H+=9lqve^Ye-OcH|Np`owO|b`$*o`n@ut6FX^$$kkj++!@zj zN}cowTN%>?8^nvFD>$ErypQqJZ_XGoRh-T_d7&}awH($#esb4N>#ri??pi}VvuRzaI6%DA za8X!!n6J$;@BO{j%k+5p_gaqll+`J=XHDQ8!@piFH6J84O>{^lq$%?Qg|g?cn_?+h zdHXC069!&XH(HX%s9E5vx3_7G ze&4ax__%cNSDBnpxlWknR|f*U2t#L2;pW5}d?Jrt&?{NOD{7u(Y@$a#XN|z|1lnD6Ar#Hn*q7wSEWtC~Cu8X;6 z;ULvFqf*40m;0EJ>ALA<_ANRa8?57>`T~z1mR(|X@=gUq*t1%wh0R`K#F2M^Z)K>T zk5!(T``H8Zln&pruhgHKj|UUt$Go$T*Jq)Mm0LfSY?>ZrC$UW}3u3D@YRdIxW7q1? zF0vCpmo?B)o=aaEOEyw`_>B^EAYzPFFV%z+Ckb`To*s2Ldl9$7Fh%H51V3?5zh-fr z*?Y9hR*d^J`ZJ1tFBs{eX!Ke=SYO{;2GO@i%GoeS$HU*Er-zbvA!-(Tx%8Ipi}QWX zQg`vQK2f7tF>+h&A)Br7!BDgKQxTw9dpRf7t&*t|1^(GP@kZ6z)keFr>aA`;5+`RN zvuqOFy4=F0K1lnw{5*whsKy(!UQH9E4Q^(=R%;?2FADb~4>b-5GD6MukvBJ{_*M}D zJ(rR!&lpc5{0m;UCAb<|)AmMBG!T0l=$>I!-QCxDB-2?!(o{l8 z{m(>W>`{Fq&x}CqB;l7G|m|FcO0b}G-T)MmNasEZMeG+$6X&fYFc!(ojXVlMDRjee<{VRLM6-%t_ow|W&m|oP+aHW$voguB_FuZ3)JK(ZLe|B=} zS;ZI;N|rQF&yzVfdgc{(m9@z5_y)R@|NCS=8Mf+lq`nze{vy%f5mWPYMni-;>XIPD z(66)gw@z*|Wdzm>Q(U(e@%`>r*|_+Ol62AK-6{;|j2*wmc;pz6^tbbak2rX55$gcYaTPi~6+M0cwah1sbb`Xv@97Iqq( ziOmW-PEzV`_hHX&F8LNWwWW=#&q(aSE;}V99c?i|ZTb;1rie#V!`7cMLXBtjLu+dK z;r#-(N}ovbdmkgPeKn?Mbl3KfTVc$I>APOyI|W(wFCEWbxLDw>>O@)jcfu{D1FSWp zbw?rvcNM0a6m}MX-l^~use37a>j|g=pMRG<`lV=?aZ%G)u*=s{zA$m9vSt zeh@Z9H~}emQOK)vpYEX3;%s!;ZGEfwb!Hw5Tbqj(QR*j_zK1>;oEHpS6*9XJTblF^ zzi+1-Y-gLjQt}~)p~0L~t-b#4+g|4W()^8)jqqeEcF%5Y!#ZarzU>KbKQw3?J;YOb zkYgDYjP|5m9}v)=Q)0?yRcJ0*E`8T&X~q_$(kdN30!Qqqc4T{#LHJ9hA`h7KR-8agOQO>w}`6HuP~WYhMIs;deKD z5T(S4fopXQfs6V~%9T$ZnZePDnfYZXEsxn#F4UrD&%)C!`{Yy!G9{u6j;XsQBZo=r zEI)?IM|hRi5ioN)<5+oTk2hn}WikRe>(KAVePqHa$bE19SMf#;K7X#HX5 z+)wrP2gsbQj8k~D-0v%5BONn)V`>*CUZNa|P}t$dZYzy8#{$Euwt()BkE7}b&>`cy z$lRWU`siWzY2Juh!{(e&i-qw&Xtb8?7+kS4L7(V`c<&23-2emFH#FzkbcEAojvAXO z#k1uaw3*2ev7fuH;!*lf^z0>K;y6d_WU$5+u&;CGVR))H$xAuYFLCy6h-PLW?*_ zI50yjYAg#MMzjYjM(DA}Hn{c2`RxaXT5BLu%MOe0Wlo;Xs?xi(NMbj?jqC{zme6)v zGb*x&-R-annri=KsUqdxpc=wGG>e5JHed3!LtVDvV6nZX$Ip1I%e+wSMvp6j}v`~Ua+o6WW`vu2&^ zIM%V&+IP0?GMxt-={OQqdTrr0{Nsi$_tmYP$nlzZgD^AG?4h*#H#SDZ;BSU1=7mS7 zWUmN0Wi3C6MVKJz$A2tbb$O1435JBkUtf1ORFU+?Eaj9D?+AVSnT)Q))tnERA#)D9%ymlvPk@fa!ms{M<&jkk*7z9eGk5cR}1kC6?xjf z>~elhoAwwP>0AQ+kd|&e>&DP^EBgvQxjC2T)UQ9)Z2O4ohYmdJ`zO9y^=(XmiV)^Y zJd?ykxAWH$;|Uid+3^HDwxzz@np1VDtd}~dB{Cfz`S2D$B~RyX`;)IcBV7q4KVeBE zIYkLG?P=0}GN{TQj0wJRSW&W{SNDZKt>G2njE0Dn;4q^W+L7^MDV#X$X-Yt|Ig>zC zPR|t)sF@Qo|5%*+84Z}%uz8jWdhpBbBhH}ZXo9QNIUv5BnC36#5XNdWz*&_!m)L&} z54JnwRcq?cLC~*D8uh0IDW)9-Vav8|5t^2#K>Z#qqg@nCCyyt<00Z#~X||?NoZI#FTdpd_f~R zjV`we_2PIjE_ne?hRv!2)^7`m|asK?-v>?>)$EHB*wNpjN zle#vS{0q@FM|}0Q*{hDMNL~r?(i>;{hIHQuzs@Yjo0`E{I&|$eRWpc@aI{_?{De6M z78%n7Hf;lra0VRf9al2J_ln;<<34W?F2IS?U)U>T`jLh70J4J@bYoDT^QJL5*AHg3 zN_$z@{SzbMHwD{`K4Gic0nTvw4lBcR-1sG6Ym0bOjS;y?IGquqTXA94!%Qt-3U+n< zfEGJDv%SKG^j{@YJ6=9vcLJIs)#0=$(>-8`y49rslX69GGjIH57dO+%H`=kx7JAfW zyYPCOPyy!avo}T10{7jAptHiSOkIabg)Y2^={R{X)6{atFB+h9mNGD!ya=Nv;W#|w z=Ie6K2y==-9%yL2%#|n;y`$ zXfv*#0w1z>fTYop?G$A(@1%rY+ZW~sZURZKTm z$@SiQ@vgPQq<{6JvCK5JgPzVvrG=>erGO{dF+rmXM8Ys`9mT|EetLeKk8@e;s!lep z^&#|iS*aFI(TD61wHIwT{(gx};dq^go|#|NPLwz+Naohx6*q;Az@YVfTN#=AaG@e* zu@9JgJ$Gm0O1*8{_@B+uQ1gfWaejm5))2?uXV=lt*6`{wUZ|yZ94>95M;d?z z@Kgu%C;Y1SOp5ip6PwzuV||<+bTdYM)WYF%`0?;q5s0_o^vzZcn15;%g~bpgWs>ZJ zVa8Ug)x{2}EP6FBbh_`6DwC$(o4onhrVy1q7wa}FRG8f*J=)a(R`q~)_|j!Cv1^NG z8aTu6W(MD5Xi(CODYBok`?9EJL z&41P|jYFuV%n4j~TM2|1*F@)~5DT)%{liv;{dt7ps6(|w5XNC(_A8^bACwjgxA-_bkv#cKRa~V3IpDJdJygZ;* zbyQEDma3@<$t!`2=LLvg(TL4{YHS3~r1|xm6ZaU_7~#Q!HNVFOSBQQL&e<6su(L=o zP;{s|o|8bD$oWSd2ju#))k6#f$UgD-z1FsyCo~oyweJt_lxPQ7A%uX#0wVR7r~ctY z$UB2W{vAR7Z2E0z;xUFY;cY7{eFI`?``Smy<>Yfg*8S^W=xZ9`e- zx8yj?jTCm)93<8Mlu|KvE^M8~VR;|9_+i{`;xkGE<5=7Bs9gx^JpG!(H7ik2&24iv zI0?`He16rzo2W3{^<{6MBVzM`xTuzE^9`p2G~zfjxeaAs$4{ou^G-eS)j}}9;l6c+ zBRj(`_02B-HnaFAH95R}fJK@?;YhM$vZMDow}WK&-!xu#nTwY;>dsDIwze2JlKKtq zRj$4jZCRz{z4l3aLtS@EI`?BI--%TA;Z>~x5TZmtj;+uiP1t_cI7!y@J|g5((P~hG ze@1-wT1?5bXi2FbR8$nq;p5yUY}6zs-l=Brtn4lBF!k>0L@4r>RjP3SS)7z0-_OJ- zjopjaT5EJnYEtq9V>DBXmP>284x z6E?cMkV@)*h+MbMNpc0hXTkkcWY)f&On|R|Byg{m4`>ZR+`DTA^@&s-Dp#G8pFAe$ zWmX;U)%I9tB$a zlBEtOwJ4;U%LX@}@37Ct(Db~>X`}kV0{`#V=f%_;XS!I*xE6tIdFf|I%LrxHpOE$` z)RD7tlUOxd_26z*8|s+ms`(dXTsdW9+ah@>omSarn$$ET$UZO~JNjIHvLIVJ<^omf;j&Wg?nOq* z&C>}oM-Lb6_OvsPXk6V&o!HCJ=liU6#KWs#yTl5&Q{wu0JG&J`LQI-xEUWV(D1OTis~E%=8@)WLa%#vS-UNCwFxTg`@&XZb&t8R` z>6ZKI1GY1p<@gyf`(G@0%r`P<0X^XbbpOzb6*e=c(D;jg_={SXV5Xbp_+>24y@A6D zmeSoxX9fE>`BXIfw))gaFPkZE)r1DLnjd$PGZ%Nf$uO1ius{0v4ZSFQb^QX9>yxRc zYKC7?X+hX4V@%jYhE20?JHQOUw9+&|{t>IEY1G*(&7d+ zxWILJjDGd4jZWwliGP55+Zpa(S}Hv`au9LEc1^4A4M#f0mTSFCE^_BP!+O*$2+7;6 zHHwGP+#iC2ombJMwbGL<^S(4kRY7XL)ty@tv>|Vmao>;}PsJCGR+cZ_X*4@af6$UG zjo@tkF-z)lmq{`C#;qby#7L(1>jYoy7#Lk)q_Iw4xES$)j8dGam9OURPo%(o}Qou5ETUK-*GvY;1BkQLtI)-CSZD4>2Owm4nS z#oKJ85c=|^b?q?O#I%dkBX{g^TURU zOY-M4fHL<#0r|&1ow(}9uWL<9!Wx^iUf+fIHen%Er4C)+GxpcGBerCm3%+EWRl&C3 z2A?RPXOb1*JKo||%7`0RgR}8Ui6YvEe&f40dDDB%c93+0)o#VGozm^k*&S)+PfjZ6 zMh(7!(^seo*#Rz33!9JJ<^1R8CVvvulsL@0~m}e&jskn-!ZH_eLWX;ea7?5h-Ejcp8b|)~)-;R@uq+h9S?O%wv{4~xn zz5Bx8_SoPU7WZb8GGQOMbfb$B8^509Jeb^eH?OpU&jh4^M|J2Y8_gat^Cab*)SOat zD^v=(IacdgicMG|>5+iwP{vO}Iy|UWTW9$&+pEPaA8t_c~ZKyq$(>}S-515Al zIbm6g6^pB=;R^J_pAKTa#k36w1SBb4;u3^<7CkUhtSdO!4}xig@o!A>PifvV@czgR zJswer;HZ&LMaZ1smO7)Ou0qntsk|EAU8dH!CfJ~{%~AQViAQ)w1b)ec3ivaK`weh7 z9<7R(VTyG>ao2L1shNompi?uJDEMIFp{;_nFTxBU4^QAXoILdfhRa3ccw?(Ij8_R? zKT8ITMYakS|BPqzBe)C4#Ei1y^f-p6^!D10!JZwc`u=M7Q?crhmmy@792$YjY{p|$ zaVVvps+T?n25qRdo$v08@u!NH77?nX2Ct>P3_{pXy*0hXWlAr+lblV047dq&78*<6 zxaEdPu5^s|6YNOP5mZq?`^oI}m!nK%^|`<>o_HHfSunAzu+$fOpVt?~JI}`0VhR)Ir!4&q;T!O>wxYmz+?=<6L}C_>ANUy6AW-=)~1eW#d4`mJj_8 z7YM!>XUwrDFX8j5R!-8fh)R=u-y~UVI?X zQfUz9Fd4gSw3&umK~>QDJ44FY!1*%I#?JTVNo4rtnpxsD&vry>$Az{MUK<5{j*TRg z?Le+rZ!r;5?Gx%~%EHRnd{y+@WmP@x24M3fPX$kLIh~&3X(O$<>HPtf5{QS+3sKoC z6L8a13yykmID`J)d(42uZ%EdIch8rjIgUQQgcF;$sU2-sPoXo}eJhsZiD!K!)iss} z&O2_CRAwk@A7;^{krG?#BE4M{dl!-Cf}%@o@!8t%E7(x4l}UYE&GCM3!%vKzZy20 zwzi(0Pq)iae{j-TyJn~1>8wBVs}DUlJdnN~a`9vY%%iDG237)P^gk8~*uuo>AZqK| z$)&0t0@7>Dx=r62To&}V4sVtUC>8Kb)Hh8;boIF=G6h*Y5q#R96Nodc+s;bT4aFLi zY3;+x4vd&BN6L0&q+98$GThR-lLo};dE5}JA+m}%9D|Vh0WK`$?52ocbLwg56IdEF zxQ;mTwm%rTLN;5_?s+WpD=8?^Lv`j2@@*@_X=*V~_A6d_)3dD-!RSrCjXI(O&qLnr z-O!&UK{wUCm?1q<-05uT$rcMiO(l%|D`bLJZdo!LsCx*%fkNoXpupX3%A{lbQ}T`~a$Bc8AMh*Z5fWM(Y8JG!2YdLi<3dOHXK zH~`xHdpuz~=X<~Ju)6MayezgiZ48I~vOQ)XG!H)1qO6)&3$ohw!tE?_tX}3>_tN`G zHcYRrz6KIP{Epkk6|8oLu=%MPD8z=XCkTFj6nCeVj-ACp16na61DEkYz9bX7jC=_e zKRNln^0N39?&;U6EPvgUk$Tg6tZ^ZfPjO~+TWUCC-SWX=Exmfq?`!TDHzt1V?AJbK zMnDjd)1m}|fFm%tsr!k?Vj}+pQzxg2mGsse6dW{4?l+t0rlroj5TYqEHYF*d+Zeg@ z8C%$`o6#=-PaZAQ9Srdd_oOkIlSr3w4ZQ4dFdMH^e0X{13k}3cKmW347RFeU*SmSy z=$qTjfEZLc(g^)+-iw%znH%CZsJHMY#|KDH@>QivydAlC^c{b2#@$lZJ$-tt{vdT& zg$Y-aeZF6>0V(^$a{7abjQ<&7(R43@_P0M>0%VC$Og{BpCSXCb5A5L(bl0vf)&Yr< zK&;fd^axWoX6^s*kt#u`9Km1rHA|emXKl;ek>WTxp-M}19uV%bp3)OG_(yCy(`D53hh_SthPr+s*;CC`OfXD> z8(TpiT6R+#`=P-7)-a)b4;Nb)Uarbr0!qkCk|{KjPewY2K5!3{-cytlj!H#It%!TI zVBW(fASA_?&J%^=k2SoJ9JIF30fae0N8a#c?knEJrjg`HTdQiT*k^m)8dw_4>S6Lu zZAknvIyazne1_u$Ym5 zXXJI0X3C~_>`R=)MK2W80YJym2RNefNC&yy`Z*{=Axn6liBPIF>w2&CR2Nb-!J2SX zxid?wH_PF_dHTLvO>l0D)+h0CTlZtBssJg!jUZFc`QaGH<-AmBs#j-XNyKc{7xMBw zRuB+0rp*yCM>22-h7)t`#Rd?&SL8pW(p#o4a*nyu`X02Bb2@x+x~ifrZMIm{|}cD zWJ_cdCnn{^^B=7rt>6W?YbrHhkl50CoPyupDq+(yVGLP_Q8n5Lxd2kK0GWCWQ?RBy0Cj-{Yb4ZlIMkb+@lMP@PL$bKUx^dJod-0_HNzN)}?4>W)nnu2C}fcx_47o7PHVVG$U3R={hIxZHNiF5&4-X z!AsguufmuaKR}i=y(nP;>6_2OxMg+EK3w$bm`s#n3DK*6!&R$mQzF4V`j*X1d$pRo zs&W-JCCPQHfck)9Poo)+-h9@ES`sg%fu!#A(^aX-%YQmX?%X2$iF}#%UTdAFnFiXbS^e2mG$x(YS@*_Mg(`YVw zVF?o@1|EKy%hPFFh4+ILQkjOsHTsuva2E5U0|e)NVXDZzkKGsCb`ni!isV-h%8KQ; z)O9HjZe1B?*kPC9nAJ6qnssF^Idpk{oP~c87`;=EEUhk95Rn0&_VBK`=s>pwe)ki- zWmf*F1XS_;I=b$wx6YoRjs$Q-cYH$9x#W}*993@NJn@NcCcm1hg(ouW_EW|Zw6lu% z_I{|tX2_zg7I26bk{WjsS1tH3XZ~pCSdHGpb?}`v)Uf>%|J(Jo(U<5ZPq3HzZ^@bV zqa8PS5WknxWQ$EYD^1SVQMm5yY}v1_GapjN>iJQztFN;yhr|=8j9_Qbds*8(iiZgk51~!IJ zHYj5oU+OBo>eA z5Ygjo%j9L5viS!tT5YGV+2{5?L!qgyX^VRGF^Jwxcitwvnqssv%W?_^LOc@z%Rm|_J3 z6)rNaQ|#V)sTA=~ViACg_gba+OR0_0f2g1hyaPZ-vnZ|=lKjJZ^WWDKXj}q=$REfw z^~)?)78_=!nD{-HH0zI6bFebzVBiEzlO$ZVcjl|zteNe#XT)VbWe48-wZNSkxD7*B zd__vvGS%pvw7VZH-*Ep!S9A&o-fek%zk5p6{U08d|8h7i(2~LY;}^^274v^so%|cw z`sFilE68e5C%gAQY7Qy^n$z=%lmGoW_y77{9O;3ZRjhCpr~l~=@4q@6c(@WM z`45%EfA3RRWdoO`CcQ^(MgF7a^u<8)pIyDJ|NaL5;T0z<8AW;Lui_WU|53MR=mX7p zbe(BJ{-=vG|LW#Ro>pB=fA@iG1<+ixWct?C|LBoIXacw89GmQ` znE#{Z;W|L`{~hZ8ZTSE1Q2*JE#J$ z{{J+?$MSV$s~K0cLy4`ttRh|!TT^}+JjHos?Ft#MPlP>Gu(cRMBy4GtXpXPXV& z`$Vg}$#`RhTudZts)s{4Yy^_UAIt{3i~jYa{(r+ECly)b@vpcn+u9($kY{3{-@~)M z^OHe%1{Shart%rAGUvj7oAuu-&!V5^NU_wG4P`BExZADz;LEL^0m9b`MWti4@K*iG@ww>q^F0A*Z`VQNp8mU{P9{oaw z4bPUfG*>7Qx;Z^RL)2w)5!C zErm_z&jrg|jSSUwNpRoIf6kNw<@qu!?8=;AUcGpW$`)xh7^dtq$EQQ(tSth5kH|)3a2KP zK6Tp(pHnPhFn${6)PH_ScgsubP6x{zzf412b2`j*)3DL=$53a(kf>&%r6S+rcBuk* zd|S#BP%|kMBcKNApEt%Tjksa#-MS?RAF2c^!c(vt$%)V5`XB((DqYz55QY5q<+laG z6a9*TPro;Xt2nO4g}Q2Glx$JhrY4hFCH+gIl zYItaRbF8MpWE7cZw!7U_>bWs|;7GhkB9QgGUTc&u_VG_zZ64O-?>Sk?v1t9S96E_)G{Umi0@VBS69CH)-iIg)Yv>-zazQ!)YMq(NerCyFhR{^Q-l* zcay%UKn>RinELp{zZ*%EcdwD^*`fid9DQE+^Q}ri{m%Nx@;w>{+;~d^6lrzeeF4D# zBXsRhwS%7I>00((lnh|7s`1=1!~=ArQUKyT2G|ih8??CqanXHL-P>##7zzJA(;u-w zGr$LiW=FC~GQNEG6AI3I)KFI5jb6J*x6qOeRb7(|g%r*ZJ4M7GzJqyrlAa*6GTn-R zzT+EdHXD`r(vSRa{;r0?LrpS27yieGK4M{NteCn%$F*eb%l^#U_0>g2-$oNfq2>^P zjOsKdK}nLUX%3+I#Oz0SU>m1u0E@gtR5*6cy|3XyL^M;)XHq@?#jje=oHZENS7hsC(X|>JT5i455&_~oR-!j}9Dc3(WAUl~w3ShVB_u}|47Q!BYk}-c zxAJQ9>=2{R&8#F{F>fgOKm>nPj0G8F?DPCzZH()T= ztng>XjNg;E4C+VrSK0A-z0gORwzNYr(ovs{94g`K3lc{?EyE>6cE}k&T7{Z7B!Swb zo;$NKqPAIXxv$3ZZS?q(#T68~SJWJ5LO$0x;Ul$+tXWBE_yTE-S3cGY1}pe$f_gZd z8>U#s;Fw_kNEvI{Xy7PbfgZP8-AP3Ji@e0Yj0-@_e--gAh;O?YX9{Zo!~@*P5g}yt zOJ7wGC-kOVQm{69G&Wj4Z6zqF$M<<{B%(+r^5A~+ETbqOt!a}2* zccn3a@Cw_`UQIwSA*XCbbQObTs>)s`5 z_h-Me*G~=k-e=P2xDabMR%;`Uep_N9>1FG%$Q2M*6@U3?!!UK~u}Mt?WsM6FifReS z7cgjP!*0(ccyN>!=vIfL;ntrw&h?FIoNGTPi=lvfi2F0}p6lQegP0KAY~RPjsB=H; zc6F~&&6IG0-5hH!?17bLz-QJm+~hOu&;0RlR`fOZ*dY*JW7V~VQmkF?95>L^_tehJnmp6t834SS&=i++*X&>rfG^jUBIm7_*tF@4xnqQ(qjCi4hs8=RR5W`uX|$&e0G7RMvQf!swj25IlgpitViM; zlH`PnGgUHdSiLSKtfhFnyd6TKapIeIv^hJem#>a@+x{Ftrtv<4g!lAt&7P8lA^}*O z`R8x8{p@z!Lom$iKn-c(+hup_<57af_A4XhD{8EXA&TFGopjp(xAF~-?SYjHa&wb$ zpP3>bky^AW3h`L1;I{uKt6>RRGXM7~y(t@G1#(hMhZR5b)YBPE8AMXO(JW(G25(T6 zHgF6m&AD-=-AGZsqRMvai8aiJv|H3)MdBi(8tdb7vC^atZyrz%)Rgf(Fe6P2Ef-rx zcBl?g@Vt{F>W>oA7lVuzR8kEeZ$+}gJ%H0Y{flL(QB8K-$jF`UTJ?Za9vsHHy{eaBcFmo3sV*ZINRDSbk6+Ee z=sOQFe1heIY$&pbGp~GX>DJO>Xx+O!9c%|V(Fc^F?7e7I*4#5y^(iuQY;2}j{xTNQ zs?xaCfZFc%Lc2<-{`DeFcKteNg%Vs20uGvvn|SG`90SSzYUm4)=O0}0S%$kIfXW02 zo>~B$GwU1VkC_JW3W-=7WHCclHf}C29Oj_yGgLQPc0) zIwr+Nk9A9#)4`|`i}vaB?po*n#AD9!(jURQ+&yI3C0#6c@QJJRj_6ZNdrEAlNqCNLh}E1sm3~a>nfdT;d-; z1uBTFf-u|Qq9L(rt1_|HGhu5o9lsKAiRoTu#)r08ALPajKsq!&%KS>-;&V|#0E^Ynb zHQ0$&oZq!&_Vpj0^%v>GfJ+Mp(*^K=GDJtm3v?OM*Y#3klbLAUbIAHPIlHw!a2rFa zf6Zre177rcni4Mrq2^1HZ1N>2=u*(o1Y{{RBJ0?t|D+m%TUJm&{jtKRXMC&UnLFKS-V0a!02nE)L`_*QAOvwROn25S z55z_Q6iF$->4X4&CYjeRRUk9$z%fEcWNYa^2V4&)=3fCqILf}6A1@VP?Owb+hHo|7JB4t{If`h$Duh%r~0MylW5ncnevf3{0Xe^{k^QM=-V%<&RQ(g z&hpB3dZAD46Q$0VB~Z<{cSp8{KVO&(^lj)qaBy&R`rI-IzW7a! za8?_{E6ti<=trROAzne4+Ugqc#y(PL7wnX86`(f3USgm&`N|XX(d;*jQsALS=R0Nd z_Aw_(%Z>W22EIFi;>BYnmE;_LV`#|+4s{M_3N?ps75Y3pqQ5fveD|Fh?z9u9mY(;S zbs|;VbZeXs|65+;8IzXR*{6_igGa>vZkMUe`iPzn`U+wXR3)n_L$(G3va@d6Kye+R z#@2C1P}4wl+^lD5|F0~^2Q!Tx8a|15;X+*ef7b1eV^ z*h}USj?4=b)O=Z4j#s*LGc(1ikP?tlz~lfs9|jh}He0A#4MV*whK&wQ?1j<7PxKqX znky7wWl%lffjg^>^lQ7qtq%aUw}9Y<0Gt4=LVEEO;0g-b=1hoO9yK_10NVAw!hV$3 zY^Uz+qJL4}`y}5#ero6yRTq5LOn;A19wxYRt;x04xm+;s_7(c_0%sILfdc{GG zIqE(+E|f_!lb``(q3$G=b+5_XC55V%EX>F__B537zWYV$)VE#bZ#MDVF!9%uk{k-z zFo*_O>lMnb`sHo%0M0LBy5C!=h^))!1-cd4Z%8h5H%Twmg*uisIv+5W537SfOf9OTr_HwK5abqUAe`& zw@r?1jtMz6Y4Ebsc&B*hS^Qrf765gTir!PcX8aaVStr!ZQ9=~BSr=}{s2u&#XZ27O zWt%j5VligKDI)P#lFM{m#m+lm1Y+o{Wd_73Uw|&Wf0ZsBun7!)-0*2skf?Tk5WO~F zft>8DGW)Us8>uG%kysRQ1ULvbP`5~-1(nC)d}SZ2j9RaBEoI1FWq=IT+77m9U<8Pq zvd`POrUAJdwC;N82y}ygynMO~l+ou#X8T?w(U#|HMknv|9-QVZCFPdi;^!YkSmRXA zJ30o)8sEW-`#9p;;_`ZV5Up211RZ~}P2W&oYk z#bgOc5mKGfS5s0)xEb5>mHs???#hfj!#)CuF=oif-~=Y^W4+8Zu>z2@t2v0r9jzs_w}zly6j@m{A1?8Wj=cOL zweU%#uN-hV-bcX8LTg4LdKW^Vw3ODAB&Nd6>~eFF+pScBb)0U-WVGw1qYou17yft? z!f47ni*7&9DUtoyLfcz~N9sFZyf&l0J7lH!U1~8&4aauSv7pA#N9EkG0b%QAYts}& zYoEV$3lXTz;4_ZA0?O|oO0=47LnrvmoXThLZju3X)O5l*;O$+`uJFCRv(jjZ5q1Uv zT5>&7){?2F@!7gY!1F_0$UeK`P4XsG@0?WJ8(y)p3+ETSDq>o~}<{cpi^V zpF{+!sk+pYgZ*qjUIc$ESYj`l&$Q03uc zWw13B)`19joa2hUf0trvqRK}_)m5>4Mq>PF$!%5b*Z@wRt{a&>^t?vKRYp(h?o7P6 zcsIu6`^O-a!>4ToctN-Xe3>)f)m5?Xyw@n}A{QkhBS*-Upu>cE13L*=I`~1TMa94x zhx?v@ZI`0TNT4qw&!4>Zi2~)tUEhJyUn%1?g)prXBhS$6P7wp$hhUcK^i06|MHr&#IVOI+`*HU4QKIlKBwW@ON(z zy}@_Vzplw!Rm(o1QY_-mnhOVb+~Y1~bCdzE35*|A|8JwC|jJkO#$|!1dK&`-H zj-zL4;pZTka)wB_A^}OHGVtx# z9Ru4v<3cx#ub1eVtAhaR3RcL*twkBS_E;xv3mYJ7FN@3VPk8^!Q?S|=op<@ov(YvrblmMlrf#dM@J zJ+>)M9emnB%aOInd+9^h0CsR*&NL}aQad^Lk%QFT6=UE}6d|h=HMA|kpO}-z2X2LhhpR_v9&UC6HMb6hjZ>7%7_L;Pa$6;uHc&TRrD5yk{1< zL4^J6V#&;+0h3Ach`cCLByv;;v;RnNHKHS97%4N6M5r9!pUJpn%!jIaIbB;oG;0C& zNTE+YxaQ-s6eI3HJOPD@Fk2c39W(ZTldFXXB?qD}$-K?ApmL2rb6LU@A$A#0Hm-5N z;(JFkwYBDyruOzkZTYygu?uuKtWR!IKIrS(sogO{Km`0aW97J&gsjgn2p>oN%sUA}!WqX~cEGb3#c&dJMkdgHP-Eb*&P zN$jecf4<#<%+*Y_J2Ajit4yX!A12$IV*4d1B$eXTXwe|K%M(e(a_Ms;*t_5?bvx>x zgTu|s9189aMBayp3@FiV9I=W|Zq`#drQ_dl&{N~D$GVy;l=GiUPL`9+Zw1Y3RH-_> z%$-dVH1yayrPi%{F=BlXZ)=_4N(l8eBzCS1R%h$Dx2u6@KEDfs*1Q+4|Fc)HP@3tQ z=Do5UOjD9+6*QCwt~3{3uMMgGokRL2?B{s&OG)k3R2X!``E>MtG`;ODyoL@dvi6$jaT2W2Az3cx_HRLepvgDWDB_7GAbm zGMc|_=!2cKNtOUn@iLisXv!rkj1?pAb#7<83$jvdz3Tf$rgQe1V?LqXWeyD^5?YIL z(3G#0xxe38>v(CHX>>ik`3}-4_}#TsjVH=?p&Zl?vYfmcO4c?y_425yrFg=ENP-|! zdhJrcD0NkO*rRwRHh+@QF4e>jl`vifG6mbyCB2}Mn~A3Qv&id6^}rh^aUNx67X9ML zMQ$TKsdT2oc0y$9d0^?v0bc6E4lFe)%eM7dz)pZq!7p}lA-9nA%w|X@wZt!Ynr3?^l!V`zW9*0Xvj({wY=CpVS|iQz z?PoQ07SF^sr(Nbh-H4{1`SD3d(y134po<3oyg4g4_10f?b{9zfw<^G_*=(DvUW$?} zI{hV(Fv$r~QRPc|tNW#XPKRe}brSP$Iy7wD*!Lih(i3H$IQ*z_sy9&6e)Ggo0I5C_ zF6e5B+m^~JsBj$|xXS^1)Cyc!vm5!2yv=d7HdAKoXk(-%Nl@ii-Al8R$m!jdB=zNQ zg``rOD5mBph+3B3|<=)idl)f+MgrkEW(Kf7@S*+$WklVnVRCvsKX?f_D*t$rNZ-K0P=! zJUp??gs(%)aXMv(aH~>2NhGmGUcUeAED1e1cd^-N?a`%@x51}^6L-Y*UnLp?)$WbT z-_x!gW&+PrKuNt;?tfiydh&@hi1P}W0gs3x^djRF7e(0sD?0X&tW9X{J}Zm7JR^^? z9Hw$z?ey@m8%~*#{>FCkE9+dASi*A*2C!(G)3u!=)EMbABrv1J39lJrNoY?6oWBUH zCYuc?LovdcI%e~LyvA`jPwgO)|B%i5&moXB-;D>XkL_bQc<&+SvQ(!)^muEXcZy0( z4+pc~ZX2x;Q=6pG2T11;N>+%R^HhqoT2>+{bT73bn&5n^xow+Zu483NH#&3eHmgfy zWEg$rQ13G-pJ2jD!6~#e>h8?L+mM-oI}F{+G<^GO?;($pVHK{$5i6S7Ns}o@jinef zx_q|q$p=3ZRr~M$Y%e#sNK)-ETIG6r&QP4a9$V939?=!Yd%|MfZ(^QI^^`P3B0ZSK z7Hna=HH(Fth={X>3+q-n5B6C1clR!2U1edIX@99{McKp?o;9z`BHq(Ggs|_G__LSV zHOku^5+twfX0Kfd9=u)fy6kQYHR~9h=}H+$=`^Qsn3nRIrY99y5hz^U{AlV3>iuau zRr2_i5PrQr??SMvL6ueggKP53FB9f(-^#c?yA9G{0)}>li~qw|k}U0{$9A?hupI@= zR7EPS@Zb)XJfFIfJKgUHlumQ>H^upQ3Q_}p`e&J(;hbxCrq4LLKg9o0AkFLKS{t%8 zvq0qy_~QkP;t!i1Uw!V6rF1GGJZ=gMc{PAz^O}yXiu{Vm0(8!KB^M<)QuPp#))3`l z9$UFdK5fGq$93dUdag=>VSC7+<4`n%^PQC6oK40ZG$FU5b>tG++VEV-&NC7cR>y!1 z*BQ`#y{xh8*$3+8s^Fhbv?dM&BDr|oUxL2QTrz~CRX{=WTHzbM1?=F4K_x<>#28Q< zxBoxvy=7RH+u8;y2vXABC`^O1C%*eHPIKGs2298NEl>-84zQ@hZK(7)-GbkbYz}HRA*vk;kD2wEiYB z=OC3(@N$-~CX(B7x|x#NqEiw-0VAfKXHmynZR$x1Qh9qF8MG4*G`}rlzCOMBRzU2e|2;5YI>t+E{N3|I z*vOj;$W4$EhlNJcoPg0y8@rd9BT3DiR97+m`50Bno?@l(`o8M%YKssgGAK~ee7+j8 zFIjr;&+GJ0KL}%}V4`IsQndHQ)IDrrz;6=_+He7LmM%XQ>9@=wkWlds8fb)zZ}_9x zIL!oBMAA%EQ!yyN6;o{Qkb~YIPGh&HUcyu4g`P%RUkT6J(;AKLQ2GE8^1*cWan@Hl(jLZc=tP}-B zh0L8Rgv^elfFNF^YOAl6Wsitn(P<32EWopqbkP{oNYb6IyUj<+S{Ut*fAwiZ<+E07 z_fVSDx<31!a$M4K)wbRIBc9~~e^i!wt9B`{!1Lnztd-Oo+y$qVEuoHox%t7EL6ps( z8w=r96x!B@Brh;a;WQc9OO8J9)Qa9)K-*}!+Ol~Ue^Dt9fkLL%vLaUos7`G#O4FMo zq{!T;+VD)6TQ19W9r`)0E9{IbeP|ZCf?N$xJ)QK3>ZzK|XkSwpOEoxeJuI;JmS>1d zuXcE_({j`N=%@I2DLYXFr4o`$ju05&R_$PFEoACC{ZTnrvalN8)OP|m) z5A?On4!lP@>FNx{n@1}1`yEG^<>p@)&(t|uY4pJRvzMAMQHVpPQ?HH}8qE;g6kRS| zlv1QTo4#}-s}w5E@m5=qYHD;r6!SDPGF3l5?_p<`sx@4- zy*~9~G-tLZp7~n8E`);RyIAKZ+twE2Hiv1*Kl_?#wM*(p3U;A<*IGl z(rC39{b*~+^4ccn_p5P-B!Y#3SNxJHFzufn3UG82O(%03>Ops(_-{R1I{DuAY6}br zJ`#cXY1@2reIeI(xY97^=(C#Q^04h*h$nQKUzSwlG3f<1wQMN@nQLnV?@!vaEkgh# zYu*mQcF-qKNdZ8`rz&z~j3awNsKhIS&tTA8=G<~qTo*$GhfF|~;27B2sfjXUFOSMC zFq4gZq#7jFT5(7+?7=M1Nia6`#BYN@E!;o&SKHQ*$owOi-YQqHln|&UXC<(|iuV)oHjT^$m?S|4v$4%GKDL3^aylBxfLi5T)Q`)|17A6^x}Er)^RJKzhV4e<0b)jfWFM?=3d}7fuS2+pN)*%c zm~7w6*dqk}Y=Kp%wN=V=Iyb(uW-7KXQS$z&UF6htblyr)!^w1d_sXXiakU3os>k1D z>PW|>I14S&Q)U=U#tAK4G*{hYjp8~7`2`G9u9m);yrYQFy+E5F9>JEXC<1xFdjf*p zT{mgO=dD#WAkXN$^cD4zMyCW;B;w4}@?OC1`RRHlcjPH=VkGVmd0^mC77Rw2g~Mu$ zl}I8zXF%XxBpWV|InjdUhw#v9HMy{p#W<_iV%V{MIX@SM^hR9$dQLb|tq{YHEARgI z?BK1wxT0yD-A{oDolCj0P;|#>Ivf}b=_`e?j5%jJ*Z!#5VZ3-ZGkau1=WSrM&2)a< zyrc;3`KNd&YIK~>75y&GoyBq=`QA>W-A>$I37A->UW*s=@x+r*Lw}D`f#wwtnL?0kz17u z-RD#CF7sJko{L>WQ>&{tM>7^oV$T?rcf-7Gn(AGS(@w=UxQ@p>$UB*t%Fo)XjkEb` zmV)l@w!AKf^iJ$%NL?s+cC0ka55S!?Wd9Kf{m0r`2%J2a5f7%Vl#rK^&+$u|P;&K_!54qa9ma*D2QHaotl_rD1cY?*$dtAiO;yz36?5 z@j?c1$FcWuuEy#>3S}5bpuY>domh3fy|ggq=84dUyTW1t z(7LrVD5YQc;=_}#W9vII2Hq#cs^E^^$cVRcvJtpGU1}Z}*YoHHjV^dy;DuwCpWD_4 zVvU{iSU77gc{Ep_;9FMQMTp#A&@T89t-f7qa^h{prq-ELd=}IvXt#2J;#D2I`_UZ7 zpUc#y%=;!drwF|SU7_Hb1*Jv;uZe~JrVv|M*Et+J^}Q*GpF=jWW!GxS>+5-Egl2PU zx1KX5CU;*qKEOv?_Cn~MA%>leoxUL~T;!ulAGjjrbD3;}e|Cw1*yB&{uM5ymKPuD$ zDtO^GVp0sRGanttdN>H_RBo*<(OldoKoA{&G+}aceOHjca9AB7QY1S)axc2Mni1)_ zq`40~&YEkV+9#8e)2^BR1og$B^&ulGA)l|qpKTw2ESH*xdi{M8V;WhG6lG5(=Lk^d zk_bdWDv4hWRkiR$IP|m0>^Oy+HWMlu=gHMpNt?ymUYq`2Sg0Zu7AIsLKl)ELBZRthl2Oog zvEhM?tXudgL7WTwwl1W5s*Z~tN}%w-{J{<^m? z{Z80QKf1S{G9i9()A7{jCrf)rKM9Dc7vi+7%WRzkzE4bDgPGVB0BkY+?JW6aPf1fg zWuqWJ={Iscyi~L?efRYbf*t|9RZC(17&tob7^VYZ*}-^mGPaq3pNh_Kv)Ulj7p6k! zW9by2Z`X+{7%h=$OrPY>yV~KDS6=GjnWDvP3>jCvBjRa3QJSIa_9NE0i_r8_Nx5vv zl?d(%BVr8;KdI&4zbvQ)yNG%7EME^*J?ncQNRqp@?TdG#R-;sZJ$l28Y*Y)1V@04Y zyjS4aI)LuI`zl~ul-Sf>AVyB|BqD-bpI!VjsH|B+N1fj^b(Jv797xroC7YGJyvIoI zGLj)PucsKTRsRNq#_3BL8541*Bfck#{jrHMh9upi+^3qv6PfkI&M(sB?AuTqPIBh` zl6vjhr@s|yjk&YuzvQt_h)%R{&Y2mrCEXjD?{fQ8lTmtbaXm!;Ls#h1Qm1!1?i1?K zor1-{?V(*9WCO)qpG<=QaVzH4>)P==y?&Qk>#1^%;l1}})4Qw!8nG;yna|29JqF3R zysvzK~&YM)h_~#`T9Ex24n>lAZ%<-X<=m==s>mts1 zgNIyBn;&J(7y7d{D4z_KC4Cdk{i6cu!I={)&C3q5@!X6BX6HJFd4NwpOcPHT3OT;w zjQc3`0zi+vX%SFAD%Due#sq~9-6#|-;5!yiDWpuSh6elE9YQ( zsird)CmMjC<>ygLjW%spY ze-Gu30G!TUnvbatInxj?Ux}PMn>Sm?F*$d_Y}DUpnKra8kQuz&8eg?F6N14D>QG%K z`7^HL(gL}jQvQyU#R4l5di|nu$ z!HP#bC_@XxLh0WS0U78e69>)j$4M&czyd1PUJ!sd%GiEqfOZl-DCJ0(p>r( zAbD5TPW%9W=Y0kN=W2P(vxQYzxm4~q(uRSDTnAFJaIwiP5=~-l^5&nO4 zT>f0ygJ-7603{s8_Tp=*YJQO!8Nrl3Nqwvw=)pj$UoGGXH(Yl@AH(c(n#^tb+!A(% zt5dSy?_b;gzkUO24K3_GZ`gYIg5|E<4JVXK`EvZr8Rz>R7R=Kzc<^xzjxSG&YU1y` zNV{_)cdW~%^}7}goy^eH)sRgO4fjhcUgq{;J`45T#+_wbkHPCF(&n|<&sFA{eyI2y z-f?haPN6DU@KS@4SR`M|k_Kj$x!#8Mm-qd*H_lK<_QL7UY@*JmLg<|*w#W<1PgbqV zbUo0sn<=&9h+yE=XdPbr)4OvOM;*J_fYyz8%({leoL1F$5o)`K@4W~r#8fnR&8kjY zn+b?6=2aem;c|Tb8Qt>yOI@|;&Rpd&WNDZ(y%iZ!tY|CIXCn7>FvKC}cZ(8!03XWU zn)%ksfa`YRkuHvcGl}uw(K&GQf@hji@fkqvK-^=L#Tu1+h?;C>#+E+a7c3NS$ zmH1KI1(&n78vkzW(7y;Sw4{K&856PbMe{c^E&nCQ!uO!fRD8RO|9CsURGo^v(33zq zo>=i0WYd4BrTgIW&vznqZ*`yPj!@mpTg+w}@~`#%<~Krc`8yc0hTGleIuAH~fYlfNm%2wFAkIZY2OOD8S|STsMDjWB&OR zK8QhWfL#jDvs;PpXJK&p{oRRwAI2s~HPrpjUI70RmVf{4X%LX&4@w5QzDRhatqw~6`1jvl{N)b< zE;!jz0PtKSfVwY(u-oy=1CpRN7FQvdTc zKQzPygRe0B_^SW;&Oe{aAOG0TP7JKYZi(L`<`#PnA{ZDLYzAK6)y!L6{lprqg~dAA zH1heMefj@-jhDi}UjkuQN9BLL^LL5*Hy)Hljeqzw-+iGiCbE+pUe~`gi}O}bNin?v?z1idkNt~hT=V5{VE{}Bhs9ud%MElvc|*iO_qJ~+ zf2f`48A9;(3LKKI=2sQ|sMclUOe3S$F>@%|2v=Iw<1Nn5+c?Y14q z>>*HG*c3GMw^2mCK%cv!-bx63Vda3*GJ{=yaXayDg+nR1-OVYchk%`v^Gz@;H zrt1JXI22G^Mp=s7DN+9qqT}~&hpa&1Bp6kNv-EYbYuQ4el1I%+0sqYi9=j{@) zzK~9^?|t0hf$uSM+;Vk1z5AImG5}}^m18SVV7M=I)}uhz;r;v5NZA zOxI-=w;Cwy{H1yT{_nU)Y^g}-GAu&_-}PY&Fl>Fja(iH@}#@DN5ZD#gvTLGvSv~E%t9l7UUfc+p=)3&P0?^sFn5C1D| z-+;IW4y_*W>GP8lB|L?Pu{zQ*dGR`Jo(BVbHY|KS^kA1E1iX%B+$#yj z?EsfcpgyuH2>5b7_#wC?7vM&TBqK;BS0ldOeg4}MwWb3@ui;o+VxcbVhlZ@Fp@qxi-5ucD`DUhL+Xipg z29M7`$0RFsb;vQ&{R6Y4`TS-7LP^b>yCINIWNdkELqpE3%8|e%>w5EK>Eb&}fLp~? zm${NpOTIUzZSxvk@RR~-Aq{g9O_13JxQz*XF1v12fdt~i>N0v=pRG!`JQKQ@9BfDT zIqld-^%Ob=1t*5<8~{cwT?ix|ODSQNPY-*4GVjyE%^uYOwccptE1-1&zN?x%$Eb?o zP`U`Ip1!u)F6c#oC!_U+51fD}KVp=tAuOxEmeure6!wVshnXG3Y$meYYw54rgE1-F z^OUmMWoS}fL`g97`sh{_1d%#xOaN*OebUBwiT>%=NN*Lw<7b0dr{gWxsuf}ug=LbD zX!)isD@J8^HZj5f5GfmWw0g&X$yypS#(rTh<>ihMG(;L|2ZomWQ z-1WdBmbtSeO1b7Us;d4vQs}yN#TLNGzm@_aj=#=X3E{PA+>>-&%Lr&&S39&+6I61 z-Q7gX@*d#)EsYli<^D?F?dtmpMjMEvCsW+@8w8@pe7G|&lnmf1Hv+?C`{6aR`rcN}a~_zU%5-0Gshx0C&jfZwQX^eW?CP0Dm%F5>@i4MxUTL5KsB=D?U z_EzlsW#=O)o^%oSrFk7|QV4(h$)(lsy~-`{j;E?9Y+L!Y{kQ;qGqf_gr^emgNxpH`hVHGnIe4G#%g}E44yR4J z1l!`kk;D-qY^F|uihzO8v_qqvOV_dc53Rmw_7U0W$b7ldR)mrl$Ynmi}Fu8VwLo#u*I1+eY(lYl17d0=q^=wtpdNgS} zc^;r%>s<%XNqO02S$n9CoHKNn&PaiN^d2sTBqSb4v?eZrr*%VU0&aGZpQGS%C=S)| za~amBmAWr%S)<`E;eZf0+mYDKV#_`evD;z01bPZ@a50>7Dvz$m-+{Ox;enFX=eG}H z-OdD7Ttf06n_u+lUq81D+VFlSfhR+Aru#cnx3&lCMcoE#4jTtfs)Yss_;v8CCM!1* zy3g2kJ6*_7d_TLGzY&D$7ztRhW-%(w%b)5k$Vpb!njPN>dkEuo>}9wCtG@#Zyz}Ic zcw%wT&xH=ad#1A#+%}ikrQutEDTqjHSt`Q)-S=*LIM-P0NUDN8(i@ zIJ}FCovT1`5xW-n02N$FG(YEevE9I&?0vqzP(5v3(6H7^UqXV$zuTJW5nRv4kx&Zo zR`}D>rWw!RqaGPeJC4ZF+pMr!hcQ+oazo+Joy2o{TT9$GFAIv)lIJC3pFmY1{>Jy2 zQ46X9+wI|~vqsVZr+3v=V_Ni=Ku~3+RGS?lR+1eCdY|ZX3!w{L+K$$`--W76?)}e{ zVf$B*gSQ&3ZY%Za8@`f7l;ayL-6Yr%+>61(qYmVIQj`SpoqiKtV?0draS8*5TJWzS z0AE$ys(oE%==x1bsWN%eqR-)1BR9%6J-@1U30`bskLh`A zIhN(`2wkl!6nNv;ZcnZ}&P{&4>2Y0XnsS-?DU?c;p19A?qPQ+63e2v&cxL|@YT^cj zZZ0z~LI5DFSvs8}<5Bgg&VzMh;H@x4F|XAJIbdS%5k!Q4BEVuW)6p(kBcm*yR`{J4 zmrf5irOuf_f1LMfnnF=N3jRaSAn!(@uy7OKG(hDL!~y;DFhSZ0P}^hgz*ff?tZuEA zOWqv!F;vLD`~DVTX7N%bmBOs&7%?!miXTy$1JyqT&gsB>bNoRN308#Q`PyRm1@N#M zsq6f$N*SY`NM937OFoJFlpxuITbKlQhh(2Bvf4Vn_r6PhF zm%;1qPzn{y?>ctqt0zYF)?-em3qe7u>bg~ko^0XUFjG^_XDdmZ{aR{BS(E-M+7vxu z+1cgG$Z@7OGSU=^3J)bU`%W+i>5FSKr3HJV=`~V4OgnMa8L-%fw*`8)Ps+E#$pq>N zbe+FYmBes(o8kdK&=zzp_$Ht~^UT#&-v@Z1kb=j>evYu?FeeXn^Al;~5bKl!rrSca~wb2*q>7WQ6vD5=U#x}4zIvP2bX^XhE) zTk-Cyr=9QE_x#crD7w2qRf{{lRQ8ArjnIqJGhrJ;DI?eadRSo^(o z&i7uqmzUcOJ9C!R`Rk30x_I}C-hY(1OU2IqECNUw1j#?voYFAxQ{pju@uX}2uA0EO z_#EPP9LJpa;56_wl7YRTZd(B^O$njC4cs_v4}qIK@`20Bk(P}Q?@t|@rXr$9b^hFS z-j4=tO>)!Vm``~|vIz~MU`4w>rR;eD8o;2=Fk6|=uu+jKKFH8C*2~Xfw@_)S1rIW* ze{5m>vKbg>YK|VvBegGHb)T@F;mlfoOQMOO@e6qoWfGoU&0m%~$qE@+-+o+O&cwGi z^~m{|*z4p&7XvVPuQSuF=24k8M!iR9_>1@i195vrkA}|BjgU0Uq!%%c#QX@ggKO;} z^Ye}GYQ=_^#Lxv)sDeAM23Ny6s9p`JqU)Z2g4E(o4^QABu`+aXZan%KQxvup)!1HU z(8X4jwfcVk8C?}W0C;y+ymBDK4(mOB5MivJN7k{!UYs!fXP)KXUn7Wz@7gIq5b9?i z!SUntpNr9=N$Aj?*PWD>rA6r~tQg=m3?ww6J!VG#d=R(;90*c1E%OgX>PQBlBgXNE zjSLUCr#H%kS%pUMHe~a_{fe!5M@-5Gxo~qxta*#%8n?yOr<|YG`p{-J4a7AZ1&H_T0$2FT~}uY?^cg9*TTbpRhPv{kbiwf7Run9P76Aa{OC=j8?fAi4&Z%On90SKYZuILf_2`*fs~^Vp- zh9$qJUA+E*WH5|-2iI`;YPp^=p&4j%RXnTFqh7Z(;|LzuSd@K_fN+*@yatH*YlpIS zrt6@m=ulIS*~(aODr|pWR}>?;X|uc!R`unuGtirOA#(ilwW+&_n>frbd1`F?LjmcfuD_`uDqKX_KV7u=TSm3x0G=SXvf@hEUIQP%iN$D?e<<`)$io&<{Wtl8yDo79pb1v&439DjLPO_7{!*-7N;_*T%Jw4ct z+&-6TLlR0-Q^31c(oEid+B*e{!k`FumMB>&phrpYe1WE90xRgF2`2Hy)6!JCqiXC` zt3Dbss`??|WVS52(3fDfS4&?enPrBw1D}uZ`h2`at?2#1z|JJVQx|lx2|Ll`2gIm~ zERa;_xO=W6=N)23a*+<&<>IOhoA2=Cn;s9%R~es)UfTS_1F^4LH#Gklr*hcpTw?)f9d%n00n4VN zF;y5_SVa{v3g5{*%u=c+l{dVAF%=$xO&`&=`;XIPp?&@r);?q{Sm-1 zra?(MnzN%5<{0~qs~Eql+Z5%57fH-*9N%NBN*z;WAbv2YuEsU6I{-0N3NBcg3(Ln< zZTEf_5uA_bU_pazf9{DwbCG+8TPEg#osXX5SBVGC>tc{QSVQ~sNh9)nMba-U;sUy= zgkMMb-9^A_XyakrI1i!njiA=}WG(n4JeFqPSRo~E4TE?|hU5W;!s4A4DV2y|86-y* zQOY{%xvWi_%h}M4^);Fn2MF%N38vN8OQ9!E>lvd6qzBGH|1I4*$;9i{yXZKxN*@lQ z5OE8n6_NZmUQS!p6xEj`q`kzy8~|u?KC{a}0nk^@&T*Xv$zo5?_)3 zTx_D~--8RFYznLF$Dp1J;__kCGqe*o7A5}2UVcBlcNOo^{aoE|YU;HK8v z4P;&z0|_tY)lR--xyXB+HfN;bJrlRoiPq^2mNtJ19wat6FCNY)?_uEc zbWC5lJtM6%k;%z;_;hN*S=QBn->?DsRdVQgF*BT))fN`f3aZ*%^espm?$33a45rC#}T zyKge{QG3`Nv&4)^65I@wr*io`e^>EE=M6Vt2UcFssJ>$tL2yWE%IvR~tf}7oEqLz+H1R)~*!MBU{Yr|wN zEGce5e^07w#lW;yBhMt>w6ukRX1%^@!tSbep5g*FL7s7zx=hO}Djm$rN48Jx;ZLyq z6#TcSCf-g&QLC3m6gMLD9`i(GJqu`jclwrE{nL6yKd1Ht2qG5^epF~45!drClB{ll zzK;@u`D=3-CNEGVZLe}iSv4N{nPbiL62)Tfj}?Z(97HR|)m%;v9F}>_bva?1MT#6s z>b7V1;ICgPu!_lIWaYPkW{zR=!~=YT3-02%I^4@FRj z=rLzxOG&QJoZ(lab|9%pwG;PXKqsc6W;6eLMY)&`hwBb8we)|3z=JY73 zIU~~tDZ=wmr!!`crp&)4IH`(Y*PK(IJ_oy&-lF1qp15VbvV55cwxaQe&r&$om}B=l zCgPUW)qr$%o6os^mi0=&78}QL)f<^vQ2Gv@|Kuos{ItK@+6J01CX#o@>nH7J1+GTb^@}E7vkNCHe0eo5>jRo6(zl&^ zdI$Dxb95omtFlFj8T@+m%zDHX6}^o8dm?A2e7Fr!6q6Pp9ocE5vkJHOaiZPxO>RMc znU#u9ua8vSypaUrapVS-m3a*fOQP@mgZi8Fg%q{ur}2-FqPF$SbS_xVo;YubKa`w2 zQmE0|l$z1gp&6wp&3Xs-+_}iXdqTc2;gfgQQyDvfbsAi{#j_tZltrRgt67T?tgh(~Zj_oCdj1kqKct#2X&p2aOZs0f$-|D@665P(IFcd zTJWn61V{80aaB$;!a@ixO|LFFqe&86!a6Fefy{QY`}v3By3rR*h%8DuQt;%=+1wxJ z95h=A*R_2EV(chx5mBR5s_tV#sVFMlsBFff^tLJ`HKgFPk$JqR4WdUHPXwyVd+F_n zX5WA6@-E$BX?tf}=;9TfVCXLqbD;dI)SiJ3*4hCQp1FPJN|KFUqmvfiso9YXG?Wn| z+BLp{WA3dV&8yie&%QUuYW2;?=U|=Rkx{XP16eDl&#`NI#O{i!ad*sn4w1dMa`>qs zI10@En!vERj4~Yg>#MR=nfX#^Y3@Ju+~A(QzbaVmFu;>5O%~FzPBUw7YuOkp`}n*v zmULRnq9}IYxo2+DTVRlK_thMd4Ws2aAA1?|$TMHem?T++UOiA+06{o?zHv-Hem7<- z*OKyeo$QWfJ|c?IDwPTmV+Q#R~T7ub-r_Uo$n-1sq-uh2}OE zpwY*LpVEGQJhRt@be7x&GyM)baA~ z_e2UN#=Yt>=h(MCh6lXmuk*(`Q>oCf?|DRTqak#;+rbf}7#E<(rW_`@d(U0dUqW-} zC9u&Yma!I0HZgJYW?A8MNEnT0$u;E$bZy0;r7W)wD9pr8?tn_!a4$KP#v3_eFgAf3 zd{jq95SdmZM6QNWrQd*W-HBja?hc0<^4h>gRqVjtgx1w0ZQ?rUm6tb3qN)Imn_90h zv^O&!q1Dh#kj9%I%G~j^B$_2!7BNgUKf+>2^|?NK-_MRx*aFgH9DPsxzx#MwJx9&Z zBu+ABEa(-9CqE)m<=OYL`1V1%>Bw=#H45elLxCt(O%k=nw*s)W;b|%&!LfWsN63N3 zSa*?hSh*#aq~G9-mUBo_g71Wv4a*R zO`LCi-*IAb@-E43I}($g$qO^ubdxy9YM3NK@+Fnkn)#*y5144JThPY5Tr3%H{u50t z(cL$8L?ROPhtktYHqD7>oR{*rah^#~o_|5yg4Lb`zHa49oh(0%t~85?=lh!nB|cXh zrJ(p41dpddu?bSw5|2Hj7^P=E-|ZqXm8Dyc*r;MlCUy(os+2^+1L-w~(U)%1Hy}PO zBI>Sq*pixWVzw$gdGN$Ja%eymKI-1S_~ZI_8Bd>)<*m3gZ=eM)r%G;t7Q$XiERWE4 z;~(WN56-KR($5+!%h;&k)PZEbMd}tw9}-QnqJuQ(C|*Q3ok#IYFi(uYzQP%i_TjcumGjA@QTPInvFNJ6@|5np&xouj@0Bu?+vP6ldG0++Qk`YvO2Fw({OW?V6jstO=01_AGv|?Tn`gt80oP!L${>1PnTD zJJJu+OP*2RqPVcI&EWF(<63?wJc*!#cOwRv9Kn2omHLOLb9qWX9-`AKqdpKoppyIK z3_3yMjvRwjeLBR*j8U3D(PICT8vB>*z&PhY0;}-NONxCIxWi_U?b8Kec z@{~9R?_hlxWpw2qlsgA-ni`Ea8?18GW{y{-tw%O513h^pq=~`)zSh z=mW^8q4R`c&@QN7shL2$RPq<*dWlCZ+@B{w;xy?Rl+|EDLZB5qNNOcYcJJp+6dCrt z<~O7C36IozK1W|0MTu%XrqqVS-?#T(@@f;%*x?G?;8t@DmLa6V>J&%HR~^;nRPbMJ z%>nhF-n}2XVXD-gH?QGpLGgnN#3>w|CyrXz0@vjJd!Uzvy zdW9|*(EZZ!Yy`S%3`V>rLG(cP3N9BhZ?)~stn+jc;`e?~6Y=Z4>-IercUSE!f^S{vG{btaJi7KQ{jj(YGVP>{*6xs8T8y3tiH zhr=babEi?8E8;Ez*hZmN02O|*Kol#U=8JcWyiNPP^kQU}l!;WR%TC=#Q%_e-#w~E4 zhuuTGb|7D_hE}h>3({x?il-J7*XNsr@e4@@1dA-ZCnS24-j~>TwZhecq(YWX*8wu^ zIx^Hy;X%W)kuI(S1>6EPw*j8jfQ^!t=C$o0(*uC|P~}L0p%Yc?%w-He5(0HLL(uIX z4ODO-{l^*zqxAb!!4pR!^{C$Dwa&FSP&5k0tKM~f$h;dUdt>vbNxvcHwA3gg!@}y# z58nhQ?QbXqZL6B_rR$ZNU;|!V7RJgUQPpv587>yW*Dw4(=Dg2eZ=M5ShED#|;aOG7 zz4v|5=th}}nn!PHE!Dls2UWbkHxq#xj$P4*>8{5`+-#sIuS)HJsGM5EJ5 z?YN=yhzFW7L_(wD;RhZ2JKgdMPcN9MVBf)s;2Toe?oQ9=?Y)V_<&eH!;O~ZeTT3z> zdO{_`GNaBO@oHX=Xf?`0ut>b4N&VO-!U*Q(H{gRvl*5m3VIV7$j|A6NPg(a+k4;6F zf;NRl38QhKfc+B$3R5W^)3WGn%hcf$IlTUI$p7Ge1i7ra`|s`e;NGOt`+mqet;NSf>`>Qb7Xz;rB%KOasC> z-;#I(Kbl#B%3MrY%3TkD$x&sL{9ea!Mw#+hK(7m%V(aHdRYmg1(&pyQ%*k2P44%(% z*m6NRRkX>4Y|VYhR`bO+z2pc)%!6pw(AH+T$AF4_c{V6}Ljd%BZg2IwJEDZzQsEu- z?Ppb1q+tC@9T({P{C;w>B%xM9v9SmV4~hv;lFKeMQp{St3$t_S{c-Z6H37>)05)FR zWjC2eA>ws3j@Uj@4-Qq-9x)!V3{^i--=~24#T%8KPf@8Jzum=cAP&LBTRe13EWVb1 zPT0b@NvW%$q-wnWAs$UxmPO)gI1-XrS^fPUO2;f5VkBHDrPBK+m@=5p7|O&cLSB9f z#*`=*P3F3JgOu?ma+E4hL);1dI4A%$ir#GV*&M1o%Y!o->c?Gh-6IM@O?lK3toRq5 z-cj7R#NC+mAy3d-C>{Gd-FU&IiH<3Y5?!kCw*(q-o4DgkxxY~{y6J5E*4?iTBR`EEcW*_DUw|Lrpb1ay!i_*_4%1Zq6&FKiq%;vDDMI2Elh@L z4C9T^W@$(0fmkL?crP(XJuB=reHG$IF#nQ7BfCqC*MRd7ChCq*8q0%M*1`1+Wj-MA zw}x=#Ns4mdr@nKv!HuTRo2dY3HT)iIJCgxs)i*{)Br?x+qE!$>RRtC+Yh^E~+JeL* zCZxA1%tOS*>fs(B1xudL0kv+GT(m%w%3>FMAe}j)Bt?n~?IpXY7p_}^Oo= zJW9t2P(4qpu=2HsBrwN6ffBNgfa zvRSu%Y3KCF187<>hu>v}84Dqgvn?qHj{ML)pIWuM+Su+2wFp$0xpb(P-!HF?kp#53iQ}*kGJio8-6R z;e?G)as7NXaZlzR+(NJaDD%nO3FAxI%KIDWQlCmR|2R!iw=Mm8#;0*DqnLtY&VY0F8AA|AWB;2PmdMmsC~0 zw)%hxDtHmI9(yg(*BPr)-TsP zW!+>SdVDV>73(tRDjwH{Ak9ccb02qOF|nIw*6gi;$Zo16Y&R%Vh3#0K(SUx+ z9y-;QI>~W9E2}BWf#JctJ4Rb*-03NZyN4+t!h;-8F`V9)gy+F8ShhFH7 zdFR0DtU;wwikBTJTpI0(+-q3>cPf+#ASGIG&SleQhaIzs>M)lB5r89DN@}yxY^E6y zYuy5v5Hu(}PpLf_nWWJx2_b{mV;X~J{?lrMFsT~x$X{7Cs6oS!<`oP<;4}(hrtpnbRlB(Tt zWvW_iUOGFB^tsGh)AC!z-dJ%PFWd_hz`Z*x2`jPrJh@7j?AokTVOXzY(8Rr8NI?tY&`o_C3xb70My0L;zv@2@(#Z2N{xdeK?}f0fztR z%(U?H$(VteZ0{HOcYWxw=uRy*oHwjqt@3Ux*Tik4Qsq}uNtL3P*&_@FMr=zpT{$%V zTFs|CR@`|#d2Brb7j_)VDS zN&#^AQ5&YESC2d#{7jJW`p3VM{0=n%fP9zg>8gO&bK?^0tt{-9N-GQ>0!0J5E+ynY zQYraNY@=FI+Kzl?7NkujJWc{eQWz@fzDA~UOEP(HzORJ#>#*qWP-kIsYyf4BOi@J7 z-9Z}C?E!h6vE5cQfcMgyBo*m+^-~0!2LX7WwH_}TzQzXqx*q$FY}R?T@H8LX&NLcX z3ao&d0hm#WdSX>vw}K2FxLb!?@&t>YJHX-`1ye?>P4wz&{VECePYkX5Yk=WyT4b+_ zUMd&P`iTgI<3e#29U$!HXTo;+Sq5?ps|!Frm}l>WFoH6l?mD~FU-4gr=dsqfRxZXu z#en2qkA{xcqQTeeeh27HByz7qC5TWLn3Yuu1WYxs;k*xEF^QqWOLw7YYf!Qll7%8t zR}xLppy?$jIB9Kup8w+jKMiPX)Y1XgLSD9A(aoshz;)A&X-B|BK zBbd?m_}Z3b!Y&MdMe3NMAIj&BM#9^Qb@BckwCbPxg|o&1TlBPacl1Qhp?CInytFkY zKpLojHn;Ux+x9nHsc;Dt{63yc=W;s^Q~fi*qS%gdY4{64|2tb?$O1}X;>hhKy&bu0 z8w)I^VR^Rr*C+K4-+M>|?$o{iqrKFxOCx`vZ~!U|SPYX}O~J1awg1K!Xp#hXs^^eD z^MADMfGQ&a<~qCgi!@~Y;ii5~vlu#o*GlXg0xY2GEA8t1W}kZkqPG(w$G`J==#4<@ znvKJ|F1MwhX#evIVea0mbh=4V_^b2%cP!D`KfbTc-}{+XopDO>+Pz-`kN)_829af- zw88o51gcfVJ<=!@gF@BKAa3Dmq}dz4j?Dh&umI%0os{nkJQjo2q}F?bwg@@)uj162 zmHYSWm~OREW)*jOaF>}X>yL;Jyey8MYR-dE-W>p7&TBkc{L2jgAHE;#PabCaONoLq z`x%md_5z?+{}k@1Pp% zyKw9y5?)HxNU{1YAIVd{Yu!4Qnh&=UedI$)=*e2rbV$41$$AD4PS$g4uGAOS$hsuXfe~_kN@p_{^HCC+u#5l!j;N#ay!;ky$VOBlBaz1&euBH=A%fh4$ZV|MREt-);Z%eM$eXwExOp{{LIabnSdexdtfc zcBr=sr4FA8f|jxaGszpb(>r$3>H00+8K4W8A+Y%XH`6&|@S#kZ^ZWs>)R5TX(;eZ5Q^dMpW!K$_$}? z>BbRuZ8hoYu>t@<0$KyN^TvvBpbYX;5NT@F^&06i%9W;TV>o}ioxwqNjK5Qdvizj7 zyb4ehp_FtmsrKcM=3BZ2iUx&npA8AXP+Sd0?P|q7EQV%~yDC58lfR|$#q(3c3kCk( zYu#6leO2EjZ)a2^{y~iv!GG{qam7C#L3%D?C2M>J1PQNbvnD%NxPkl^YU4kQn#Vu= zyt%&h)W3=`|M9oszz~{kE~(tggey`2IiV9067i2Tp!L)R zkWx$08A!*^(I0)P^APC=3PsmoGcRs=F2v}r@8)b+h^Yq``kA+b=9 zfqIwAN<0{=EvN%p+^Qx~*g-&V<`SaSzY=@_iB=|2_ufQXAsoeYmG9t7tP^xZ;G?du zykaEy>FVCnDlymjpRJ_0%o#aHsTViy_dao48?ybv(j5ROeNT#imsS0{FnxwQS5dJ) z-CZyQ3=zNcM>u0BX%63LT~Q-gYYit6n57*ZiXr@gtD?*Nz< z4HYl*m^Vt*jZ1%!%s<4M{}Z$k;KQHG;y<8LB>@?HLr`Ke1hsgHx(n~C^YF0MZ^mlr zgNT=ac*!L9|FHMgVNrH#->@PoD1w5Zh#=Ap(w)*N-6bK7bR&ou2+|;pbR*r3bO-_x z!$>o9$P7b%>$>-T?`MDe+3NEi$M^mB{Kqj4!+2fmTI)Q2brJzp^!2vD>nz&p`la%3 z*G5kP^Q-yc(C-;=8(fEY_jq83O>@rx8{`}ai7)v$aSO(}190A8KyGK`inncl zhY&@V|QF8@ajGqE~OhcG8-J6=IFN6er!1Bphhrq<%m^#YR&o!ZM((>Y>ogoZ_ zLKxh?6QDA_|MI~}+V@mqi}>^!+^L37N-4M8i%X!<1z59Aq4=5Re>tjox_;rP&K3af z!_=~Cm+tdSVEMbi9|2?PoeAtNVSt2wyYIjscum-IeXx3J^1;@fLF}PCub~*9R8LLS zh&L~|3=(c)IVeBn%NN}dY)^QHvFR)2w(P3z#ssNPYJl;FA!>dbqpJ-L^t=YVEM?sk zF`kFw6hJE9@=jD>j7ess23T|3a0ND0xI`|UXpZE18570_w)y|=nGMLs@MUNX%%EN+ zjba*v45yKu;30zD{={KP-g5Y_9%<%CCclFMqgMmm(}h?yE29f+7rW$HYN?U{tv=`A zf2?=k08Qml3jpZXK<`m*e=~{a4Ey^RD4P4WgX9CpmW!QwqX7ICPV z3$F3ll@0^d62@PJ9>YG~Q}_-z{Sdp%^5HCu z2}N5dZ(%9a_>0}=PNIuBkbMTrPZ+SL&&TJTE5|e$2OTox?lve6^7FbM-0NXTs@F~q zK-0|){m;$O?NQ3YI{eq)UQV(s4zUQ>3)3%w5ju2e65n%OrX$ zz1OC8UOC5WikUk#i+s9Z=d)E^#mR6nd^M)(FO%yC zi1_y%`Dy~0T$%EvXfELi?udScsrlX5^I6bo0y!X5&J%uFA@AWQ%RCw=$E1)TqGCAM zKZQBh>@ygPGisD~qZn=jIW3^@N&S%Jsf1Co4K+Y36S56y;qHP&l!(W-;zB2GuXqB5 zI*XKZGIT@+$Pub@$r7jo>vW~ugaDAtSnG$T{=Pg`{LA0m)9cl1Hd~QnhJ*-yWB!Zi zEo;m#kh$3r1UGHSjD;$HyPQ=qxjYyAfTp)Zw%C}&HiQZ%Qshh3t(~krnGE3QQN*}_>lrDnS1oTI z+_0p9zh_U6rG!sKgH5emY;3Tx56+^yAVNB&r0y;t8goJrp+HO<;Tn}IjxS>?&s?c~ zqKl?N1d96TWNi4(PT^DKcwq-v){%E#nnoOzrmrW1ugZTjsCa_kt5KCNjhR_Ui}bmD zU)8*z`LUFvpdDIpMxMm3;)#aS<^A&W&lKHYrR!30I{u5-`6|W&mF94+{qT6KyU-Jd z+A_Jj2g{_ORU60*VX4claoEFFhow_U>rl473(6|9311=Ukq)i%qo6kf^;uRAq3s7t zTGSqh%TQH6r=NaZTo<-y7e#ezXaQfI=@yahvvdmVpvO1sTxAJLMuO-!7FI8n>dUo^>QPLFV~(a8%;s3LpMp z5gADJKl6-eP$7zDohA-^2OThsVpY6&4rZ*7d0B&TUJyY$4OpJeH5#4F{S@%G6<3ZS zgFclO=e47@!?k(3+iKS79<_p5%{Nv`MN9Q zVb1xThdIP6hAw^b6!74;CX3`ZzMC3m-*Zb zUSqW15x&(BHj-Hb9$Q}c5=9S%8}S}clU|Pe^vudhdFry<)Bz5RrBiBe6r>1f<5W?j z8CbNo2^=C{j@Xs@rL0rkUG9-8e4WWv7dnRuT#-~@%B#MSJ$m`tTR)fA;!aw?C$+xd z9=}8eYFE*vFyx6n8!Msc&az*IxQgGvx9JtH1=-+qYy7TOzAl!OKCeDDvP;MZS{vGf zzw7P|SXIvMJ)hW?&ar*ImY2g4$wXJFL~*f|eij#)6 zcC6cwg1*xpza=}#chYN>EPy8*z!(Q3RBw&W_TuJ1u~T$h<*_EphX!YNv&Yk;ll>u9 z7}@^$&TA2-*|X)M<1*t_5Swuq=ra&id)qFlkvw4`JUPKCw< z<4Q8iL#)AN6c)+Td(3WqBiB|;Um2X>^<4SOynG=$F`^;jz68%LOmk>0f09$=9|C2$ z4i)#V?SfZZsvMr@!dY0Wd*o2fm33-`N1@z3R8flsRy}M(3l^a)YP|Ls!}{x<^`IFk zU}y|C6GcgSE*w$cdb9q*t^~eS7lxJ6m3h^#`mm1#X0W?q(#&U=uc}f+ zub3$lMQo~ZeVhZxIPMfshChfZ&#jZd(2^z@3zC^i3%QqnbGJ|_N?2P2M)bUBVW^x& z8TW?=LO7=|;fh8q6l9>H>H7?X5i$6EnBUFn3Z#eSp8#{HqVyg3& zqW??dmwf@@R2z$2jzDJ#41JxY)E=6|LXSb`)L5=9tGW+81w)Q!PkGqQ`}lr`-srMI zO8*}T*7W#R+sn=mcxE$K`?ede*8I~`U8h>zWhoU8kdzNOa*9{yOT9=>7 zKJKx@KG_1NuL+2p=`0okr6*T?H;@b7od&v?ON4wQNB|&eUO@n7@*ChxzBtZFt}`x# z3{x?D{%YMEROQ7?-ao%ezy2?8 zvJ*J|F(XNI$7<|7uRJdb=X_il7=K&Mfy8A$LQ|7m?2TD!1!U+&7(eNuRAx#SzuX0| zM*^b#k;}N)s#a}-pgYl2FMDGU>oVc`IOcN7^NOD-EK*eGnWHk@I zeBCt})tjv*44*PX?Ye@leu-;Dz+*2M}3cRK%T##CAYm$)?02EE}F?ePcq^7U7ED zb&xp(q;K4XRa4fTEKlBM>0}h70U0j(c@F{8-Wmy2@lvQ=&IC6h5iZ|iczz}u#u=4H zM`ktHkVbk5LK$9X4k0+71XyAPxZ%^Sjt6$+#5=aTO25L)*Xpn&Y<~3K#ykZ3g8Gd) z&w-}Ma2}t-9a9eV)AZewh3fdt(IrU*GIEnJ%R$i4YxPT0;Jg+4Tm)PTo#k&V@wx{0 z!#ZwM$^XMPoU7V-lBAZ>&RJDHrm06r$SspXj{Sa1e2pt#6Wj}YPINN{Va^U^Uf^R9 zd_irI9wv~gVbiFg@uj@v5q(h5qm;fR%Q_MhBZu0hSX0CN04U;b@3@PdYEN<+RBCml zOFVNxS$$nFXLLQSOsx4=)CZ_)MRTy<6JQgqM)cn-5X#IN6_DrlPfXa1zFhA~`B4-b zo5(!0BfR0341*0+-$A)b1sJ86HlFg_%#^7teQx_a7VDdRpahFx(N({icW?K!1yJGp zPwei|-0kw~@NEsccK@fhGFQl5CIzk7E7YUA$-BuHJaj12sjo0ExC91UQIgB3JfhJY zUb@nS1d^?*v%`aNmXn7T&iZ%;l8e|x0ETjU0%PyEk3Y zc6lAq>zy|1$8)b4RO37e`W&G)Ob+T+-6XP@R-orw8EKvOl#3+NFdX3qyGzc?PE^IG z%anBs{Bo&@2Pw@PdI>(aE+OC3iUrxcVtGBnAWn5B{I2AJr-bS~1O4y|Ux`C);?@Pv z#`p9eex}eIAQ$_PS<0Kdh!=Uq6#vQ!<6qt)Dg@+;i!t~Tz#=IlOpbWy_Vl)Y#=LXL zWf`gW25%hgYrpKU6lex2Zx97}>TuIkmJSJC%`3ZAp!DQbFjbFKXh)q#=m77+dkq7D zT|x56SNZo{Ug8son%t23#4x4Ut{t4|q<|8kmOd(2uY3kglEN zYch;(EQMz_klE${!#X;2h~#2QgC4NSwkD*W{mcQnGzH4Zm(}n3?j7HLX@GD+(%)Fd z=cUAo=EiU>vTh(f8J55!^!=vx@!^%sdqvGpO6$HlJ>{^A)v=&ADBRdw0>0qciY8#F zc~^Ge>3-jwad4=|wtRqSm0^+9A1!b0hOg`qmAZExzf{Cbcxj$pz1!FqIK~L*5+Bqz z@&OB2J2>if4~Tq#hx7o+8n&J5tgme88E9Vjym&Yw~e)B79lY%tXGEU+VJd-Ofm*VgGY>5N6NHYRKk9K3Gstqp?LWswx*=K!%I zin*1`DZ!NnG%dH=ADIL^e&t~(bA|FEISsc;MEdNudZVvgSJaCbk$M^Hw>>zv0;wr9 z!yRTAet4^AFQuG}b;syoWN)!RfQRm*cMCMFftbDVK5g5E3dJ&UdTx{EjK|Sov^tb2 z*Hfy$(kH)WcuW<%lSKPD)GV|@RgRw(z8hL(=t?&un>L^1wAmT!MyL^cTLR-opVRDb zyuWnATo?zGdE@Nf45$_h3hMl{!a_=K;+d`rx*L-G~BLc-mpg7#>`BqV-42H!mrNR zOk$tDa_?E8_h7(fMHsxdb{}z;9b>nbCfsZT1)%Q6v9!B0T!`>!;c)(F9!pQ7miMs8 zOQP+9tUVPa3viR58KyY(H6PLXN@e%le*VgQCFyZSyl9)N`nHa8<@J=9evYCaP^SUXfG!GMt3>viQ&uNN&&oR4-P<7W`=!Q_E-m|+iD7^2~Af=8;gpV@&b4) zNGdsNZm%pTE_;PmCxSq+3&wiO4nuA)b3K8Oin0n!cs2FMVlx8kQquLknbUw4#%n6GQoM@d8bcem`E#j?k=j{q ze*P2|#x<_l9ae9NWVEM5vi)t3<8$EaWvv^?t4>MbY%)|;&G2Qa-y#_ps_-K8O<=y0 z0}X@RwOK7*rzfwJuzMv+R-(I<< zp3FLc%(L~2!%z(}RVXWDQ zoYe>Chtl!DD7|336eV{d`W7_exE-KG8vPO<-7uojiPJ7)EhNR}VuTnRfGe^!Z`{4^ zP=ov?B`%YqFBW&_ABNqK5!A+UJD!NXGuBgr_eDCgB+@%>?vQ2oLRjSC=ZJ4nJaSV| zgh&kLn~M6Eybe0U5#-arcR|Y1u+zq?R|5zgIY$3*<44?~Eo*bHACTb!o5#GO&Fr%r z>nqdr-ie7FxV^ihu43+nB}Fb|B-K?+qyKd5>RkSZWB1ebc-}{DU-4g)P}_BQPVLK1 z;1pSVzIvru#AAdfYlC)xYgP68=W;4hU95W z26}qV#!&|?uFDP?2s1y(4k@0!pc>+`*I4f2+-(ni_;_|K+mJ=C4+nK1T)Ko6M zSR9#^H%Q1FZ4HJamTBP201uwdH}^>N`YL&+=-$M$7i;&a4jl)c5T*K_fo78wir$+a zKmw~=C0(m>+2yw+o}Vsv5l6|@EqHC>tVkI?6)1WV*a>(y{YqU7(3g4Jj`5}tq7T%$ zBm}OSit-yUx%GvIkxXwJpl5pOWz)QF4t;AVyD*dp*uTcyVNv#5*bbjDq}&aqldj`m z+8L_9D|b42O>&?v$%GG|aSQAWriAJ;Z&#??a>QIS;=@J7ao+l>zjzZvFkd%3mM@|K_`d@R*ikuHE|ony^i}e-6CU+nRZh8v_xYAFqdeV1kM9})Vz+0+cb)euHyEUq zW%i_e6d+~HFw32X=jvX%!LIL-#Qe1-_DMn2{_MO+=q3l85J0x2%|N+1u} z^fQ!`d*5?00>SW(d>bUcFrsk9wDA?N43`byndXP}3toyJ7|A-m^YhdjE*y0&mm5Y- z00F2qej#r&X6u6Ui_M6|C|XmlHKk9J!e3gv_>FKdoelQxtXR36X7=U4*GV1tl?$3i z6>*0`E1nwxvAETYa$HDte*V}OpL$oNOAqj@t5kEvr zMeGE(WnO%WP#BKw#a2&!X!Ww=T3!5GW8uQGUU=PjCd{TrHm3aq?3B}SHkj@$s#97sIB>O3Mg7?F26NT8j z%&syw^itfNu0DP+f_H45cyL>Ah$k$(gl6bfk2g zi4kl1Sb_3* zXpq=`Z2_DMNiq1iPi2<^lorzK z(#I)}C>T~!7^JW~-;=^nx|gIZKc+@V309@{KxH+kT7xBtbTVs{0A<&kuy`#}b|lTr zT_5bb_HK>K#YJ~%F1|P>SJt1ibKi1~G?!U~a_y|SrPJccT@-?HKc=^0)g|>zJNWG< zI<6O0U#WY;3(&5Rchvo(t4BQ(UrE~`j{j?sV%;X7f#?eX5-CY>uZPg3JyJwE*RhpL z-e$=)dP`cbSjfnwPN5HILg>O|s>^s;^pTF9Kf>-S(aHiYWEwgz4C3;1l=7w3rM zP*;(o)r`(^R%MrmbK9WeW+2KrQfV?mdm)Z&0R7$hEOIZmDl+9d%}zsT42O*UTWlvP z?Hv-C`lVRCckum+zT1(Hd;N|>E}uyMM*aly%7;J}1u;i9mJ9? zG_jX*mbKu#ez$Aoemjc;38=9B=MbiK;zji&sM#yj635`_aNRLKMU65wCdQ#4$KfeO z&wFLR2~(9+Ujv}6KtKD=`+@43qw@05B%~17ImzS~R~SyW9=!U%N2QQMF~PbfLMchc z>CSQYqv6WyJrC~l^gPf{1U#?rlciS%X*N+H4ABRR^ufDr%gI^<~Z+dMfg0=N$6*t4u%~d5mcOz-YshZ_=QI-(U`aTi7 zAd4*AIL56nYRmsbiClyx@JT0S$>Qz$Qi|HZV$0RNK;=kcnYB+xPuzLJZhiO;NrWi) z0xZV>%V{86Oimnhjpj4s-DO%UCd~_T@eq{l*l|nxc1q1iZ{);XWi1&d<&Zuy*Kbcc z%T7|d@*lWJmVLQrb9B*?7U=N+zxzner=M7YX|Q3O^gbcVbLXwcJFrW^{y-zCs~&_H`^Y% zIQ1F4y6+^PClgIKxp{;l8#)*8e;UfQqHD7)G%@46d3q!~WIy<5xu)q$yz_w|9Che3 z0g5i9brk<9jnDUl)hYLO3Y`i8Rtfba;Hw@`p(|44a&T^d>c5`R@6z|5KSnKNzxPg_ zgxN2_Y-#rW_I#dA5_x zvLW^%?q;NcKLgH2j%HHUL)n1ZaWH5S=By-b$Z)|23?53Y8fBYc?D7FA8j9a7yiK)H zHYncm4}KGl+JmQ6u;gkmcNdw*y*+Jy%#i_qj!M+xiDtM&Tt!aWd8*5BbCLc`y&N(7 za?=FA%pT=&b)fG=@FM&M%FGWLk$=+a0Yym&)pqOVeM zhk{wcimD|d?7SlA-jzwN>n>-bO-R_b7?GX-td8r587ie4KIB2wKU~sD(JTQw=IFD4 zsh6+$#riG^zjf7hPvx8S!8A1JgbR>{JqRohwIK*IHbt=hwMa z$A!&d&YNmQr&`Y}`?gncLS(TTed62O80Fa8dxh8uchW*!hA-u0Go`0;;M}s4 zoEiT0W77FvQh_=4zu%#M+_RQ7rcyz?c%>zB<3}-JL*p_5c^E_s7b3%ze2?mU1tDs4 z63Er2%Nrh)wTxuRlPvI`h{H}mR07+QBZ(_t$$!7~|MJRvLu2iWA(hhpt4Ns_Eqhp* zfgON}{w^q#oKKx+_|?vn-Frv~wK2#oL=}KD@O;WDhignjH6U|37L|9nb(H;!Fa3`d zch~>o#gN@*sW8VIce)*^uL7HX^fhRw(5Z2pi|#vg?7ZxBqfUcyZ9LMgPlfE>e_E!0 zf7gQQmXopLpGl+vwXCHcyYuwQrl8bg0q6G)^ifNgS6(rejX|chC2o7W|FGcy{v^!h zpcgMXlWG)jofL`U^ZDD{rtP#K@mm=*s-Wj_xz`rh^9;}+9d*q80e01Wuhn#45ss+; z_!#~3Qv=52jc4tut4)$dAUfN`_6s*wp;G`*u9iXqn8pQd&^7mwd2f78Bs)k1(w;16 zR>)F*K`{e_#ZQ6 z_~Tk8owA^F+xcnk-(0kShggMRoQ1@9IeH8t36qLjzr8BZ4q<%%axh`(&gwC*p+VQ< z|GaVh*LB2t9|JC=wgK){Fv0gX-vj!m_Zi@=yoQAT`>Fq5UxAik45Izz0g|qLXN7;c zH^10T?lG|SGqpp%vVv!)X0vMUI`!vYV!Ist(fqD1gDL1E?k)385&hw2Ln|o@^RM4& zF>MXJ%;>7BN%MF3{W2^$;O&!+daD& za(}q()%8BMJ{ug68w$of|6#>zJ7Y!~$h4To+vS4a{r*WZB#0^4^ObGLAAd9cvuGP( z4+~EHK>a3?dn44s8xp|j)VUyRZKt?@yDk3XM2^B#tu*}}!?>no!E78sN>v{b-U+a~ zUJxocr7%J2P5tNV1+w27JokG~(EEuI+(b;;D(pgfcAA%n%3X)6V~t${}bzbdEx z{tQaOo27T@tCMg2@tyyBQUCX%{_jft|M~IHY$zPRaDj7A_OY1yuQ!kXtF1uWn;Y*4 zFiFsS0C}A%Tb-U`C>x90-E#WxUEo(gwA`a&bC_*l_dh!+18H?Jm#-5=D-3BSx_hsh zXsY7v#HJFNJ@8bvDueQ;R%)^XH@N=G{91CKklOM5T9^ zYp546HhKSes0P$B{<9KujvI~m^SOeVO$4^fsji&=!Ih#go}>Bm>cLW=1U==A@DKlk zY6XL6>yMWVEGbS545HBs==fjW|G$eGa^pF&|NV;p@e2H3T*Xpu42*)17GS;9W2s$? z#Lg)PG+nF!96i|R*?h9Z+6VEfvp=CK5yYUXjvG#ErN3s+c3=U6B%Q!4y;um-UsCoz zQkw*xt-i)B*OFz|o=9ry38&keP;&}N@o6`#!B|f^&~48Kc@}uhXD8Y-h@9l@| zC1at9W(l1HhJ3(T)CW?%jSSC^CgR{A%*vI+@VC#|DpsLpW90d9^SK^0ea{KRZ@DUs zQeDJw*7yM=e5rfG03z$67cm+Y76gMPX>neTZiBg!H9#2NM@hE(CVQ<<-Q>OBdZP4i z3U6b@+uC-)ShBhEORWB$wIF7(7eGddPAJeo>JgOWIn$I*VL_OKZ#%}eH~hF44COt~ zo^OLJc~eQ-Y)XqjjntVrumNm-OOmW!PXLl*^3-jjezwvFj8bI*3(uW~S%8EC*kG%h zPwmj7sb}g=jZh@y9^Uy5p4!%0Fo``KG$gZ+P)q;GIKY<6z*M^EtAal+UV0q}4cRml zK5WH{g&-2ay@(G?AnXhsJ#CaMe6sN1{5z(FlahQa6TN%gXtL(fqz@)cb7nszw{ zXBv{jIXr*uy~d$4>#UfMg_gv>JOf+kFf|ijNVeU6aQwZi7kH7?X7^K2oDx?W&;t%+ zuhM<{9|mYO?Zqs0vid#We&YfvK_Gq}^T^)+2W zTTfDU-&=B~f7p7Rm-`&Zx}t+AW2M}`$N45l{wWK`0cy@Y-{hVQfbMF>jM@B_$w-0{qc z@FfBI{h&k0%DHUy6LRrLAo^_{prBZPCm?I$k%FGh#IP#Ch-9S=U<)m2Ty<)O1B6We ztVp3x?GSpJ`lLwg)S-!>WyY<6#11T^gSAL>+$Mnb?+*bx)5y$Kj@e-**1M<~qdfj_ zrLCEaJg@Kt{gnNp*R`KeHd~eU^?e3gBgtG=Ufjvfc*Xs`cPCs7S5OS7Apio}?X~{TQ`t&wVxwTXq@cdyQ&BH4b=wGbixNO@AAN0olg) zl2!yQRaZ^{0|jG>gLhsP-U*-pO#( z&Nks^MUbIdEp|Yecj3~5Ls3suJsgI5yA#9&8Lsx)?ld_X(|V*FD!;a~L;RQlM#(-f z$5l=EAWvEGkf|#sr*r?Ox2`xI-ymdJbUj$+GN0L3_ve?>%1#E>*`?%dA4@d2l{}6d z^rz=#agBwknw%yYP#D@!cKqzrBOh?5 zrV|G%Pl54THw9Ud69Wkg8qvG`NYxlh=JZ7MA3dnDQ=!cw$KymF*3^SS%NU3Qx-RvSPhqL^ckD!)JRyo*!|U!{it z1(?9inceVl-U+}s}ka55q7&u(?s^!GpwcoiMLY%82 zRu)Ndca>8=R7H3z54%^NLtbjMPrjq%cuy69x-3>^6_gX-wAo1G5)pRj$GmhLhg=7r4n%e0o?+K2cdH1EZaRYu1%kc*@4t)U~`#ZV;Lg1`M` z=8~b&thHz(smJedapQXdW9-He&Pw#B(Abz0@Dw{kRgGpC(Dho;1)uLiTvpJXBiCNk zv>ty|>e06xrB%UxClH3Ov)_SCGnRDMn}ok4``7jhYXN9AYTLcul|bS+@G0PWUr3j$UjK6p&9dsdIeH->arWkqqB- z11d7k){n>r#B9zx=|)TT3W=?^_VO{Yew%=YP2fD1RrVUm^n?-TCG4c*`Q{3E|8UuQ z74)cXF1nB{5w)InNmpk@Y?^fZ#AD26YSw~*|C==qG?y9P%elEUy}j@KC>LMSyH;aY zc#M9n@iSB~zPf%#iTAyFM)&XoD{T1+2_fRGj4JTIuWs7ZSnq!Crm_Y&KAWn~U@jvn z-{7aF?jTQJEHfi^-J+4u*?naUiM*tUYmcxgEA_^EhUJVv$(5KM#oqDNg}Lh-3;{2j zvMIm8ExU2T=^?IIrQK>V6uII7U4d(df!NfYV_@~6eS<_C2 zp5h|y_L)!X^hha-5yrN7eZ#OXwhB33UwpTmQ!R1>kG}bMix7{`FGeYE4ahx9_r~kk z!B+MVp9HeFzbZ1wbtc=lSZA*NwgTtY$PE!6uoXE3zeH@VB6$!UL#Lzm&u0K(HeG(y zq}=ieHnN+_fUP4!`i0n(N@A;Gh#Fj`N-!4hXd${hDMVRmVIR50!t4S??eXcb@8~;W8NC!HmtlRLzW1J5lS&p58kx zHhC2^|EGQjj-~$J`rnvfCqx+7Yc^Lj5Ej@{p=s5!#*%y2RcgTfGUC zqtxeh%qZvBA-8(w2{wsNoTJlz*MXaouxnI#-=n?F@?%eFe8x)F6awkdp*=!nf}8Hm z#|G#hS4F;KGS#iyfsxY#@V8#cQ>nC6PC!Bxn+n+H&B=jd^+zMWKI9je*nEeMc^{nO zgxP@yaN`vddxcm^l3ypI;iH#aTJ{m@i88NUsim~_rXm7ks0N6 zF(in2Z_%Z?5uxZ{9qf`z`VLVc0L~y9mlw40;nrBJK6BUW3zXxPx@`HE)#^m-KtK0P z?oe5K75UbsC5vM}%)R01{*%Bf;Pvl8oqL(6y$Y8EH-Xa;&oj^{)J{B1+RRd8A?@Fc z&1sUJgv6ZKCV`kw>Z%Zqg228cpE9LJSX`JwPMcKy zjdj0)aD4Qg*M}8)gNRKBe{b(`l_XkQ$5PqibkDvf<8}c4u^yYK;u6#O zfzdfvx|eLRtT^^266B@See8Fy*8I@pC;@xNSZf4zBD49#$Q9phZzJatqy=ymw?8;@ z9PNRpR8wqE!v`>7N0mnckwaIQQ{ln)hGkrXDqN-}OhlcUvzFY2P0~!Nw7)SBZEji^ zVi?t)JA-#)X5zO%qFb*Aw2R>?x&q`8rBX0yzXg2lUU*oJ(56-6!5&Qv&E9mRxpl$% z8E8_TiIcecp}52np!}jXHl`3F<~34jaR#&?p;aA9%U#cvKZaKL=p*Tcz%Xeuo=umwNAKdh7XTjMQ zUwV6P@BKBz@Y{8*#quCZcGim_f|bdUXyTDfgP1wc@cFxQP?P2&eC(^Gh1Q-Zt{Cv_ zge%qBW2H43&Vt#gH?++7l><>WdHus%w~I8mr~0z>PxdON9_ha%LU{BM%p6!9*A)rg zn7yH$`P5OJ+2o~LR`3Q&XUIzvDjBuvT7w0X4KEQPsFaOq#>kxP5w`ZP8OxGi3obtN z{5U)nhJ9IRg>Q&H@6Cw)r27p)GrxRY7d-}Zg^9X$9y4^1tRF}j;z@?&TsEV8slAMl zc4!hbR#!D8i91iHwtc`R<51t86!$}gKiOGm)Y_4Jo1mflG+I=a|GSzjl-JZP-5C4g zasK$CVSbTs>Nn4YovC8(uV;1$GQCZG2fXW%@2+9fWadlqFO<}+cjAbKG*KbzEWD^1loXLP{(X5)=;FbxIZ*0$E4eH&knxI{!>!G zI6@R$v_*F?G8JD~<{1SLx6tnir$<5&4R_qSoA8(O=ia>*{+X`m`hG_GbB}wakeM7x zaIZexE|a=28Xgp+&Q2wZVVsKYw@erkM)xSkg4TRC%FjCyPw%{k4^)n+s{=hZdGa=* z7J6L!k@#C7M#$v3B|Y;bUv!MYG^QE056mXPx|``R zG*7>8MfF&Tf`9YiR`j|ut4)zXxspCIZtRLQ=B#tKG)kz^p=Bc*!YJ zXXQqFt-TGmp>vT<%_lf=|2UfA5s<4|j^?FqtMX@X_{d{$V^>wQ6Hb1iYrb?E<~iJe z+-_077;-OjZB`9kY}OcbO_eJrm=Rw)m+%GD5J;G1UK_Hlz>LRF>1JcW))Ab)^&!4A zQJruSD47!16W{|r$~LZ{n2)Ucw!Kdi!{zWml!FIBarcUj@bNRP_dO`Oi*G7|2=@{r zVpWvF(r2ZKDQF3wT&WBaTDvKL0_8-4$*Z+e(n+Z{A1>Zl(Z@wt?9aSErZOm0u1U2K zqBnE9qDnOt)*N(i;EZinwm-wh9*5`nxD((5z=(AH({FI6r}U*#>ZLMSFI~PbAts{@ zhoa`oVb*-dNI&jLvnZt5_Gy}^M9T11m0;^EX>2-6lv1%vkh_4%=w~f~hPAQ-t}gYL zw62DR&I+4z*G6^|mA<$YkiOmYWIQ^9>;mw^FFd_EmdRu4uX2+E)$B^#))XuIONHfY z&;9Ixv^tfu-Yv6Aq+1QaS1lL;Ck@MJ)c1uq(jc@4qmGSE*R<9t2G|(r&r|0l@TCw{ zf)7PTV{uP#`q*=qQhLLAT)!vAHEx(MU1s$V>rq>+44wBYI==U_u59pSmB4%SruCJV zRdGsa^{d^@$V#$`lbXSjF(M})n0Kvj|8*j!XUfP~AWCF7FvALiWNdl);XgFmaIBu^ z!!w|fBOl}7;SWxJTvcqLznF!2P4!03m1_yFVi!cvb{mG}CuifaDxxTNu4dUuqqF6T z0=WtaEo>Pxn0?+5pVsrG&DZ0#{rZ@$`9CP*#g5@7~i%~ETP7(wDn4q=785}utq{f8u2et{{Rgtw%RyL zLeg&A%_`DjXk1>O!0c`qy}(JZ>wV&vP1D(4k@fYq+0)7a6GNlByc&H31F+aq@oLIa zmQk|3jKOu()Rv5c|LhIZ3Xw#_vCBplLl>wvn?4qgF!A)i=yDMtbJ;vH_yCROZChqn z=mS_;1NMG);_Af3M5iN|5(-CW=e?z1MiRJc1l%9jBWc?#r$%H?tEwA|AiD>LE_Hj1 znRZz8&l1!O-PS}NuD$l4+U8SpVZ8>A-ROcGUCCkzf$yA4*Pfo3@lOnho3fFH#uP8 z9JR5V=^xj2C}4ILwNq=4GT%wt5pQK1$*)rQ+e{s=RwsG>=K52Y>Rx4fqo#s%H);2&xC$DSS&%5DeZ* z-09AIWuF=`a>Q4S)3_JkC1}w`aXPs9`GfC9kU4vVi8vXU*cmr9r+>!-Y8h}otK?Yj z9rarZm-D4y5)J~JlB$5z)uO~9g6>?2nD_I3q%KVDE@TxSVv>zsx35+w3s%BQ_{Cxs zUj;x1)RGvUmx||T;;i~#Sj%*W_JGaRi|p@v(q5?E(56y&G#YzBt>|V2YSx>lfLdRr zoe-OCu|6SP5`VV$6#W&sTtvY*UfO_>qD9Fhv*tGo#H5Qn9Cl?oAvp8hN2$H|j9IW9ZYb&%ME2iBeIKFWaaxf&W&DWSaW@Ek_A_df#k*1Kt+BM(Ql{kGl9 zJS10?^G9pn-*n6tYQ~i~+Te_ZKy(7*yRJEk%_bG^8Q0lxf`pNnmM` zgXO_;su54Wq1J7Am6s|%r79AZ@&em1jV*WboP$R@2~B^WgCxo?p|r(G>F0I2v6glx zd+U+;JaHAht&;lLgJRb*lrAHu*%t-=wQ~JpS5m(`gM%zhq^xLe)saxYOFkWwL(3<7 z%ey7mq1484ZXn5st9kRZN^giVb<9{i(133{FQ4Bm@l-dMEkA}5LN2*tUK}y=jCyXa zk$9%U%Rg3m&n%ENN*-&R`X!3kl7BnCnZaF{kt`bcvU}`8&T!b&;)AYRJLPCq7A$O z9YLNSwNr3QWf}2Ir1-fxf;z#Snm&$uM_M^HIKrPi5q<1X?ZS_|9-ZmbmOHf~jH;!{ z9i25QwiIWE#Ttw2@=Mki>8Xk+2j$3#Rga|;)a^SPDWa&nQhsc^rR3ZbKfXuB`DEG~ zusO@+I2qw<_wwYPe|sVwgB<s`kvhLktihl8HAb%yg0NHFAx}xetFIbj zSq%6QJmg||m;_VI4^y`sB!l7FU&l*6iEh3h@~vez2|=>)y$t3=gNk-o;HTT&Pdw#A ziMovx0V!^D8Duu~s#3vgx$u|BVIp5{f%S6y(p+YfY%vIKMfj>q(2ucCWEyoQ6%OAR z9}BHO325-H0N_#u-Evh}Wq!I?^+~mw(SlC%cCE;?MCv#5y@cj=;wsu0ohGn9aX+YJ zyx{tJD1V)%;b2ANyjIEU*Yd#k$t~6zt)EDXWpe!Z!>+no4!H}YaEmQOSoHSZy!60H* z&mQ?+X_2F^*<}(8LR4>t?P`}R6C{oW*PXzNAA0uz^|Ke9Bbeohe-5%b>0CWt)+rcX z73xe@S_rZL0`aMJ3z;N)`3pHPJ~*ybCc_sS!~F#80;jhyg_Fd1~ zsPZaQr~m8jI>(pf*+y)OfsC4~dqT=NZh?Xi(B0BBo7|)$*mr(jmsilO;h>ZlbeRUc znLlUp2DW4a07~r`VqM}s_WT4?R^mffc1)Ef#@f{BF+6-02P4&_4|o^PJ(osD@2n94XikP`n6c)u4TYjcAzBxsOo2m zWH(SEJe3b#SaqWcJrd7cYXblvk5x5dSk6+*J@*w;d|3N^e>+5wJgrZ2EbgS>Lw$kz zy1pb}OfQ&8^HzW%K!Yf74uQ>+z%$Yd8V#Nu#0C^)0vogNTgdj2e$ZiKUaUv@yJ}k3T%%O7}dWcC+ zHdT~~WV?KI#jjOX8d!6^IhxEhDnHj9qq~A#vWQ|#57(v@{aS1v-E7YFIAXsDj`-dP zst9K6By)j0xm(j>c8PXXh#R4iJ1R($xI%A0WX3^GCUL?PBo|4=fVA*lL}N1}wnb)w z>i^T;nFTd@Mq${67Gpsz)~ZFeDH0`Y8d=IBWl=#$1O-70L1+Lq2(rcqfwBxZ6-9v{ z3=pISgveqAiG)o7t$+aqgh@gKtt?>`5(p83J-@YHRcCtH8UCyP`n&kf`Of=3?_nNe zyuy_Q$GJ;oOx>n0pCbfiFN@=Jpx8$#9u_(GY;l=juu_db({t+F=E>=FZk>gJ3d?*l zIE7>yHRCeR3?x^#c^*v6u#@LH9yk57i_)W*7ytpzgUE4K+SqhciDsx(jL)H|?cE+0S zFiAu6yIQ#AIC74xr==DGtm{!x3U6!s7mcBtqNe=p+E-rjvTrKKpG1h$F4i;fj1=Ec zvp97Xxo6UbIK=%-<=2shMbA%v9ltj(a4B`W!@*L$RJ=H>xnYJ@9-uwnJ&KiH8Yklg zXVA$`NsdC+B4|ScezZ2dniB3IZH?~x)^pCctio7kt-`sdhfvovO~{QXbh?66EbWM? zC+|Qx-Nl@L9rRP2k)dsBsN-Wy29guI(ItyHYHO`{_qctW0!qzKfMhgAK}hYygt65H z2vn^ywiw}ngWQ4nx|<4Phbsr7Z9*=AQmrOA$_WmFCs~~^p;}4R-XZ)dqS#$}ko`hj zNZ6Og7JQDil6z!#;x5X)Sq!76lcuGQG(4QkgB#Z&dSEN8(R7_*P#ZD^ex#4IJAEh9 zCJ=MYWjSb`*DTXbar^@3_IgP0X>%~$EFYd8&ay1RlA!YEo-Kktsesh4c#(KRK-v1+ zD^O=fmDO9O3xBnyGc6%>R%_c4t$Mi1W{1LA+3VRNcGodKt>HQ7p(|>hkWhK4+^G_qaT zOa%eDH%wf}e&nM2fyGnw2>6@CYx+pyT|>{-lpa+s5-q5Z8z|vYm!-#&IWQPRw^bOXVJ2^en6fN3qNdq;B{-k5?=+kvsgsb1CDTJmn*T|y%XZV>K z$!v)q*{c}ua?4G#Hgwpmzq-b*8kzqucseG)o%4{IJ4uVr6H1464w-w? zZ?Y?L!-%Eea>9C2bs$Y>1Z*?U(zCqSVW*D7et*cEY*y~SFaW53e_?!8T^=lA&(C_& zyM6ndC_SQ2#E^oUfp>9TRG!A>XmC{+56a$CcO@s$K8g4r01Zcvli+?J(NE?XgnofO zyj8RJ6=W9#wMvFnIZ{1B?Y%IYJy`C;9aFvDrV=xjob&DkTnzw76pqv8_j4XVrZ9-r zO!-|+ziblcuDvpu8{kHu__mx~k4j<8;G(Z3O6%GrTCSKGeU&j(Hb)$}F$JkU93lEj zx_aaF2*g6>pkG&6eEAAha|Fweh`;R1mP&Cg1}Z2EO*v;wGF~N@;WhvX>!FD2A^RrmHrITP0VMVp|B;nvBIJ-~c*qB` zj#|h!r}l5!h5MX|Yj)#?+wQWmV(f8_90HApK>fo}jxLjR%VgarpL6f6n90k$-hVlP tWwLIWtXn4Q{;5O;%VgdE2Unbbw?g02H|9F;T+|Bq?Dyeq%dAht{RI+9tTX@s literal 85033 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�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 From c247dee11a575a9ebca34ed926251f5402e97cf4 Mon Sep 17 00:00:00 2001 From: Felicity Chapman Date: Wed, 28 Feb 2024 11:49:50 +0000 Subject: [PATCH 201/207] Delete docs/codeql/reusables/beta-note-model-packs-java.rst This was accidentally reintroduced during merge conflict resolution. --- docs/codeql/reusables/beta-note-model-packs-java.rst | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 docs/codeql/reusables/beta-note-model-packs-java.rst diff --git a/docs/codeql/reusables/beta-note-model-packs-java.rst b/docs/codeql/reusables/beta-note-model-packs-java.rst deleted file mode 100644 index f8286086034..00000000000 --- a/docs/codeql/reusables/beta-note-model-packs-java.rst +++ /dev/null @@ -1,5 +0,0 @@ -.. pull-quote:: - - Note - - CodeQL model packs are currently in beta and subject to change. During the beta, model packs are supported only by Java/Kotlin (CodeQL CLI 2.15.0+) and C# (CodeQL CLI 2.16.0+) analysis. To use this beta functionality, install the latest version of the CodeQL CLI bundle from: https://github.com/github/codeql-action/releases. From 5226c77abfbfc8f975dd5acd173e762b20fc42dc Mon Sep 17 00:00:00 2001 From: Koen Vlaswinkel Date: Wed, 28 Feb 2024 13:47:11 +0100 Subject: [PATCH 202/207] Update documentation for testing CodeQL queries in VS Code --- ...g-codeql-queries-in-visual-studio-code.rst | 18 +++++++++++------- .../accept-test-output.png | Bin 0 -> 57921 bytes .../open-test-explorer.png | Bin 53739 -> 32575 bytes .../show-test-diff.png | Bin 60761 -> 0 bytes .../test-results-panel.png | Bin 0 -> 113424 bytes 5 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 docs/codeql/images/codeql-for-visual-studio-code/accept-test-output.png delete mode 100644 docs/codeql/images/codeql-for-visual-studio-code/show-test-diff.png create mode 100644 docs/codeql/images/codeql-for-visual-studio-code/test-results-panel.png diff --git a/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst b/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst index ddc78558496..122d4bb1bff 100644 --- a/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst +++ b/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst @@ -12,27 +12,31 @@ About testing queries in VS Code To ensure that your CodeQL queries produce the expected results, you can run tests that compare the expected query results with the actual results. -The CodeQL extension automatically prompts VS Code to install the Test Explorer extension as a dependency. The Test Explorer displays any workspace folders with a name ending in ``-tests`` and provides a UI for exploring and running tests in those folders. +The CodeQL extension automatically registers itself with the **Test Explorer** view. The **Test Explorer** view displays all tests found in your current workspace and provides a UI for exploring and running tests in your workspace. For more information about how CodeQL tests work, see "`Testing custom queries `__" in the CLI help. Testing the results of your queries ----------------------------------- -1. Open the Test Explorer view in the sidebar. +1. Open the **Test Explorer** view in the sidebar. .. image:: ../images/codeql-for-visual-studio-code/open-test-explorer.png :width: 350 :alt: Open the Test Explorer view 2. To run a specific test, hover over the file or folder name and click the play button. To run all tests in your workspace, click the play button at the top of the view. If a test takes too long to run, you can click the stop button at the top of the view to cancel the test. -3. The icons show whether a test passed or failed. If it failed, right-click the failed test and click **CodeQL: Show Test Output Differences** to display the differences between the expected output and the actual output. +3. The icons show whether a test passed or failed. If it failed, click the test in the **Test Results** panel to display the differences between the expected output and the actual output. - .. image:: ../images/codeql-for-visual-studio-code/show-test-diff.png + .. image:: ../images/codeql-for-visual-studio-code/test-results-panel.png + :width: 800 + :alt: View the Test Results panel + +4. Compare the results. If you want to update the test with the actual output, right-click the test in the **Test Explorer** view and click **Accept Test Output**. + + .. image:: ../images/codeql-for-visual-studio-code/accept-test-output.png :width: 400 - :alt: Show test output differences - -4. Compare the results. If you want to update the test with the actual output, click **CodeQL: Accept Test Output**. + :alt: Acccept test output in the Test Explorer view Monitoring the performance of your queries ------------------------------------------ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/accept-test-output.png b/docs/codeql/images/codeql-for-visual-studio-code/accept-test-output.png new file mode 100644 index 0000000000000000000000000000000000000000..28a2f3aee2f4c5ace9b540d60df49fb0293c765f GIT binary patch literal 57921 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 literal 0 HcmV?d00001 diff --git a/docs/codeql/images/codeql-for-visual-studio-code/open-test-explorer.png b/docs/codeql/images/codeql-for-visual-studio-code/open-test-explorer.png index b5a2a16824aa66a24d0b727032d94ad18fc9a3a9..127f2191c197ae643b8c24c4d42b82c502018189 100644 GIT binary patch literal 32575 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 IrD7BQAL*~hMgRZ+ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/show-test-diff.png b/docs/codeql/images/codeql-for-visual-studio-code/show-test-diff.png deleted file mode 100644 index 7b1e45d194f218567d3e7dd3a45e42860bd78d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60761 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 Date: Wed, 28 Feb 2024 16:00:15 +0100 Subject: [PATCH 203/207] Rename Test Explorer to Testing view --- ...testing-codeql-queries-in-visual-studio-code.rst | 12 ++++++------ ...open-test-explorer.png => open-testing-view.png} | Bin 2 files changed, 6 insertions(+), 6 deletions(-) rename docs/codeql/images/codeql-for-visual-studio-code/{open-test-explorer.png => open-testing-view.png} (100%) diff --git a/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst b/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst index 122d4bb1bff..7e19e78bd42 100644 --- a/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst +++ b/docs/codeql/codeql-for-visual-studio-code/testing-codeql-queries-in-visual-studio-code.rst @@ -12,18 +12,18 @@ About testing queries in VS Code To ensure that your CodeQL queries produce the expected results, you can run tests that compare the expected query results with the actual results. -The CodeQL extension automatically registers itself with the **Test Explorer** view. The **Test Explorer** view displays all tests found in your current workspace and provides a UI for exploring and running tests in your workspace. +The CodeQL extension automatically registers itself with the **Testing** view. The **Testing** view displays all tests found in your current workspace and provides a UI for exploring and running tests in your workspace. For more information about how CodeQL tests work, see "`Testing custom queries `__" in the CLI help. Testing the results of your queries ----------------------------------- -1. Open the **Test Explorer** view in the sidebar. +1. Open the **Testing** view in the sidebar. - .. image:: ../images/codeql-for-visual-studio-code/open-test-explorer.png + .. image:: ../images/codeql-for-visual-studio-code/open-testing-view.png :width: 350 - :alt: Open the Test Explorer view + :alt: Open the Testing view 2. To run a specific test, hover over the file or folder name and click the play button. To run all tests in your workspace, click the play button at the top of the view. If a test takes too long to run, you can click the stop button at the top of the view to cancel the test. 3. The icons show whether a test passed or failed. If it failed, click the test in the **Test Results** panel to display the differences between the expected output and the actual output. @@ -32,11 +32,11 @@ Testing the results of your queries :width: 800 :alt: View the Test Results panel -4. Compare the results. If you want to update the test with the actual output, right-click the test in the **Test Explorer** view and click **Accept Test Output**. +4. Compare the results. If you want to update the test with the actual output, right-click the test in the **Testing** view and click **Accept Test Output**. .. image:: ../images/codeql-for-visual-studio-code/accept-test-output.png :width: 400 - :alt: Acccept test output in the Test Explorer view + :alt: Acccept test output in the Testing view Monitoring the performance of your queries ------------------------------------------ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/open-test-explorer.png b/docs/codeql/images/codeql-for-visual-studio-code/open-testing-view.png similarity index 100% rename from docs/codeql/images/codeql-for-visual-studio-code/open-test-explorer.png rename to docs/codeql/images/codeql-for-visual-studio-code/open-testing-view.png From efff0149d0fe3dda911ea14332b40b31b77159ba Mon Sep 17 00:00:00 2001 From: Felicity Chapman Date: Wed, 28 Feb 2024 15:33:07 +0000 Subject: [PATCH 204/207] Update formatting of 'tip' --- .../using-the-codeql-model-editor.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst index 06d7fcac8a0..d1dce1a6771 100644 --- a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst +++ b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst @@ -32,7 +32,7 @@ Displaying the CodeQL model editor #. The CodeQL model editor runs a series of telemetry queries to identify APIs in the code and the editor is displayed in a new tab. #. When the telemetry queries are complete, the APIs that have been identified are shown in the editor. -.. tip:: +.. pull-quote:: Tip The "CodeQL method modeling" section is a view that you can move from the primary sidebar to the secondary sidebar, when you want more space while you are modeling calls or methods. If you close the view, you can reopen it from the "Open Views" option in the **View** menu. From 7cd84c8f0ac0072348d100de75d2df2c9e35e372 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 29 Feb 2024 09:59:44 +0100 Subject: [PATCH 205/207] JS: Add type-tracking test --- .../TypeTracking/TypeTracking.expected | 2 ++ .../library-tests/TypeTracking/summarize.js | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 javascript/ql/test/library-tests/TypeTracking/summarize.js diff --git a/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected b/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected index e69de29bb2d..75ca5993b09 100644 --- a/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected +++ b/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected @@ -0,0 +1,2 @@ +| summarize.js:30:14:30:26 | // track: obj | Failed to track obj here. | +| summarize.js:33:14:33:26 | // track: obj | Failed to track obj here. | diff --git a/javascript/ql/test/library-tests/TypeTracking/summarize.js b/javascript/ql/test/library-tests/TypeTracking/summarize.js new file mode 100644 index 00000000000..e4aa9ebdb85 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeTracking/summarize.js @@ -0,0 +1,33 @@ +import 'dummy'; + +function identity(x) { + return x; +} +function load(x) { + return x.loadProp; +} +function store(x) { + return { storeProp: x }; +} +function loadStore(x) { + return { storeProp: x.loadProp }; +} + +identity({}); +load({}); +store({}); +loadStore({}); + +const obj = {}; // name: obj + +let x = identity(obj); +x; // track: obj + +x = load({ loadProp: obj }); +x; // track: obj + +x = store(obj); +x.storeProp; // track: obj + +x = loadStore({ loadProp: obj }); +x.storeProp; // track: obj From 3ad83cc09812fe0106d39c12bc1dd3c617852e02 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 28 Feb 2024 22:02:07 +0100 Subject: [PATCH 206/207] JS: Summarise store steps for type tracking --- .../ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll | 3 +++ .../ql/test/library-tests/TypeTracking/TypeTracking.expected | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll index 6593df32615..c59b2aa58da 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll @@ -156,6 +156,9 @@ private module Cached { exists(string prop | param.getAPropertyRead(prop).flowsTo(fun.getAReturn()) and summary = LoadStep(prop) + or + fun.getAReturn().getALocalSource().getAPropertySource(prop) = param and + summary = StoreStep(prop) ) ) and if param = fun.getAParameter() diff --git a/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected b/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected index 75ca5993b09..4670d4f9253 100644 --- a/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected +++ b/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected @@ -1,2 +1 @@ -| summarize.js:30:14:30:26 | // track: obj | Failed to track obj here. | | summarize.js:33:14:33:26 | // track: obj | Failed to track obj here. | From f384afbaf6bc87d60de0c630756d4b7e722d19a3 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 29 Feb 2024 10:00:45 +0100 Subject: [PATCH 207/207] JS: Also summarize loadStore steps --- .../dataflow/internal/StepSummary.qll | 27 +++++++++++++++++++ .../TypeTracking/TypeTracking.expected | 1 - 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll index c59b2aa58da..829e02591a0 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/StepSummary.qll @@ -45,6 +45,8 @@ private module Cached { CopyStep(PropertyName prop) or LoadStoreStep(PropertyName fromProp, PropertyName toProp) { SharedTypeTrackingStep::loadStoreStep(_, _, fromProp, toProp) + or + summarizedLoadStoreStep(_, _, fromProp, toProp) } or WithoutPropStep(PropertySet props) { SharedTypeTrackingStep::withoutPropStep(_, _, props) } } @@ -69,6 +71,26 @@ private module Cached { AccessPath::isAssignedInUniqueFile(global) } + bindingset[fun] + pragma[inline_late] + private DataFlow::PropRead getStoredPropRead(DataFlow::FunctionNode fun, string storeProp) { + result = fun.getAReturn().getALocalSource().getAPropertySource(storeProp) + } + + /** + * Holds if `loadProp` of `parameter` is stored in the `storeProp` property of the return value of `fun`. + */ + pragma[nomagic] + private predicate summarizedLoadStoreStep( + DataFlow::ParameterNode param, DataFlow::FunctionNode fun, string loadProp, string storeProp + ) { + exists(DataFlow::PropRead read | + read = getStoredPropRead(fun, storeProp) and + read.getBase().getALocalSource() = param and + read.getPropertyName() = loadProp + ) + } + /** * INTERNAL: Use `TypeBackTracker.smallstep()` instead. */ @@ -160,6 +182,11 @@ private module Cached { fun.getAReturn().getALocalSource().getAPropertySource(prop) = param and summary = StoreStep(prop) ) + or + exists(string loadProp, string storeProp | + summarizedLoadStoreStep(param, fun, loadProp, storeProp) and + summary = LoadStoreStep(loadProp, storeProp) + ) ) and if param = fun.getAParameter() then diff --git a/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected b/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected index 4670d4f9253..e69de29bb2d 100644 --- a/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected +++ b/javascript/ql/test/library-tests/TypeTracking/TypeTracking.expected @@ -1 +0,0 @@ -| summarize.js:33:14:33:26 | // track: obj | Failed to track obj here. |