From f4841e1f391e29200e30c8db3f0b29c27ab97e84 Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 19 Mar 2026 15:33:04 +0000 Subject: [PATCH 01/81] Python: Use API graphs instead of points-to for simple built-ins Also extends the list of known built-ins slightly, to add some that were missing. --- .../python/dataflow/new/internal/Builtins.qll | 8 +++--- python/ql/src/Expressions/UseofApply.ql | 9 ++++--- python/ql/src/Imports/DeprecatedModule.ql | 4 +-- .../ql/src/Statements/SideEffectInAssert.ql | 12 ++++----- python/ql/src/Statements/UnnecessaryDelete.ql | 8 +++--- .../SuspiciousUnusedLoopIterationVariable.ql | 27 +++++++------------ 6 files changed, 32 insertions(+), 36 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/Builtins.qll b/python/ql/lib/semmle/python/dataflow/new/internal/Builtins.qll index 6a66d241083..764af5d9dc5 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/Builtins.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/Builtins.qll @@ -32,7 +32,9 @@ module Builtins { "UnicodeDecodeError", "UnicodeEncodeError", "UnicodeError", "UnicodeTranslateError", "UnicodeWarning", "UserWarning", "ValueError", "Warning", "ZeroDivisionError", // Added for compatibility - "exec" + "exec", + // Added by the `site` module (available by default unless `-S` is used) + "copyright", "credits", "exit", "quit" ] or // Built-in constants shared between Python 2 and 3 @@ -51,8 +53,8 @@ module Builtins { or // Python 2 only result in [ - "basestring", "cmp", "execfile", "file", "long", "raw_input", "reduce", "reload", "unichr", - "unicode", "xrange" + "apply", "basestring", "cmp", "execfile", "file", "long", "raw_input", "reduce", "reload", + "unichr", "unicode", "xrange" ] } diff --git a/python/ql/src/Expressions/UseofApply.ql b/python/ql/src/Expressions/UseofApply.ql index 2012f2d9361..f1068eca837 100644 --- a/python/ql/src/Expressions/UseofApply.ql +++ b/python/ql/src/Expressions/UseofApply.ql @@ -10,9 +10,10 @@ */ import python -private import LegacyPointsTo -private import semmle.python.types.Builtins +private import semmle.python.ApiGraphs -from CallNode call, ControlFlowNodeWithPointsTo func -where major_version() = 2 and call.getFunction() = func and func.pointsTo(Value::named("apply")) +from CallNode call +where + major_version() = 2 and + call = API::builtin("apply").getACall().asCfgNode() select call, "Call to the obsolete builtin function 'apply'." diff --git a/python/ql/src/Imports/DeprecatedModule.ql b/python/ql/src/Imports/DeprecatedModule.ql index 3d529943fb8..62d77231334 100644 --- a/python/ql/src/Imports/DeprecatedModule.ql +++ b/python/ql/src/Imports/DeprecatedModule.ql @@ -11,7 +11,7 @@ */ import python -private import LegacyPointsTo +private import semmle.python.ApiGraphs /** * Holds if the module `name` was deprecated in Python version `major`.`minor`, @@ -80,7 +80,7 @@ where name = imp.getName() and deprecated_module(name, instead, _, _) and not exists(Try try, ExceptStmt except | except = try.getAHandler() | - except.getType().(ExprWithPointsTo).pointsTo(ClassValue::importError()) and + except.getType() = API::builtin("ImportError").getAValueReachableFromSource().asExpr() and except.containsInScope(imp) ) select imp, deprecation_message(name) + replacement_message(name) diff --git a/python/ql/src/Statements/SideEffectInAssert.ql b/python/ql/src/Statements/SideEffectInAssert.ql index 902b6c4c9c1..7ac96030c04 100644 --- a/python/ql/src/Statements/SideEffectInAssert.ql +++ b/python/ql/src/Statements/SideEffectInAssert.ql @@ -13,7 +13,7 @@ */ import python -private import LegacyPointsTo +private import semmle.python.ApiGraphs predicate func_with_side_effects(Expr e) { exists(string name | name = e.(Attribute).getName() or name = e.(Name).getId() | @@ -24,11 +24,11 @@ predicate func_with_side_effects(Expr e) { } predicate call_with_side_effect(Call e) { - e.getAFlowNode() = Value::named("subprocess.call").getACall() - or - e.getAFlowNode() = Value::named("subprocess.check_call").getACall() - or - e.getAFlowNode() = Value::named("subprocess.check_output").getACall() + e.getAFlowNode() = + API::moduleImport("subprocess") + .getMember(["call", "check_call", "check_output"]) + .getACall() + .asCfgNode() } predicate probable_side_effect(Expr e) { diff --git a/python/ql/src/Statements/UnnecessaryDelete.ql b/python/ql/src/Statements/UnnecessaryDelete.ql index c7b80ecc66a..da239f81405 100644 --- a/python/ql/src/Statements/UnnecessaryDelete.ql +++ b/python/ql/src/Statements/UnnecessaryDelete.ql @@ -13,7 +13,7 @@ */ import python -private import LegacyPointsTo +private import semmle.python.ApiGraphs predicate isInsideLoop(AstNode node) { node.getParentNode() instanceof While @@ -33,9 +33,9 @@ where not isInsideLoop(del) and // False positive: calling `sys.exc_info` within a function results in a // reference cycle, and an explicit call to `del` helps break this cycle. - not exists(FunctionValue ex | - ex = Value::named("sys.exc_info") and - ex.getACall().getScope() = f + not exists(API::CallNode call | + call = API::moduleImport("sys").getMember("exc_info").getACall() and + call.getScope() = f ) select del, "Unnecessary deletion of local variable $@ in function $@.", e, e.toString(), f, f.getName() diff --git a/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql b/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql index 87900c48fc5..18c83240667 100644 --- a/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql +++ b/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql @@ -12,7 +12,7 @@ */ import python -private import LegacyPointsTo +private import semmle.python.ApiGraphs import Definition predicate is_increment(Stmt s) { @@ -41,23 +41,16 @@ predicate one_item_only(For f) { ) } -predicate points_to_call_to_range(ControlFlowNode f) { - /* (x)range is a function in Py2 and a class in Py3, so we must treat it as a plain object */ - exists(Value range | - range = Value::named("range") or - range = Value::named("xrange") - | - f = range.getACall() - ) +/** Holds if `node` is a call to `range`, `xrange`, or `list(range(...))`. */ +predicate call_to_range(DataFlow::Node node) { + node = API::builtin(["range", "xrange"]).getACall() or - /* In case points-to fails due to 'from six.moves import range' or similar. */ - exists(string range | f.getNode().(Call).getFunc().(Name).getId() = range | - range = "range" or range = "xrange" - ) + /* Handle 'from six.moves import range' or similar. */ + node = API::moduleImport("six").getMember("moves").getMember(["range", "xrange"]).getACall() or /* Handle list(range(...)) and list(list(range(...))) */ - f.(CallNode).(ControlFlowNodeWithPointsTo).pointsTo().getClass() = ClassValue::list() and - points_to_call_to_range(f.(CallNode).getArg(0)) + node = API::builtin("list").getACall() and + call_to_range(node.(DataFlow::CallCfgNode).getArg(0)) } /** Whether n is a use of a variable that is a not effectively a constant. */ @@ -102,8 +95,8 @@ from For f, Variable v, string msg where f.getTarget() = v.getAnAccess() and not f.getAStmt().contains(v.getAnAccess()) and - not points_to_call_to_range(f.getIter().getAFlowNode()) and - not points_to_call_to_range(get_comp_iterable(f)) and + not call_to_range(DataFlow::exprNode(f.getIter())) and + not call_to_range(DataFlow::exprNode(get_comp_iterable(f).getNode())) and not name_acceptable_for_unused_variable(v) and not f.getScope().getName() = "genexpr" and not empty_loop(f) and From 1dcc76996daca8ff302db3be4f39fa4b8a097c92 Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 19 Feb 2026 15:06:47 +0000 Subject: [PATCH 02/81] Python: Port `py/print-during-import` Uses a (perhaps) slightly coarser approximation of what modules are imported, but it's probably fine. --- python/ql/src/Statements/TopLevelPrint.ql | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/python/ql/src/Statements/TopLevelPrint.ql b/python/ql/src/Statements/TopLevelPrint.ql index 12095f7a484..1896d41908e 100644 --- a/python/ql/src/Statements/TopLevelPrint.ql +++ b/python/ql/src/Statements/TopLevelPrint.ql @@ -12,7 +12,6 @@ */ import python -private import LegacyPointsTo predicate main_eq_name(If i) { exists(Name n, StringLiteral m, Compare c | @@ -32,10 +31,19 @@ predicate is_print_stmt(Stmt s) { ) } +/** + * Holds if module `m` is likely used as a module (imported by another module), + * as opposed to being exclusively used as a script. + */ +predicate is_used_as_module(Module m) { + m.isPackageInit() + or + exists(ImportingStmt i | i.getAnImportedModuleName() = m.getName()) +} + from Stmt p where is_print_stmt(p) and - // TODO: Need to discuss how we would like to handle ModuleObject.getKind in the glorious future - exists(ModuleValue m | m.getScope() = p.getScope() and m.isUsedAsModule()) and + is_used_as_module(p.getScope()) and not exists(If i | main_eq_name(i) and i.getASubStatement().getASubStatement*() = p) select p, "Print statement may execute during import." From 33ed6034f63b03b2a90a0835940e38d7d43d0610 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 20 Feb 2026 13:37:25 +0000 Subject: [PATCH 03/81] Python: Introduce `DuckTyping` module This module (which for convenience currently resides inside `DataFlowDispatch`, but this may change later) contains convenience predicates for bridging the gap between the data-flow layer and the old points-to analysis. --- .../new/internal/DataFlowDispatch.qll | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index 37eecb76d4c..9b5de413973 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -1977,3 +1977,95 @@ private module OutNodes { * `kind`. */ OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) { call = result.getCall(kind) } + +/** + * Provides predicates for approximating type properties of user-defined classes + * based on their structure (method declarations, base classes). + * + * This module should _not_ be used in the call graph computation itself, as parts of it may depend + * on layers that themselves build upon the call graph (e.g. API graphs). + */ +module DuckTyping { + private import semmle.python.ApiGraphs + + /** + * Holds if `cls` or any of its resolved superclasses declares a method with the given `name`. + */ + predicate hasMethod(Class cls, string name) { + cls.getAMethod().getName() = name + or + hasMethod(getADirectSuperclass(cls), name) + } + + /** + * Holds if `cls` has a base class that cannot be resolved to a user-defined class + * and is not just `object`, meaning it may inherit methods from an unknown class. + */ + predicate hasUnresolvedBase(Class cls) { + exists(Expr base | base = cls.getABase() | + not base = classTracker(_).asExpr() and + not base = API::builtin("object").getAValueReachableFromSource().asExpr() + ) + } + + /** + * Holds if `cls` supports the container protocol, i.e. it declares + * `__contains__`, `__iter__`, or `__getitem__`. + */ + predicate isContainer(Class cls) { + hasMethod(cls, "__contains__") or + hasMethod(cls, "__iter__") or + hasMethod(cls, "__getitem__") + } + + /** + * Holds if `cls` supports the iterable protocol, i.e. it declares + * `__iter__` or `__getitem__`. + */ + predicate isIterable(Class cls) { + hasMethod(cls, "__iter__") or + hasMethod(cls, "__getitem__") + } + + /** + * Holds if `cls` supports the iterator protocol, i.e. it declares + * both `__iter__` and `__next__`. + */ + predicate isIterator(Class cls) { + hasMethod(cls, "__iter__") and + hasMethod(cls, "__next__") + } + + /** + * Holds if `cls` supports the context manager protocol, i.e. it declares + * both `__enter__` and `__exit__`. + */ + predicate isContextManager(Class cls) { + hasMethod(cls, "__enter__") and + hasMethod(cls, "__exit__") + } + + /** + * Holds if `cls` supports the descriptor protocol, i.e. it declares + * `__get__`, `__set__`, or `__delete__`. + */ + predicate isDescriptor(Class cls) { + hasMethod(cls, "__get__") or + hasMethod(cls, "__set__") or + hasMethod(cls, "__delete__") + } + + /** + * Holds if `cls` is callable, i.e. it declares `__call__`. + */ + predicate isCallable(Class cls) { hasMethod(cls, "__call__") } + + /** + * Holds if `cls` supports the mapping protocol, i.e. it declares + * `__getitem__` and `keys`, or `__getitem__` and `__iter__`. + */ + predicate isMapping(Class cls) { + hasMethod(cls, "__getitem__") and + (hasMethod(cls, "keys") or hasMethod(cls, "__iter__")) + } +} From cd92162920f9507b8662dc69928e9b4395263ce7 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 20 Feb 2026 15:19:18 +0000 Subject: [PATCH 04/81] Python: Add `DuckTyping::isNewStyle` Approximates the behaviour of `Types::isNewStyle` but without depending on points-to --- .../new/internal/DataFlowDispatch.qll | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index 9b5de413973..529fc3c95fd 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -2068,4 +2068,30 @@ module DuckTyping { hasMethod(cls, "__getitem__") and (hasMethod(cls, "keys") or hasMethod(cls, "__iter__")) } + + /** + * Holds if `cls` is a new-style class. In Python 3, all classes are new-style. + * In Python 2, a class is new-style if it (transitively) inherits from `object`, + * or has a declared `__metaclass__`, or has an unresolved base class. + */ + predicate isNewStyle(Class cls) { + major_version() = 3 + or + major_version() = 2 and + ( + cls.getABase() = API::builtin("object").getAValueReachableFromSource().asExpr() + or + isNewStyle(getADirectSuperclass(cls)) + or + hasUnresolvedBase(cls) + or + exists(cls.getMetaClass()) + or + // Module-level __metaclass__ = type makes all classes in the module new-style + exists(Assign a | + a.getScope() = cls.getEnclosingModule() and + a.getATarget().(Name).getId() = "__metaclass__" + ) + ) + } } From b57e92164ce7a8d8ddbc24875512879679984fe5 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 20 Feb 2026 15:56:14 +0000 Subject: [PATCH 05/81] Python: Add declares/getAttribute API These could arguably be moved to `Class` itself, but for now I'm choosing to limit the changes to the `DuckTyping` module (until we decide on a proper API). --- .../dataflow/new/internal/DataFlowDispatch.qll | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index 529fc3c95fd..2aaa33de159 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -2055,6 +2055,23 @@ module DuckTyping { hasMethod(cls, "__delete__") } + /** + * Holds if `cls` directly assigns to an attribute named `name` in its class body. + * This covers attribute assignments like `x = value`, but not method definitions. + */ + predicate declaresAttribute(Class cls, string name) { exists(getAnAttributeValue(cls, name)) } + + /** + * Gets the value expression assigned to attribute `name` directly in the class body of `cls`. + */ + Expr getAnAttributeValue(Class cls, string name) { + exists(Assign a | + a.getScope() = cls and + a.getATarget().(Name).getId() = name and + result = a.getValue() + ) + } + /** * Holds if `cls` is callable, i.e. it declares `__call__`. */ From 3d20050c0ad0f485b6c0e11f5c4a0c950ea5c5b8 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 20 Feb 2026 15:25:57 +0000 Subject: [PATCH 06/81] Python: Port SlotsInOldStyleClass.ql Only trivial test changes. --- python/ql/src/Classes/SlotsInOldStyleClass.ql | 8 +++++--- .../Classes/new-style/SlotsInOldStyleClass.expected | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/python/ql/src/Classes/SlotsInOldStyleClass.ql b/python/ql/src/Classes/SlotsInOldStyleClass.ql index 2f91a88cf64..70a7997113e 100644 --- a/python/ql/src/Classes/SlotsInOldStyleClass.ql +++ b/python/ql/src/Classes/SlotsInOldStyleClass.ql @@ -12,9 +12,11 @@ */ import python -private import LegacyPointsTo +private import semmle.python.dataflow.new.internal.DataFlowDispatch -from ClassObject c -where not c.isNewStyle() and c.declaresAttribute("__slots__") and not c.failedInference() +from Class c +where + not DuckTyping::isNewStyle(c) and + DuckTyping::declaresAttribute(c, "__slots__") select c, "Using '__slots__' in an old style class just creates a class attribute called '__slots__'." diff --git a/python/ql/test/2/query-tests/Classes/new-style/SlotsInOldStyleClass.expected b/python/ql/test/2/query-tests/Classes/new-style/SlotsInOldStyleClass.expected index ccad85bd384..14d30913b93 100644 --- a/python/ql/test/2/query-tests/Classes/new-style/SlotsInOldStyleClass.expected +++ b/python/ql/test/2/query-tests/Classes/new-style/SlotsInOldStyleClass.expected @@ -1 +1 @@ -| newstyle_test.py:4:1:4:16 | class OldStyle1 | Using '__slots__' in an old style class just creates a class attribute called '__slots__'. | +| newstyle_test.py:4:1:4:16 | Class OldStyle1 | Using '__slots__' in an old style class just creates a class attribute called '__slots__'. | From e860d706c946640b819c17d3757dcbb2117ee532 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 20 Feb 2026 15:26:27 +0000 Subject: [PATCH 07/81] Python: Port SuperInOldStyleClass.ql --- python/ql/src/Classes/SuperInOldStyleClass.ql | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/python/ql/src/Classes/SuperInOldStyleClass.ql b/python/ql/src/Classes/SuperInOldStyleClass.ql index a6a272b1b3b..bc6541052de 100644 --- a/python/ql/src/Classes/SuperInOldStyleClass.ql +++ b/python/ql/src/Classes/SuperInOldStyleClass.ql @@ -11,14 +11,13 @@ */ import python -private import LegacyPointsTo +private import semmle.python.dataflow.new.internal.DataFlowDispatch predicate uses_of_super_in_old_style_class(Call s) { - exists(Function f, ClassObject c | + exists(Function f, Class c | s.getScope() = f and - f.getScope() = c.getPyClass() and - not c.failedInference() and - not c.isNewStyle() and + f.getScope() = c and + not DuckTyping::isNewStyle(c) and s.getFunc().(Name).getId() = "super" ) } From 8cfdea2001c75b111607024b6cfcb7d47bfbd86f Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 20 Feb 2026 15:27:32 +0000 Subject: [PATCH 08/81] Python: Port PropertyInOldStyleClass.ql Only trivial test changes. --- python/ql/src/Classes/PropertyInOldStyleClass.ql | 9 ++++++--- .../Classes/new-style/PropertyInOldStyleClass.expected | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/python/ql/src/Classes/PropertyInOldStyleClass.ql b/python/ql/src/Classes/PropertyInOldStyleClass.ql index 2fd7b1d14cf..80a5ef06bbe 100644 --- a/python/ql/src/Classes/PropertyInOldStyleClass.ql +++ b/python/ql/src/Classes/PropertyInOldStyleClass.ql @@ -11,10 +11,13 @@ */ import python -private import LegacyPointsTo +private import semmle.python.dataflow.new.internal.DataFlowDispatch -from PropertyObject prop, ClassObject cls -where cls.declaredAttribute(_) = prop and not cls.failedInference() and not cls.isNewStyle() +from Function prop, Class cls +where + prop.getScope() = cls and + prop.getADecorator().(Name).getId() = "property" and + not DuckTyping::isNewStyle(cls) select prop, "Property " + prop.getName() + " will not work properly, as class " + cls.getName() + " is an old-style class." diff --git a/python/ql/test/2/query-tests/Classes/new-style/PropertyInOldStyleClass.expected b/python/ql/test/2/query-tests/Classes/new-style/PropertyInOldStyleClass.expected index 9fb3e582cb7..1e5be51fbaf 100644 --- a/python/ql/test/2/query-tests/Classes/new-style/PropertyInOldStyleClass.expected +++ b/python/ql/test/2/query-tests/Classes/new-style/PropertyInOldStyleClass.expected @@ -1 +1 @@ -| property_old_style.py:8:6:8:13 | Property piosc | Property piosc will not work properly, as class OldStyle is an old-style class. | +| property_old_style.py:9:5:9:20 | Function piosc | Property piosc will not work properly, as class OldStyle is an old-style class. | From 025a7d0ccac1b8715996eb4d9f8672728918e72b Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 20 Feb 2026 16:54:34 +0000 Subject: [PATCH 09/81] Python: Port UselessClass.ql No test changes. --- python/ql/src/Classes/UselessClass.ql | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/python/ql/src/Classes/UselessClass.ql b/python/ql/src/Classes/UselessClass.ql index 740c74bf96d..229e42fd292 100644 --- a/python/ql/src/Classes/UselessClass.ql +++ b/python/ql/src/Classes/UselessClass.ql @@ -13,7 +13,7 @@ */ import python -private import LegacyPointsTo +private import semmle.python.dataflow.new.internal.DataFlowDispatch predicate fewer_than_two_public_methods(Class cls, int methods) { (methods = 0 or methods = 1) and @@ -25,13 +25,8 @@ predicate does_not_define_special_method(Class cls) { } predicate no_inheritance(Class c) { - not exists(ClassValue cls, ClassValue other | - cls.getScope() = c and - other != ClassValue::object() - | - other.getABaseType() = cls or - cls.getABaseType() = other - ) and + not exists(getADirectSubclass(c)) and + not exists(getADirectSuperclass(c)) and not exists(Expr base | base = c.getABase() | not base instanceof Name or base.(Name).getId() != "object" ) From 283231bdbc044ad1c98da4c522b89dc1012baf18 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 20 Feb 2026 16:54:49 +0000 Subject: [PATCH 10/81] Python: Port ShouldBeContextManager.ql Only trivial test changes. --- python/ql/src/Classes/ShouldBeContextManager.ql | 8 +++++--- .../ShouldBeContextManager.expected | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/python/ql/src/Classes/ShouldBeContextManager.ql b/python/ql/src/Classes/ShouldBeContextManager.ql index 6aec0f0e0ab..9a50d841a74 100644 --- a/python/ql/src/Classes/ShouldBeContextManager.ql +++ b/python/ql/src/Classes/ShouldBeContextManager.ql @@ -14,10 +14,12 @@ */ import python -private import LegacyPointsTo +private import semmle.python.dataflow.new.internal.DataFlowDispatch -from ClassValue c -where not c.isBuiltin() and not c.isContextManager() and exists(c.declaredAttribute("__del__")) +from Class c +where + not DuckTyping::isContextManager(c) and + DuckTyping::hasMethod(c, "__del__") select c, "Class " + c.getName() + " implements __del__ (presumably to release some resource). Consider making it a context manager." diff --git a/python/ql/test/query-tests/Classes/should-be-context-manager/ShouldBeContextManager.expected b/python/ql/test/query-tests/Classes/should-be-context-manager/ShouldBeContextManager.expected index 47c773804ae..3cd6d92ff64 100644 --- a/python/ql/test/query-tests/Classes/should-be-context-manager/ShouldBeContextManager.expected +++ b/python/ql/test/query-tests/Classes/should-be-context-manager/ShouldBeContextManager.expected @@ -1,2 +1,2 @@ -| should_be_context_manager.py:3:1:3:22 | class MegaDel | Class MegaDel implements __del__ (presumably to release some resource). Consider making it a context manager. | -| should_be_context_manager.py:16:1:16:22 | class MiniDel | Class MiniDel implements __del__ (presumably to release some resource). Consider making it a context manager. | +| should_be_context_manager.py:3:1:3:22 | Class MegaDel | Class MegaDel implements __del__ (presumably to release some resource). Consider making it a context manager. | +| should_be_context_manager.py:16:1:16:22 | Class MiniDel | Class MiniDel implements __del__ (presumably to release some resource). Consider making it a context manager. | From c04b615a07a7fcd128fbe5b420bc68b6b3d4ab41 Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 23 Feb 2026 15:55:58 +0000 Subject: [PATCH 11/81] Python: Extend DuckTyping module Adds `overridesMethod` and `isPropertyAccessor`. --- .../new/internal/DataFlowDispatch.qll | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index 2aaa33de159..529e90798ba 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -2111,4 +2111,27 @@ module DuckTyping { ) ) } + + /** + * Gets the `__init__` function that will be invoked when `cls` is constructed, + * resolved according to the MRO. + */ + Function getInit(Class cls) { result = invokedFunctionFromClassConstruction(cls, "__init__") } + + /** + * Holds if `f` overrides a method in a superclass with the same name. + */ + predicate overridesMethod(Function f) { + exists(Class cls | f.getScope() = cls | hasMethod(getADirectSuperclass(cls), f.getName())) + } + + /** + * Holds if `f` is a property accessor (decorated with `@property`, `@name.setter`, + * or `@name.deleter`). + */ + predicate isPropertyAccessor(Function f) { + exists(Attribute a | a = f.getADecorator() | a.getName() = "setter" or a.getName() = "deleter") + or + f.getADecorator().(Name).getId() = "property" + } } From fa8e4f7314d111ef9b1de920f22ea3ae9ce0c2fc Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 23 Feb 2026 15:55:05 +0000 Subject: [PATCH 12/81] Python: Port DocStrings.ql --- python/ql/src/Statements/DocStrings.ql | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/python/ql/src/Statements/DocStrings.ql b/python/ql/src/Statements/DocStrings.ql index df7b09a963e..f71b204c018 100644 --- a/python/ql/src/Statements/DocStrings.ql +++ b/python/ql/src/Statements/DocStrings.ql @@ -17,7 +17,7 @@ */ import python -private import LegacyPointsTo +private import semmle.python.dataflow.new.internal.DataFlowDispatch predicate needs_docstring(Scope s) { s.isPublic() and @@ -29,15 +29,15 @@ predicate needs_docstring(Scope s) { } predicate function_needs_docstring(FunctionMetrics f) { - not exists(FunctionValue fo, FunctionValue base | fo.overrides(base) and fo.getScope() = f | - not function_needs_docstring(base.getScope()) + not exists(Function base | + DuckTyping::overridesMethod(f) and + base.getScope() = getADirectSuperclass+(f.getScope()) and + base.getName() = f.getName() and + not function_needs_docstring(base) ) and f.getName() != "lambda" and (f.getNumberOfLinesOfCode() - count(f.getADecorator())) > 2 and - not exists(PythonPropertyObject p | - p.getGetter().getFunction() = f or - p.getSetter().getFunction() = f - ) + not DuckTyping::isPropertyAccessor(f) } string scope_type(Scope s) { From 50b3b7ee1ff76754ecde6c113bb0998f1d7d8cd4 Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 19 Mar 2026 15:34:54 +0000 Subject: [PATCH 13/81] Python: Add `DuckTyping::hasUnreliableMro` Primarily used to filter out false positives in cases where our MRO approximation may be wrong. --- .../dataflow/new/internal/DataFlowDispatch.qll | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index 529e90798ba..21fa6872864 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -2118,6 +2118,19 @@ module DuckTyping { */ Function getInit(Class cls) { result = invokedFunctionFromClassConstruction(cls, "__init__") } + /** + * Holds if `cls` or any of its superclasses uses multiple inheritance, or + * has an unresolved base class. In these cases, our MRO approximation may + * resolve to the wrong `__init__`, so we should not flag argument mismatches. + */ + predicate hasUnreliableMro(Class cls) { + exists(Class sup | sup = getADirectSuperclass*(cls) | + exists(sup.getBase(1)) + or + hasUnresolvedBase(sup) + ) + } + /** * Holds if `f` overrides a method in a superclass with the same name. */ From 3584ad19059890cd598867b1a5c61f78764cbda0 Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 23 Feb 2026 15:51:25 +0000 Subject: [PATCH 14/81] Python: Port DeprecatedSliceMethod.ql Only trivial test changes. --- python/ql/src/Functions/DeprecatedSliceMethod.ql | 11 ++++++----- .../Functions/general/DeprecatedSliceMethod.expected | 6 +++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/python/ql/src/Functions/DeprecatedSliceMethod.ql b/python/ql/src/Functions/DeprecatedSliceMethod.ql index 3e9cdb681d9..937b3f46a4f 100644 --- a/python/ql/src/Functions/DeprecatedSliceMethod.ql +++ b/python/ql/src/Functions/DeprecatedSliceMethod.ql @@ -10,16 +10,17 @@ */ import python -private import LegacyPointsTo +private import semmle.python.dataflow.new.internal.DataFlowDispatch predicate slice_method_name(string name) { name = "__getslice__" or name = "__setslice__" or name = "__delslice__" } -from PythonFunctionValue f, string meth +from Function f, string meth where - f.getScope().isMethod() and - not f.isOverridingMethod() and + f.isMethod() and slice_method_name(meth) and - f.getName() = meth + f.getName() = meth and + not DuckTyping::overridesMethod(f) and + not DuckTyping::hasUnresolvedBase(getADirectSuperclass*(f.getScope())) select f, meth + " method has been deprecated since Python 2.0." diff --git a/python/ql/test/query-tests/Functions/general/DeprecatedSliceMethod.expected b/python/ql/test/query-tests/Functions/general/DeprecatedSliceMethod.expected index 1a6df6eca47..c9875b7a805 100644 --- a/python/ql/test/query-tests/Functions/general/DeprecatedSliceMethod.expected +++ b/python/ql/test/query-tests/Functions/general/DeprecatedSliceMethod.expected @@ -1,3 +1,3 @@ -| functions_test.py:95:5:95:40 | Function DeprecatedSliceMethods.__getslice__ | __getslice__ method has been deprecated since Python 2.0. | -| functions_test.py:98:5:98:47 | Function DeprecatedSliceMethods.__setslice__ | __setslice__ method has been deprecated since Python 2.0. | -| functions_test.py:101:5:101:40 | Function DeprecatedSliceMethods.__delslice__ | __delslice__ method has been deprecated since Python 2.0. | +| functions_test.py:95:5:95:40 | Function __getslice__ | __getslice__ method has been deprecated since Python 2.0. | +| functions_test.py:98:5:98:47 | Function __setslice__ | __setslice__ method has been deprecated since Python 2.0. | +| functions_test.py:101:5:101:40 | Function __delslice__ | __delslice__ method has been deprecated since Python 2.0. | From 434b3973eb285a69c038dba3719070eddbd6d735 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 13 Mar 2026 16:36:36 +0000 Subject: [PATCH 15/81] Python: Add change note --- .../change-notes/2026-03-13-port-simple-points-to-queries.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 python/ql/src/change-notes/2026-03-13-port-simple-points-to-queries.md diff --git a/python/ql/src/change-notes/2026-03-13-port-simple-points-to-queries.md b/python/ql/src/change-notes/2026-03-13-port-simple-points-to-queries.md new file mode 100644 index 00000000000..3673b6de83a --- /dev/null +++ b/python/ql/src/change-notes/2026-03-13-port-simple-points-to-queries.md @@ -0,0 +1,5 @@ +--- +category: majorAnalysis +--- + +- Several quality queries have been ported away from using the legacy points-to library. This may lead to changes in alerts. From 5859590b5d2345afa57a6fbfa7a6c827488d4baa Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 23 Mar 2026 15:07:31 +0100 Subject: [PATCH 16/81] Python: Fix typo in comment Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql b/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql index 18c83240667..d252742d67c 100644 --- a/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql +++ b/python/ql/src/Variables/SuspiciousUnusedLoopIterationVariable.ql @@ -53,7 +53,7 @@ predicate call_to_range(DataFlow::Node node) { call_to_range(node.(DataFlow::CallCfgNode).getArg(0)) } -/** Whether n is a use of a variable that is a not effectively a constant. */ +/** Whether n is a use of a variable that is not effectively a constant. */ predicate use_of_non_constant(Name n) { exists(Variable var | n.uses(var) and From 56c83e250e29f20be505d577080b0966e0f9bfa4 Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 23 Mar 2026 15:09:27 +0100 Subject: [PATCH 17/81] Python: Make comment more precise Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../semmle/python/dataflow/new/internal/DataFlowDispatch.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index 21fa6872864..abdf03daa13 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -2089,7 +2089,8 @@ module DuckTyping { /** * Holds if `cls` is a new-style class. In Python 3, all classes are new-style. * In Python 2, a class is new-style if it (transitively) inherits from `object`, - * or has a declared `__metaclass__`, or has an unresolved base class. + * or has a declared `__metaclass__`, or is in a module with a module-level + * `__metaclass__` declaration, or has an unresolved base class. */ predicate isNewStyle(Class cls) { major_version() = 3 From 1ffcdc92939102715c79ff916d147b67ae969ff5 Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 23 Mar 2026 14:55:28 +0000 Subject: [PATCH 18/81] Python: Select property instead of function in PropertyInOldStyleClass. This matches the previous behaviour more closely. --- python/ql/src/Classes/PropertyInOldStyleClass.ql | 7 ++++--- .../Classes/new-style/PropertyInOldStyleClass.expected | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/python/ql/src/Classes/PropertyInOldStyleClass.ql b/python/ql/src/Classes/PropertyInOldStyleClass.ql index 80a5ef06bbe..4b3666067ec 100644 --- a/python/ql/src/Classes/PropertyInOldStyleClass.ql +++ b/python/ql/src/Classes/PropertyInOldStyleClass.ql @@ -13,11 +13,12 @@ import python private import semmle.python.dataflow.new.internal.DataFlowDispatch -from Function prop, Class cls +from Function prop, Class cls, Name decorator where prop.getScope() = cls and - prop.getADecorator().(Name).getId() = "property" and + decorator = prop.getADecorator() and + decorator.getId() = "property" and not DuckTyping::isNewStyle(cls) -select prop, +select decorator, "Property " + prop.getName() + " will not work properly, as class " + cls.getName() + " is an old-style class." diff --git a/python/ql/test/2/query-tests/Classes/new-style/PropertyInOldStyleClass.expected b/python/ql/test/2/query-tests/Classes/new-style/PropertyInOldStyleClass.expected index 1e5be51fbaf..fb508cbe859 100644 --- a/python/ql/test/2/query-tests/Classes/new-style/PropertyInOldStyleClass.expected +++ b/python/ql/test/2/query-tests/Classes/new-style/PropertyInOldStyleClass.expected @@ -1 +1 @@ -| property_old_style.py:9:5:9:20 | Function piosc | Property piosc will not work properly, as class OldStyle is an old-style class. | +| property_old_style.py:8:6:8:13 | property | Property piosc will not work properly, as class OldStyle is an old-style class. | From a276f721f72dedf9afe754463af88055eab36179 Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 23 Mar 2026 15:21:27 +0000 Subject: [PATCH 19/81] Python: Add ternary `overridesMethod` This one also allows easy access to the method being overridden and the class on which it resides. This let's us simplify DocStrings.ql accordingly. --- .../dataflow/new/internal/DataFlowDispatch.qll | 14 ++++++++++++-- python/ql/src/Statements/DocStrings.ql | 4 +--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index abdf03daa13..d73b0cfabb6 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -2135,8 +2135,18 @@ module DuckTyping { /** * Holds if `f` overrides a method in a superclass with the same name. */ - predicate overridesMethod(Function f) { - exists(Class cls | f.getScope() = cls | hasMethod(getADirectSuperclass(cls), f.getName())) + predicate overridesMethod(Function f) { overridesMethod(f, _, _) } + + /** + * Holds if `f` overrides `overridden` declared in `superclass`. + */ + predicate overridesMethod(Function f, Class superclass, Function overridden) { + exists(Class cls | + f.getScope() = cls and + superclass = getADirectSuperclass+(cls) and + overridden = superclass.getAMethod() and + overridden.getName() = f.getName() + ) } /** diff --git a/python/ql/src/Statements/DocStrings.ql b/python/ql/src/Statements/DocStrings.ql index f71b204c018..d1f8c07abba 100644 --- a/python/ql/src/Statements/DocStrings.ql +++ b/python/ql/src/Statements/DocStrings.ql @@ -30,9 +30,7 @@ predicate needs_docstring(Scope s) { predicate function_needs_docstring(FunctionMetrics f) { not exists(Function base | - DuckTyping::overridesMethod(f) and - base.getScope() = getADirectSuperclass+(f.getScope()) and - base.getName() = f.getName() and + DuckTyping::overridesMethod(f, _, base) and not function_needs_docstring(base) ) and f.getName() != "lambda" and From 93e35661e67cb576d9b4fe5a4429e01c2104a957 Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 23 Mar 2026 15:22:24 +0000 Subject: [PATCH 20/81] Python: Make `isNewType` more precise For module-level metaclass declarations, we now also check that the right hand side in a `__metaclass__ = type` assignment is in fact the built-in `type`. --- .../semmle/python/dataflow/new/internal/DataFlowDispatch.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index d73b0cfabb6..d1af9585275 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -2108,7 +2108,8 @@ module DuckTyping { // Module-level __metaclass__ = type makes all classes in the module new-style exists(Assign a | a.getScope() = cls.getEnclosingModule() and - a.getATarget().(Name).getId() = "__metaclass__" + a.getATarget().(Name).getId() = "__metaclass__" and + a.getValue() = API::builtin("type").getAValueReachableFromSource().asExpr() ) ) } From ac48eca9169b0ddd506564f3f075aedf96f37b5c Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 23 Mar 2026 15:26:00 +0000 Subject: [PATCH 21/81] Python: Use `cls.getMethod` instead of `getName` --- .../semmle/python/dataflow/new/internal/DataFlowDispatch.qll | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index d1af9585275..1db6c08f5f4 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -2145,8 +2145,7 @@ module DuckTyping { exists(Class cls | f.getScope() = cls and superclass = getADirectSuperclass+(cls) and - overridden = superclass.getAMethod() and - overridden.getName() = f.getName() + overridden = superclass.getMethod(f.getName()) ) } From 059693ce898c93c9a40e04948e1ceeacd9a02175 Mon Sep 17 00:00:00 2001 From: Taus Date: Tue, 24 Mar 2026 13:04:44 +0000 Subject: [PATCH 22/81] Python: Restrict `ShouldBeContextManager.ql` results By limiting the results to the class that actually defines the `__del__` method, we eliminate a bunch of FPs where a _subclass_ of such a class would also get flagged. --- python/ql/src/Classes/ShouldBeContextManager.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/src/Classes/ShouldBeContextManager.ql b/python/ql/src/Classes/ShouldBeContextManager.ql index 9a50d841a74..ee97a0e682f 100644 --- a/python/ql/src/Classes/ShouldBeContextManager.ql +++ b/python/ql/src/Classes/ShouldBeContextManager.ql @@ -19,7 +19,7 @@ private import semmle.python.dataflow.new.internal.DataFlowDispatch from Class c where not DuckTyping::isContextManager(c) and - DuckTyping::hasMethod(c, "__del__") + exists(c.getMethod("__del__")) select c, "Class " + c.getName() + " implements __del__ (presumably to release some resource). Consider making it a context manager." From c8169f576fd380d7700931d80228e9203bd5e576 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 20 Mar 2026 12:21:21 +0100 Subject: [PATCH 23/81] C#: Don't extract expanded assignments and swap child indices for assignments. --- .../Entities/Expressions/Assignment.cs | 75 ++----------------- .../Entities/Expressions/Initializer.cs | 29 +++---- .../ObjectCreation/AnonymousObjectCreation.cs | 6 +- .../Entities/Expressions/Query.cs | 6 +- .../Expressions/VariableDeclaration.cs | 6 +- .../Entities/Field.cs | 4 +- .../Entities/Property.cs | 4 +- 7 files changed, 33 insertions(+), 97 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs index f3e2e510cd6..67e49b2919c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs @@ -22,26 +22,12 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions protected override void PopulateExpression(TextWriter trapFile) { - var operatorKind = OperatorKind; - if (operatorKind.HasValue) - { - // Convert assignment such as `a += b` into `a = a + b`. - var simpleAssignExpr = new Expression(new ExpressionInfo(Context, Type, Location, ExprKind.SIMPLE_ASSIGN, this, 2, isCompilerGenerated: true, null)); - Create(Context, Syntax.Left, simpleAssignExpr, 1); - var opexpr = new Expression(new ExpressionInfo(Context, Type, Location, operatorKind.Value, simpleAssignExpr, 0, isCompilerGenerated: true, null)); - Create(Context, Syntax.Left, opexpr, 0, isCompilerGenerated: true); - Create(Context, Syntax.Right, opexpr, 1); - opexpr.OperatorCall(trapFile, Syntax); - } - else - { - Create(Context, Syntax.Left, this, 1); - Create(Context, Syntax.Right, this, 0); + Create(Context, Syntax.Left, this, 0); + Create(Context, Syntax.Right, this, 1); - if (Kind == ExprKind.ADD_EVENT || Kind == ExprKind.REMOVE_EVENT) - { - OperatorCall(trapFile, Syntax); - } + if (Kind != ExprKind.SIMPLE_ASSIGN && Kind != ExprKind.ASSIGN_COALESCE) + { + OperatorCall(trapFile, Syntax); } } @@ -108,56 +94,5 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions return kind; } - - /// - /// Gets the kind of this assignment operator (null if the - /// assignment is not an assignment operator). For example, the operator - /// kind of `*=` is `*`. - /// - private ExprKind? OperatorKind - { - get - { - var kind = Kind; - if (kind == ExprKind.REMOVE_EVENT || kind == ExprKind.ADD_EVENT || kind == ExprKind.SIMPLE_ASSIGN) - return null; - - if (CallType.AdjustKind(kind) == ExprKind.OPERATOR_INVOCATION) - return ExprKind.OPERATOR_INVOCATION; - - switch (kind) - { - case ExprKind.ASSIGN_ADD: - return ExprKind.ADD; - case ExprKind.ASSIGN_AND: - return ExprKind.BIT_AND; - case ExprKind.ASSIGN_DIV: - return ExprKind.DIV; - case ExprKind.ASSIGN_LSHIFT: - return ExprKind.LSHIFT; - case ExprKind.ASSIGN_MUL: - return ExprKind.MUL; - case ExprKind.ASSIGN_OR: - return ExprKind.BIT_OR; - case ExprKind.ASSIGN_REM: - return ExprKind.REM; - case ExprKind.ASSIGN_RSHIFT: - return ExprKind.RSHIFT; - case ExprKind.ASSIGN_URSHIFT: - return ExprKind.URSHIFT; - case ExprKind.ASSIGN_SUB: - return ExprKind.SUB; - case ExprKind.ASSIGN_XOR: - return ExprKind.BIT_XOR; - case ExprKind.ASSIGN_COALESCE: - return ExprKind.NULL_COALESCING; - default: - Context.ModelError(Syntax, $"Couldn't unfold assignment of type {kind}"); - return ExprKind.UNKNOWN; - } - } - } - - public new CallType CallType => GetCallType(Context, Syntax); } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Initializer.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Initializer.cs index 92e2b910f99..63024cd47fc 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Initializer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Initializer.cs @@ -83,8 +83,22 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions { var assignmentInfo = new ExpressionNodeInfo(Context, init, this, child++).SetKind(ExprKind.SIMPLE_ASSIGN); var assignmentEntity = new Expression(assignmentInfo); + var target = Context.GetSymbolInfo(assignment.Left); + + // If the target is null, then assume that this is an array initializer (of the form `[...] = ...`) + var access = target.Symbol is null ? + new Expression(new ExpressionNodeInfo(Context, assignment.Left, assignmentEntity, 0).SetKind(ExprKind.ARRAY_ACCESS)) : + Access.Create(new ExpressionNodeInfo(Context, assignment.Left, assignmentEntity, 0), target.Symbol, false, Context.CreateEntity(target.Symbol)); + + if (assignment.Left is ImplicitElementAccessSyntax iea) + { + // An array/indexer initializer of the form `[...] = ...` + access.PopulateArguments(trapFile, iea.ArgumentList.Arguments, 0); + } + var typeInfoRight = Context.GetTypeInfo(assignment.Right); if (typeInfoRight.Type is null) + { // The type may be null for nested initializers such as // ```csharp // new ClassWithArrayField() { As = { [0] = a } } @@ -92,21 +106,8 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions // In this case we take the type from the assignment // `As = { [0] = a }` instead typeInfoRight = assignmentInfo.TypeInfo; - CreateFromNode(new ExpressionNodeInfo(Context, assignment.Right, assignmentEntity, 0, typeInfoRight)); - - var target = Context.GetSymbolInfo(assignment.Left); - - // If the target is null, then assume that this is an array initializer (of the form `[...] = ...`) - - var access = target.Symbol is null ? - new Expression(new ExpressionNodeInfo(Context, assignment.Left, assignmentEntity, 1).SetKind(ExprKind.ARRAY_ACCESS)) : - Access.Create(new ExpressionNodeInfo(Context, assignment.Left, assignmentEntity, 1), target.Symbol, false, Context.CreateEntity(target.Symbol)); - - if (assignment.Left is ImplicitElementAccessSyntax iea) - { - // An array/indexer initializer of the form `[...] = ...` - access.PopulateArguments(trapFile, iea.ArgumentList.Arguments, 0); } + CreateFromNode(new ExpressionNodeInfo(Context, assignment.Right, assignmentEntity, 1, typeInfoRight)); } else { diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/ObjectCreation/AnonymousObjectCreation.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/ObjectCreation/AnonymousObjectCreation.cs index a6f94f53338..1fdf03171b9 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/ObjectCreation/AnonymousObjectCreation.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/ObjectCreation/AnonymousObjectCreation.cs @@ -41,11 +41,11 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions var loc = Context.CreateLocation(init.GetLocation()); var assignment = new Expression(new ExpressionInfo(Context, type, loc, ExprKind.SIMPLE_ASSIGN, objectInitializer, child++, isCompilerGenerated: false, null)); - Create(Context, init.Expression, assignment, 0); Property.Create(Context, property); - - var access = new Expression(new ExpressionInfo(Context, type, loc, ExprKind.PROPERTY_ACCESS, assignment, 1, isCompilerGenerated: false, null)); + var access = new Expression(new ExpressionInfo(Context, type, loc, ExprKind.PROPERTY_ACCESS, assignment, 0, isCompilerGenerated: false, null)); trapFile.expr_access(access, propEntity); + + Create(Context, init.Expression, assignment, 1); } } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Query.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Query.cs index 85a1ceda47c..aadf06f2dee 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Query.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Query.cs @@ -94,12 +94,12 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions child ); - Expression.Create(cx, Expr, decl, 0); - var nameLoc = cx.CreateLocation(name.GetLocation()); - var access = new Expression(new ExpressionInfo(cx, type, nameLoc, ExprKind.LOCAL_VARIABLE_ACCESS, decl, 1, isCompilerGenerated: false, null)); + var access = new Expression(new ExpressionInfo(cx, type, nameLoc, ExprKind.LOCAL_VARIABLE_ACCESS, decl, 0, isCompilerGenerated: false, null)); cx.TrapWriter.Writer.expr_access(access, LocalVariable.Create(cx, variableSymbol)); + Expression.Create(cx, Expr, decl, 1); + return decl; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/VariableDeclaration.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/VariableDeclaration.cs index c44f9e2b946..47ecee3e037 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/VariableDeclaration.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/VariableDeclaration.cs @@ -176,11 +176,11 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions if (d.Initializer is not null) { - Create(cx, d.Initializer.Value, ret, 0); - // Create an access - var access = new Expression(new ExpressionInfo(cx, type, localVar.Location, ExprKind.LOCAL_VARIABLE_ACCESS, ret, 1, isCompilerGenerated: false, null)); + var access = new Expression(new ExpressionInfo(cx, type, localVar.Location, ExprKind.LOCAL_VARIABLE_ACCESS, ret, 0, isCompilerGenerated: false, null)); cx.TrapWriter.Writer.expr_access(access, localVar); + + Create(cx, d.Initializer.Value, ret, 1); } if (d.Parent is VariableDeclarationSyntax decl) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs index 329115f11c7..708c00d2f73 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Field.cs @@ -116,9 +116,9 @@ namespace Semmle.Extraction.CSharp.Entities { var type = Symbol.GetAnnotatedType(); var simpleAssignExpr = new Expression(new ExpressionInfo(Context, type, loc, ExprKind.SIMPLE_ASSIGN, this, child++, isCompilerGenerated: true, constValue)); - Expression.CreateFromNode(new ExpressionNodeInfo(Context, initializer, simpleAssignExpr, 0)); - var access = new Expression(new ExpressionInfo(Context, type, Location, ExprKind.FIELD_ACCESS, simpleAssignExpr, 1, isCompilerGenerated: true, constValue)); + var access = new Expression(new ExpressionInfo(Context, type, Location, ExprKind.FIELD_ACCESS, simpleAssignExpr, 0, isCompilerGenerated: true, constValue)); trapFile.expr_access(access, this); + Expression.CreateFromNode(new ExpressionNodeInfo(Context, initializer, simpleAssignExpr, 1)); return access; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Property.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Property.cs index 57eb5efc007..988ca843927 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Property.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Property.cs @@ -94,9 +94,9 @@ namespace Semmle.Extraction.CSharp.Entities var loc = Context.CreateLocation(initializer!.GetLocation()); var annotatedType = AnnotatedTypeSymbol.CreateNotAnnotated(Symbol.Type); var simpleAssignExpr = new Expression(new ExpressionInfo(Context, annotatedType, loc, ExprKind.SIMPLE_ASSIGN, this, child++, isCompilerGenerated: true, null)); - Expression.CreateFromNode(new ExpressionNodeInfo(Context, initializer.Value, simpleAssignExpr, 0)); - var access = new Expression(new ExpressionInfo(Context, annotatedType, Location, ExprKind.PROPERTY_ACCESS, simpleAssignExpr, 1, isCompilerGenerated: true, null)); + var access = new Expression(new ExpressionInfo(Context, annotatedType, Location, ExprKind.PROPERTY_ACCESS, simpleAssignExpr, 0, isCompilerGenerated: true, null)); trapFile.expr_access(access, this); + Expression.CreateFromNode(new ExpressionNodeInfo(Context, initializer.Value, simpleAssignExpr, 1)); if (!Symbol.IsStatic) { This.CreateImplicit(Context, Symbol.ContainingType, Location, access, -1); From b426c6fb391aedc2dd5bf66a06f03914ffaaa4b3 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 20 Mar 2026 12:25:36 +0100 Subject: [PATCH 24/81] C#: Update the DB scheme to reflect that assign arithmetic- and bitwise operations are operator calls. --- csharp/ql/lib/semmlecode.csharp.dbscheme | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme index e73ca2c93df..7763debea24 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme @@ -1216,7 +1216,8 @@ case @expr.kind of | @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_op_call_expr = @assign_arith_expr | @assign_bitwise_expr +@assign_op_expr = @assign_op_call_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 @@ -1270,14 +1271,15 @@ case @expr.kind of @anonymous_function_expr = @lambda_expr | @anonymous_method_expr; -@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr +@op_invoke_expr = @operator_invocation_expr | @assign_op_call_expr +@call = @method_invocation_expr | @constructor_init_expr | @op_invoke_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; + | @object_creation_expr | @method_invocation_expr | @op_invoke_expr; @throw_element = @throw_expr | @throw_stmt; From 327757dbcba657f58d25bb969d97c3ead51d9c17 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 20 Mar 2026 12:33:57 +0100 Subject: [PATCH 25/81] C#: Update the child indices for assignments, update Assign classes to extend OperatorCall and add AssignOperation classes. --- csharp/ql/lib/semmle/code/csharp/Property.qll | 2 +- csharp/ql/lib/semmle/code/csharp/Variable.qll | 2 +- .../semmle/code/csharp/exprs/Assignment.qll | 59 ++++----- .../ql/lib/semmle/code/csharp/exprs/Call.qll | 8 +- .../lib/semmle/code/csharp/exprs/Dynamic.qll | 8 +- .../ql/lib/semmle/code/csharp/exprs/Expr.qll | 21 +-- .../semmle/code/csharp/exprs/Operation.qll | 122 ++++++++++++++++++ 7 files changed, 163 insertions(+), 59 deletions(-) create mode 100644 csharp/ql/lib/semmle/code/csharp/exprs/Operation.qll diff --git a/csharp/ql/lib/semmle/code/csharp/Property.qll b/csharp/ql/lib/semmle/code/csharp/Property.qll index 88665280d5b..bbd4fdd9d8e 100644 --- a/csharp/ql/lib/semmle/code/csharp/Property.qll +++ b/csharp/ql/lib/semmle/code/csharp/Property.qll @@ -226,7 +226,7 @@ class Property extends DeclarationWithGetSetAccessors, @property { * } * ``` */ - Expr getInitializer() { result = this.getChildExpr(1).getChildExpr(0) } + Expr getInitializer() { result = this.getChildExpr(1).getChildExpr(1) } /** * Holds if this property has an initial value. For example, the initial diff --git a/csharp/ql/lib/semmle/code/csharp/Variable.qll b/csharp/ql/lib/semmle/code/csharp/Variable.qll index 746ea6acd2f..6d59816373d 100644 --- a/csharp/ql/lib/semmle/code/csharp/Variable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Variable.qll @@ -408,7 +408,7 @@ class Field extends Variable, AssignableMember, Attributable, TopLevelExprParent * } * ``` */ - final override Expr getInitializer() { result = this.getChildExpr(0).getChildExpr(0) } + final override Expr getInitializer() { result = this.getChildExpr(0).getChildExpr(1) } /** * Holds if this field has an initial value. For example, the initial diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll index 9fa2a93724d..baf366be1ba 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll @@ -17,18 +17,14 @@ class Assignment extends BinaryOperation, @assign_expr { implies // Same as `this.(LocalVariableDeclExpr).hasInitializer()` but avoids // negative recursion - expr_parent(_, 0, this) + expr_parent(_, 1, this) } - override Expr getLeftOperand() { result = this.getChild(1) } - - override Expr getRightOperand() { result = this.getChild(0) } - /** Gets the left operand of this assignment. */ - Expr getLValue() { result = this.getChild(1) } + Expr getLValue() { result = this.getLeftOperand() } /** Gets the right operand of this assignment. */ - Expr getRValue() { result = this.getChild(0) } + Expr getRValue() { result = this.getRightOperand() } /** Gets the variable being assigned to, if any. */ Variable getTargetVariable() { result.getAnAccess() = this.getLValue() } @@ -64,37 +60,33 @@ class AssignExpr extends Assignment, @simple_assign_expr { /** * An assignment operation. Either an arithmetic assignment operation - * (`AssignArithmeticOperation`), a bitwise assignment operation - * (`AssignBitwiseOperation`), or an event assignment (`AddOrRemoveEventExpr`). + * (`AssignArithmeticOperation`), a bitwise assignment operation or + * (`AssignBitwiseOperation`), an event assignment (`AddOrRemoveEventExpr`), or + * a null-coalescing assignment (`AssignCoalesceExpr`). */ class AssignOperation extends Assignment, @assign_op_expr { override string getOperator() { none() } /** - * Gets the expanded version of this assignment operation, if any. - * - * For example, if this assignment operation is `x += y` then - * the expanded assignment is `x = x + y`. - * - * If an expanded version exists, then it is used in the control - * flow graph. + * Expanded versions of compound assignments are no longer extracted. */ - AssignExpr getExpandedAssignment() { expr_parent(result, 2, this) } + deprecated AssignExpr getExpandedAssignment() { none() } /** - * Holds if this assignment operation has an expanded version. - * - * For example, if this assignment operation is `x += y` then - * it has the expanded version `x = x + y`. - * - * If an expanded version exists, then it is used in the control - * flow graph. + * Expanded versions of compound assignments are no longer extracted. */ - predicate hasExpandedAssignment() { exists(this.getExpandedAssignment()) } + deprecated predicate hasExpandedAssignment() { none() } override string toString() { result = "... " + this.getOperator() + " ..." } } +/** + * An assignment operation that corresponds to an operator call, for example `x += y` corresponds to `x = x + y`. + */ +class AssignCallOperation extends AssignOperation, OperatorCall, @assign_op_call_expr { + override string toString() { result = "... " + this.getOperator() + " ..." } +} + /** * An arithmetic assignment operation. Either an addition assignment operation * (`AssignAddExpr`), a subtraction assignment operation (`AssignSubExpr`), a @@ -102,7 +94,7 @@ class AssignOperation extends Assignment, @assign_op_expr { * operation (`AssignDivExpr`), or a remainder assignment operation * (`AssignRemExpr`). */ -class AssignArithmeticOperation extends AssignOperation, @assign_arith_expr { } +class AssignArithmeticOperation extends AssignCallOperation, @assign_arith_expr { } /** * An addition assignment operation, for example `x += y`. @@ -158,7 +150,7 @@ class AssignRemExpr extends AssignArithmeticOperation, @assign_rem_expr { * operation (`AssignRightShiftExpr`), or an unsigned right-shift assignment * operation (`AssignUnsignedRightShiftExpr`). */ -class AssignBitwiseOperation extends AssignOperation, @assign_bitwise_expr { } +class AssignBitwiseOperation extends AssignCallOperation, @assign_bitwise_expr { } /** * A bitwise-and assignment operation, for example `x &= y`. @@ -208,12 +200,17 @@ class AssignRightShiftExpr extends AssignBitwiseOperation, @assign_rshift_expr { /** * An unsigned right-shift assignment operation, for example `x >>>= y`. */ -class AssignUnsighedRightShiftExpr extends AssignBitwiseOperation, @assign_urshift_expr { +class AssignUnsignedRightShiftExpr extends AssignBitwiseOperation, @assign_urshift_expr { override string getOperator() { result = ">>>=" } - override string getAPrimaryQlClass() { result = "AssignUnsighedRightShiftExpr" } + override string getAPrimaryQlClass() { result = "AssignUnsignedRightShiftExpr" } } +/** + * DEPRECATED: Use `AssignUnsignedRightShiftExpr` instead. + */ +deprecated class AssignUnsighedRightShiftExpr = AssignUnsignedRightShiftExpr; + /** * An event assignment. Either an event addition (`AddEventExpr`) or an event * removal (`RemoveEventExpr`). @@ -222,9 +219,9 @@ class AddOrRemoveEventExpr extends AssignOperation, @assign_event_expr { /** Gets the event targeted by this event assignment. */ Event getTarget() { result = this.getLValue().getTarget() } - override EventAccess getLValue() { result = this.getChild(1) } + override EventAccess getLValue() { result = this.getChild(0) } - override Expr getRValue() { result = this.getChild(0) } + override EventAccess getLeftOperand() { result = this.getChild(0) } } /** diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll index f8b51a990ed..912cb23e06b 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll @@ -493,12 +493,16 @@ class ConstructorInitializer extends Call, @constructor_init_expr { * } * ``` */ -class OperatorCall extends Call, LateBindableExpr, @operator_invocation_expr { +class OperatorCall extends Call, LateBindableExpr, @op_invoke_expr { override Operator getTarget() { expr_call(this, result) } override Operator getARuntimeTarget() { result = Call.super.getARuntimeTarget() } - override string toString() { result = "call to operator " + this.getTarget().getName() } + override string toString() { + if this instanceof DynamicOperatorCall + then result = "dynamic call to operator " + this.getLateBoundTargetName() + else result = "call to operator " + this.getTarget().getName() + } override string getAPrimaryQlClass() { result = "OperatorCall" } } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll index 04ea9f062a5..bfc5c36ff37 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll @@ -96,13 +96,7 @@ class DynamicMethodCall extends DynamicExpr, MethodCall { * Unlike an ordinary call to a user-defined operator (`OperatorCall`), the * target operator may not be known at compile-time (as in the example above). */ -class DynamicOperatorCall extends DynamicExpr, OperatorCall { - override string toString() { - result = "dynamic call to operator " + this.getLateBoundTargetName() - } - - override string getAPrimaryQlClass() { result = "DynamicOperatorCall" } -} +class DynamicOperatorCall extends DynamicExpr, OperatorCall { } /** * A call to a user-defined mutator operator where the operand is a `dynamic` diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll index c3b9bcc363b..66764d06479 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll @@ -14,6 +14,7 @@ import Creation import Dynamic import Literal import LogicalOperation +import Operation import semmle.code.csharp.controlflow.ControlFlowElement import semmle.code.csharp.Location import semmle.code.csharp.Stmt @@ -65,25 +66,11 @@ class Expr extends ControlFlowElement, @expr { /** Gets the enclosing callable of this expression, if any. */ override Callable getEnclosingCallable() { enclosingCallable(this, result) } - pragma[nomagic] - private predicate isExpandedAssignmentRValueDescendant() { - this = - any(AssignOperation op).getExpandedAssignment().getRValue().getChildExpr(0).getAChildExpr() - or - exists(Expr parent | - parent.isExpandedAssignmentRValueDescendant() and - this = parent.getAChildExpr() - ) - } - /** * Holds if this expression is generated by the compiler and does not appear * explicitly in the source code. */ - final predicate isImplicit() { - compiler_generated(this) or - this.isExpandedAssignmentRValueDescendant() - } + final predicate isImplicit() { compiler_generated(this) } /** * Gets an expression that is the result of stripping (recursively) all @@ -168,7 +155,7 @@ class LocalVariableDeclExpr extends Expr, @local_var_decl_expr { string getName() { result = this.getVariable().getName() } /** Gets the initializer expression of this local variable declaration, if any. */ - Expr getInitializer() { result = this.getChild(0) } + Expr getInitializer() { result = this.getChild(1) } /** Holds if this local variable declaration has an initializer. */ predicate hasInitializer() { exists(this.getInitializer()) } @@ -188,7 +175,7 @@ class LocalVariableDeclExpr extends Expr, @local_var_decl_expr { /** Gets the variable access used in this declaration, if any. */ LocalVariableAccess getAccess() { - result = this.getChild(1) or + result = this.getChild(0) or result = this // `out` argument } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Operation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Operation.qll new file mode 100644 index 00000000000..3310fe4de1a --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Operation.qll @@ -0,0 +1,122 @@ +/** + * Provides classes for operations that also have compound assignment forms. + */ + +import Expr + +/** A binary operation that involves a null-coalescing operation. */ +abstract private class NullCoalescingOperationImpl extends BinaryOperation { } + +final class NullCoalescingOperation = NullCoalescingOperationImpl; + +private class AddNullCoalescingExpr extends NullCoalescingOperationImpl instanceof NullCoalescingExpr +{ } + +private class AddAssignCoalesceExpr extends NullCoalescingOperationImpl instanceof AssignCoalesceExpr +{ } + +/** A binary operations that involves an addition operation. */ +abstract private class AddOperationImpl extends BinaryOperation { } + +final class AddOperation = AddOperationImpl; + +private class AddAddExpr extends AddOperationImpl instanceof AddExpr { } + +private class AddAssignExpr extends AddOperationImpl instanceof AssignAddExpr { } + +/** A binary operation that involves a subtraction operation. */ +abstract private class SubOperationImpl extends BinaryOperation { } + +final class SubOperation = SubOperationImpl; + +private class AddSubExpr extends SubOperationImpl instanceof SubExpr { } + +private class AddSubAssignExpr extends SubOperationImpl instanceof AssignSubExpr { } + +/** A binary operation that involves a multiplication operation. */ +abstract private class MulOperationImpl extends BinaryOperation { } + +final class MulOperation = MulOperationImpl; + +private class AddMulExpr extends MulOperationImpl instanceof MulExpr { } + +private class AddMulAssignExpr extends MulOperationImpl instanceof AssignMulExpr { } + +/** A binary operation that involves a division operation. */ +abstract private class DivOperationImpl extends BinaryOperation { + /** Gets the denominator of this division operation. */ + Expr getDenominator() { result = this.getRightOperand() } +} + +final class DivOperation = DivOperationImpl; + +private class AddDivExpr extends DivOperationImpl instanceof DivExpr { } + +private class AddDivAssignExpr extends DivOperationImpl instanceof AssignDivExpr { } + +/** A binary operation that involves a remainder operation. */ +abstract private class RemOperationImpl extends BinaryOperation { } + +final class RemOperation = RemOperationImpl; + +private class AddRemExpr extends RemOperationImpl instanceof RemExpr { } + +private class AddRemAssignExpr extends RemOperationImpl instanceof AssignRemExpr { } + +/** A binary operation that involves a bitwise AND operation. */ +abstract private class BitwiseAndOperationImpl extends BinaryOperation { } + +final class BitwiseAndOperation = BitwiseAndOperationImpl; + +private class AddBitwiseAndExpr extends BitwiseAndOperationImpl instanceof BitwiseAndExpr { } + +private class AddAssignBitwiseAndExpr extends BitwiseAndOperationImpl instanceof AssignAndExpr { } + +/** A binary operation that involves a bitwise OR operation. */ +abstract private class BitwiseOrOperationImpl extends BinaryOperation { } + +final class BitwiseOrOperation = BitwiseOrOperationImpl; + +private class AddBitwiseOrExpr extends BitwiseOrOperationImpl instanceof BitwiseOrExpr { } + +private class AddAssignBitwiseOrExpr extends BitwiseOrOperationImpl instanceof AssignOrExpr { } + +/** A binary operation that involves a bitwise XOR operation. */ +abstract private class BitwiseXorOperationImpl extends BinaryOperation { } + +final class BitwiseXorOperation = BitwiseXorOperationImpl; + +private class AddBitwiseXorExpr extends BitwiseXorOperationImpl instanceof BitwiseXorExpr { } + +private class AddAssignBitwiseXorExpr extends BitwiseXorOperationImpl instanceof AssignXorExpr { } + +/** A binary operation that involves a left shift operation. */ +abstract private class LeftShiftOperationImpl extends BinaryOperation { } + +final class LeftShiftOperation = LeftShiftOperationImpl; + +private class AddLeftShiftExpr extends LeftShiftOperationImpl instanceof LeftShiftExpr { } + +private class AddAssignLeftShiftExpr extends LeftShiftOperationImpl instanceof AssignLeftShiftExpr { +} + +/** A binary operation that involves a right shift operation. */ +abstract private class RightShiftOperationImpl extends BinaryOperation { } + +final class RightShiftOperation = RightShiftOperationImpl; + +private class AddRightShiftExpr extends RightShiftOperationImpl instanceof RightShiftExpr { } + +private class AddAssignRightShiftExpr extends RightShiftOperationImpl instanceof AssignRightShiftExpr +{ } + +/** A binary operation that involves a unsigned right shift operation. */ +abstract private class UnsignedRightShiftOperationImpl extends BinaryOperation { } + +final class UnsignedRightShiftOperation = UnsignedRightShiftOperationImpl; + +private class AddUnsignedRightShiftExpr extends UnsignedRightShiftOperationImpl instanceof UnsignedRightShiftExpr +{ } + +private class AddAssignUnsignedRightShiftExpr extends UnsignedRightShiftOperationImpl instanceof AssignUnsignedRightShiftExpr +{ } From 2a781832387dfaaa4b28e59d6c9a79c843fea0c9 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 20 Mar 2026 12:38:10 +0100 Subject: [PATCH 26/81] C#: Deprecate the expanded assignment predicate as we no longer extract expanded assignments. --- .../semmle/code/csharp/ExprOrStmtParent.qll | 58 +------------------ 1 file changed, 3 insertions(+), 55 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll index 5afacf608a8..ae9ed04e018 100644 --- a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll +++ b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll @@ -20,7 +20,7 @@ class ExprOrStmtParent extends Element, @exprorstmt_parent { /** Gets the `i`th child expression of this element (zero-based). */ final Expr getChildExpr(int i) { - expr_parent_adjusted(result, i, this) or + expr_parent(result, i, this) or expr_parent_top_level_adjusted(result, i, this) } @@ -119,66 +119,14 @@ private module Cached { } /** - * The `expr_parent()` relation adjusted for expandable assignments. For example, - * the assignment `x += y` is extracted as - * - * ``` - * += - * | - * 2 - * | - * = - * / \ - * 1 0 - * / \ - * x + - * / \ - * 1 0 - * / \ - * x y - * ``` - * - * in order to be able to retrieve the expanded assignment `x = x + y` as the 2nd - * child. This predicate changes the diagram above into - * - * ``` - * += - * / \ - * 1 0 - * / \ - * x y - * ``` + * Use `expr_parent` instead. */ cached - predicate expr_parent_adjusted(Expr child, int i, ControlFlowElement parent) { - if parent instanceof AssignOperation - then - parent = - any(AssignOperation ao | - exists(AssignExpr ae | ae = ao.getExpandedAssignment() | - i = 0 and - exists(Expr right | - // right = `x + y` - expr_parent(right, 0, ae) - | - expr_parent(child, 1, right) - ) - or - i = 1 and - expr_parent(child, 1, ae) - ) - or - not ao.hasExpandedAssignment() and - expr_parent(child, i, parent) - ) - else expr_parent(child, i, parent) - } + deprecated predicate expr_parent_adjusted(Expr child, int i, ControlFlowElement parent) { none() } private Expr getAChildExpr(ExprOrStmtParent parent) { result = parent.getAChildExpr() and not result = parent.(DeclarationWithGetSetAccessors).getExpressionBody() - or - result = parent.(AssignOperation).getExpandedAssignment() } private ControlFlowElement getAChild(ExprOrStmtParent parent) { From e2afb000b251feff563431e3178925e247895bae Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 20 Mar 2026 12:42:30 +0100 Subject: [PATCH 27/81] C#: Cleaup expanded assignments from the dispatch logic. --- csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll index a83967441d7..f7f6c7a50be 100644 --- a/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll +++ b/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll @@ -202,11 +202,9 @@ private module Internal { private predicate isPotentialEventCall( AssignArithmeticOperation aao, DynamicMemberAccess dma, string name ) { - exists(DynamicOperatorCall doc, AssignExpr ae | - ae = aao.getExpandedAssignment() and - dma = ae.getLValue() and - doc = ae.getRValue() - | + aao instanceof DynamicOperatorCall and + dma = aao.getLeftOperand() and + ( aao instanceof AssignAddExpr and name = "add_" + dma.getLateBoundTargetName() or From 569e33b407f4f18d70faa60daba728d1cffc050b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 20 Mar 2026 12:45:22 +0100 Subject: [PATCH 28/81] C#: Introduce a new kind of assignable definitions for compound assignments (those that was previously covered by expanded assignments). --- .../ql/lib/semmle/code/csharp/Assignable.qll | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/Assignable.qll b/csharp/ql/lib/semmle/code/csharp/Assignable.qll index 3c7170a6f84..a0e575218ad 100644 --- a/csharp/ql/lib/semmle/code/csharp/Assignable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Assignable.qll @@ -78,6 +78,8 @@ class AssignableRead extends AssignableAccess { this.isRefArgument() or this = any(AssignableDefinitions::AddressOfDefinition def).getTargetAccess() + or + this = any(AssignableDefinitions::AssignOperationDefinition def).getTargetAccess() ) and not nameOfChild(_, this) } @@ -271,6 +273,8 @@ module AssignableInternal { def = TAddressOfDefinition(result) or def = TPatternDefinition(result) + or + def = TAssignOperationDefinition(result) } /** A local variable declaration at the top-level of a pattern. */ @@ -286,7 +290,11 @@ module AssignableInternal { private module Cached { cached newtype TAssignableDefinition = - TAssignmentDefinition(Assignment a) { not a.getLValue() instanceof TupleExpr } or + TAssignmentDefinition(Assignment a) { + not a.getLValue() instanceof TupleExpr and + not a instanceof AssignCallOperation and + not a instanceof AssignCoalesceExpr + } or TTupleAssignmentDefinition(AssignExpr ae, Expr leaf) { tupleAssignmentDefinition(ae, leaf) } or TOutRefDefinition(AssignableAccess aa) { aa.isOutArgument() @@ -309,7 +317,11 @@ module AssignableInternal { ) } or TAddressOfDefinition(AddressOfExpr aoe) or - TPatternDefinition(TopLevelPatternDecl tlpd) + TPatternDefinition(TopLevelPatternDecl tlpd) or + TAssignOperationDefinition(AssignOperation ao) { + ao instanceof AssignCallOperation or + ao instanceof AssignCoalesceExpr + } /** * Gets the source expression assigned in tuple definition `def`, if any. @@ -355,6 +367,8 @@ module AssignableInternal { def = TMutationDefinition(any(MutatorOperation mo | mo.getOperand() = result)) or def = TAddressOfDefinition(any(AddressOfExpr aoe | aoe.getOperand() = result)) + or + def = TAssignOperationDefinition(any(AssignOperation ao | ao.getLeftOperand() = result)) } /** @@ -369,8 +383,10 @@ module AssignableInternal { or exists(Assignment ass | ac = ass.getLValue() | result = ass.getRValue() and - not ass.(AssignOperation).hasExpandedAssignment() + not ass instanceof AssignOperation ) + or + exists(AssignOperation ao | ac = ao.getLeftOperand() | result = ao) } } @@ -388,8 +404,9 @@ private import AssignableInternal * a mutation update (`AssignableDefinitions::MutationDefinition`), a local variable * declaration without an initializer (`AssignableDefinitions::LocalVariableDefinition`), * an implicit parameter definition (`AssignableDefinitions::ImplicitParameterDefinition`), - * an address-of definition (`AssignableDefinitions::AddressOfDefinition`), or a pattern - * definition (`AssignableDefinitions::PatternDefinition`). + * an address-of definition (`AssignableDefinitions::AddressOfDefinition`), a pattern + * definition (`AssignableDefinitions::PatternDefinition`), or a compound assignment + * operation definition (`AssignableDefinitions::AssignOperationDefinition`) */ class AssignableDefinition extends TAssignableDefinition { /** @@ -511,7 +528,7 @@ module AssignableDefinitions { override Expr getSource() { result = a.getRValue() and - not a instanceof AssignOperation + not a instanceof AddOrRemoveEventExpr } override string toString() { result = a.toString() } @@ -735,4 +752,17 @@ module AssignableDefinitions { /** Gets the assignable (field or property) being initialized. */ Assignable getAssignable() { result = fieldOrProp } } + + /** + * A definition by a compound assignment operation, for example `x += y`. + */ + class AssignOperationDefinition extends AssignableDefinition, TAssignOperationDefinition { + AssignOperation ao; + + AssignOperationDefinition() { this = TAssignOperationDefinition(ao) } + + override Expr getSource() { result = ao } + + override string toString() { result = ao.toString() } + } } From 149df86ce2666d647c65a16fd107758db252eda0 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 20 Mar 2026 12:50:30 +0100 Subject: [PATCH 29/81] C#: Update the CFG implementation based on the new operations and remove hack that rotates children of assignments. --- .../internal/ControlFlowGraphImpl.qll | 47 +++---------------- 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll index 0bdf1f795db..e29e92d26eb 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll @@ -62,18 +62,13 @@ class CfgScope extends Element, @top_level_exprorstmt_parent { private class TAstNode = @callable or @control_flow_element; -private Element getAChild(Element p) { - result = p.getAChild() or - result = p.(AssignOperation).getExpandedAssignment() -} - pragma[nomagic] private predicate astNode(Element e) { e = any(@top_level_exprorstmt_parent p | not p instanceof Attribute) or exists(Element parent | astNode(parent) and - e = getAChild(parent) + e = parent.getAChild() ) } @@ -447,7 +442,6 @@ module Expressions { private AstNode getExprChild0(Expr e, int i) { not e instanceof NameOfExpr and not e instanceof QualifiableExpr and - not e instanceof Assignment and not e instanceof AnonymousFunctionExpr and result = e.getChild(i) or @@ -458,14 +452,6 @@ module Expressions { not qe instanceof ExtensionMethodCall and result = qe.getChild(i) ) - or - e = - any(Assignment a | - // The left-hand side of an assignment is evaluated before the right-hand side - i = 0 and result = a.getLValue() - or - i = 1 and result = a.getRValue() - ) } private AstNode getExprChild(Expr e, int i) { @@ -491,9 +477,8 @@ module Expressions { not this instanceof LogicalNotExpr and not this instanceof LogicalAndExpr and not this instanceof LogicalOrExpr and - not this instanceof NullCoalescingExpr and + not this instanceof NullCoalescingOperation and not this instanceof ConditionalExpr and - not this instanceof AssignOperationWithExpandedAssignment and not this instanceof ConditionallyQualifiedExpr and not this instanceof ThrowExpr and not this instanceof ObjectCreation and @@ -590,8 +575,7 @@ module Expressions { QualifiedAccessorWrite() { def.getExpr() = this and def.getTargetAccess().(WriteAccess) instanceof QualifiableExpr and - not def instanceof AssignableDefinitions::OutRefDefinition and - not this instanceof AssignOperationWithExpandedAssignment + not def instanceof AssignableDefinitions::OutRefDefinition } /** @@ -723,7 +707,8 @@ module Expressions { } } - private class NullCoalescingExprTree extends PostOrderTree instanceof NullCoalescingExpr { + private class NullCoalescingOperationTree extends PostOrderTree instanceof NullCoalescingOperation + { final override predicate propagatesAbnormal(AstNode child) { child in [super.getLeftOperand(), super.getRightOperand()] } @@ -774,26 +759,6 @@ module Expressions { } } - /** - * An assignment operation that has an expanded version. We use the expanded - * version in the control flow graph in order to get better data flow / taint - * tracking. - */ - private class AssignOperationWithExpandedAssignment extends ControlFlowTree instanceof AssignOperation - { - private Expr expanded; - - AssignOperationWithExpandedAssignment() { expanded = this.getExpandedAssignment() } - - final override predicate first(AstNode first) { first(expanded, first) } - - final override predicate last(AstNode last, Completion c) { last(expanded, last, c) } - - final override predicate propagatesAbnormal(AstNode child) { none() } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - /** A conditionally qualified expression. */ private class ConditionallyQualifiedExpr extends PostOrderTree instanceof QualifiableExpr { private Expr qualifier; @@ -1551,7 +1516,7 @@ module Statements { /** Gets a child of `cfe` that is in CFG scope `scope`. */ pragma[noinline] private ControlFlowElement getAChildInScope(AstNode cfe, Callable scope) { - result = getAChild(cfe) and + result = cfe.getAChild() and scope = result.getEnclosingCallable() } From 51673312c5e16f17cc83943c70b0e3c16dabb928 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 20 Mar 2026 13:00:33 +0100 Subject: [PATCH 30/81] C#: Upgrade libraries and queries to use the new Operation classes. --- .../src/ModifiedFnvFunctionDetection.ql | 13 +--- .../Cryptography/NonCryptographicHashes.qll | 2 +- .../semmle/code/csharp/commons/Strings.qll | 5 ++ .../semmle/code/csharp/controlflow/Guards.qll | 37 +++++------ .../controlflow/internal/Completion.qll | 16 ++--- .../csharp/controlflow/internal/Splitting.qll | 2 +- .../semmle/code/csharp/dataflow/Nullness.qll | 2 +- .../dataflow/internal/DataFlowPrivate.qll | 4 +- .../internal/TaintTrackingPrivate.qll | 2 +- .../rangeanalysis/ModulusAnalysisSpecific.qll | 12 ++-- .../internal/rangeanalysis/RangeUtils.qll | 63 +++++++++++-------- .../rangeanalysis/SignAnalysisSpecific.qll | 7 ++- .../internal/rangeanalysis/SsaUtils.qll | 4 +- .../code/csharp/frameworks/system/Xml.qll | 2 +- .../semmle/code/csharp/metrics/Complexity.qll | 2 +- .../Control-Flow/ConstantCondition.ql | 4 +- csharp/ql/src/Complexity/ComplexCondition.ql | 29 +++++++-- csharp/ql/src/Dead Code/DeadStoreOfLocal.ql | 2 + .../UselessNullCoalescingExpression.ql | 12 ++-- .../Collections/WriteOnlyContainer.ql | 4 +- .../DangerousNonShortCircuitLogic.ql | 1 - .../Likely Bugs/PossibleLossOfPrecision.ql | 8 +-- .../Performance/StringConcatenationInLoop.ql | 1 - .../CWE-119/LocalUnvalidatedArithmetic.ql | 2 +- .../Security Features/InsecureRandomness.ql | 6 +- .../experimental/CWE-918/RequestForgery.qll | 2 +- .../CWE-759/HashWithoutSalt.ql | 2 +- 27 files changed, 138 insertions(+), 108 deletions(-) diff --git a/csharp/ql/campaigns/Solorigate/src/ModifiedFnvFunctionDetection.ql b/csharp/ql/campaigns/Solorigate/src/ModifiedFnvFunctionDetection.ql index e09d00807e6..ca153bfb97d 100644 --- a/csharp/ql/campaigns/Solorigate/src/ModifiedFnvFunctionDetection.ql +++ b/csharp/ql/campaigns/Solorigate/src/ModifiedFnvFunctionDetection.ql @@ -16,16 +16,9 @@ import experimental.code.csharp.Cryptography.NonCryptographicHashes from Variable v, Literal l, LoopStmt loop, Expr additional_xor where maybeUsedInFnvFunction(v, _, _, loop) and - ( - exists(BitwiseXorExpr xor2 | xor2.getAnOperand() = l and additional_xor = xor2 | - loop.getAControlFlowExitNode().getASuccessor*() = xor2.getAControlFlowNode() and - xor2.getAnOperand() = v.getAnAccess() - ) - or - exists(AssignXorExpr xor2 | xor2.getAnOperand() = l and additional_xor = xor2 | - loop.getAControlFlowExitNode().getASuccessor*() = xor2.getAControlFlowNode() and - xor2.getAnOperand() = v.getAnAccess() - ) + exists(BitwiseXorOperation xor2 | xor2.getAnOperand() = l and additional_xor = xor2 | + loop.getAControlFlowExitNode().getASuccessor*() = xor2.getAControlFlowNode() and + xor2.getAnOperand() = v.getAnAccess() ) select l, "This literal is used in an $@ after an FNV-like hash calculation with variable $@.", additional_xor, "additional xor", v, v.toString() diff --git a/csharp/ql/lib/experimental/code/csharp/Cryptography/NonCryptographicHashes.qll b/csharp/ql/lib/experimental/code/csharp/Cryptography/NonCryptographicHashes.qll index 49dd011658d..b09251cf6e4 100644 --- a/csharp/ql/lib/experimental/code/csharp/Cryptography/NonCryptographicHashes.qll +++ b/csharp/ql/lib/experimental/code/csharp/Cryptography/NonCryptographicHashes.qll @@ -48,7 +48,7 @@ private predicate maybeUsedInElfHashFunction(Variable v, Operation xor, Operatio Expr e1, Expr e2, AssignExpr addAssign, AssignExpr xorAssign, Operation notOp, AssignExpr notAssign | - (add instanceof AddExpr or add instanceof AssignAddExpr) and + add instanceof AddOperation and e1.getAChild*() = add.getAnOperand() and e1 instanceof BinaryBitwiseOperation and e2 = e1.(BinaryBitwiseOperation).getLeftOperand() and diff --git a/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll b/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll index bdf9e558539..678a1f92816 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll @@ -49,6 +49,11 @@ class ImplicitToStringExpr extends Expr { this = add.getOtherOperand(o).stripImplicit() ) or + exists(AssignAddExpr add, Expr o | o = add.getLeftOperand() | + o.stripImplicit().getType() instanceof StringType and + this = add.getRightOperand().stripImplicit() + ) + or this = any(InterpolatedStringExpr ise).getAnInsert().stripImplicit() } } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 40ec3722edd..03a5aa7e2b7 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -119,14 +119,14 @@ private module GuardsInput implements class AndExpr extends BinExpr { AndExpr() { this instanceof LogicalAndExpr or - this instanceof BitwiseAndExpr + this instanceof BitwiseAndOperation } } class OrExpr extends BinExpr { OrExpr() { this instanceof LogicalOrExpr or - this instanceof BitwiseOrExpr + this instanceof BitwiseOrOperation } } @@ -292,7 +292,7 @@ private module LogicInput implements GuardsImpl::LogicInputSig { v1.isNonNullValue() and v2 = v1 or - g2 = g1.(NullCoalescingExpr).getAnOperand() and + g2 = g1.(NullCoalescingOperation).getAnOperand() and v1.isNullValue() and v2 = v1 or @@ -840,14 +840,14 @@ module Internal { or e1 = e2.(Cast).getExpr() or - e2 = e1.(NullCoalescingExpr).getAnOperand() + e2 = e1.(NullCoalescingOperation).getAnOperand() } /** Holds if expression `e3` is a `null` value whenever `e1` and `e2` are. */ predicate nullValueImpliedBinary(Expr e1, Expr e2, Expr e3) { e3 = any(ConditionalExpr ce | e1 = ce.getThen() and e2 = ce.getElse()) or - e3 = any(NullCoalescingExpr nce | e1 = nce.getLeftOperand() and e2 = nce.getRightOperand()) + e3 = any(NullCoalescingOperation no | e1 = no.getLeftOperand() and e2 = no.getRightOperand()) } predicate nullValueImplied(Expr e) { @@ -907,7 +907,7 @@ module Internal { or // "In string concatenation operations, the C# compiler treats a null string the same as an empty string." // (https://docs.microsoft.com/en-us/dotnet/csharp/how-to/concatenate-multiple-strings) - e instanceof AddExpr and + e instanceof AddOperation and e.getType() instanceof StringType or e.(DefaultValueExpr).getType().isValueType() @@ -922,11 +922,9 @@ module Internal { /** Holds if expression `e2` is a non-`null` value whenever `e1` is. */ predicate nonNullValueImpliedUnary(Expr e1, Expr e2) { - e1 = e2.(CastExpr).getExpr() - or - e1 = e2.(AssignExpr).getRValue() - or - e1 = e2.(NullCoalescingExpr).getAnOperand() + e1 = e2.(CastExpr).getExpr() or + e1 = e2.(AssignExpr).getRValue() or + e1 = e2.(NullCoalescingOperation).getAnOperand() } /** @@ -953,10 +951,13 @@ module Internal { ) or // In C#, `null + 1` has type `int?` with value `null` - exists(BinaryArithmeticOperation bao, Expr o | - result = bao and - bao.getAnOperand() = e and - bao.getAnOperand() = o and + exists(BinaryOperation bo, Expr o | + bo instanceof BinaryArithmeticOperation or + bo instanceof AssignArithmeticOperation + | + result = bo and + bo.getAnOperand() = e and + bo.getAnOperand() = o and // The other operand must be provably non-null in order // for `only if` to hold nonNullValueImplied(o) and @@ -972,10 +973,10 @@ module Internal { any(QualifiableExpr qe | qe.isConditional() and result = qe.getQualifier() - ) - or + ) or // In C#, `null + 1` has type `int?` with value `null` - e = any(BinaryArithmeticOperation bao | result = bao.getAnOperand()) + e = any(BinaryArithmeticOperation bao | result = bao.getAnOperand()) or + e = any(AssignArithmeticOperation aao | result = aao.getAnOperand()) } deprecated predicate isGuard(Expr e, GuardValue val) { 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 ab8bb233e2c..e734e79402b 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll @@ -344,7 +344,7 @@ private class TriedControlFlowElement extends ControlFlowElement { result instanceof SystemOutOfMemoryExceptionClass or this = - any(AddExpr ae | + any(AddOperation ae | ae.getType() instanceof StringType and result instanceof SystemOutOfMemoryExceptionClass or @@ -353,24 +353,24 @@ private class TriedControlFlowElement extends ControlFlowElement { ) or this = - any(SubExpr se | + any(SubOperation se | se.getType() instanceof IntegralType and result instanceof SystemOverflowExceptionClass ) or this = - any(MulExpr me | + any(MulOperation me | me.getType() instanceof IntegralType and result instanceof SystemOverflowExceptionClass ) or this = - any(DivExpr de | + any(DivOperation de | not de.getDenominator().getValue().toFloat() != 0 and result instanceof SystemDivideByZeroExceptionClass ) or - this instanceof RemExpr and + this instanceof RemOperation and result instanceof SystemDivideByZeroExceptionClass or this instanceof DynamicExpr and @@ -447,7 +447,7 @@ private predicate inBooleanContext(Expr e) { e in [ce.getThen(), ce.getElse()] ) or - e = any(NullCoalescingExpr nce | inBooleanContext(nce)).getAnOperand() + e = any(NullCoalescingOperation nce | inBooleanContext(nce)).getAnOperand() or e = any(SwitchExpr se | inBooleanContext(se)).getACase() or @@ -467,13 +467,13 @@ private predicate mustHaveNullnessCompletion(Expr e) { * that `e` evaluates to determines a `null`/non-`null` branch successor. */ private predicate inNullnessContext(Expr e) { - e = any(NullCoalescingExpr nce).getLeftOperand() + e = any(NullCoalescingOperation nce).getLeftOperand() or exists(QualifiableExpr qe | qe.isConditional() | e = qe.getChildExpr(-1)) or exists(ConditionalExpr ce | inNullnessContext(ce) | (e = ce.getThen() or e = ce.getElse())) or - exists(NullCoalescingExpr nce | inNullnessContext(nce) | e = nce.getRightOperand()) + exists(NullCoalescingOperation nce | inNullnessContext(nce) | e = nce.getRightOperand()) or e = any(SwitchExpr se | inNullnessContext(se)).getACase() or diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll index 55b75ed31a7..173179216f3 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll @@ -95,7 +95,7 @@ module ConditionalCompletionSplitting { child = parent.(SwitchCaseExpr).getBody() or parent = - any(NullCoalescingExpr nce | + any(NullCoalescingOperation nce | if childCompletion instanceof NullnessCompletion then child = nce.getRightOperand() else child = nce.getAnOperand() diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll index c7ac34d3d01..a82779eaa5d 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll @@ -42,7 +42,7 @@ private Expr maybeNullExpr(Expr reason) { ce.getElse() = maybeNullExpr(reason) ) or - result.(NullCoalescingExpr).getRightOperand() = maybeNullExpr(reason) + result.(NullCoalescingOperation).getRightOperand() = maybeNullExpr(reason) or result = any(QualifiableExpr qe | 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 03164960d41..afb09f85835 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -512,7 +512,7 @@ module LocalFlow { predicate localExprStep(Expr e1, Expr e2) { e1 = e2.(ParenthesizedExpr).getExpr() or - e1 = e2.(NullCoalescingExpr).getAnOperand() + e1 = e2.(NullCoalescingOperation).getAnOperand() or e1 = e2.(SuppressNullableWarningExpr).getExpr() or @@ -623,7 +623,7 @@ module LocalFlow { ( e instanceof ConditionalExpr or e instanceof Cast or - e instanceof NullCoalescingExpr or + e instanceof NullCoalescingOperation or e instanceof SwitchExpr or e instanceof SuppressNullableWarningExpr or e instanceof AssignExpr diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll index 99a50b36873..d3ae19c6d18 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll @@ -47,7 +47,7 @@ predicate defaultImplicitTaintRead(DataFlow::Node node, DataFlow::ContentSet c) private predicate localTaintExprStep(Expr e1, Expr e2) { e1 = e2.(ElementAccess).getQualifier() or - e1 = e2.(AddExpr).getAnOperand() + e1 = e2.(AddOperation).getAnOperand() or // A comparison expression where taint can flow from one of the // operands if the other operand is a constant value. diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll index c9c3a937ef9..ca0aa83f29f 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll @@ -20,17 +20,17 @@ module Private { class ConditionalExpr = RU::ExprNode::ConditionalExpr; - class AddExpr = RU::ExprNode::AddExpr; + class AddExpr = RU::ExprNode::AddOperation; - class SubExpr = RU::ExprNode::SubExpr; + class SubExpr = RU::ExprNode::SubOperation; - class RemExpr = RU::ExprNode::RemExpr; + class RemExpr = RU::ExprNode::RemOperation; - class BitwiseAndExpr = RU::ExprNode::BitwiseAndExpr; + class BitwiseAndExpr = RU::ExprNode::BitwiseAndOperation; - class MulExpr = RU::ExprNode::MulExpr; + class MulExpr = RU::ExprNode::MulOperation; - class LeftShiftExpr = RU::ExprNode::LeftShiftExpr; + class LeftShiftExpr = RU::ExprNode::LeftShiftOperation; predicate guardControlsSsaRead = RU::guardControlsSsaRead/3; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll index 656bf9aae21..46153f18dae 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll @@ -21,7 +21,11 @@ private module Impl { /** Holds if SSA definition `def` equals `e + delta`. */ predicate ssaUpdateStep(ExplicitDefinition def, ExprNode e, int delta) { exists(ControlFlow::Node cfn | cfn = def.getControlFlowNode() | - e = cfn.(ExprNode::Assignment).getRValue() and delta = 0 + e = cfn.(ExprNode::Assignment).getRValue() and + delta = 0 and + not cfn instanceof ExprNode::AssignOperation + or + e = cfn.(ExprNode::AssignOperation) and delta = 0 or e = cfn.(ExprNode::PostIncrExpr).getOperand() and delta = 1 or @@ -48,15 +52,15 @@ private module Impl { e2.(ExprNode::PreDecrExpr).getOperand() = e1 and delta = -1 or exists(ConstantIntegerExpr x | - e2.(ExprNode::AddExpr).getAnOperand() = e1 and - e2.(ExprNode::AddExpr).getAnOperand() = x and + e2.(ExprNode::AddOperation).getAnOperand() = e1 and + e2.(ExprNode::AddOperation).getAnOperand() = x and e1 != x and x.getIntValue() = delta ) or exists(ConstantIntegerExpr x | - e2.(ExprNode::SubExpr).getLeftOperand() = e1 and - e2.(ExprNode::SubExpr).getRightOperand() = x and + e2.(ExprNode::SubOperation).getLeftOperand() = e1 and + e2.(ExprNode::SubOperation).getRightOperand() = x and x.getIntValue() = -delta ) or @@ -218,6 +222,11 @@ module ExprNode { override CS::AssignExpr e; } + /** A compound assignment operation. */ + class AssignOperation extends Assignment, BinaryOperation { + override CS::AssignOperation e; + } + /** A unary operation. */ class UnaryOperation extends ExprNode { override CS::UnaryOperation e; @@ -309,78 +318,78 @@ module ExprNode { } /** An addition operation. */ - class AddExpr extends BinaryOperation { - override CS::AddExpr e; + class AddOperation extends BinaryOperation { + override CS::AddOperation e; override TAddOp getOp() { any() } } /** A subtraction operation. */ - class SubExpr extends BinaryOperation { - override CS::SubExpr e; + class SubOperation extends BinaryOperation { + override CS::SubOperation e; override TSubOp getOp() { any() } } /** A multiplication operation. */ - class MulExpr extends BinaryOperation { - override CS::MulExpr e; + class MulOperation extends BinaryOperation { + override CS::MulOperation e; override TMulOp getOp() { any() } } /** A division operation. */ - class DivExpr extends BinaryOperation { - override CS::DivExpr e; + class DivOperation extends BinaryOperation { + override CS::DivOperation e; override TDivOp getOp() { any() } } /** A remainder operation. */ - class RemExpr extends BinaryOperation { - override CS::RemExpr e; + class RemOperation extends BinaryOperation { + override CS::RemOperation e; override TRemOp getOp() { any() } } /** A bitwise-and operation. */ - class BitwiseAndExpr extends BinaryOperation { - override CS::BitwiseAndExpr e; + class BitwiseAndOperation extends BinaryOperation { + override CS::BitwiseAndOperation e; override TBitAndOp getOp() { any() } } /** A bitwise-or operation. */ - class BitwiseOrExpr extends BinaryOperation { - override CS::BitwiseOrExpr e; + class BitwiseOrOperation extends BinaryOperation { + override CS::BitwiseOrOperation e; override TBitOrOp getOp() { any() } } /** A bitwise-xor operation. */ - class BitwiseXorExpr extends BinaryOperation { - override CS::BitwiseXorExpr e; + class BitwiseXorOperation extends BinaryOperation { + override CS::BitwiseXorOperation e; override TBitXorOp getOp() { any() } } /** A left-shift operation. */ - class LeftShiftExpr extends BinaryOperation { - override CS::LeftShiftExpr e; + class LeftShiftOperation extends BinaryOperation { + override CS::LeftShiftOperation e; override TLeftShiftOp getOp() { any() } } /** A right-shift operation. */ - class RightShiftExpr extends BinaryOperation { - override CS::RightShiftExpr e; + class RightShiftOperation extends BinaryOperation { + override CS::RightShiftOperation e; override TRightShiftOp getOp() { any() } } /** An unsigned right-shift operation. */ - class UnsignedRightShiftExpr extends BinaryOperation { - override CS::UnsignedRightShiftExpr e; + class UnsignedRightShiftOperation extends BinaryOperation { + override CS::UnsignedRightShiftOperation e; override TUnsignedRightShiftOp getOp() { any() } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll index 1bd86e19f34..d59d7958765 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll @@ -41,7 +41,7 @@ module Private { class RealLiteral = RU::ExprNode::RealLiteral; - class DivExpr = RU::ExprNode::DivExpr; + class DivExpr = RU::ExprNode::DivOperation; class UnaryOperation = RU::ExprNode::UnaryOperation; @@ -130,6 +130,11 @@ private module Impl { adef = def.getADefinition() and hasChild(adef.getExpr(), adef.getSource(), def.getControlFlowNode(), result) ) + or + exists(AssignableDefinitions::AssignOperationDefinition adef | + adef = def.getADefinition() and + result.getExpr() = adef.getSource() + ) } /** Holds if `def` can have any sign. */ diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaUtils.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaUtils.qll index b26082b6250..89117d90ba7 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaUtils.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaUtils.qll @@ -29,7 +29,7 @@ ExprNode getAnExplicitDefinitionRead(ExprNode src) { ExprNode ssaRead(Definition v, int delta) { exists(v.getAReadAtNode(result)) and delta = 0 or - exists(ExprNode::AddExpr add, int d1, ConstantIntegerExpr c | + exists(ExprNode::AddOperation add, int d1, ConstantIntegerExpr c | result = add and delta = d1 - c.getIntValue() | @@ -38,7 +38,7 @@ ExprNode ssaRead(Definition v, int delta) { add.getRightOperand() = ssaRead(v, d1) and add.getLeftOperand() = c ) or - exists(ExprNode::SubExpr sub, int d1, ConstantIntegerExpr c | + exists(ExprNode::SubOperation sub, int d1, ConstantIntegerExpr c | result = sub and sub.getLeftOperand() = ssaRead(v, d1) and sub.getRightOperand() = c and diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll index c0edf9e110e..798a8ed3822 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll @@ -131,7 +131,7 @@ class SystemXmlSchemaXmlSchemaValidationFlags extends EnumConstant { } } -private Expr getBitwiseOrOperand(Expr e) { result = e.(BitwiseOrExpr).getAnOperand() } +private Expr getBitwiseOrOperand(Expr e) { result = e.(BitwiseOrOperation).getAnOperand() } /** A creation of an instance of `System.Xml.XmlReaderSettings`. */ class XmlReaderSettingsCreation extends ObjectCreation { diff --git a/csharp/ql/lib/semmle/code/csharp/metrics/Complexity.qll b/csharp/ql/lib/semmle/code/csharp/metrics/Complexity.qll index 2f37d23fe49..392f13d118e 100644 --- a/csharp/ql/lib/semmle/code/csharp/metrics/Complexity.qll +++ b/csharp/ql/lib/semmle/code/csharp/metrics/Complexity.qll @@ -32,7 +32,7 @@ private predicate branchingExpr(Expr expr) { expr instanceof ConditionalExpr or expr instanceof LogicalAndExpr or expr instanceof LogicalOrExpr or - expr instanceof NullCoalescingExpr + expr instanceof NullCoalescingOperation } /** diff --git a/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql b/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql index 386b238e049..a58e19049ff 100644 --- a/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql +++ b/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql @@ -43,7 +43,7 @@ module ConstCondImpl = ConstCond::Make; predicate nullCheck(Expr e, boolean direct) { exists(QualifiableExpr qe | qe.isConditional() and qe.getQualifier() = e and direct = true) or - exists(NullCoalescingExpr nce | nce.getLeftOperand() = e and direct = true) + exists(NullCoalescingOperation nce | nce.getLeftOperand() = e and direct = true) or exists(ConditionalExpr ce | ce.getThen() = e or ce.getElse() = e | nullCheck(ce, _) and direct = false @@ -114,7 +114,7 @@ class ConstantBooleanCondition extends ConstantCondition { override predicate isWhiteListed() { // E.g. `x ?? false` - this.(BoolLiteral) = any(NullCoalescingExpr nce).getRightOperand() or + this.(BoolLiteral) = any(NullCoalescingOperation nce).getRightOperand() or // No need to flag logical operations when the operands are constant isConstantCondition(this.(LogicalNotExpr).getOperand(), _) or this = diff --git a/csharp/ql/src/Complexity/ComplexCondition.ql b/csharp/ql/src/Complexity/ComplexCondition.ql index 0afb27e2a94..0a4d37705a3 100644 --- a/csharp/ql/src/Complexity/ComplexCondition.ql +++ b/csharp/ql/src/Complexity/ComplexCondition.ql @@ -12,19 +12,38 @@ import csharp -predicate nontrivialLogicalOperator(BinaryLogicalOperation e) { - not exists(BinaryLogicalOperation parent | +abstract class RelevantBinaryOperations extends Operation { } + +private class AddBinaryLogicalOperationRelevantBinaryOperations extends RelevantBinaryOperations, + BinaryLogicalOperation +{ } + +private class AddAssignCoalesceExprRelevantBinaryOperations extends RelevantBinaryOperations, + AssignCoalesceExpr +{ } + +abstract class RelevantOperations extends Operation { } + +private class AddLogicalOperationRelevantOperations extends RelevantOperations, LogicalOperation { } + +private class AddAssignCoalesceExprRelevantOperations extends RelevantOperations, AssignCoalesceExpr +{ } + +predicate nontrivialLogicalOperator(RelevantBinaryOperations e) { + not exists(RelevantBinaryOperations parent | parent = e.getParent() and parent.getOperator() = e.getOperator() ) } -predicate logicalParent(LogicalOperation op, LogicalOperation parent) { parent = op.getParent() } +predicate logicalParent(RelevantOperations op, RelevantOperations parent) { + parent = op.getParent() +} from Expr e, int operators where - not e.getParent() instanceof LogicalOperation and + not e.getParent() instanceof RelevantOperations and operators = - count(BinaryLogicalOperation op | logicalParent*(op, e) and nontrivialLogicalOperator(op)) and + count(RelevantBinaryOperations op | logicalParent*(op, e) and nontrivialLogicalOperator(op)) and operators > 3 select e, "Complex condition: too many logical operations in this expression." diff --git a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql index 0f6e6d11fb2..59816a18b3f 100644 --- a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql +++ b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql @@ -84,6 +84,8 @@ class RelevantDefinition extends AssignableDefinition { ) or this instanceof AssignableDefinitions::PatternDefinition + or + this instanceof AssignableDefinitions::AssignOperationDefinition } /** Holds if this assignment may be live. */ diff --git a/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql b/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql index 7790fc5ba4a..78e1ea365a5 100644 --- a/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql +++ b/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql @@ -17,20 +17,20 @@ import semmle.code.csharp.commons.StructuralComparison pragma[noinline] private predicate same(AssignableAccess x, AssignableAccess y) { - exists(NullCoalescingExpr nce | - x = nce.getLeftOperand() and - y = nce.getRightOperand().getAChildExpr*() + exists(NullCoalescingOperation nc | + x = nc.getLeftOperand() and + y = nc.getRightOperand().getAChildExpr*() ) and sameGvn(x, y) } -private predicate uselessNullCoalescingExpr(NullCoalescingExpr nce) { +private predicate uselessNullCoalescingOperation(NullCoalescingOperation nce) { exists(AssignableAccess x | nce.getLeftOperand() = x and forex(AssignableAccess y | same(x, y) | y instanceof AssignableRead and not y.isRefArgument()) ) } -from NullCoalescingExpr nce -where uselessNullCoalescingExpr(nce) +from NullCoalescingOperation nce +where uselessNullCoalescingOperation(nce) select nce, "Both operands of this null-coalescing expression access the same variable or property." diff --git a/csharp/ql/src/Likely Bugs/Collections/WriteOnlyContainer.ql b/csharp/ql/src/Likely Bugs/Collections/WriteOnlyContainer.ql index 5a24a1f5f51..5fcb140e679 100644 --- a/csharp/ql/src/Likely Bugs/Collections/WriteOnlyContainer.ql +++ b/csharp/ql/src/Likely Bugs/Collections/WriteOnlyContainer.ql @@ -23,7 +23,9 @@ where ) and forex(Access a | a = v.getAnAccess() | a = any(ModifierMethodCall m).getQualifier() or - a = any(Assignment ass | ass.getRValue() instanceof ObjectCreation).getLValue() + a = any(AssignExpr ass | ass.getRValue() instanceof ObjectCreation).getLValue() or + a = + any(LocalVariableDeclAndInitExpr ass | ass.getRValue() instanceof ObjectCreation).getLValue() ) and not v = any(ForeachStmt fs).getVariable() and not v = any(BindingPatternExpr vpe).getVariableDeclExpr().getVariable() and diff --git a/csharp/ql/src/Likely Bugs/DangerousNonShortCircuitLogic.ql b/csharp/ql/src/Likely Bugs/DangerousNonShortCircuitLogic.ql index b980bfba1ae..8c77a6376d6 100644 --- a/csharp/ql/src/Likely Bugs/DangerousNonShortCircuitLogic.ql +++ b/csharp/ql/src/Likely Bugs/DangerousNonShortCircuitLogic.ql @@ -23,7 +23,6 @@ class NonShortCircuit extends BinaryBitwiseOperation { or this instanceof BitwiseOrExpr ) and - not exists(AssignBitwiseOperation abo | abo.getExpandedAssignment().getRValue() = this) and this.getLeftOperand().getType() instanceof BoolType and this.getRightOperand().getType() instanceof BoolType } diff --git a/csharp/ql/src/Likely Bugs/PossibleLossOfPrecision.ql b/csharp/ql/src/Likely Bugs/PossibleLossOfPrecision.ql index c66bbbeedbd..8b719bb92a5 100644 --- a/csharp/ql/src/Likely Bugs/PossibleLossOfPrecision.ql +++ b/csharp/ql/src/Likely Bugs/PossibleLossOfPrecision.ql @@ -27,13 +27,13 @@ predicate convertedToFloatOrDecimal(Expr e, Type t) { t instanceof DecimalType ) or - exists(BinaryArithmeticOperation op | + exists(BinaryOperation op | op.getAnOperand() = e and convertedToFloatOrDecimal(op, t) | - op instanceof AddExpr or - op instanceof SubExpr or - op instanceof MulExpr + op instanceof AddOperation or + op instanceof SubOperation or + op instanceof MulOperation ) } diff --git a/csharp/ql/src/Performance/StringConcatenationInLoop.ql b/csharp/ql/src/Performance/StringConcatenationInLoop.ql index a015771610d..3b3228588a4 100644 --- a/csharp/ql/src/Performance/StringConcatenationInLoop.ql +++ b/csharp/ql/src/Performance/StringConcatenationInLoop.ql @@ -23,7 +23,6 @@ class StringCat extends AddExpr { * where `v` is a simple variable (and not, for example, a property). */ predicate isSelfConcatAssignExpr(AssignExpr e, Variable v) { - not e = any(AssignAddExpr a).getExpandedAssignment() and exists(VariableAccess use | stringCatContains(e.getRValue(), use) and use.getTarget() = e.getTargetVariable() and diff --git a/csharp/ql/src/Security Features/CWE-119/LocalUnvalidatedArithmetic.ql b/csharp/ql/src/Security Features/CWE-119/LocalUnvalidatedArithmetic.ql index 57d6e500134..d5efb1304af 100644 --- a/csharp/ql/src/Security Features/CWE-119/LocalUnvalidatedArithmetic.ql +++ b/csharp/ql/src/Security Features/CWE-119/LocalUnvalidatedArithmetic.ql @@ -18,7 +18,7 @@ import csharp import semmle.code.csharp.controlflow.Guards -from AddExpr add, VirtualMethodCall taintSrc +from AddOperation add, VirtualMethodCall taintSrc where // `add` is performing pointer arithmetic add.getType() instanceof PointerType and diff --git a/csharp/ql/src/Security Features/InsecureRandomness.ql b/csharp/ql/src/Security Features/InsecureRandomness.ql index 2c2df7010c6..8237afdff13 100644 --- a/csharp/ql/src/Security Features/InsecureRandomness.ql +++ b/csharp/ql/src/Security Features/InsecureRandomness.ql @@ -89,11 +89,7 @@ module Random { e = any(SensitiveLibraryParameter v).getAnAssignedArgument() or // Assignment operation, e.g. += or similar - exists(AssignOperation ao | - ao.getRValue() = e and - // "expanded" assignments will be covered by simple assignment - not ao.hasExpandedAssignment() - | + exists(AssignOperation ao | ao.getRValue() = e | ao.getLValue() = any(SensitiveVariable v).getAnAccess() or ao.getLValue() = any(SensitiveProperty v).getAnAccess() or ao.getLValue() = any(SensitiveLibraryParameter v).getAnAccess() diff --git a/csharp/ql/src/experimental/CWE-918/RequestForgery.qll b/csharp/ql/src/experimental/CWE-918/RequestForgery.qll index 84ea534a50f..12af7fd7d33 100644 --- a/csharp/ql/src/experimental/CWE-918/RequestForgery.qll +++ b/csharp/ql/src/experimental/CWE-918/RequestForgery.qll @@ -211,7 +211,7 @@ module RequestForgery { } private predicate stringConcatStep(DataFlow::Node prev, DataFlow::Node succ) { - exists(AddExpr a | + exists(AddOperation a | a.getLeftOperand() = prev.asExpr() or a.getRightOperand() = prev.asExpr() and diff --git a/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql b/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql index f175723c099..d43050c2deb 100644 --- a/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql +++ b/csharp/ql/src/experimental/Security Features/CWE-759/HashWithoutSalt.ql @@ -174,7 +174,7 @@ module HashWithoutSaltConfig implements DataFlow::ConfigSig { mc.getAnArgument() = node.asExpr() ) or - exists(AddExpr e | node.asExpr() = e.getAnOperand()) // password+salt + exists(AddOperation e | node.asExpr() = e.getAnOperand()) // password+salt or exists(InterpolatedStringExpr e | node.asExpr() = e.getAnInsert()) or From 55516342b224c3a2f6ad6fc64624f3be4e1b714b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 20 Mar 2026 13:01:46 +0100 Subject: [PATCH 31/81] C#: Add/update tests and expected output. --- .../arguments/argumentByName.expected | 10 +- .../arguments/argumentByParameter.expected | 4 +- .../arguments/argumentType.expected | 2 - .../arguments/parameterGetArguments.expected | 4 +- .../AssignOperationExpanded.expected | 3 - .../assignments/AssignOperationExpanded.ql | 22 -- .../controlflow/graph/BasicBlock.expected | 26 +- .../controlflow/graph/Condition.expected | 8 +- .../controlflow/graph/Dominance.expected | 346 +++++------------- .../graph/EnclosingCallable.expected | 88 +---- .../controlflow/graph/EntryElement.expected | 66 ---- .../controlflow/graph/ExitElement.expected | 171 +++------ .../controlflow/graph/NodeGraph.expected | 124 ++----- .../library-tests/csharp11/PrintAst.expected | 2 +- .../library-tests/csharp11/operators.expected | 3 +- .../csharp8/NullCoalescingAssignment.expected | 3 +- .../csharp8/NullCoalescingAssignment.ql | 4 +- .../NullCoalescingControlFlow.expected | 7 +- .../dataflow/local/DataFlowStep.expected | 5 +- .../dataflow/local/TaintTrackingStep.expected | 13 +- .../modulusanalysis/ModulusAnalysis.expected | 12 +- .../dataflow/nullcoalescing/NullCoalescing.cs | 35 ++ .../nullCoalescingFlow.expected | 70 ++++ .../nullcoalescing/nullCoalescingFlow.ql | 12 + .../signanalysis/SignAnalysis.expected | 3 +- .../dataflow/ssa/DefAdjacentRead.expected | 2 +- .../dataflow/ssa/SsaDefElement.expected | 10 +- .../dataflow/ssa/SsaExplicitDef.expected | 10 +- .../dispatch/CallContext.expected | 18 +- .../library-tests/dispatch/CallGraph.expected | 118 +++--- .../dispatch/GetADynamicTarget.expected | 116 +++--- .../library-tests/dispatch/ViableCallable.cs | 1 + .../dispatch/viableCallable.expected | 65 ++-- .../dynamic/DynamicOperatorCall.expected | 4 +- .../library-tests/dynamic/PrintAst.expected | 6 +- .../structuralComparison.expected | 64 ++-- .../SynchSetUnsynchGet/SynchSetUnsynchGet.cs | 21 ++ .../DeadStoreOfLocal.expected | 2 +- .../UselessNullCoalescingExpression.cs | 3 + .../UselessNullCoalescingExpression.expected | 2 + .../WriteOnlyContainer/WriteOnlyContainer.cs | 6 + 41 files changed, 605 insertions(+), 886 deletions(-) delete mode 100644 csharp/ql/test/library-tests/assignments/AssignOperationExpanded.expected delete mode 100644 csharp/ql/test/library-tests/assignments/AssignOperationExpanded.ql create mode 100644 csharp/ql/test/library-tests/dataflow/nullcoalescing/NullCoalescing.cs create mode 100644 csharp/ql/test/library-tests/dataflow/nullcoalescing/nullCoalescingFlow.expected create mode 100644 csharp/ql/test/library-tests/dataflow/nullcoalescing/nullCoalescingFlow.ql diff --git a/csharp/ql/test/library-tests/arguments/argumentByName.expected b/csharp/ql/test/library-tests/arguments/argumentByName.expected index 6fcb9021d17..065d7070312 100644 --- a/csharp/ql/test/library-tests/arguments/argumentByName.expected +++ b/csharp/ql/test/library-tests/arguments/argumentByName.expected @@ -33,14 +33,16 @@ | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:21:59:21 | 3 | a | | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:24:59:24 | 4 | b | | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:34:59:34 | 6 | value | -| arguments.cs:61:9:61:12 | access to property Prop | arguments.cs:61:9:61:17 | ... + ... | value | +| arguments.cs:61:9:61:12 | access to property Prop | arguments.cs:61:9:61:17 | ... += ... | value | +| arguments.cs:61:9:61:17 | ... += ... | arguments.cs:61:9:61:12 | access to property Prop | left | +| arguments.cs:61:9:61:17 | ... += ... | arguments.cs:61:17:61:17 | 7 | right | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:14:62:14 | 8 | a | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:17:62:17 | 9 | b | -| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:9:63:26 | ... + ... | value | -| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:14:63:15 | 10 | a | +| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:9:63:26 | ... += ... | value | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:14:63:15 | 10 | a | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:18:63:19 | 11 | b | -| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:18:63:19 | 11 | b | +| arguments.cs:63:9:63:26 | ... += ... | arguments.cs:63:9:63:20 | access to indexer | left | +| arguments.cs:63:9:63:26 | ... += ... | arguments.cs:63:25:63:26 | 12 | right | | arguments.cs:65:16:65:27 | access to indexer | arguments.cs:65:21:65:22 | 15 | a | | arguments.cs:65:16:65:27 | access to indexer | arguments.cs:65:25:65:26 | 16 | b | | arguments.cs:76:9:76:31 | call to method f8`1 | arguments.cs:76:12:76:12 | 0 | o | diff --git a/csharp/ql/test/library-tests/arguments/argumentByParameter.expected b/csharp/ql/test/library-tests/arguments/argumentByParameter.expected index ac354d31e28..c0465859253 100644 --- a/csharp/ql/test/library-tests/arguments/argumentByParameter.expected +++ b/csharp/ql/test/library-tests/arguments/argumentByParameter.expected @@ -33,12 +33,12 @@ | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:21:59:21 | 3 | arguments.cs:53:18:53:18 | a | | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:24:59:24 | 4 | arguments.cs:53:25:53:25 | b | | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:34:59:34 | 6 | arguments.cs:53:44:53:46 | value | -| arguments.cs:61:9:61:12 | access to property Prop | arguments.cs:61:9:61:17 | ... + ... | arguments.cs:51:21:51:23 | value | +| arguments.cs:61:9:61:12 | access to property Prop | arguments.cs:61:9:61:17 | ... += ... | arguments.cs:51:21:51:23 | value | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:14:62:14 | 8 | arguments.cs:53:18:53:18 | a | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:14:62:14 | 8 | arguments.cs:53:18:53:18 | a | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:17:62:17 | 9 | arguments.cs:53:25:53:25 | b | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:17:62:17 | 9 | arguments.cs:53:25:53:25 | b | -| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:9:63:26 | ... + ... | arguments.cs:53:44:53:46 | value | +| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:9:63:26 | ... += ... | arguments.cs:53:44:53:46 | value | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:14:63:15 | 10 | arguments.cs:53:18:53:18 | a | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:14:63:15 | 10 | arguments.cs:53:18:53:18 | a | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:18:63:19 | 11 | arguments.cs:53:25:53:25 | b | diff --git a/csharp/ql/test/library-tests/arguments/argumentType.expected b/csharp/ql/test/library-tests/arguments/argumentType.expected index 0dac7019345..fa148e657b4 100644 --- a/csharp/ql/test/library-tests/arguments/argumentType.expected +++ b/csharp/ql/test/library-tests/arguments/argumentType.expected @@ -36,8 +36,6 @@ | arguments.cs:62:14:62:14 | 8 | 0 | | arguments.cs:62:17:62:17 | 9 | 0 | | arguments.cs:63:14:63:15 | 10 | 0 | -| arguments.cs:63:14:63:15 | 10 | 0 | -| arguments.cs:63:18:63:19 | 11 | 0 | | arguments.cs:63:18:63:19 | 11 | 0 | | arguments.cs:64:22:64:23 | 13 | 0 | | arguments.cs:64:26:64:27 | 14 | 0 | diff --git a/csharp/ql/test/library-tests/arguments/parameterGetArguments.expected b/csharp/ql/test/library-tests/arguments/parameterGetArguments.expected index 6f25b07e2e5..9f830954efb 100644 --- a/csharp/ql/test/library-tests/arguments/parameterGetArguments.expected +++ b/csharp/ql/test/library-tests/arguments/parameterGetArguments.expected @@ -28,7 +28,7 @@ | arguments.cs:51:21:51:23 | value | arguments.cs:57:16:57:16 | 0 | | arguments.cs:51:21:51:23 | value | arguments.cs:58:16:58:25 | access to indexer | | arguments.cs:51:21:51:23 | value | arguments.cs:59:31:59:31 | 5 | -| arguments.cs:51:21:51:23 | value | arguments.cs:61:9:61:17 | ... + ... | +| arguments.cs:51:21:51:23 | value | arguments.cs:61:9:61:17 | ... += ... | | arguments.cs:53:18:53:18 | a | arguments.cs:58:21:58:21 | 1 | | arguments.cs:53:18:53:18 | a | arguments.cs:59:21:59:21 | 3 | | arguments.cs:53:18:53:18 | a | arguments.cs:62:14:62:14 | 8 | @@ -44,7 +44,7 @@ | arguments.cs:53:25:53:25 | b | arguments.cs:63:18:63:19 | 11 | | arguments.cs:53:25:53:25 | b | arguments.cs:65:25:65:26 | 16 | | arguments.cs:53:44:53:46 | value | arguments.cs:59:34:59:34 | 6 | -| arguments.cs:53:44:53:46 | value | arguments.cs:63:9:63:26 | ... + ... | +| arguments.cs:53:44:53:46 | value | arguments.cs:63:9:63:26 | ... += ... | | arguments.cs:74:20:74:20 | o | arguments.cs:76:12:76:12 | 0 | | arguments.cs:74:20:74:20 | o | arguments.cs:77:12:77:12 | 0 | | arguments.cs:74:20:74:20 | o | arguments.cs:78:12:78:12 | 0 | diff --git a/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.expected b/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.expected deleted file mode 100644 index bcc9d11c42f..00000000000 --- a/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.expected +++ /dev/null @@ -1,3 +0,0 @@ -| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:14:6:14 | 1 | -| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:14:9:14 | 2 | -| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:14:12:17 | this access | diff --git a/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.ql b/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.ql deleted file mode 100644 index bd67776520f..00000000000 --- a/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.ql +++ /dev/null @@ -1,22 +0,0 @@ -import csharp - -predicate getExpandedOperatorArgs(Expr e, Expr left, Expr right) { - e = - any(BinaryArithmeticOperation bo | - bo.getLeftOperand() = left and - bo.getRightOperand() = right - ) - or - e = - any(OperatorCall oc | - oc.getArgument(0) = left and - oc.getArgument(1) = right - ) -} - -from AssignOperation ao, AssignExpr ae, Expr op, Expr left, Expr right -where - ae = ao.getExpandedAssignment() and - op = ae.getRValue() and - getExpandedOperatorArgs(op, left, right) -select ao, ae, ae.getLValue(), op, left, right diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index 30f2b105155..9802f2b0195 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -7,11 +7,11 @@ | AccessorCalls.cs:19:10:19:11 | enter M2 | AccessorCalls.cs:19:10:19:11 | exit M2 | 42 | | AccessorCalls.cs:28:10:28:11 | enter M3 | AccessorCalls.cs:28:10:28:11 | exit M3 | 17 | | AccessorCalls.cs:35:10:35:11 | enter M4 | AccessorCalls.cs:35:10:35:11 | exit M4 | 20 | -| AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:42:10:42:11 | exit M5 | 34 | -| AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:49:10:49:11 | exit M6 | 43 | +| AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:42:10:42:11 | exit M5 | 24 | +| AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:49:10:49:11 | exit M6 | 30 | | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | exit M7 | 25 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | exit M8 | 31 | -| AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | exit M9 | 58 | +| AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | exit M9 | 51 | | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | 7 | | 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 | @@ -164,7 +164,7 @@ | Assert.cs:138:10:138:12 | exit M13 (abnormal) | Assert.cs:138:10:138:12 | exit M13 (abnormal) | 1 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | exit M13 (normal) | 2 | | Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | exit Assignments | 7 | -| Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | exit M | 34 | +| Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | exit M | 31 | | 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 | | Assignments.cs:27:10:27:23 | enter SetParamSingle | Assignments.cs:27:10:27:23 | exit SetParamSingle | 7 | @@ -250,7 +250,6 @@ | ConditionalAccess.cs:42:9:42:11 | enter get_Item | ConditionalAccess.cs:42:9:42:11 | exit get_Item | 6 | | ConditionalAccess.cs:43:9:43:11 | enter set_Item | ConditionalAccess.cs:43:9:43:11 | exit set_Item | 4 | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | 4 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | exit M9 | 2 | | ConditionalAccess.cs:48:24:48:25 | 42 | ConditionalAccess.cs:48:12:48:25 | ... = ... | 3 | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:49:9:49:10 | access to parameter ca | 2 | | ConditionalAccess.cs:49:26:49:32 | "Hello" | ConditionalAccess.cs:49:12:49:32 | ... = ... | 3 | @@ -262,14 +261,11 @@ | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:9:52:16 | access to property Prop | 1 | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | 2 | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:18:52:38 | ... = ... | 3 | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | 1 | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:20 | access to field IntField | 1 | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | 2 | -| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... = ... | 4 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | 1 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | 4 | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | 1 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | 2 | -| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... = ... | 4 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:46:10:46:11 | exit M9 | 4 | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | 8 | | Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | exit Conditions | 7 | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:5:13:5:15 | access to parameter inc | 4 | @@ -331,12 +327,12 @@ | Conditions.cs:97:17:97:20 | ...; | Conditions.cs:97:17:97:19 | ...++ | 3 | | Conditions.cs:99:16:99:16 | access to local variable x | Conditions.cs:86:9:86:10 | exit M7 | 4 | | Conditions.cs:102:12:102:13 | enter M8 | Conditions.cs:105:13:105:13 | access to parameter b | 8 | -| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... = ... | 5 | +| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... += ... | 4 | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:24 | ... > ... | 5 | | Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:108:18:108:18 | access to parameter b | 2 | | Conditions.cs:108:17:108:18 | [false] !... | Conditions.cs:108:17:108:18 | [false] !... | 1 | | Conditions.cs:108:17:108:18 | [true] !... | Conditions.cs:108:17:108:18 | [true] !... | 1 | -| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... = ... | 5 | +| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... += ... | 4 | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:102:12:102:13 | exit M8 | 4 | | Conditions.cs:113:10:113:11 | enter M9 | Conditions.cs:116:18:116:22 | Int32 i = ... | 8 | | Conditions.cs:113:10:113:11 | exit M9 (normal) | Conditions.cs:113:10:113:11 | exit M9 | 2 | @@ -533,7 +529,7 @@ | Finally.cs:254:13:254:45 | ...; | Finally.cs:254:13:254:44 | call to method WriteLine | 3 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:258:13:258:46 | call to method WriteLine | 4 | | Finally.cs:260:9:260:34 | ...; | Finally.cs:233:10:233:12 | exit M12 (normal) | 4 | -| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:272:13:272:18 | ... = ... | 16 | +| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:272:13:272:18 | ... += ... | 15 | | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | 1 | | Finally.cs:263:10:263:12 | exit M13 (abnormal) | Finally.cs:263:10:263:12 | exit M13 (abnormal) | 1 | | Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:263:10:263:12 | exit M13 (normal) | 1 | @@ -1130,7 +1126,7 @@ | cflow.cs:201:9:205:9 | {...} | cflow.cs:193:10:193:17 | exit Booleans (abnormal) | 5 | | cflow.cs:208:10:208:11 | enter Do | cflow.cs:210:9:221:36 | do ... while (...); | 3 | | cflow.cs:208:10:208:11 | exit Do (normal) | cflow.cs:208:10:208:11 | exit Do | 2 | -| cflow.cs:211:9:221:9 | {...} | cflow.cs:213:17:213:32 | ... > ... | 15 | +| cflow.cs:211:9:221:9 | {...} | cflow.cs:213:17:213:32 | ... > ... | 12 | | cflow.cs:214:13:216:13 | {...} | cflow.cs:215:17:215:25 | continue; | 2 | | cflow.cs:217:13:220:13 | if (...) ... | cflow.cs:217:17:217:32 | ... < ... | 6 | | cflow.cs:218:13:220:13 | {...} | cflow.cs:219:17:219:22 | break; | 2 | @@ -1138,7 +1134,7 @@ | cflow.cs:224:10:224:16 | enter Foreach | cflow.cs:226:27:226:64 | call to method Repeat | 5 | | cflow.cs:224:10:224:16 | exit Foreach (normal) | cflow.cs:224:10:224:16 | exit Foreach | 2 | | cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | 1 | -| cflow.cs:226:22:226:22 | String x | cflow.cs:229:17:229:32 | ... > ... | 16 | +| cflow.cs:226:22:226:22 | String x | cflow.cs:229:17:229:32 | ... > ... | 13 | | cflow.cs:230:13:232:13 | {...} | cflow.cs:231:17:231:25 | continue; | 2 | | cflow.cs:233:13:236:13 | if (...) ... | cflow.cs:233:17:233:32 | ... < ... | 6 | | cflow.cs:234:13:236:13 | {...} | cflow.cs:235:17:235:22 | break; | 2 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected index 3ef1d481abe..cda25b6abd1 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected @@ -100,14 +100,8 @@ conditionBlock | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:32:52:38 | "World" | false | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | false | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | false | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:20 | access to field IntField | false | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | false | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | false | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | false | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | false | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | false | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | false | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | false | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | false | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:6:13:6:16 | ...; | true | | Conditions.cs:7:9:8:16 | if (...) ... | Conditions.cs:7:13:7:16 | [false] !... | true | | Conditions.cs:7:9:8:16 | if (...) ... | Conditions.cs:7:13:7:16 | [true] !... | false | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index 204092c6df2..072d874d8d4 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -129,77 +129,54 @@ dominance | AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:43:5:47:5 | {...} | | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:42:10:42:11 | exit M5 | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:44:9:44:33 | ...; | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:18 | access to field Field | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... = ... | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:23:44:26 | this access | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:18 | access to field Field | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:45:9:45:31 | ...; | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:45:9:45:31 | ...; | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:32 | access to field Field | -| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... + ... | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | +| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... += ... | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:17 | access to property Prop | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... = ... | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:22:45:25 | this access | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:17 | access to property Prop | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:46:9:46:27 | ...; | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:46:9:46:27 | ...; | | AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:30 | access to property Prop | -| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... + ... | +| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... += ... | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... = ... | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:20:46:23 | this access | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:15 | access to indexer | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | | AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:15 | access to indexer | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:25:46:25 | 0 | -| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... + ... | +| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... += ... | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:20:46:26 | access to indexer | | AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:50:5:54:5 | {...} | | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:49:10:49:11 | exit M6 | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:51:9:51:37 | ...; | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:20 | access to field Field | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... = ... | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:25:51:28 | this access | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:20 | access to field Field | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:52:9:52:35 | ...; | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:52:9:52:35 | ...; | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:30 | access to field x | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:36 | access to field Field | -| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... + ... | +| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... += ... | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:19 | access to property Prop | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... = ... | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:24:52:27 | this access | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:19 | access to property Prop | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:53:9:53:31 | ...; | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:53:9:53:31 | ...; | | AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:29 | access to field x | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:34 | access to property Prop | -| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... + ... | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | +| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... += ... | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... = ... | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:22:53:25 | this access | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:17 | access to indexer | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | | AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:17 | access to indexer | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:27 | access to field x | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:29:53:29 | 0 | -| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... + ... | +| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... += ... | | AccessorCalls.cs:53:29:53:29 | 0 | AccessorCalls.cs:53:22:53:30 | access to indexer | | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:57:5:59:5 | {...} | | AccessorCalls.cs:56:10:56:11 | exit M7 (normal) | AccessorCalls.cs:56:10:56:11 | exit M7 | @@ -271,25 +248,18 @@ dominance | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:71:9:71:26 | ...; | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:25 | ... = ... | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:25:71:25 | access to parameter e | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:72:9:72:21 | ...; | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:72:9:72:21 | ...; | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | +| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:25 | ... += ... | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | ... = ... | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:17:72:17 | access to local variable d | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:73:9:73:84 | ...; | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:12 | dynamic access to element | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:73:9:73:84 | ...; | | AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:12 | dynamic access to element | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:19:72:19 | 1 | -| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | +| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | ... += ... | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:17:72:20 | dynamic access to element | | AccessorCalls.cs:73:9:73:44 | (..., ...) | AccessorCalls.cs:73:49:73:49 | access to local variable d | | AccessorCalls.cs:73:9:73:83 | ... = ... | AccessorCalls.cs:66:10:66:11 | exit M9 (normal) | @@ -732,27 +702,24 @@ dominance | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:6:9:6:15 | ...; | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:13:5:17 | Int32 x = ... | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:14:6:14 | 1 | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:14 | ... = ... | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:8:9:8:22 | ... ...; | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:8:9:8:22 | ... ...; | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:9 | access to local variable x | -| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:14 | ... + ... | +| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:14 | ... += ... | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:21:8:21 | 0 | | Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:9:9:9:15 | ...; | | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:21:8:21 | (...) ... | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:17:8:21 | dynamic d = ... | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:14:9:14 | 2 | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:11:9:11:34 | ... ...; | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:14 | ... = ... | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:11:9:11:34 | ... ...; | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:9 | access to local variable d | -| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:14 | dynamic call to operator - | +| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:14 | ... -= ... | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:17:11:33 | object creation of type Assignments | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:12:9:12:18 | ...; | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:13:11:33 | Assignments a = ... | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:14:12:17 | this access | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:14:9:14:36 | ...; | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:17 | ... = ... | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:14:9:14:36 | ...; | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:9 | access to local variable a | -| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:17 | call to operator + | +| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:17 | ... += ... | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:35 | ... += ... | | Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:18:14:35 | (...) => ... | | Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:3:10:3:10 | exit M (normal) | @@ -1058,22 +1025,16 @@ dominance | ConditionalAccess.cs:52:9:52:28 | access to property StringProp | ConditionalAccess.cs:52:18:52:38 | ... = ... | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:9:52:28 | access to property StringProp | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:12:53:25 | ... = ... | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... - ... | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:54:9:54:30 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... -= ... | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:27:54:29 | "!" | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:12:54:29 | ... = ... | | ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... + ... | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... += ... | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith (normal) | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | ConditionalAccess.cs:60:75:60:78 | ", " | @@ -1295,9 +1256,8 @@ dominance | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:106:13:106:20 | ...; | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:107:9:109:24 | if (...) ... | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:18:106:19 | "" | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:13:106:19 | ... = ... | | Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:13 | access to local variable x | -| Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:19 | ... + ... | +| Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:19 | ... += ... | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:13 | access to local variable x | | Conditions.cs:107:13:107:13 | access to local variable x | Conditions.cs:107:13:107:20 | access to property Length | | Conditions.cs:107:13:107:20 | access to property Length | Conditions.cs:107:24:107:24 | 0 | @@ -1309,9 +1269,8 @@ dominance | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:17:108:18 | [false] !... | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:17:108:18 | [true] !... | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:22:109:23 | "" | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:23 | ... = ... | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:17 | access to local variable x | -| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... + ... | +| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... += ... | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | exit M8 (normal) | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:9:110:17 | return ...; | | Conditions.cs:113:10:113:11 | enter M9 | Conditions.cs:114:5:124:5 | {...} | @@ -1939,11 +1898,10 @@ dominance | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:31:271:33 | "3" | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:34 | call to method WriteLine | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:18:272:18 | 3 | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... = ... | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (normal) | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | exit M13 (normal) | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | -| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | +| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... += ... | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | | Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | call to constructor Object | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | this access | @@ -3819,14 +3777,11 @@ dominance | cflow.cs:209:5:222:5 | {...} | cflow.cs:210:9:221:36 | do ... while (...); | | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:211:9:221:9 | {...} | | cflow.cs:211:9:221:9 | {...} | cflow.cs:212:13:212:25 | ...; | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:24 | ... = ... | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:22:212:24 | "a" | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | access to field Field | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:17 | access to field Field | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:213:13:216:13 | if (...) ... | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:213:13:216:13 | if (...) ... | | cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:24 | ... + ... | +| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:24 | ... += ... | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:17:213:21 | this access | | cflow.cs:213:17:213:21 | access to field Field | cflow.cs:213:17:213:28 | access to property Length | | cflow.cs:213:17:213:21 | this access | cflow.cs:213:17:213:21 | access to field Field | @@ -3856,14 +3811,11 @@ dominance | cflow.cs:226:57:226:59 | "a" | cflow.cs:226:62:226:63 | 10 | | cflow.cs:226:62:226:63 | 10 | cflow.cs:226:27:226:64 | call to method Repeat | | cflow.cs:227:9:237:9 | {...} | cflow.cs:228:13:228:23 | ...; | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:22 | ... = ... | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:22:228:22 | access to local variable x | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | access to field Field | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:17 | access to field Field | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:229:13:232:13 | if (...) ... | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:229:13:232:13 | if (...) ... | | cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:22 | ... + ... | +| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:22 | ... += ... | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:17:229:21 | this access | | cflow.cs:229:17:229:21 | access to field Field | cflow.cs:229:17:229:28 | access to property Length | | cflow.cs:229:17:229:21 | this access | cflow.cs:229:17:229:21 | access to field Field | @@ -4138,75 +4090,52 @@ postDominance | AccessorCalls.cs:39:9:39:20 | ...; | AccessorCalls.cs:38:9:38:21 | ...++ | | AccessorCalls.cs:39:16:39:16 | 0 | AccessorCalls.cs:39:9:39:14 | access to field x | | AccessorCalls.cs:42:10:42:11 | exit M5 | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | -| AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:46:9:46:26 | ... = ... | +| AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:46:9:46:26 | ... += ... | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:42:10:42:11 | enter M5 | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:33 | ...; | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... + ... | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:23:44:32 | access to field Field | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:44:9:44:18 | access to field Field | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:44:23:44:32 | access to field Field | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:43:5:47:5 | {...} | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:9:44:18 | access to field Field | | AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:23:44:26 | this access | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:31 | ...; | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... + ... | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:22:45:30 | access to property Prop | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:45:9:45:17 | access to property Prop | -| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:44:9:44:32 | ... = ... | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:45:22:45:30 | access to property Prop | +| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:44:9:44:32 | ... += ... | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:9:45:17 | access to property Prop | | AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:22:45:25 | this access | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:27 | ...; | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... + ... | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:20:46:26 | access to indexer | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:46:9:46:15 | access to indexer | -| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:45:9:45:30 | ... = ... | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:12 | this access | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:46:20:46:26 | access to indexer | +| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:45:9:45:30 | ... += ... | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:9:46:15 | access to indexer | | AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:25:46:25 | 0 | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:20:46:23 | this access | | AccessorCalls.cs:49:10:49:11 | exit M6 | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | -| AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:53:9:53:30 | ... = ... | +| AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:53:9:53:30 | ... += ... | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:49:10:49:11 | enter M6 | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:37 | ...; | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:14 | access to field x | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... + ... | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:25:51:36 | access to field Field | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:51:9:51:20 | access to field Field | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:51:25:51:36 | access to field Field | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:50:5:54:5 | {...} | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:9:51:20 | access to field Field | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:28 | this access | | AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:25:51:30 | access to field x | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:35 | ...; | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:14 | access to field x | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... + ... | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:24:52:34 | access to property Prop | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:52:9:52:19 | access to property Prop | -| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:51:9:51:36 | ... = ... | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:52:24:52:34 | access to property Prop | +| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:51:9:51:36 | ... += ... | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:9:52:19 | access to property Prop | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:27 | this access | | AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:24:52:29 | access to field x | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:31 | ...; | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:16:53:16 | 0 | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... + ... | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:16:53:16 | 0 | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:22:53:30 | access to indexer | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:53:9:53:17 | access to indexer | -| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:52:9:52:34 | ... = ... | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:14 | access to field x | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:53:22:53:30 | access to indexer | +| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:52:9:52:34 | ... += ... | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:14 | access to field x | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:9:53:17 | access to indexer | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:22:53:25 | this access | @@ -4282,29 +4211,22 @@ postDominance | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | AccessorCalls.cs:70:9:70:9 | access to local variable d | | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:69:9:69:35 | ... = ... | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:26 | ...; | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:25:71:25 | access to parameter e | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:71:25:71:25 | access to parameter e | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | | AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:21 | ...; | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:11:72:11 | 0 | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:72:9:72:12 | dynamic access to element | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:17:72:20 | dynamic access to element | -| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:71:9:71:25 | ... = ... | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:9 | access to local variable d | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:72:17:72:20 | dynamic access to element | +| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:71:9:71:25 | ... += ... | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:9:72:12 | dynamic access to element | | AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:19:72:19 | 1 | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:17:72:17 | access to local variable d | | AccessorCalls.cs:73:9:73:44 | (..., ...) | AccessorCalls.cs:73:35:73:43 | (..., ...) | | AccessorCalls.cs:73:9:73:83 | ... = ... | AccessorCalls.cs:73:39:73:42 | dynamic access to element | -| AccessorCalls.cs:73:9:73:84 | ...; | AccessorCalls.cs:72:9:72:20 | ... = ... | +| AccessorCalls.cs:73:9:73:84 | ...; | AccessorCalls.cs:72:9:72:20 | ... += ... | | AccessorCalls.cs:73:10:73:10 | access to local variable d | AccessorCalls.cs:73:9:73:84 | ...; | | AccessorCalls.cs:73:10:73:21 | dynamic access to member MaybeProp1 | AccessorCalls.cs:73:48:73:83 | (..., ...) | | AccessorCalls.cs:73:24:73:27 | this access | AccessorCalls.cs:73:10:73:10 | access to local variable d | @@ -4730,31 +4652,28 @@ postDominance | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:17:5:17 | 0 | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:9:5:18 | ... ...; | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:9:6:15 | ...; | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:14:6:14 | 1 | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:6:9:6:14 | ... + ... | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:14:6:14 | 1 | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:5:13:5:17 | Int32 x = ... | | Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:9 | access to local variable x | -| Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:6:9:6:14 | ... = ... | +| Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:6:9:6:14 | ... += ... | | Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:8:21:8:21 | (...) ... | | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:9:8:22 | ... ...; | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:21:8:21 | 0 | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:9:9:15 | ...; | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:9:9:9:14 | dynamic call to operator - | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:14:9:14 | 2 | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:14:9:14 | 2 | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:8:17:8:21 | dynamic d = ... | | Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:9 | access to local variable d | -| Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:9:9:9:14 | ... = ... | +| Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:9:9:9:14 | ... -= ... | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:11:17:11:33 | object creation of type Assignments | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:9:11:34 | ... ...; | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:9:12:18 | ...; | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:12:9:12:17 | call to operator + | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:14:12:17 | this access | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:14:12:17 | this access | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:11:13:11:33 | Assignments a = ... | | Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:9 | access to local variable a | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:18:14:35 | (...) => ... | | Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:9:14:36 | ...; | | Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:14:9:14:13 | access to event Event | -| Assignments.cs:14:9:14:36 | ...; | Assignments.cs:12:9:12:17 | ... = ... | +| Assignments.cs:14:9:14:36 | ...; | Assignments.cs:12:9:12:17 | ... += ... | | Assignments.cs:14:18:14:35 | (...) => ... | Assignments.cs:14:9:14:13 | this access | | Assignments.cs:14:18:14:35 | exit (...) => ... | Assignments.cs:14:18:14:35 | exit (...) => ... (normal) | | Assignments.cs:14:18:14:35 | exit (...) => ... (normal) | Assignments.cs:14:33:14:35 | {...} | @@ -5022,8 +4941,7 @@ postDominance | ConditionalAccess.cs:43:9:43:11 | exit set_Item (normal) | ConditionalAccess.cs:43:13:43:15 | {...} | | ConditionalAccess.cs:43:13:43:15 | {...} | ConditionalAccess.cs:43:9:43:11 | enter set_Item | | ConditionalAccess.cs:46:10:46:11 | exit M9 | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:12:54:29 | ... = ... | +| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:12:54:29 | ... += ... | | ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:46:10:46:11 | enter M9 | | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | ConditionalAccess.cs:48:9:48:26 | ...; | | ConditionalAccess.cs:48:9:48:20 | access to field IntField | ConditionalAccess.cs:48:24:48:25 | 42 | @@ -5052,20 +4970,15 @@ postDominance | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:51:18:51:31 | ... = ... | | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:52:9:52:28 | access to property StringProp | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:12:53:25 | ... - ... | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:18:52:38 | ... = ... | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:9:53:20 | access to field IntField | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:25:53:25 | 1 | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:12:54:29 | ... + ... | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:12:53:25 | ... = ... | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:27:54:29 | "!" | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | +| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:12:53:25 | ... -= ... | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith (normal) | @@ -5287,25 +5200,23 @@ postDominance | Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:104:13:104:28 | String x = ... | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:9:106:20 | if (...) ... | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:13:106:20 | ...; | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:18:106:19 | "" | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:106:13:106:19 | ... + ... | +| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:106:18:106:19 | "" | | Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:13 | access to local variable x | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:105:13:105:13 | access to parameter b | -| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:106:13:106:19 | ... = ... | +| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:106:13:106:19 | ... += ... | | Conditions.cs:107:13:107:13 | access to local variable x | Conditions.cs:107:9:109:24 | if (...) ... | | Conditions.cs:107:13:107:20 | access to property Length | Conditions.cs:107:13:107:13 | access to local variable x | | Conditions.cs:107:13:107:24 | ... > ... | Conditions.cs:107:24:107:24 | 0 | | Conditions.cs:107:24:107:24 | 0 | Conditions.cs:107:13:107:20 | access to property Length | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:13:109:24 | if (...) ... | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:17:109:24 | ...; | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:22:109:23 | "" | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:109:17:109:23 | ... + ... | +| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:109:22:109:23 | "" | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:108:17:108:18 | [true] !... | | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:17 | access to local variable x | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:110:16:110:16 | access to local variable x | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:107:13:107:24 | ... > ... | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:108:17:108:18 | [false] !... | -| Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:109:17:109:23 | ... = ... | +| Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:109:17:109:23 | ... += ... | | Conditions.cs:113:10:113:11 | exit M9 | Conditions.cs:113:10:113:11 | exit M9 (normal) | | Conditions.cs:113:10:113:11 | exit M9 (normal) | Conditions.cs:116:25:116:39 | ... < ... | | Conditions.cs:114:5:124:5 | {...} | Conditions.cs:113:10:113:11 | enter M9 | @@ -5890,7 +5801,7 @@ postDominance | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:260:27:260:32 | "Done" | | Finally.cs:260:9:260:34 | ...; | Finally.cs:258:13:258:46 | call to method WriteLine | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:9:260:34 | ...; | -| Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:272:13:272:18 | ... = ... | +| Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:272:13:272:18 | ... += ... | | Finally.cs:264:5:274:5 | {...} | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:264:5:274:5 | {...} | | Finally.cs:266:9:268:9 | {...} | Finally.cs:265:9:273:9 | try {...} ... | @@ -5902,8 +5813,7 @@ postDominance | Finally.cs:271:13:271:35 | ...; | Finally.cs:270:9:273:9 | {...} | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:35 | ...; | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:13:272:19 | ...; | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:18:272:18 | 3 | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:18 | ... + ... | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:272:18:272:18 | 3 | | Finally.cs:272:13:272:19 | ...; | Finally.cs:271:13:271:34 | call to method WriteLine | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:13 | access to parameter i | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to method | @@ -7720,14 +7630,11 @@ postDominance | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:209:5:222:5 | {...} | | cflow.cs:211:9:221:9 | {...} | cflow.cs:210:9:221:36 | do ... while (...); | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:24 | ... + ... | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:25 | ...; | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:22:212:24 | "a" | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:212:13:212:17 | access to field Field | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:212:22:212:24 | "a" | | cflow.cs:212:13:212:25 | ...; | cflow.cs:211:9:221:9 | {...} | | cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:17 | access to field Field | -| cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:212:13:212:24 | ... = ... | +| cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:212:13:212:24 | ... += ... | | cflow.cs:213:17:213:21 | access to field Field | cflow.cs:213:17:213:21 | this access | | cflow.cs:213:17:213:21 | this access | cflow.cs:213:13:216:13 | if (...) ... | | cflow.cs:213:17:213:28 | access to property Length | cflow.cs:213:17:213:21 | access to field Field | @@ -7756,14 +7663,11 @@ postDominance | cflow.cs:226:62:226:63 | 10 | cflow.cs:226:57:226:59 | "a" | | cflow.cs:227:9:237:9 | {...} | cflow.cs:226:22:226:22 | String x | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:22 | ... + ... | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:23 | ...; | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:22:228:22 | access to local variable x | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:228:13:228:17 | access to field Field | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:228:22:228:22 | access to local variable x | | cflow.cs:228:13:228:23 | ...; | cflow.cs:227:9:237:9 | {...} | | cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:17 | access to field Field | -| cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:228:13:228:22 | ... = ... | +| cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:228:13:228:22 | ... += ... | | cflow.cs:229:17:229:21 | access to field Field | cflow.cs:229:17:229:21 | this access | | cflow.cs:229:17:229:21 | this access | cflow.cs:229:13:232:13 | if (...) ... | | cflow.cs:229:17:229:28 | access to property Length | cflow.cs:229:17:229:21 | access to field Field | @@ -9077,7 +8981,6 @@ blockDominance | ConditionalAccess.cs:42:9:42:11 | enter get_Item | ConditionalAccess.cs:42:9:42:11 | enter get_Item | | ConditionalAccess.cs:43:9:43:11 | enter set_Item | ConditionalAccess.cs:43:9:43:11 | enter set_Item | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:46:10:46:11 | enter M9 | -| ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:48:24:48:25 | 42 | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:49:9:49:33 | ...; | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:49:26:49:32 | "Hello" | @@ -9089,17 +8992,12 @@ blockDominance | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:54:27:54:29 | "!" | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:48:24:48:25 | 42 | ConditionalAccess.cs:48:24:48:25 | 42 | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:49:9:49:33 | ...; | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:49:26:49:32 | "Hello" | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:50:9:50:24 | ...; | @@ -9110,16 +9008,12 @@ blockDominance | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:49:26:49:32 | "Hello" | ConditionalAccess.cs:49:26:49:32 | "Hello" | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:50:9:50:24 | ...; | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:50:13:50:13 | 0 | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:51:9:51:16 | access to property Prop | @@ -9128,71 +9022,47 @@ blockDominance | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:50:13:50:13 | 0 | ConditionalAccess.cs:50:13:50:13 | 0 | | ConditionalAccess.cs:51:9:51:16 | access to property Prop | ConditionalAccess.cs:51:9:51:16 | access to property Prop | | ConditionalAccess.cs:51:9:51:16 | access to property Prop | ConditionalAccess.cs:51:30:51:31 | 84 | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:51:9:51:16 | access to property Prop | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:51:9:51:32 | ...; | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:51:30:51:31 | 84 | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:51:30:51:31 | 84 | ConditionalAccess.cs:51:30:51:31 | 84 | | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:25:53:25 | 1 | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:27:54:29 | "!" | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | | Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | enter Conditions | @@ -13005,27 +12875,6 @@ postBlockDominance | ConditionalAccess.cs:42:9:42:11 | enter get_Item | ConditionalAccess.cs:42:9:42:11 | enter get_Item | | ConditionalAccess.cs:43:9:43:11 | enter set_Item | ConditionalAccess.cs:43:9:43:11 | enter set_Item | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:46:10:46:11 | enter M9 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | enter M9 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:48:24:48:25 | 42 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:49:9:49:33 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:49:26:49:32 | "Hello" | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:50:9:50:24 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:50:13:50:13 | 0 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:51:9:51:16 | access to property Prop | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:51:9:51:32 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:51:30:51:31 | 84 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:52:9:52:16 | access to property Prop | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:52:9:52:39 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:48:24:48:25 | 42 | ConditionalAccess.cs:48:24:48:25 | 42 | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:46:10:46:11 | enter M9 | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:48:24:48:25 | 42 | @@ -13058,7 +12907,6 @@ postBlockDominance | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:51:30:51:31 | 84 | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:46:10:46:11 | enter M9 | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:48:24:48:25 | 42 | @@ -13073,29 +12921,37 @@ postBlockDominance | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:46:10:46:11 | enter M9 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:48:24:48:25 | 42 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:49:9:49:33 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:49:26:49:32 | "Hello" | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:50:9:50:24 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:50:13:50:13 | 0 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:51:9:51:16 | access to property Prop | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:51:9:51:32 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:51:30:51:31 | 84 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:52:9:52:16 | access to property Prop | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:52:9:52:39 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:52:32:52:38 | "World" | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:20 | access to field IntField | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:46:10:46:11 | enter M9 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:48:24:48:25 | 42 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:49:9:49:33 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:49:26:49:32 | "Hello" | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:50:9:50:24 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:50:13:50:13 | 0 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:51:9:51:16 | access to property Prop | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:51:9:51:32 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:51:30:51:31 | 84 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:46:10:46:11 | enter M9 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:48:24:48:25 | 42 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:49:9:49:33 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:49:26:49:32 | "Hello" | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:50:9:50:24 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:50:13:50:13 | 0 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:51:9:51:16 | access to property Prop | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:51:9:51:32 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:51:30:51:31 | 84 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:52:9:52:16 | access to property Prop | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:52:9:52:39 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:52:32:52:38 | "World" | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:53:9:53:20 | access to field IntField | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:53:9:53:26 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:53:25:53:25 | 1 | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected index 8f48cd46fc3..99f8c25b49e 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected @@ -140,32 +140,22 @@ nodeEnclosing | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:42:10:42:11 | M5 | @@ -174,40 +164,27 @@ nodeEnclosing | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:49:10:49:11 | M6 | @@ -286,22 +263,15 @@ nodeEnclosing | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:66:10:66:11 | M9 | @@ -803,8 +773,7 @@ nodeEnclosing | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:3:10:3:10 | M | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:3:10:3:10 | M | | Assignments.cs:6:14:6:14 | 1 | Assignments.cs:3:10:3:10 | M | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:3:10:3:10 | M | @@ -812,16 +781,14 @@ nodeEnclosing | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:3:10:3:10 | M | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:3:10:3:10 | M | | Assignments.cs:9:14:9:14 | 2 | Assignments.cs:3:10:3:10 | M | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:3:10:3:10 | M | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:3:10:3:10 | M | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:3:10:3:10 | M | | Assignments.cs:12:14:12:17 | this access | Assignments.cs:3:10:3:10 | M | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:3:10:3:10 | M | @@ -1165,20 +1132,14 @@ nodeEnclosing | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:46:10:46:11 | M9 | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:46:10:46:11 | M9 | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | CommaJoinWith | | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | CommaJoinWith | @@ -1412,8 +1373,7 @@ nodeEnclosing | Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:102:12:102:13 | M8 | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:102:12:102:13 | M8 | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:106:13:106:20 | ...; | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:106:18:106:19 | "" | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:102:12:102:13 | M8 | @@ -1426,8 +1386,7 @@ nodeEnclosing | Conditions.cs:108:17:108:18 | [true] !... | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:102:12:102:13 | M8 | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:102:12:102:13 | M8 | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:109:22:109:23 | "" | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | M8 | @@ -2131,8 +2090,7 @@ nodeEnclosing | Finally.cs:271:13:271:35 | ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:271:31:271:33 | "3" | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:19 | ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:18:272:18 | 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 | @@ -4204,11 +4162,8 @@ nodeEnclosing | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:208:10:208:11 | Do | | cflow.cs:211:9:221:9 | {...} | cflow.cs:208:10:208:11 | Do | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:208:10:208:11 | Do | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:208:10:208:11 | Do | | cflow.cs:212:13:212:17 | this access | cflow.cs:208:10:208:11 | Do | -| cflow.cs:212:13:212:17 | this access | cflow.cs:208:10:208:11 | Do | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:208:10:208:11 | Do | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:208:10:208:11 | Do | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:208:10:208:11 | Do | | cflow.cs:212:13:212:25 | ...; | cflow.cs:208:10:208:11 | Do | | cflow.cs:212:22:212:24 | "a" | cflow.cs:208:10:208:11 | Do | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:208:10:208:11 | Do | @@ -4243,11 +4198,8 @@ nodeEnclosing | cflow.cs:226:62:226:63 | 10 | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:227:9:237:9 | {...} | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:224:10:224:16 | Foreach | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:228:13:228:17 | this access | cflow.cs:224:10:224:16 | Foreach | -| cflow.cs:228:13:228:17 | this access | cflow.cs:224:10:224:16 | Foreach | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:224:10:224:16 | Foreach | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:224:10:224:16 | Foreach | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:228:13:228:23 | ...; | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:224:10:224:16 | Foreach | @@ -4666,7 +4618,6 @@ blockEnclosing | ConditionalAccess.cs:42:9:42:11 | enter get_Item | ConditionalAccess.cs:42:9:42:11 | get_Item | | ConditionalAccess.cs:43:9:43:11 | enter set_Item | ConditionalAccess.cs:43:9:43:11 | set_Item | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:48:24:48:25 | 42 | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:49:26:49:32 | "Hello" | ConditionalAccess.cs:46:10:46:11 | M9 | @@ -4678,13 +4629,10 @@ blockEnclosing | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | CommaJoinWith | | Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | Conditions | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected index 410916afabd..248562dbc83 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected @@ -109,77 +109,48 @@ | AccessorCalls.cs:39:16:39:16 | 0 | AccessorCalls.cs:39:16:39:16 | 0 | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:43:5:47:5 | {...} | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:33 | ...; | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:26 | this access | | AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:23:44:26 | this access | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:31 | ...; | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:25 | this access | | AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:22:45:25 | this access | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:27 | ...; | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:20:46:23 | this access | | AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:20:46:23 | this access | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:25:46:25 | 0 | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:50:5:54:5 | {...} | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:37 | ...; | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:28 | this access | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:28 | this access | | AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:25:51:28 | this access | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:35 | ...; | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:27 | this access | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:27 | this access | | AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:24:52:27 | this access | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:31 | ...; | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:25 | this access | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:22:53:25 | this access | | AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:22:53:25 | this access | @@ -249,24 +220,15 @@ | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:70:9:70:9 | access to local variable d | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:22 | ...; | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:26 | ...; | | AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:25:71:25 | access to parameter e | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:21 | ...; | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:17:72:17 | access to local variable d | | AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:17:72:17 | access to local variable d | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:19:72:19 | 1 | @@ -689,9 +651,7 @@ | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:17:5:17 | 0 | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:17:5:17 | 0 | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:9:6:9 | access to local variable x | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:9 | access to local variable x | | Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:9 | access to local variable x | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:6:9:6:9 | access to local variable x | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:15 | ...; | | Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:14:6:14 | 1 | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:9:8:22 | ... ...; | @@ -700,8 +660,6 @@ | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:21:8:21 | 0 | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:9:9:9 | access to local variable d | | Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:9 | access to local variable d | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:9:9:9:9 | access to local variable d | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:9 | access to local variable d | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:15 | ...; | | Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:14:9:14 | 2 | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:9:11:34 | ... ...; | @@ -709,8 +667,6 @@ | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:17:11:33 | object creation of type Assignments | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:9:12:9 | access to local variable a | | Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:9 | access to local variable a | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:12:9:12:9 | access to local variable a | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:9 | access to local variable a | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:18 | ...; | | Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:14:12:17 | this access | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:13 | this access | @@ -966,22 +922,14 @@ | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:32:52:38 | "World" | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:25:53:25 | 1 | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | | ConditionalAccess.cs:60:70:60:78 | ... + ... | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | @@ -1180,9 +1128,7 @@ | Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:105:9:106:20 | if (...) ... | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:13:105:13 | access to parameter b | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:13:106:13 | access to local variable x | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:13:106:13 | access to local variable x | | Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:106:13:106:13 | access to local variable x | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:106:13:106:13 | access to local variable x | | Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:20 | ...; | | Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:18:106:19 | "" | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:9:109:24 | if (...) ... | @@ -1194,9 +1140,7 @@ | Conditions.cs:108:17:108:18 | !... | Conditions.cs:108:18:108:18 | access to parameter b | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:18:108:18 | access to parameter b | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:17:109:17 | access to local variable x | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:17 | access to local variable x | | Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:109:17:109:17 | access to local variable x | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:109:17:109:17 | access to local variable x | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:24 | ...; | | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:22:109:23 | "" | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:110:16:110:16 | access to local variable x | @@ -1776,9 +1720,7 @@ | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:13:271:35 | ...; | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:31:271:33 | "3" | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:13:272:13 | access to parameter i | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:13 | access to parameter i | | Finally.cs:272:13:272:18 | ... += ... | Finally.cs:272:13:272:13 | access to parameter i | -| 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 | @@ -3417,12 +3359,8 @@ | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:210:9:221:36 | do ... while (...); | | cflow.cs:211:9:221:9 | {...} | cflow.cs:211:9:221:9 | {...} | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | this access | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:17 | this access | | cflow.cs:212:13:212:24 | ... += ... | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:212:13:212:17 | this access | | cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:25 | ...; | | cflow.cs:212:22:212:24 | "a" | cflow.cs:212:22:212:24 | "a" | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:13:216:13 | if (...) ... | @@ -3454,12 +3392,8 @@ | cflow.cs:226:62:226:63 | 10 | cflow.cs:226:62:226:63 | 10 | | cflow.cs:227:9:237:9 | {...} | cflow.cs:227:9:237:9 | {...} | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | this access | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:17 | this access | | cflow.cs:228:13:228:22 | ... += ... | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:228:13:228:17 | this access | | cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:23 | ...; | | cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:22:228:22 | access to local variable x | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:13:232:13 | if (...) ... | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected index a6794112ebd..602dd8c2a52 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected @@ -107,78 +107,49 @@ | AccessorCalls.cs:39:9:39:19 | ...++ | AccessorCalls.cs:39:9:39:19 | ...++ | normal | | AccessorCalls.cs:39:9:39:20 | ...; | AccessorCalls.cs:39:9:39:19 | ...++ | normal | | AccessorCalls.cs:39:16:39:16 | 0 | AccessorCalls.cs:39:16:39:16 | 0 | normal | -| AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | +| AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:46:9:46:26 | ... += ... | normal | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | normal | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | normal | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:12 | this access | normal | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:18 | access to field Field | normal | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:32 | ... + ... | normal | -| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:44:9:44:32 | ... = ... | normal | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:44:9:44:32 | ... = ... | normal | -| AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:32 | ... = ... | normal | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:44:9:44:32 | ... += ... | normal | +| AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:32 | ... += ... | normal | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:26 | this access | normal | | AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:23:44:32 | access to field Field | normal | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | normal | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | normal | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:12 | this access | normal | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:17 | access to property Prop | normal | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:30 | ... + ... | normal | -| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:45:9:45:30 | ... = ... | normal | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:45:9:45:30 | ... = ... | normal | -| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:30 | ... = ... | normal | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:45:9:45:30 | ... += ... | normal | +| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:30 | ... += ... | normal | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:25 | this access | normal | | AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:22:45:30 | access to property Prop | normal | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | normal | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | normal | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:15 | access to indexer | normal | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:14:46:14 | 0 | normal | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:26 | ... + ... | normal | -| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | normal | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:46:9:46:26 | ... += ... | normal | +| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:26 | ... += ... | normal | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | normal | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:20:46:23 | this access | normal | | AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:20:46:26 | access to indexer | normal | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:25:46:25 | 0 | normal | -| AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | normal | +| AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:53:9:53:30 | ... += ... | normal | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | normal | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:14 | access to field x | normal | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:14 | access to field x | normal | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:14 | access to field x | normal | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:20 | access to field Field | normal | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:36 | ... + ... | normal | -| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:51:9:51:36 | ... = ... | normal | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:51:9:51:36 | ... = ... | normal | -| AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:36 | ... = ... | normal | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:51:9:51:36 | ... += ... | normal | +| AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:36 | ... += ... | normal | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:28 | this access | normal | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:30 | access to field x | normal | | AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:25:51:36 | access to field Field | normal | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | normal | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | normal | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:14 | access to field x | normal | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:14 | access to field x | normal | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:14 | access to field x | normal | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:19 | access to property Prop | normal | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:34 | ... + ... | normal | -| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:52:9:52:34 | ... = ... | normal | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:52:9:52:34 | ... = ... | normal | -| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:34 | ... = ... | normal | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:52:9:52:34 | ... += ... | normal | +| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:34 | ... += ... | normal | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:27 | this access | normal | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:29 | access to field x | normal | | AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:24:52:34 | access to property Prop | normal | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | normal | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | normal | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:14 | access to field x | normal | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:14 | access to field x | normal | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:17 | access to indexer | normal | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:16:53:16 | 0 | normal | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:30 | ... + ... | normal | -| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | normal | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:53:9:53:30 | ... += ... | normal | +| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:30 | ... += ... | normal | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | normal | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:25 | this access | normal | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:22:53:27 | access to field x | normal | @@ -249,23 +220,14 @@ | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | normal | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | normal | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | normal | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | normal | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:9 | access to local variable d | normal | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | normal | -| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:71:9:71:25 | ... = ... | normal | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:71:9:71:25 | ... = ... | normal | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | normal | -| AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:25 | ... = ... | normal | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:71:9:71:25 | ... += ... | normal | +| AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:25 | ... += ... | normal | | AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:25:71:25 | access to parameter e | normal | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | normal | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | normal | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:12 | dynamic access to element | normal | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:11:72:11 | 0 | normal | -| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:72:9:72:20 | ... = ... | normal | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:72:9:72:20 | ... = ... | normal | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | normal | -| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:20 | ... = ... | normal | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | normal | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:72:9:72:20 | ... += ... | normal | +| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:20 | ... += ... | normal | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | normal | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:17:72:17 | access to local variable d | normal | | AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:17:72:20 | dynamic access to element | normal | @@ -788,29 +750,23 @@ | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:13:5:17 | Int32 x = ... | normal | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:17:5:17 | 0 | normal | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:9:6:9 | access to local variable x | normal | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:14 | ... + ... | normal | -| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:14 | ... = ... | normal | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:6:9:6:14 | ... = ... | normal | -| Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:14 | ... = ... | normal | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:14 | ... += ... | normal | +| Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:14 | ... += ... | normal | | Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:14:6:14 | 1 | normal | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:17:8:21 | dynamic d = ... | normal | | Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:8:17:8:21 | dynamic d = ... | normal | | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:21:8:21 | 0 | normal | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:21:8:21 | (...) ... | normal | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:9:9:9 | access to local variable d | normal | -| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:14 | ... = ... | normal | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:9:9:9:14 | ... = ... | normal | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:14 | dynamic call to operator - | normal | -| Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:14 | ... = ... | normal | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:14 | ... -= ... | normal | +| Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:14 | ... -= ... | normal | | Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:14:9:14 | 2 | normal | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:13:11:33 | Assignments a = ... | normal | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:11:13:11:33 | Assignments a = ... | normal | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:17:11:33 | object creation of type Assignments | normal | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:9:12:9 | access to local variable a | normal | -| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:17 | ... = ... | normal | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:12:9:12:17 | ... = ... | normal | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:17 | call to operator + | normal | -| Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:17 | ... = ... | normal | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:17 | ... += ... | normal | +| Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:17 | ... += ... | normal | | Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:14:12:17 | this access | normal | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:13 | this access | normal | | Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:9:14:13 | this access | normal | @@ -1120,8 +1076,7 @@ | ConditionalAccess.cs:42:15:42:26 | return ...; | ConditionalAccess.cs:42:15:42:26 | return ...; | return | | ConditionalAccess.cs:42:22:42:25 | null | ConditionalAccess.cs:42:22:42:25 | null | normal | | ConditionalAccess.cs:43:13:43:15 | {...} | ConditionalAccess.cs:43:13:43:15 | {...} | normal | -| ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | +| ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:54:12:54:29 | ... += ... | normal | | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | non-null | | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | null | | ConditionalAccess.cs:48:9:48:20 | access to field IntField | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | non-null | @@ -1181,36 +1136,18 @@ | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:52:18:52:38 | ... = ... | normal | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:32:52:38 | "World" | normal | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:20 | access to field IntField | normal | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:12:53:25 | ... = ... | normal | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:12:53:25 | ... - ... | normal | -| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:12:53:25 | ... = ... | normal | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:12:53:25 | ... = ... | normal | +| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:12:53:25 | ... -= ... | normal | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:12:53:25 | ... -= ... | normal | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:25:53:25 | 1 | normal | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | normal | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:12:54:29 | ... + ... | normal | -| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | +| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:12:54:29 | ... += ... | normal | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:12:54:29 | ... += ... | normal | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:27:54:29 | "!" | normal | | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | normal | | ConditionalAccess.cs:60:70:60:78 | ... + ... | ConditionalAccess.cs:60:70:60:78 | ... + ... | normal | @@ -1458,34 +1395,30 @@ | Conditions.cs:104:17:104:17 | access to parameter b | Conditions.cs:104:17:104:17 | access to parameter b | normal | | Conditions.cs:104:17:104:28 | call to method ToString | Conditions.cs:104:17:104:28 | call to method ToString | normal | | Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:105:13:105:13 | access to parameter b | false | -| Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:106:13:106:19 | ... = ... | normal | +| Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:106:13:106:19 | ... += ... | normal | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:13:105:13 | access to parameter b | false | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:13:105:13 | access to parameter b | true | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:13:106:13 | access to local variable x | normal | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:13:106:19 | ... + ... | normal | -| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:106:13:106:19 | ... = ... | normal | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:106:13:106:19 | ... = ... | normal | -| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... = ... | normal | +| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:106:13:106:19 | ... += ... | normal | +| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... += ... | normal | | Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:18:106:19 | "" | normal | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:24 | ... > ... | false | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:108:17:108:18 | !... | false | -| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... = ... | normal | +| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... += ... | normal | | Conditions.cs:107:13:107:13 | access to local variable x | Conditions.cs:107:13:107:13 | access to local variable x | normal | | Conditions.cs:107:13:107:20 | access to property Length | Conditions.cs:107:13:107:20 | access to property Length | normal | | Conditions.cs:107:13:107:24 | ... > ... | Conditions.cs:107:13:107:24 | ... > ... | false | | Conditions.cs:107:13:107:24 | ... > ... | Conditions.cs:107:13:107:24 | ... > ... | true | | Conditions.cs:107:24:107:24 | 0 | Conditions.cs:107:24:107:24 | 0 | normal | | Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:108:17:108:18 | !... | false | -| Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... = ... | normal | +| Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... += ... | normal | | Conditions.cs:108:17:108:18 | !... | Conditions.cs:108:17:108:18 | !... | false | | Conditions.cs:108:17:108:18 | !... | Conditions.cs:108:17:108:18 | !... | true | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:18:108:18 | access to parameter b | false | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:18:108:18 | access to parameter b | true | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:17:109:17 | access to local variable x | normal | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:23 | ... + ... | normal | -| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:109:17:109:23 | ... = ... | normal | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:109:17:109:23 | ... = ... | normal | -| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... = ... | normal | +| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:109:17:109:23 | ... += ... | normal | +| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... += ... | normal | | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:22:109:23 | "" | normal | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:110:9:110:17 | return ...; | return | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:16:110:16 | access to local variable x | normal | @@ -2405,10 +2338,10 @@ | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:260:9:260:33 | call to method WriteLine | normal | | Finally.cs:260:9:260:34 | ...; | Finally.cs:260:9:260:33 | call to method WriteLine | normal | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:27:260:32 | "Done" | normal | -| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... = ... | throw(Exception) [normal] (0) | -| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... = ... | throw(Exception) [normal] (0) | +| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... += ... | normal | +| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... += ... | throw(Exception) [normal] (0) | +| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... += ... | normal | +| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... += ... | throw(Exception) [normal] (0) | | Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:34 | call to method WriteLine | normal | | Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:34 | call to method WriteLine | throw(Exception) | | Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:267:13:267:34 | call to method WriteLine | normal | @@ -2416,15 +2349,13 @@ | Finally.cs:267:13:267:35 | ...; | Finally.cs:267:13:267:34 | call to method WriteLine | normal | | Finally.cs:267:13:267:35 | ...; | Finally.cs:267:13:267:34 | call to method WriteLine | throw(Exception) | | Finally.cs:267:31:267:33 | "1" | Finally.cs:267:31:267:33 | "1" | normal | -| Finally.cs:270:9:273:9 | {...} | Finally.cs:272:13:272:18 | ... = ... | normal | +| Finally.cs:270:9:273:9 | {...} | Finally.cs:272:13:272:18 | ... += ... | normal | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:271:13:271:34 | call to method WriteLine | normal | | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:13:271:34 | call to method WriteLine | normal | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:31:271:33 | "3" | normal | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:13:272:13 | access to parameter i | normal | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... + ... | normal | -| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:272:13:272:18 | ... = ... | normal | -| 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: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 | call to method | Foreach.cs:4:7:4:13 | call to method | normal | @@ -4403,13 +4334,9 @@ | cflow.cs:211:9:221:9 | {...} | cflow.cs:217:17:217:32 | ... < ... | false | | cflow.cs:211:9:221:9 | {...} | cflow.cs:219:17:219:22 | break; | break | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | access to field Field | normal | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | this access | normal | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | normal | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | normal | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:24 | ... + ... | normal | -| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:212:13:212:24 | ... = ... | normal | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:212:13:212:24 | ... = ... | normal | -| cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:24 | ... = ... | normal | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:212:13:212:24 | ... += ... | normal | +| cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:24 | ... += ... | normal | | cflow.cs:212:22:212:24 | "a" | cflow.cs:212:22:212:24 | "a" | normal | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:17:213:32 | ... > ... | false | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:215:17:215:25 | continue; | continue | @@ -4449,13 +4376,9 @@ | cflow.cs:227:9:237:9 | {...} | cflow.cs:233:17:233:32 | ... < ... | false | | cflow.cs:227:9:237:9 | {...} | cflow.cs:235:17:235:22 | break; | break | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | access to field Field | normal | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | this access | normal | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | normal | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | normal | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:22 | ... + ... | normal | -| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:228:13:228:22 | ... = ... | normal | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:228:13:228:22 | ... = ... | normal | -| cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:22 | ... = ... | normal | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:228:13:228:22 | ... += ... | normal | +| cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:22 | ... += ... | normal | | cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:22:228:22 | access to local variable x | normal | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:17:229:32 | ... > ... | false | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:231:17:231:25 | continue; | continue | diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index 4ce98d5096f..544bc1bd776 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -128,77 +128,54 @@ | AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:43:5:47:5 | {...} | | | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:42:10:42:11 | exit M5 | | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:44:9:44:33 | ...; | | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:18 | access to field Field | | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... = ... | | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:23:44:26 | this access | | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:18 | access to field Field | | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:45:9:45:31 | ...; | | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:45:9:45:31 | ...; | | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:12 | this access | | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:32 | access to field Field | | -| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... + ... | | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | | +| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... += ... | | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:17 | access to property Prop | | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... = ... | | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:22:45:25 | this access | | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:17 | access to property Prop | | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:46:9:46:27 | ...; | | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:46:9:46:27 | ...; | | | AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:12 | this access | | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:30 | access to property Prop | | -| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... + ... | | +| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... += ... | | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... = ... | | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:20:46:23 | this access | | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:15 | access to indexer | | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | | | AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:12 | this access | | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:12 | this access | | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:15 | access to indexer | | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:25:46:25 | 0 | | -| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... + ... | | +| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... += ... | | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:20:46:26 | access to indexer | | | AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:50:5:54:5 | {...} | | | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:49:10:49:11 | exit M6 | | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:51:9:51:37 | ...; | | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:20 | access to field Field | | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... = ... | | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:25:51:28 | this access | | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:20 | access to field Field | | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:52:9:52:35 | ...; | | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:52:9:52:35 | ...; | | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:12 | this access | | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:30 | access to field x | | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:36 | access to field Field | | -| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... + ... | | +| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... += ... | | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:19 | access to property Prop | | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... = ... | | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:24:52:27 | this access | | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:19 | access to property Prop | | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:53:9:53:31 | ...; | | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:53:9:53:31 | ...; | | | AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:12 | this access | | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:29 | access to field x | | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:34 | access to property Prop | | -| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... + ... | | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | | +| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... += ... | | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... = ... | | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:22:53:25 | this access | | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:17 | access to indexer | | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | | | AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:12 | this access | | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:12 | this access | | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:17 | access to indexer | | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:27 | access to field x | | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:29:53:29 | 0 | | -| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... + ... | | +| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... += ... | | | AccessorCalls.cs:53:29:53:29 | 0 | AccessorCalls.cs:53:22:53:30 | access to indexer | | | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:57:5:59:5 | {...} | | | AccessorCalls.cs:56:10:56:11 | exit M7 (normal) | AccessorCalls.cs:56:10:56:11 | exit M7 | | @@ -270,25 +247,18 @@ | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | | | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:71:9:71:26 | ...; | | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:9 | access to local variable d | | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:25 | ... = ... | | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:25:71:25 | access to parameter e | | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:72:9:72:21 | ...; | | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:72:9:72:21 | ...; | | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:9 | access to local variable d | | -| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | | +| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:25 | ... += ... | | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | ... = ... | | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:17:72:17 | access to local variable d | | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:73:9:73:84 | ...; | | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:12 | dynamic access to element | | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:73:9:73:84 | ...; | | | AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:9 | access to local variable d | | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:9 | access to local variable d | | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:12 | dynamic access to element | | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:19:72:19 | 1 | | -| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | | +| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | ... += ... | | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:17:72:20 | dynamic access to element | | | AccessorCalls.cs:73:9:73:44 | (..., ...) | AccessorCalls.cs:73:49:73:49 | access to local variable d | | | AccessorCalls.cs:73:9:73:83 | ... = ... | AccessorCalls.cs:66:10:66:11 | exit M9 (normal) | | @@ -819,27 +789,24 @@ | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:6:9:6:15 | ...; | | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:13:5:17 | Int32 x = ... | | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:14:6:14 | 1 | | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:14 | ... = ... | | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:8:9:8:22 | ... ...; | | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:8:9:8:22 | ... ...; | | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:9 | access to local variable x | | -| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:14 | ... + ... | | +| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:14 | ... += ... | | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:21:8:21 | 0 | | | Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:9:9:9:15 | ...; | | | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:21:8:21 | (...) ... | | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:17:8:21 | dynamic d = ... | | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:14:9:14 | 2 | | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:11:9:11:34 | ... ...; | | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:14 | ... = ... | | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:11:9:11:34 | ... ...; | | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:9 | access to local variable d | | -| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:14 | dynamic call to operator - | | +| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:14 | ... -= ... | | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:17:11:33 | object creation of type Assignments | | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:12:9:12:18 | ...; | | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:13:11:33 | Assignments a = ... | | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:14:12:17 | this access | | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:14:9:14:36 | ...; | | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:17 | ... = ... | | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:14:9:14:36 | ...; | | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:9 | access to local variable a | | -| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:17 | call to operator + | | +| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:17 | ... += ... | | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:35 | ... += ... | | | Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:18:14:35 | (...) => ... | | | Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:3:10:3:10 | exit M (normal) | | @@ -1187,26 +1154,18 @@ | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | | | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:53:9:53:26 | ...; | | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:9:52:28 | access to property StringProp | | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:20 | access to field IntField | non-null | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:25:53:25 | 1 | null | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:30 | ...; | null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:12:53:25 | ... = ... | | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:25:53:25 | 1 | | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:54:9:54:30 | ...; | | -| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... - ... | | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | null | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:54:9:54:30 | ...; | | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... -= ... | | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | non-null | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:27:54:29 | "!" | null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:12:54:29 | ... = ... | | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:27:54:29 | "!" | | | ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | -| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... + ... | | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... += ... | | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | | | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith (normal) | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | | | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | ConditionalAccess.cs:60:75:60:78 | ", " | | @@ -1453,10 +1412,9 @@ | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:106:13:106:20 | ...; | true | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:107:9:109:24 | if (...) ... | false | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:18:106:19 | "" | | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:13:106:19 | ... = ... | | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:107:9:109:24 | if (...) ... | | +| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:107:9:109:24 | if (...) ... | | | Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:13 | access to local variable x | | -| Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:19 | ... + ... | | +| Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:19 | ... += ... | | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:13 | access to local variable x | | | Conditions.cs:107:13:107:13 | access to local variable x | Conditions.cs:107:13:107:20 | access to property Length | | | Conditions.cs:107:13:107:20 | access to property Length | Conditions.cs:107:24:107:24 | 0 | | @@ -1469,10 +1427,9 @@ | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:17:108:18 | [false] !... | true | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:17:108:18 | [true] !... | false | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:22:109:23 | "" | | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:23 | ... = ... | | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:110:16:110:16 | access to local variable x | | +| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:110:16:110:16 | access to local variable x | | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:17 | access to local variable x | | -| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... + ... | | +| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... += ... | | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | exit M8 (normal) | return | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:9:110:17 | return ...; | | | Conditions.cs:113:10:113:11 | enter M9 | Conditions.cs:114:5:124:5 | {...} | | @@ -2205,11 +2162,10 @@ | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:31:271:33 | "3" | | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:34 | call to method WriteLine | | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:18:272:18 | 3 | | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... = ... | | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | exception | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (normal) | | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | exception | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | exit M13 (normal) | | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | | -| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | | +| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... += ... | | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | | | Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | call to constructor Object | | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | this access | | @@ -4305,14 +4261,11 @@ | cflow.cs:209:5:222:5 | {...} | cflow.cs:210:9:221:36 | do ... while (...); | | | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:211:9:221:9 | {...} | | | cflow.cs:211:9:221:9 | {...} | cflow.cs:212:13:212:25 | ...; | | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:24 | ... = ... | | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:22:212:24 | "a" | | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | access to field Field | | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:17 | access to field Field | | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:213:13:216:13 | if (...) ... | | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:213:13:216:13 | if (...) ... | | | cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:17 | this access | | -| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:24 | ... + ... | | +| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:24 | ... += ... | | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:17:213:21 | this access | | | cflow.cs:213:17:213:21 | access to field Field | cflow.cs:213:17:213:28 | access to property Length | | | cflow.cs:213:17:213:21 | this access | cflow.cs:213:17:213:21 | access to field Field | | @@ -4347,14 +4300,11 @@ | cflow.cs:226:57:226:59 | "a" | cflow.cs:226:62:226:63 | 10 | | | cflow.cs:226:62:226:63 | 10 | cflow.cs:226:27:226:64 | call to method Repeat | | | cflow.cs:227:9:237:9 | {...} | cflow.cs:228:13:228:23 | ...; | | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:22 | ... = ... | | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:22:228:22 | access to local variable x | | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | access to field Field | | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:17 | access to field Field | | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:229:13:232:13 | if (...) ... | | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:229:13:232:13 | if (...) ... | | | cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:17 | this access | | -| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:22 | ... + ... | | +| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:22 | ... += ... | | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:17:229:21 | this access | | | cflow.cs:229:17:229:21 | access to field Field | cflow.cs:229:17:229:28 | access to property Length | | | cflow.cs:229:17:229:21 | this access | cflow.cs:229:17:229:21 | access to field Field | | diff --git a/csharp/ql/test/library-tests/csharp11/PrintAst.expected b/csharp/ql/test/library-tests/csharp11/PrintAst.expected index 391c41540ec..cf501daa763 100644 --- a/csharp/ql/test/library-tests/csharp11/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp11/PrintAst.expected @@ -614,7 +614,7 @@ Operators.cs: # 12| 1: [UnaryMinusExpr] -... # 12| 0: [IntLiteral] 4 # 13| 5: [ExprStmt] ...; -# 13| 0: [AssignUnsighedRightShiftExpr] ... >>>= ... +# 13| 0: [AssignUnsignedRightShiftExpr] ... >>>= ... # 13| 0: [LocalVariableAccess] access to local variable z # 13| 1: [IntLiteral] 5 # 17| [Class] MyOperatorClass diff --git a/csharp/ql/test/library-tests/csharp11/operators.expected b/csharp/ql/test/library-tests/csharp11/operators.expected index 2c7bda6800d..177019a3ea0 100644 --- a/csharp/ql/test/library-tests/csharp11/operators.expected +++ b/csharp/ql/test/library-tests/csharp11/operators.expected @@ -1,8 +1,7 @@ binarybitwise | Operators.cs:7:18:7:25 | ... >>> ... | Operators.cs:7:18:7:19 | access to local variable x1 | Operators.cs:7:25:7:25 | 2 | >>> | UnsignedRightShiftExpr | | Operators.cs:10:18:10:25 | ... >>> ... | Operators.cs:10:18:10:19 | access to local variable y1 | Operators.cs:10:25:10:25 | 3 | >>> | UnsignedRightShiftExpr | -| Operators.cs:13:9:13:16 | ... >>> ... | Operators.cs:13:9:13:9 | access to local variable z | Operators.cs:13:16:13:16 | 5 | >>> | UnsignedRightShiftExpr | assignbitwise -| Operators.cs:13:9:13:16 | ... >>>= ... | Operators.cs:13:9:13:9 | access to local variable z | Operators.cs:13:16:13:16 | 5 | >>>= | AssignUnsighedRightShiftExpr | +| Operators.cs:13:9:13:16 | ... >>>= ... | Operators.cs:13:9:13:9 | access to local variable z | Operators.cs:13:16:13:16 | 5 | >>>= | AssignUnsignedRightShiftExpr | userdefined | Operators.cs:19:44:19:46 | >>> | op_UnsignedRightShift | UnsignedRightShiftOperator | diff --git a/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.expected b/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.expected index d388d2fdb7c..1b4f30ad6e7 100644 --- a/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.expected +++ b/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.expected @@ -1,5 +1,4 @@ nullcoalescing -| NullCoalescingAssignment.cs:8:9:8:18 | ... ?? ... | | NullableRefTypes.cs:94:17:94:25 | ... ?? ... | assignments -| NullCoalescingAssignment.cs:8:9:8:18 | ... ??= ... | NullCoalescingAssignment.cs:8:9:8:18 | ... = ... | +| NullCoalescingAssignment.cs:8:9:8:18 | ... ??= ... | diff --git a/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.ql b/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.ql index a3a8ca20e92..1a452274677 100644 --- a/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.ql +++ b/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.ql @@ -2,6 +2,4 @@ import csharp query predicate nullcoalescing(NullCoalescingExpr expr) { any() } -query predicate assignments(AssignCoalesceExpr expr, Expr expanded) { - expanded = expr.getExpandedAssignment() -} +query predicate assignments(AssignCoalesceExpr expr) { any() } diff --git a/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.expected b/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.expected index 2657c450d68..b8d360d1608 100644 --- a/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.expected +++ b/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.expected @@ -4,9 +4,8 @@ | NullCoalescingAssignment.cs:7:9:7:24 | ... ...; | NullCoalescingAssignment.cs:7:20:7:23 | null | semmle.label | successor | | NullCoalescingAssignment.cs:7:16:7:23 | Object o = ... | NullCoalescingAssignment.cs:8:9:8:19 | ...; | semmle.label | successor | | NullCoalescingAssignment.cs:7:20:7:23 | null | NullCoalescingAssignment.cs:7:16:7:23 | Object o = ... | semmle.label | successor | -| NullCoalescingAssignment.cs:8:9:8:9 | access to local variable o | NullCoalescingAssignment.cs:8:9:8:18 | ... ?? ... | semmle.label | non-null | +| NullCoalescingAssignment.cs:8:9:8:9 | access to local variable o | NullCoalescingAssignment.cs:8:9:8:18 | ... ??= ... | semmle.label | non-null | | NullCoalescingAssignment.cs:8:9:8:9 | access to local variable o | NullCoalescingAssignment.cs:8:15:8:18 | this access | semmle.label | null | -| NullCoalescingAssignment.cs:8:9:8:18 | ... = ... | NullCoalescingAssignment.cs:5:10:5:23 | exit NullCoalescing (normal) | semmle.label | successor | -| NullCoalescingAssignment.cs:8:9:8:18 | ... ?? ... | NullCoalescingAssignment.cs:8:9:8:18 | ... = ... | semmle.label | successor | +| NullCoalescingAssignment.cs:8:9:8:18 | ... ??= ... | NullCoalescingAssignment.cs:5:10:5:23 | exit NullCoalescing (normal) | semmle.label | successor | | NullCoalescingAssignment.cs:8:9:8:19 | ...; | NullCoalescingAssignment.cs:8:9:8:9 | access to local variable o | semmle.label | successor | -| NullCoalescingAssignment.cs:8:15:8:18 | this access | NullCoalescingAssignment.cs:8:9:8:18 | ... ?? ... | semmle.label | successor | +| NullCoalescingAssignment.cs:8:15:8:18 | this access | NullCoalescingAssignment.cs:8:9:8:18 | ... ??= ... | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 861e4c519a8..29533a67083 100644 --- a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -32,13 +32,14 @@ | 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: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 | ... += ... | 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 | [post] access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | | 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 | 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 | ... += ... | 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 | diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected index 0950638d830..4be5dcf1295 100644 --- a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected @@ -31,19 +31,20 @@ | 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: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:13 | access to local variable 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:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:13 | access to local variable 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 | [post] access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | +| 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:16 | access to local variable 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:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:16 | access to local variable 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: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) | diff --git a/csharp/ql/test/library-tests/dataflow/modulusanalysis/ModulusAnalysis.expected b/csharp/ql/test/library-tests/dataflow/modulusanalysis/ModulusAnalysis.expected index ac03ba8b8f3..bc1f2cad5c7 100644 --- a/csharp/ql/test/library-tests/dataflow/modulusanalysis/ModulusAnalysis.expected +++ b/csharp/ql/test/library-tests/dataflow/modulusanalysis/ModulusAnalysis.expected @@ -153,8 +153,7 @@ | ModulusAnalysis.cs:92:25:92:25 | access to local variable j | SSA phi(j) | 0 | 0 | | ModulusAnalysis.cs:92:29:92:31 | access to parameter cap | SSA param(cap) | 0 | 0 | | ModulusAnalysis.cs:92:34:92:34 | access to local variable j | SSA phi(j) | 0 | 0 | -| ModulusAnalysis.cs:92:34:92:39 | ... + ... | SSA phi(j) | 1 | 0 | -| ModulusAnalysis.cs:92:34:92:39 | ... = ... | SSA phi(j) | 1 | 0 | +| ModulusAnalysis.cs:92:34:92:39 | ... += ... | SSA phi(j) | 1 | 0 | | ModulusAnalysis.cs:92:39:92:39 | 1 | 0 | 1 | 0 | | ModulusAnalysis.cs:93:38:93:38 | access to local variable j | SSA phi(j) | 0 | 0 | | ModulusAnalysis.cs:95:22:95:22 | 0 | 0 | 0 | 0 | @@ -165,12 +164,9 @@ | ModulusAnalysis.cs:95:34:95:34 | access to local variable k | 0 | 0 | 3 | | ModulusAnalysis.cs:95:34:95:34 | access to local variable k | SSA def(k) | 0 | 3 | | ModulusAnalysis.cs:95:34:95:34 | access to local variable k | SSA phi(k) | 0 | 0 | -| ModulusAnalysis.cs:95:34:95:39 | ... + ... | 0 | 0 | 3 | -| ModulusAnalysis.cs:95:34:95:39 | ... + ... | SSA def(k) | 0 | 3 | -| ModulusAnalysis.cs:95:34:95:39 | ... + ... | SSA phi(k) | 3 | 0 | -| ModulusAnalysis.cs:95:34:95:39 | ... = ... | 0 | 0 | 3 | -| ModulusAnalysis.cs:95:34:95:39 | ... = ... | SSA def(k) | 0 | 3 | -| ModulusAnalysis.cs:95:34:95:39 | ... = ... | SSA phi(k) | 3 | 0 | +| ModulusAnalysis.cs:95:34:95:39 | ... += ... | 0 | 0 | 3 | +| ModulusAnalysis.cs:95:34:95:39 | ... += ... | SSA def(k) | 0 | 3 | +| ModulusAnalysis.cs:95:34:95:39 | ... += ... | SSA phi(k) | 3 | 0 | | ModulusAnalysis.cs:95:39:95:39 | 3 | 0 | 3 | 0 | | ModulusAnalysis.cs:96:38:96:38 | access to local variable k | 0 | 0 | 3 | | ModulusAnalysis.cs:96:38:96:38 | access to local variable k | SSA def(k) | 0 | 3 | diff --git a/csharp/ql/test/library-tests/dataflow/nullcoalescing/NullCoalescing.cs b/csharp/ql/test/library-tests/dataflow/nullcoalescing/NullCoalescing.cs new file mode 100644 index 00000000000..7231d1e1265 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/nullcoalescing/NullCoalescing.cs @@ -0,0 +1,35 @@ +public class NullCoalescing +{ + public void M1() + { + var i = Source(1); + int? x = null; + x = x ?? i; + Sink(x); // $ hasValueFlow=1 + } + + public void M2() + { + var i = Source(2); + int? x = null; + x ??= i; + Sink(x); // $ hasValueFlow=2 + } + + public void M3(int? x) + { + var i = Source(3); + x = x ?? i; + Sink(x); // $ hasValueFlow=3 + } + + public void M4(int? x) + { + var i = Source(4); + x ??= i; + Sink(x); // $ hasValueFlow=4 + } + + public static void Sink(object o) { } + static T Source(object source) => throw null; +} diff --git a/csharp/ql/test/library-tests/dataflow/nullcoalescing/nullCoalescingFlow.expected b/csharp/ql/test/library-tests/dataflow/nullcoalescing/nullCoalescingFlow.expected new file mode 100644 index 00000000000..8894ec7006f --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/nullcoalescing/nullCoalescingFlow.expected @@ -0,0 +1,70 @@ +models +edges +| NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable | NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable | provenance | | +| NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable | NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable | provenance | | +| NullCoalescing.cs:5:17:5:31 | call to method Source> : Nullable | NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable | provenance | | +| NullCoalescing.cs:5:17:5:31 | call to method Source> : Nullable | NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable | provenance | | +| NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable | NullCoalescing.cs:8:14:8:14 | (...) ... | provenance | | +| NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable | NullCoalescing.cs:8:14:8:14 | (...) ... | provenance | | +| NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable | NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable | provenance | | +| NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable | NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable | provenance | | +| NullCoalescing.cs:13:17:13:31 | call to method Source> : Nullable | NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable | provenance | | +| NullCoalescing.cs:13:17:13:31 | call to method Source> : Nullable | NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable | provenance | | +| NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable | NullCoalescing.cs:16:14:16:14 | (...) ... | provenance | | +| NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable | NullCoalescing.cs:16:14:16:14 | (...) ... | provenance | | +| NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable | NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable | provenance | | +| NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable | NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable | provenance | | +| NullCoalescing.cs:21:17:21:31 | call to method Source> : Nullable | NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable | provenance | | +| NullCoalescing.cs:21:17:21:31 | call to method Source> : Nullable | NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable | provenance | | +| NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable | NullCoalescing.cs:23:14:23:14 | (...) ... | provenance | | +| NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable | NullCoalescing.cs:23:14:23:14 | (...) ... | provenance | | +| NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable | NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable | provenance | | +| NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable | NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable | provenance | | +| NullCoalescing.cs:28:17:28:31 | call to method Source> : Nullable | NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable | provenance | | +| NullCoalescing.cs:28:17:28:31 | call to method Source> : Nullable | NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable | provenance | | +| NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable | NullCoalescing.cs:30:14:30:14 | (...) ... | provenance | | +| NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable | NullCoalescing.cs:30:14:30:14 | (...) ... | provenance | | +nodes +| NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable | semmle.label | access to local variable i : Nullable | +| NullCoalescing.cs:5:13:5:13 | access to local variable i : Nullable | semmle.label | access to local variable i : Nullable | +| NullCoalescing.cs:5:17:5:31 | call to method Source> : Nullable | semmle.label | call to method Source> : Nullable | +| NullCoalescing.cs:5:17:5:31 | call to method Source> : Nullable | semmle.label | call to method Source> : Nullable | +| NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable | semmle.label | access to local variable x : Nullable | +| NullCoalescing.cs:7:9:7:9 | access to local variable x : Nullable | semmle.label | access to local variable x : Nullable | +| NullCoalescing.cs:8:14:8:14 | (...) ... | semmle.label | (...) ... | +| NullCoalescing.cs:8:14:8:14 | (...) ... | semmle.label | (...) ... | +| NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable | semmle.label | access to local variable i : Nullable | +| NullCoalescing.cs:13:13:13:13 | access to local variable i : Nullable | semmle.label | access to local variable i : Nullable | +| NullCoalescing.cs:13:17:13:31 | call to method Source> : Nullable | semmle.label | call to method Source> : Nullable | +| NullCoalescing.cs:13:17:13:31 | call to method Source> : Nullable | semmle.label | call to method Source> : Nullable | +| NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable | semmle.label | access to local variable x : Nullable | +| NullCoalescing.cs:15:9:15:9 | access to local variable x : Nullable | semmle.label | access to local variable x : Nullable | +| NullCoalescing.cs:16:14:16:14 | (...) ... | semmle.label | (...) ... | +| NullCoalescing.cs:16:14:16:14 | (...) ... | semmle.label | (...) ... | +| NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable | semmle.label | access to local variable i : Nullable | +| NullCoalescing.cs:21:13:21:13 | access to local variable i : Nullable | semmle.label | access to local variable i : Nullable | +| NullCoalescing.cs:21:17:21:31 | call to method Source> : Nullable | semmle.label | call to method Source> : Nullable | +| NullCoalescing.cs:21:17:21:31 | call to method Source> : Nullable | semmle.label | call to method Source> : Nullable | +| NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable | semmle.label | access to parameter x : Nullable | +| NullCoalescing.cs:22:9:22:9 | access to parameter x : Nullable | semmle.label | access to parameter x : Nullable | +| NullCoalescing.cs:23:14:23:14 | (...) ... | semmle.label | (...) ... | +| NullCoalescing.cs:23:14:23:14 | (...) ... | semmle.label | (...) ... | +| NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable | semmle.label | access to local variable i : Nullable | +| NullCoalescing.cs:28:13:28:13 | access to local variable i : Nullable | semmle.label | access to local variable i : Nullable | +| NullCoalescing.cs:28:17:28:31 | call to method Source> : Nullable | semmle.label | call to method Source> : Nullable | +| NullCoalescing.cs:28:17:28:31 | call to method Source> : Nullable | semmle.label | call to method Source> : Nullable | +| NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable | semmle.label | access to parameter x : Nullable | +| NullCoalescing.cs:29:9:29:9 | access to parameter x : Nullable | semmle.label | access to parameter x : Nullable | +| NullCoalescing.cs:30:14:30:14 | (...) ... | semmle.label | (...) ... | +| NullCoalescing.cs:30:14:30:14 | (...) ... | semmle.label | (...) ... | +subpaths +testFailures +#select +| NullCoalescing.cs:8:14:8:14 | (...) ... | NullCoalescing.cs:5:17:5:31 | call to method Source> : Nullable | NullCoalescing.cs:8:14:8:14 | (...) ... | $@ | NullCoalescing.cs:5:17:5:31 | call to method Source> : Nullable | call to method Source> : Nullable | +| NullCoalescing.cs:8:14:8:14 | (...) ... | NullCoalescing.cs:5:17:5:31 | call to method Source> : Nullable | NullCoalescing.cs:8:14:8:14 | (...) ... | $@ | NullCoalescing.cs:5:17:5:31 | call to method Source> : Nullable | call to method Source> : Nullable | +| NullCoalescing.cs:16:14:16:14 | (...) ... | NullCoalescing.cs:13:17:13:31 | call to method Source> : Nullable | NullCoalescing.cs:16:14:16:14 | (...) ... | $@ | NullCoalescing.cs:13:17:13:31 | call to method Source> : Nullable | call to method Source> : Nullable | +| NullCoalescing.cs:16:14:16:14 | (...) ... | NullCoalescing.cs:13:17:13:31 | call to method Source> : Nullable | NullCoalescing.cs:16:14:16:14 | (...) ... | $@ | NullCoalescing.cs:13:17:13:31 | call to method Source> : Nullable | call to method Source> : Nullable | +| NullCoalescing.cs:23:14:23:14 | (...) ... | NullCoalescing.cs:21:17:21:31 | call to method Source> : Nullable | NullCoalescing.cs:23:14:23:14 | (...) ... | $@ | NullCoalescing.cs:21:17:21:31 | call to method Source> : Nullable | call to method Source> : Nullable | +| NullCoalescing.cs:23:14:23:14 | (...) ... | NullCoalescing.cs:21:17:21:31 | call to method Source> : Nullable | NullCoalescing.cs:23:14:23:14 | (...) ... | $@ | NullCoalescing.cs:21:17:21:31 | call to method Source> : Nullable | call to method Source> : Nullable | +| NullCoalescing.cs:30:14:30:14 | (...) ... | NullCoalescing.cs:28:17:28:31 | call to method Source> : Nullable | NullCoalescing.cs:30:14:30:14 | (...) ... | $@ | NullCoalescing.cs:28:17:28:31 | call to method Source> : Nullable | call to method Source> : Nullable | +| NullCoalescing.cs:30:14:30:14 | (...) ... | NullCoalescing.cs:28:17:28:31 | call to method Source> : Nullable | NullCoalescing.cs:30:14:30:14 | (...) ... | $@ | NullCoalescing.cs:28:17:28:31 | call to method Source> : Nullable | call to method Source> : Nullable | diff --git a/csharp/ql/test/library-tests/dataflow/nullcoalescing/nullCoalescingFlow.ql b/csharp/ql/test/library-tests/dataflow/nullcoalescing/nullCoalescingFlow.ql new file mode 100644 index 00000000000..9ab95f59caf --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/nullcoalescing/nullCoalescingFlow.ql @@ -0,0 +1,12 @@ +/** + * @kind path-problem + */ + +import csharp +import utils.test.InlineFlowTest +import DefaultFlowTest +import PathGraph + +from PathNode source, PathNode sink +where flowPath(source, sink) +select sink, source, sink, "$@", source, source.toString() diff --git a/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.expected b/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.expected index 9f87bf59eeb..4dce60d9c2d 100644 --- a/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.expected +++ b/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.expected @@ -52,8 +52,7 @@ | SignAnalysis.cs:80:13:80:17 | ... = ... | strictlyNegative | | SignAnalysis.cs:80:17:80:17 | access to parameter i | strictlyNegative | | SignAnalysis.cs:81:13:81:13 | access to local variable x | strictlyNegative | -| SignAnalysis.cs:81:13:81:18 | ... + ... | strictlyNegative | -| SignAnalysis.cs:81:13:81:18 | ... = ... | strictlyNegative | +| SignAnalysis.cs:81:13:81:18 | ... += ... | strictlyNegative | | SignAnalysis.cs:81:18:81:18 | access to parameter i | strictlyNegative | | SignAnalysis.cs:82:38:82:38 | access to local variable x | strictlyNegative | | SignAnalysis.cs:87:21:87:21 | access to parameter i | strictlyNegative | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected index 13036f0f0ae..9246392b662 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected @@ -46,7 +46,7 @@ | DefUse.cs:89:13:89:14 | x3 | DefUse.cs:89:13:89:18 | Int32 x3 = ... | DefUse.cs:92:15:92:16 | access to local variable x3 | | DefUse.cs:89:13:89:14 | x3 | DefUse.cs:92:15:92:16 | access to local variable x3 | DefUse.cs:94:13:94:14 | access to local variable x3 | | DefUse.cs:90:13:90:14 | x4 | DefUse.cs:93:15:93:16 | access to local variable x4 | DefUse.cs:95:13:95:14 | access to local variable x4 | -| DefUse.cs:97:13:97:14 | x5 | DefUse.cs:104:9:104:15 | ... = ... | DefUse.cs:105:13:105:14 | access to local variable x5 | +| DefUse.cs:97:13:97:14 | x5 | DefUse.cs:104:9:104:15 | ... += ... | DefUse.cs:105:13:105:14 | access to local variable x5 | | DefUse.cs:118:45:118:45 | i | DefUse.cs:118:45:118:45 | i | DefUse.cs:118:65:118:65 | access to parameter i | | DefUse.cs:120:17:120:21 | Field | DefUse.cs:53:9:53:17 | ... = ... | DefUse.cs:54:13:54:17 | access to field Field | | DefUse.cs:122:16:122:21 | Field2 | DefUse.cs:63:9:63:18 | ... = ... | DefUse.cs:64:13:64:18 | access to field Field2 | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected index 4bbe88295ed..923d62a96ec 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected @@ -76,7 +76,7 @@ | DefUse.cs:97:13:97:18 | SSA def(x5) | DefUse.cs:97:13:97:18 | Int32 x5 = ... | | DefUse.cs:98:16:98:17 | SSA phi(x5) | DefUse.cs:98:16:98:17 | access to local variable x5 | | DefUse.cs:101:13:101:23 | SSA def(x5) | DefUse.cs:101:13:101:23 | ... = ... | -| DefUse.cs:104:9:104:15 | SSA def(x5) | DefUse.cs:104:9:104:15 | ... = ... | +| DefUse.cs:104:9:104:15 | SSA def(x5) | DefUse.cs:104:9:104:15 | ... += ... | | DefUse.cs:114:47:114:52 | SSA def(i) | DefUse.cs:114:47:114:52 | ... = ... | | DefUse.cs:116:47:116:51 | SSA def(i) | DefUse.cs:116:47:116:51 | ... = ... | | DefUse.cs:118:45:118:45 | SSA param(i) | DefUse.cs:118:45:118:45 | i | @@ -245,7 +245,7 @@ | Test.cs:14:17:14:19 | SSA def(x) | Test.cs:14:17:14:19 | ++... | | Test.cs:15:13:15:17 | SSA def(z) | Test.cs:15:13:15:17 | ... = ... | | Test.cs:19:13:19:17 | SSA def(y) | Test.cs:19:13:19:17 | ... = ... | -| Test.cs:20:13:20:18 | SSA def(y) | Test.cs:20:13:20:18 | ... = ... | +| Test.cs:20:13:20:18 | SSA def(y) | Test.cs:20:13:20:18 | ... += ... | | Test.cs:21:13:21:22 | SSA def(this.field) | Test.cs:21:13:21:22 | ... = ... | | Test.cs:22:13:22:17 | SSA def(z) | Test.cs:22:13:22:17 | ... = ... | | Test.cs:24:9:24:15 | SSA phi(this.field) | Test.cs:24:9:24:15 | ...; | @@ -255,16 +255,16 @@ | Test.cs:25:16:25:16 | SSA phi(param1) | Test.cs:25:16:25:16 | access to local variable x | | Test.cs:25:16:25:16 | SSA phi(y) | Test.cs:25:16:25:16 | access to local variable x | | Test.cs:27:17:27:24 | SSA def(param1) | Test.cs:27:17:27:24 | ...++ | -| Test.cs:31:13:31:18 | SSA def(y) | Test.cs:31:13:31:18 | ... = ... | +| Test.cs:31:13:31:18 | SSA def(y) | Test.cs:31:13:31:18 | ... -= ... | | Test.cs:33:9:33:19 | SSA phi(param1) | Test.cs:33:9:33:19 | ...; | | Test.cs:34:18:34:22 | SSA def(i) | Test.cs:34:18:34:22 | Int32 i = ... | | Test.cs:34:25:34:25 | SSA phi(i) | Test.cs:34:25:34:25 | access to local variable i | | Test.cs:34:25:34:25 | SSA phi(x) | Test.cs:34:25:34:25 | access to local variable i | | Test.cs:34:33:34:35 | SSA def(i) | Test.cs:34:33:34:35 | ...++ | -| Test.cs:36:13:36:18 | SSA def(x) | Test.cs:36:13:36:18 | ... = ... | +| Test.cs:36:13:36:18 | SSA def(x) | Test.cs:36:13:36:18 | ... += ... | | Test.cs:39:9:42:9 | SSA phi(param1) | Test.cs:39:9:42:9 | foreach (... ... in ...) ... | | Test.cs:39:22:39:22 | SSA def(w) | Test.cs:39:22:39:22 | Int32 w | -| Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... = ... | +| Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... += ... | | Test.cs:46:10:46:10 | SSA entry def(this.field) | Test.cs:46:10:46:10 | g | | Test.cs:46:16:46:18 | SSA param(in) | Test.cs:46:16:46:18 | in | | Test.cs:50:13:50:20 | SSA def(out) | Test.cs:50:13:50:20 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected index a8bcd3e4daf..8582dd1cf6e 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected @@ -47,7 +47,7 @@ | DefUse.cs:90:13:90:14 | x4 | DefUse.cs:93:15:93:16 | SSA def(x4) | DefUse.cs:93:15:93:16 | access to local variable x4 | | DefUse.cs:97:13:97:14 | x5 | DefUse.cs:97:13:97:18 | SSA def(x5) | DefUse.cs:97:13:97:18 | Int32 x5 = ... | | DefUse.cs:97:13:97:14 | x5 | DefUse.cs:101:13:101:23 | SSA def(x5) | DefUse.cs:101:13:101:23 | ... = ... | -| DefUse.cs:97:13:97:14 | x5 | DefUse.cs:104:9:104:15 | SSA def(x5) | DefUse.cs:104:9:104:15 | ... = ... | +| DefUse.cs:97:13:97:14 | x5 | DefUse.cs:104:9:104:15 | SSA def(x5) | DefUse.cs:104:9:104:15 | ... += ... | | DefUse.cs:114:42:114:42 | i | DefUse.cs:114:47:114:52 | SSA def(i) | DefUse.cs:114:47:114:52 | ... = ... | | DefUse.cs:116:42:116:42 | i | DefUse.cs:116:47:116:51 | SSA def(i) | DefUse.cs:116:47:116:51 | ... = ... | | DefUse.cs:118:45:118:45 | i | DefUse.cs:118:68:118:72 | SSA def(i) | DefUse.cs:118:68:118:72 | ... = ... | @@ -117,17 +117,17 @@ | Properties.cs:78:9:78:15 | this.xs | Properties.cs:81:9:81:22 | SSA def(this.xs) | Properties.cs:81:9:81:22 | ... = ... | | Properties.cs:78:9:78:15 | this.xs | Properties.cs:83:9:83:22 | SSA def(this.xs) | Properties.cs:83:9:83:22 | ... = ... | | Test.cs:5:15:5:20 | param1 | Test.cs:27:17:27:24 | SSA def(param1) | Test.cs:27:17:27:24 | ...++ | -| Test.cs:5:15:5:20 | param1 | Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... = ... | +| Test.cs:5:15:5:20 | param1 | Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... += ... | | Test.cs:7:9:7:13 | this.field | Test.cs:7:9:7:17 | SSA def(this.field) | Test.cs:7:9:7:17 | ... = ... | | Test.cs:7:9:7:13 | this.field | Test.cs:21:13:21:22 | SSA def(this.field) | Test.cs:21:13:21:22 | ... = ... | | Test.cs:8:13:8:13 | x | Test.cs:8:13:8:17 | SSA def(x) | Test.cs:8:13:8:17 | Int32 x = ... | | Test.cs:8:13:8:13 | x | Test.cs:13:13:13:15 | SSA def(x) | Test.cs:13:13:13:15 | ...++ | | Test.cs:8:13:8:13 | x | Test.cs:14:17:14:19 | SSA def(x) | Test.cs:14:17:14:19 | ++... | -| Test.cs:8:13:8:13 | x | Test.cs:36:13:36:18 | SSA def(x) | Test.cs:36:13:36:18 | ... = ... | +| Test.cs:8:13:8:13 | x | Test.cs:36:13:36:18 | SSA def(x) | Test.cs:36:13:36:18 | ... += ... | | Test.cs:9:13:9:13 | y | Test.cs:14:13:14:19 | SSA def(y) | Test.cs:14:13:14:19 | ... = ... | | Test.cs:9:13:9:13 | y | Test.cs:19:13:19:17 | SSA def(y) | Test.cs:19:13:19:17 | ... = ... | -| Test.cs:9:13:9:13 | y | Test.cs:20:13:20:18 | SSA def(y) | Test.cs:20:13:20:18 | ... = ... | -| Test.cs:9:13:9:13 | y | Test.cs:31:13:31:18 | SSA def(y) | Test.cs:31:13:31:18 | ... = ... | +| Test.cs:9:13:9:13 | y | Test.cs:20:13:20:18 | SSA def(y) | Test.cs:20:13:20:18 | ... += ... | +| Test.cs:9:13:9:13 | y | Test.cs:31:13:31:18 | SSA def(y) | Test.cs:31:13:31:18 | ... -= ... | | Test.cs:10:13:10:13 | z | Test.cs:15:13:15:17 | SSA def(z) | Test.cs:15:13:15:17 | ... = ... | | Test.cs:10:13:10:13 | z | Test.cs:22:13:22:17 | SSA def(z) | Test.cs:22:13:22:17 | ... = ... | | Test.cs:34:18:34:18 | i | Test.cs:34:18:34:22 | SSA def(i) | Test.cs:34:18:34:22 | Int32 i = ... | diff --git a/csharp/ql/test/library-tests/dispatch/CallContext.expected b/csharp/ql/test/library-tests/dispatch/CallContext.expected index 2ef2223ebd7..09fe22783aa 100644 --- a/csharp/ql/test/library-tests/dispatch/CallContext.expected +++ b/csharp/ql/test/library-tests/dispatch/CallContext.expected @@ -20,12 +20,12 @@ mayBenefitFromCallContext | ViableCallable.cs:245:9:245:15 | call to method M | | ViableCallable.cs:294:9:294:15 | call to method M | | ViableCallable.cs:297:9:297:20 | call to method M | -| ViableCallable.cs:425:9:425:18 | call to method M | -| ViableCallable.cs:469:9:469:30 | call to method M2 | -| ViableCallable.cs:475:9:475:30 | call to method M2 | -| ViableCallable.cs:577:18:577:22 | call to operator / | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | -| ViableCallable.cs:586:9:586:15 | call to method M12 | -| ViableCallable.cs:619:9:619:13 | call to method M | -| ViableCallable.cs:683:9:683:16 | call to method M | -| ViableCallable.cs:687:9:687:16 | call to method M | +| ViableCallable.cs:426:9:426:18 | call to method M | +| ViableCallable.cs:470:9:470:30 | call to method M2 | +| ViableCallable.cs:476:9:476:30 | call to method M2 | +| ViableCallable.cs:578:18:578:22 | call to operator / | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | +| ViableCallable.cs:587:9:587:15 | call to method M12 | +| ViableCallable.cs:620:9:620:13 | call to method M | +| ViableCallable.cs:684:9:684:16 | call to method M | +| ViableCallable.cs:688:9:688:16 | call to method M | diff --git a/csharp/ql/test/library-tests/dispatch/CallGraph.expected b/csharp/ql/test/library-tests/dispatch/CallGraph.expected index e7ebca868ba..8c93277cb54 100644 --- a/csharp/ql/test/library-tests/dispatch/CallGraph.expected +++ b/csharp/ql/test/library-tests/dispatch/CallGraph.expected @@ -219,62 +219,62 @@ | ViableCallable.cs:308:17:308:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 | | ViableCallable.cs:308:17:308:19 | Run | ViableCallable.cs:303:26:303:30 | M`1 | | ViableCallable.cs:361:17:361:19 | Run | ViableCallable.cs:359:10:359:10 | M | -| ViableCallable.cs:361:17:361:19 | Run | ViableCallable.cs:375:5:375:7 | C11 | -| ViableCallable.cs:389:10:389:16 | Run`1 | ViableCallable.cs:385:33:385:33 | M | -| ViableCallable.cs:395:10:395:17 | Run2`1 | ViableCallable.cs:389:10:389:16 | Run | -| ViableCallable.cs:400:10:400:13 | Run3 | ViableCallable.cs:395:10:395:17 | Run2 | -| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:213:21:213:27 | Mock | -| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:410:36:410:40 | M`1 | -| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:416:53:416:57 | M`1 | -| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:418:42:418:46 | M`1 | -| ViableCallable.cs:444:22:444:26 | M2`1 | ViableCallable.cs:469:14:469:29 | (...) => ... | -| ViableCallable.cs:444:22:444:26 | M2`1 | ViableCallable.cs:475:14:475:29 | (...) => ... | -| ViableCallable.cs:449:10:449:11 | M1 | ViableCallable.cs:443:23:443:24 | M1 | -| ViableCallable.cs:449:10:449:11 | M1 | ViableCallable.cs:458:23:458:27 | M2`1 | -| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:455:17:455:23 | (...) => ... | -| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:463:14:463:20 | (...) => ... | -| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:469:14:469:29 | (...) => ... | -| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:475:14:475:29 | (...) => ... | -| ViableCallable.cs:460:10:460:14 | M3`1 | ViableCallable.cs:458:23:458:27 | M2`1 | -| ViableCallable.cs:466:10:466:14 | M4`1 | ViableCallable.cs:444:22:444:26 | M2`1 | -| ViableCallable.cs:466:10:466:14 | M4`1 | ViableCallable.cs:458:23:458:27 | M2`1 | -| ViableCallable.cs:472:10:472:14 | M5`1 | ViableCallable.cs:444:22:444:26 | M2`1 | -| ViableCallable.cs:472:10:472:14 | M5`1 | ViableCallable.cs:458:23:458:27 | M2`1 | -| ViableCallable.cs:489:10:489:12 | Run | ViableCallable.cs:482:10:482:11 | M2 | -| ViableCallable.cs:489:10:489:12 | Run | ViableCallable.cs:487:17:487:18 | M1 | -| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:501:32:501:32 | + | -| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:502:40:502:40 | checked + | -| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:503:28:503:35 | explicit conversion | -| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:504:28:504:35 | checked explicit conversion | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:528:39:528:39 | checked - | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:530:31:530:31 | * | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:531:39:531:39 | checked * | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:533:31:533:31 | / | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:534:39:534:39 | checked / | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:538:18:538:20 | M12 | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:540:18:540:20 | M13 | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:545:32:545:32 | + | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:546:40:546:40 | checked + | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:548:32:548:32 | - | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:550:32:550:32 | / | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:551:40:551:40 | checked / | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:553:17:553:19 | M11 | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:554:17:554:19 | M12 | -| ViableCallable.cs:610:17:610:23 | Run1`1 | ViableCallable.cs:602:21:602:21 | M | -| ViableCallable.cs:616:17:616:23 | Run2`1 | ViableCallable.cs:602:21:602:21 | M | -| ViableCallable.cs:616:17:616:23 | Run2`1 | ViableCallable.cs:607:21:607:21 | M | -| ViableCallable.cs:657:17:657:20 | Run1 | ViableCallable.cs:635:21:635:21 | M | -| ViableCallable.cs:657:17:657:20 | Run1 | ViableCallable.cs:637:21:637:21 | M | -| ViableCallable.cs:668:17:668:20 | Run2 | ViableCallable.cs:651:21:651:21 | M | -| ViableCallable.cs:668:17:668:20 | Run2 | ViableCallable.cs:654:21:654:21 | M | -| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:635:21:635:21 | M | -| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:637:21:637:21 | M | -| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:646:21:646:21 | M | -| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:648:21:648:21 | M | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:704:24:704:31 | Partial1 | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:705:42:705:44 | get_Property | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:705:63:705:65 | set_Property | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:707:49:707:51 | get_Item | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:707:70:707:72 | set_Item | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:708:51:708:53 | add_Event | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:708:59:708:64 | remove_Event | +| ViableCallable.cs:361:17:361:19 | Run | ViableCallable.cs:376:5:376:7 | C11 | +| ViableCallable.cs:390:10:390:16 | Run`1 | ViableCallable.cs:386:33:386:33 | M | +| ViableCallable.cs:396:10:396:17 | Run2`1 | ViableCallable.cs:390:10:390:16 | Run | +| ViableCallable.cs:401:10:401:13 | Run3 | ViableCallable.cs:396:10:396:17 | Run2 | +| ViableCallable.cs:423:10:423:12 | Run | ViableCallable.cs:213:21:213:27 | Mock | +| ViableCallable.cs:423:10:423:12 | Run | ViableCallable.cs:411:36:411:40 | M`1 | +| ViableCallable.cs:423:10:423:12 | Run | ViableCallable.cs:417:53:417:57 | M`1 | +| ViableCallable.cs:423:10:423:12 | Run | ViableCallable.cs:419:42:419:46 | M`1 | +| ViableCallable.cs:445:22:445:26 | M2`1 | ViableCallable.cs:470:14:470:29 | (...) => ... | +| ViableCallable.cs:445:22:445:26 | M2`1 | ViableCallable.cs:476:14:476:29 | (...) => ... | +| ViableCallable.cs:450:10:450:11 | M1 | ViableCallable.cs:444:23:444:24 | M1 | +| ViableCallable.cs:450:10:450:11 | M1 | ViableCallable.cs:459:23:459:27 | M2`1 | +| ViableCallable.cs:459:23:459:27 | M2`1 | ViableCallable.cs:456:17:456:23 | (...) => ... | +| ViableCallable.cs:459:23:459:27 | M2`1 | ViableCallable.cs:464:14:464:20 | (...) => ... | +| ViableCallable.cs:459:23:459:27 | M2`1 | ViableCallable.cs:470:14:470:29 | (...) => ... | +| ViableCallable.cs:459:23:459:27 | M2`1 | ViableCallable.cs:476:14:476:29 | (...) => ... | +| ViableCallable.cs:461:10:461:14 | M3`1 | ViableCallable.cs:459:23:459:27 | M2`1 | +| ViableCallable.cs:467:10:467:14 | M4`1 | ViableCallable.cs:445:22:445:26 | M2`1 | +| ViableCallable.cs:467:10:467:14 | M4`1 | ViableCallable.cs:459:23:459:27 | M2`1 | +| ViableCallable.cs:473:10:473:14 | M5`1 | ViableCallable.cs:445:22:445:26 | M2`1 | +| ViableCallable.cs:473:10:473:14 | M5`1 | ViableCallable.cs:459:23:459:27 | M2`1 | +| ViableCallable.cs:490:10:490:12 | Run | ViableCallable.cs:483:10:483:11 | M2 | +| ViableCallable.cs:490:10:490:12 | Run | ViableCallable.cs:488:17:488:18 | M1 | +| ViableCallable.cs:507:10:507:12 | Run | ViableCallable.cs:502:32:502:32 | + | +| ViableCallable.cs:507:10:507:12 | Run | ViableCallable.cs:503:40:503:40 | checked + | +| ViableCallable.cs:507:10:507:12 | Run | ViableCallable.cs:504:28:504:35 | explicit conversion | +| ViableCallable.cs:507:10:507:12 | Run | ViableCallable.cs:505:28:505:35 | checked explicit conversion | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:529:39:529:39 | checked - | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:531:31:531:31 | * | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:532:39:532:39 | checked * | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:534:31:534:31 | / | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:535:39:535:39 | checked / | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:539:18:539:20 | M12 | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:541:18:541:20 | M13 | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:546:32:546:32 | + | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:547:40:547:40 | checked + | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:549:32:549:32 | - | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:551:32:551:32 | / | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:552:40:552:40 | checked / | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:554:17:554:19 | M11 | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:555:17:555:19 | M12 | +| ViableCallable.cs:611:17:611:23 | Run1`1 | ViableCallable.cs:603:21:603:21 | M | +| ViableCallable.cs:617:17:617:23 | Run2`1 | ViableCallable.cs:603:21:603:21 | M | +| ViableCallable.cs:617:17:617:23 | Run2`1 | ViableCallable.cs:608:21:608:21 | M | +| ViableCallable.cs:658:17:658:20 | Run1 | ViableCallable.cs:636:21:636:21 | M | +| ViableCallable.cs:658:17:658:20 | Run1 | ViableCallable.cs:638:21:638:21 | M | +| ViableCallable.cs:669:17:669:20 | Run2 | ViableCallable.cs:652:21:652:21 | M | +| ViableCallable.cs:669:17:669:20 | Run2 | ViableCallable.cs:655:21:655:21 | M | +| ViableCallable.cs:680:17:680:20 | Run3 | ViableCallable.cs:636:21:636:21 | M | +| ViableCallable.cs:680:17:680:20 | Run3 | ViableCallable.cs:638:21:638:21 | M | +| ViableCallable.cs:680:17:680:20 | Run3 | ViableCallable.cs:647:21:647:21 | M | +| ViableCallable.cs:680:17:680:20 | Run3 | ViableCallable.cs:649:21:649:21 | M | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:705:24:705:31 | Partial1 | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:706:42:706:44 | get_Property | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:706:63:706:65 | set_Property | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:708:49:708:51 | get_Item | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:708:70:708:72 | set_Item | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:709:51:709:53 | add_Event | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:709:59:709:64 | remove_Event | diff --git a/csharp/ql/test/library-tests/dispatch/GetADynamicTarget.expected b/csharp/ql/test/library-tests/dispatch/GetADynamicTarget.expected index 84dc17b073a..82376653095 100644 --- a/csharp/ql/test/library-tests/dispatch/GetADynamicTarget.expected +++ b/csharp/ql/test/library-tests/dispatch/GetADynamicTarget.expected @@ -467,61 +467,61 @@ | ViableCallable.cs:311:9:311:15 | call to method M | C7`1.M(T1, T3) | | ViableCallable.cs:314:9:314:20 | call to method M | C7`1.M(T1, T3) | | ViableCallable.cs:317:9:317:20 | call to method M | C6.M(T1, T3) | -| ViableCallable.cs:367:9:367:14 | dynamic call to method M | C11.M(dynamic) | -| ViableCallable.cs:369:9:369:18 | dynamic object creation of type C11 | C11.C11(C11) | -| ViableCallable.cs:392:9:392:13 | call to method M | C12+C13.M() | -| ViableCallable.cs:397:9:397:14 | call to method Run | C12.Run(T2) | -| ViableCallable.cs:402:9:402:23 | call to method Run2 | C12.Run2(C13) | -| ViableCallable.cs:425:9:425:18 | call to method M | C15+A1.M() | -| ViableCallable.cs:425:9:425:18 | call to method M | C15+A4.M() | -| ViableCallable.cs:425:9:425:18 | call to method M | C15+A5.M() | -| ViableCallable.cs:429:9:429:19 | call to method M | C15+A1.M() | -| ViableCallable.cs:433:9:433:21 | call to method M | C15+A4.M() | -| ViableCallable.cs:435:13:435:37 | call to method Mock | ViableCallable.Mock() | -| ViableCallable.cs:437:9:437:21 | call to method M | C15+A4.M() | -| ViableCallable.cs:437:9:437:21 | call to method M | C15+A5.M() | -| ViableCallable.cs:452:9:452:19 | call to method M1 | C16.M1(string) | -| ViableCallable.cs:455:9:455:24 | call to method M2 | C17.M2(Func) | -| ViableCallable.cs:463:9:463:21 | call to method M2 | C17.M2(Func) | -| ViableCallable.cs:469:9:469:30 | call to method M2 | C16.M2(Func) | -| ViableCallable.cs:469:9:469:30 | call to method M2 | C17.M2(Func) | -| ViableCallable.cs:475:9:475:30 | call to method M2 | C16.M2(Func) | -| ViableCallable.cs:475:9:475:30 | call to method M2 | C17.M2(Func) | -| ViableCallable.cs:492:9:492:14 | call to method M1 | C18.M1() | -| ViableCallable.cs:495:9:495:14 | call to method M2 | I2.M2() | -| ViableCallable.cs:509:18:509:22 | call to operator + | C19.+(C19, C19) | -| ViableCallable.cs:512:26:512:30 | call to operator checked + | C19.checked +(C19, C19) | -| ViableCallable.cs:515:18:515:23 | call to operator explicit conversion | C19.explicit conversion(C19) | -| ViableCallable.cs:518:26:518:31 | call to operator checked explicit conversion | C19.checked explicit conversion(C19) | -| ViableCallable.cs:559:18:559:22 | call to operator + | C20.+(C20, C20) | -| ViableCallable.cs:562:26:562:30 | call to operator checked + | C20.checked +(C20, C20) | -| ViableCallable.cs:565:18:565:22 | call to operator - | C20.-(C20, C20) | -| ViableCallable.cs:568:26:568:30 | call to operator checked - | I3.checked -(T, T) | -| ViableCallable.cs:571:18:571:22 | call to operator * | I3.*(T, T) | -| ViableCallable.cs:574:26:574:30 | call to operator checked * | I3.checked *(T, T) | -| ViableCallable.cs:577:18:577:22 | call to operator / | C20./(C20, C20) | -| ViableCallable.cs:577:18:577:22 | call to operator / | I3./(T, T) | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | C20.checked /(C20, C20) | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | I3.checked /(T, T) | -| ViableCallable.cs:583:9:583:15 | call to method M11 | C20.M11() | -| ViableCallable.cs:586:9:586:15 | call to method M12 | C20.M12() | -| ViableCallable.cs:586:9:586:15 | call to method M12 | I3.M12() | -| ViableCallable.cs:589:9:589:15 | call to method M13 | I3.M13() | -| ViableCallable.cs:613:9:613:13 | call to method M | C21+A1.M() | -| ViableCallable.cs:619:9:619:13 | call to method M | C21+A1.M() | -| ViableCallable.cs:619:9:619:13 | call to method M | C21+A2.M() | -| ViableCallable.cs:661:9:661:16 | call to method M | C22+TestOverloadResolution1.M(Int32[]) | -| ViableCallable.cs:665:9:665:16 | call to method M | C22+TestOverloadResolution1.M(List) | -| ViableCallable.cs:672:9:672:16 | call to method M | C22+TestOverloadResolution2.M(ReadOnlySpan) | -| ViableCallable.cs:676:9:676:16 | call to method M | C22+TestOverloadResolution2.M(IEnumerable) | -| ViableCallable.cs:683:9:683:16 | call to method M | C22+TestOverloadResolution1.M(Int32[]) | -| ViableCallable.cs:683:9:683:16 | call to method M | C22+TestOverloadResolution2.M(Int32[]) | -| ViableCallable.cs:687:9:687:16 | call to method M | C22+TestOverloadResolution1.M(List) | -| ViableCallable.cs:687:9:687:16 | call to method M | C22+TestOverloadResolution2.M(List) | -| ViableCallable.cs:716:9:716:18 | access to property Property | C23+Partial1.set_Property(object) | -| ViableCallable.cs:719:13:719:22 | access to property Property | C23+Partial1.get_Property() | -| ViableCallable.cs:722:9:722:12 | access to indexer | C23+Partial1.set_Item(int, object) | -| ViableCallable.cs:725:13:725:16 | access to indexer | C23+Partial1.get_Item(int) | -| ViableCallable.cs:728:9:728:15 | access to event Event | C23+Partial1.add_Event(EventHandler) | -| ViableCallable.cs:731:9:731:15 | access to event Event | C23+Partial1.remove_Event(EventHandler) | -| ViableCallable.cs:734:18:734:43 | object creation of type Partial1 | C23+Partial1.Partial1(object) | +| ViableCallable.cs:368:9:368:14 | dynamic call to method M | C11.M(dynamic) | +| ViableCallable.cs:370:9:370:18 | dynamic object creation of type C11 | C11.C11(C11) | +| ViableCallable.cs:393:9:393:13 | call to method M | C12+C13.M() | +| ViableCallable.cs:398:9:398:14 | call to method Run | C12.Run(T2) | +| ViableCallable.cs:403:9:403:23 | call to method Run2 | C12.Run2(C13) | +| ViableCallable.cs:426:9:426:18 | call to method M | C15+A1.M() | +| ViableCallable.cs:426:9:426:18 | call to method M | C15+A4.M() | +| ViableCallable.cs:426:9:426:18 | call to method M | C15+A5.M() | +| ViableCallable.cs:430:9:430:19 | call to method M | C15+A1.M() | +| ViableCallable.cs:434:9:434:21 | call to method M | C15+A4.M() | +| ViableCallable.cs:436:13:436:37 | call to method Mock | ViableCallable.Mock() | +| ViableCallable.cs:438:9:438:21 | call to method M | C15+A4.M() | +| ViableCallable.cs:438:9:438:21 | call to method M | C15+A5.M() | +| ViableCallable.cs:453:9:453:19 | call to method M1 | C16.M1(string) | +| ViableCallable.cs:456:9:456:24 | call to method M2 | C17.M2(Func) | +| ViableCallable.cs:464:9:464:21 | call to method M2 | C17.M2(Func) | +| ViableCallable.cs:470:9:470:30 | call to method M2 | C16.M2(Func) | +| ViableCallable.cs:470:9:470:30 | call to method M2 | C17.M2(Func) | +| ViableCallable.cs:476:9:476:30 | call to method M2 | C16.M2(Func) | +| ViableCallable.cs:476:9:476:30 | call to method M2 | C17.M2(Func) | +| ViableCallable.cs:493:9:493:14 | call to method M1 | C18.M1() | +| ViableCallable.cs:496:9:496:14 | call to method M2 | I2.M2() | +| ViableCallable.cs:510:18:510:22 | call to operator + | C19.+(C19, C19) | +| ViableCallable.cs:513:26:513:30 | call to operator checked + | C19.checked +(C19, C19) | +| ViableCallable.cs:516:18:516:23 | call to operator explicit conversion | C19.explicit conversion(C19) | +| ViableCallable.cs:519:26:519:31 | call to operator checked explicit conversion | C19.checked explicit conversion(C19) | +| ViableCallable.cs:560:18:560:22 | call to operator + | C20.+(C20, C20) | +| ViableCallable.cs:563:26:563:30 | call to operator checked + | C20.checked +(C20, C20) | +| ViableCallable.cs:566:18:566:22 | call to operator - | C20.-(C20, C20) | +| ViableCallable.cs:569:26:569:30 | call to operator checked - | I3.checked -(T, T) | +| ViableCallable.cs:572:18:572:22 | call to operator * | I3.*(T, T) | +| ViableCallable.cs:575:26:575:30 | call to operator checked * | I3.checked *(T, T) | +| ViableCallable.cs:578:18:578:22 | call to operator / | C20./(C20, C20) | +| ViableCallable.cs:578:18:578:22 | call to operator / | I3./(T, T) | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | C20.checked /(C20, C20) | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | I3.checked /(T, T) | +| ViableCallable.cs:584:9:584:15 | call to method M11 | C20.M11() | +| ViableCallable.cs:587:9:587:15 | call to method M12 | C20.M12() | +| ViableCallable.cs:587:9:587:15 | call to method M12 | I3.M12() | +| ViableCallable.cs:590:9:590:15 | call to method M13 | I3.M13() | +| ViableCallable.cs:614:9:614:13 | call to method M | C21+A1.M() | +| ViableCallable.cs:620:9:620:13 | call to method M | C21+A1.M() | +| ViableCallable.cs:620:9:620:13 | call to method M | C21+A2.M() | +| ViableCallable.cs:662:9:662:16 | call to method M | C22+TestOverloadResolution1.M(Int32[]) | +| ViableCallable.cs:666:9:666:16 | call to method M | C22+TestOverloadResolution1.M(List) | +| ViableCallable.cs:673:9:673:16 | call to method M | C22+TestOverloadResolution2.M(ReadOnlySpan) | +| ViableCallable.cs:677:9:677:16 | call to method M | C22+TestOverloadResolution2.M(IEnumerable) | +| ViableCallable.cs:684:9:684:16 | call to method M | C22+TestOverloadResolution1.M(Int32[]) | +| ViableCallable.cs:684:9:684:16 | call to method M | C22+TestOverloadResolution2.M(Int32[]) | +| ViableCallable.cs:688:9:688:16 | call to method M | C22+TestOverloadResolution1.M(List) | +| ViableCallable.cs:688:9:688:16 | call to method M | C22+TestOverloadResolution2.M(List) | +| ViableCallable.cs:717:9:717:18 | access to property Property | C23+Partial1.set_Property(object) | +| ViableCallable.cs:720:13:720:22 | access to property Property | C23+Partial1.get_Property() | +| ViableCallable.cs:723:9:723:12 | access to indexer | C23+Partial1.set_Item(int, object) | +| ViableCallable.cs:726:13:726:16 | access to indexer | C23+Partial1.get_Item(int) | +| ViableCallable.cs:729:9:729:15 | access to event Event | C23+Partial1.add_Event(EventHandler) | +| ViableCallable.cs:732:9:732:15 | access to event Event | C23+Partial1.remove_Event(EventHandler) | +| ViableCallable.cs:735:18:735:43 | object creation of type Partial1 | C23+Partial1.Partial1(object) | diff --git a/csharp/ql/test/library-tests/dispatch/ViableCallable.cs b/csharp/ql/test/library-tests/dispatch/ViableCallable.cs index dee8d9b0d1d..61dfef7444c 100644 --- a/csharp/ql/test/library-tests/dispatch/ViableCallable.cs +++ b/csharp/ql/test/library-tests/dispatch/ViableCallable.cs @@ -362,6 +362,7 @@ public class C11 { dynamic d = this; int x = 0; + // Viable callables: int.+ x += 42; // Viable callables: C11.M() d.M(x); diff --git a/csharp/ql/test/library-tests/dispatch/viableCallable.expected b/csharp/ql/test/library-tests/dispatch/viableCallable.expected index c4abbbd2e58..8791bd0ae41 100644 --- a/csharp/ql/test/library-tests/dispatch/viableCallable.expected +++ b/csharp/ql/test/library-tests/dispatch/viableCallable.expected @@ -271,35 +271,36 @@ | ViableCallable.cs:311:9:311:15 | call to method M | M`1 | C7`1 | | ViableCallable.cs:314:9:314:20 | call to method M | M`1 | C7`1 | | ViableCallable.cs:317:9:317:20 | call to method M | M`1 | C6`2 | -| ViableCallable.cs:367:9:367:14 | dynamic call to method M | M | C11 | -| ViableCallable.cs:369:9:369:18 | dynamic object creation of type C11 | C11 | C11 | -| ViableCallable.cs:392:9:392:13 | call to method M | M | C13 | -| ViableCallable.cs:425:9:425:18 | call to method M | M`1 | A1 | -| ViableCallable.cs:425:9:425:18 | call to method M | M`1 | A4 | -| ViableCallable.cs:425:9:425:18 | call to method M | M`1 | A5 | -| ViableCallable.cs:427:13:427:20 | object creation of type A3 | A3 | A3 | -| ViableCallable.cs:429:9:429:19 | call to method M | M`1 | A1 | -| ViableCallable.cs:431:13:431:20 | object creation of type A4 | A4 | A4 | -| ViableCallable.cs:433:9:433:21 | call to method M | M`1 | A4 | -| ViableCallable.cs:437:9:437:21 | call to method M | M`1 | A4 | -| ViableCallable.cs:437:9:437:21 | call to method M | M`1 | A5 | -| ViableCallable.cs:492:9:492:14 | call to method M1 | M1 | C18 | -| ViableCallable.cs:495:9:495:14 | call to method M2 | M2 | I2 | -| ViableCallable.cs:509:18:509:22 | call to operator + | + | C19 | -| ViableCallable.cs:512:26:512:30 | call to operator checked + | checked + | C19 | -| ViableCallable.cs:515:18:515:23 | call to operator explicit conversion | explicit conversion | C19 | -| ViableCallable.cs:518:26:518:31 | call to operator checked explicit conversion | checked explicit conversion | C19 | -| ViableCallable.cs:559:18:559:22 | call to operator + | + | C20 | -| ViableCallable.cs:562:26:562:30 | call to operator checked + | checked + | C20 | -| ViableCallable.cs:565:18:565:22 | call to operator - | - | C20 | -| ViableCallable.cs:568:26:568:30 | call to operator checked - | checked - | I3`1 | -| ViableCallable.cs:571:18:571:22 | call to operator * | * | I3`1 | -| ViableCallable.cs:574:26:574:30 | call to operator checked * | checked * | I3`1 | -| ViableCallable.cs:577:18:577:22 | call to operator / | / | C20 | -| ViableCallable.cs:577:18:577:22 | call to operator / | / | I3`1 | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | checked / | C20 | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | checked / | I3`1 | -| ViableCallable.cs:583:9:583:15 | call to method M11 | M11 | C20 | -| ViableCallable.cs:586:9:586:15 | call to method M12 | M12 | C20 | -| ViableCallable.cs:586:9:586:15 | call to method M12 | M12 | I3`1 | -| ViableCallable.cs:589:9:589:15 | call to method M13 | M13 | I3`1 | +| ViableCallable.cs:366:9:366:15 | ... += ... | + | Int32 | +| ViableCallable.cs:368:9:368:14 | dynamic call to method M | M | C11 | +| ViableCallable.cs:370:9:370:18 | dynamic object creation of type C11 | C11 | C11 | +| ViableCallable.cs:393:9:393:13 | call to method M | M | C13 | +| ViableCallable.cs:426:9:426:18 | call to method M | M`1 | A1 | +| ViableCallable.cs:426:9:426:18 | call to method M | M`1 | A4 | +| ViableCallable.cs:426:9:426:18 | call to method M | M`1 | A5 | +| ViableCallable.cs:428:13:428:20 | object creation of type A3 | A3 | A3 | +| ViableCallable.cs:430:9:430:19 | call to method M | M`1 | A1 | +| ViableCallable.cs:432:13:432:20 | object creation of type A4 | A4 | A4 | +| ViableCallable.cs:434:9:434:21 | call to method M | M`1 | A4 | +| ViableCallable.cs:438:9:438:21 | call to method M | M`1 | A4 | +| ViableCallable.cs:438:9:438:21 | call to method M | M`1 | A5 | +| ViableCallable.cs:493:9:493:14 | call to method M1 | M1 | C18 | +| ViableCallable.cs:496:9:496:14 | call to method M2 | M2 | I2 | +| ViableCallable.cs:510:18:510:22 | call to operator + | + | C19 | +| ViableCallable.cs:513:26:513:30 | call to operator checked + | checked + | C19 | +| ViableCallable.cs:516:18:516:23 | call to operator explicit conversion | explicit conversion | C19 | +| ViableCallable.cs:519:26:519:31 | call to operator checked explicit conversion | checked explicit conversion | C19 | +| ViableCallable.cs:560:18:560:22 | call to operator + | + | C20 | +| ViableCallable.cs:563:26:563:30 | call to operator checked + | checked + | C20 | +| ViableCallable.cs:566:18:566:22 | call to operator - | - | C20 | +| ViableCallable.cs:569:26:569:30 | call to operator checked - | checked - | I3`1 | +| ViableCallable.cs:572:18:572:22 | call to operator * | * | I3`1 | +| ViableCallable.cs:575:26:575:30 | call to operator checked * | checked * | I3`1 | +| ViableCallable.cs:578:18:578:22 | call to operator / | / | C20 | +| ViableCallable.cs:578:18:578:22 | call to operator / | / | I3`1 | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | checked / | C20 | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | checked / | I3`1 | +| ViableCallable.cs:584:9:584:15 | call to method M11 | M11 | C20 | +| ViableCallable.cs:587:9:587:15 | call to method M12 | M12 | C20 | +| ViableCallable.cs:587:9:587:15 | call to method M12 | M12 | I3`1 | +| ViableCallable.cs:590:9:590:15 | call to method M13 | M13 | I3`1 | diff --git a/csharp/ql/test/library-tests/dynamic/DynamicOperatorCall.expected b/csharp/ql/test/library-tests/dynamic/DynamicOperatorCall.expected index 6c0a054c84a..6e98bffaf6f 100644 --- a/csharp/ql/test/library-tests/dynamic/DynamicOperatorCall.expected +++ b/csharp/ql/test/library-tests/dynamic/DynamicOperatorCall.expected @@ -1,6 +1,6 @@ | dynamic.cs:35:13:35:14 | dynamic call to operator - | - | 0 | dynamic.cs:35:14:35:14 | access to local variable d | | dynamic.cs:36:13:36:17 | dynamic call to operator + | + | 0 | dynamic.cs:36:13:36:13 | access to local variable d | | dynamic.cs:36:13:36:17 | dynamic call to operator + | + | 1 | dynamic.cs:36:17:36:17 | access to local variable d | -| dynamic.cs:37:9:37:14 | dynamic call to operator + | + | 0 | dynamic.cs:37:9:37:9 | access to local variable d | -| dynamic.cs:37:9:37:14 | dynamic call to operator + | + | 1 | dynamic.cs:37:14:37:14 | access to local variable d | +| dynamic.cs:37:9:37:14 | ... += ... | + | 0 | dynamic.cs:37:9:37:9 | access to local variable d | +| dynamic.cs:37:9:37:14 | ... += ... | + | 1 | dynamic.cs:37:14:37:14 | access to local variable d | | dynamic.cs:47:9:47:11 | dynamic call to operator ++ | ++ | 0 | dynamic.cs:47:9:47:9 | access to local variable d | diff --git a/csharp/ql/test/library-tests/dynamic/PrintAst.expected b/csharp/ql/test/library-tests/dynamic/PrintAst.expected index 3bde4d42d86..3526e0b6bf5 100644 --- a/csharp/ql/test/library-tests/dynamic/PrintAst.expected +++ b/csharp/ql/test/library-tests/dynamic/PrintAst.expected @@ -105,12 +105,12 @@ dynamic.cs: # 35| 15: [ExprStmt] ...; # 35| 0: [AssignExpr] ... = ... # 35| 0: [LocalVariableAccess] access to local variable d -# 35| 1: [DynamicOperatorCall] dynamic call to operator - +# 35| 1: [OperatorCall] dynamic call to operator - # 35| 0: [LocalVariableAccess] access to local variable d # 36| 16: [ExprStmt] ...; # 36| 0: [AssignExpr] ... = ... # 36| 0: [LocalVariableAccess] access to local variable d -# 36| 1: [DynamicOperatorCall] dynamic call to operator + +# 36| 1: [OperatorCall] dynamic call to operator + # 36| 0: [LocalVariableAccess] access to local variable d # 36| 1: [LocalVariableAccess] access to local variable d # 37| 17: [ExprStmt] ...; @@ -141,7 +141,7 @@ dynamic.cs: # 44| 0: [PostIncrExpr] ...++ # 44| 0: [LocalVariableAccess] access to local variable i # 47| 23: [ExprStmt] ...; -# 47| 0: [DynamicOperatorCall] dynamic call to operator ++ +# 47| 0: [OperatorCall] dynamic call to operator ++ # 47| 0: [LocalVariableAccess] access to local variable d # 50| 24: [ExprStmt] ...; # 50| 0: [PostIncrExpr] ...++ diff --git a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected index d9b6636469a..1d15c2e6169 100644 --- a/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected +++ b/csharp/ql/test/library-tests/structuralcomparison/structuralComparison.expected @@ -57,64 +57,64 @@ gvn | 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),false,Class) | -| StructuralComparison.cs:5:26:5:30 | ... = ... | ((kind:Expr(16),true,x) :: (0 :: (kind:Expr(63)))) | +| StructuralComparison.cs:5:26:5:30 | ... = ... | (0 :: ((kind:Expr(16),true,x) :: (kind:Expr(63)))) | | StructuralComparison.cs:5:30:5:30 | 0 | 0 | | StructuralComparison.cs:6:26:6:26 | access to field y | (kind:Expr(16),true,y) | | StructuralComparison.cs:6:26:6:26 | this access | (kind:Expr(12),false,Class) | -| StructuralComparison.cs:6:26:6:30 | ... = ... | ((kind:Expr(16),true,y) :: (1 :: (kind:Expr(63)))) | +| StructuralComparison.cs:6:26:6:30 | ... = ... | (1 :: ((kind:Expr(16),true,y) :: (kind:Expr(63)))) | | StructuralComparison.cs:6:30:6:30 | 1 | 1 | | StructuralComparison.cs:8:24:8:24 | 0 | 0 | | StructuralComparison.cs:9:29:9:29 | access to parameter a | (kind:Expr(15),false,a) | | StructuralComparison.cs:10:38:10:39 | access to parameter v1 | (kind:Expr(15),false,v1) | | StructuralComparison.cs:10:38:10:44 | ... + ... | ((kind:Expr(15),false,v2) :: ((kind:Expr(15),false,v1) :: (kind:Expr(44)))) | | StructuralComparison.cs:10:43:10:44 | access to parameter v2 | (kind:Expr(15),false,v2) | -| StructuralComparison.cs:14:5:17:5 | {...} | ((((kind:Expr(14),false,z2) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z1) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1)))) | -| StructuralComparison.cs:15:9:15:23 | ... ...; | (((kind:Expr(14),false,z1) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:14:5:17:5 | {...} | (((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: ((kind:Expr(14),false,z2) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: ((kind:Expr(14),false,z1) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1)))) | +| StructuralComparison.cs:15:9:15:23 | ... ...; | ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: ((kind:Expr(14),false,z1) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:15:13:15:14 | access to local variable z1 | (kind:Expr(14),false,z1) | -| StructuralComparison.cs:15:13:15:22 | Int32 z1 = ... | ((kind:Expr(14),false,z1) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:15:13:15:22 | Int32 z1 = ... | (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: ((kind:Expr(14),false,z1) :: (kind:Expr(83)))) | | StructuralComparison.cs:15:18:15:18 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:15:18:15:18 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:15:18:15:22 | ... + ... | ((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) | | StructuralComparison.cs:15:22:15:22 | access to field y | (kind:Expr(16),true,y) | | StructuralComparison.cs:15:22:15:22 | this access | (kind:Expr(12),false,Class) | -| StructuralComparison.cs:16:9:16:23 | ... ...; | (((kind:Expr(14),false,z2) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:16:9:16:23 | ... ...; | ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: ((kind:Expr(14),false,z2) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:16:13:16:14 | access to local variable z2 | (kind:Expr(14),false,z2) | -| StructuralComparison.cs:16:13:16:22 | Int32 z2 = ... | ((kind:Expr(14),false,z2) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:16:13:16:22 | Int32 z2 = ... | (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) :: ((kind:Expr(14),false,z2) :: (kind:Expr(83)))) | | StructuralComparison.cs:16:18:16:18 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:16:18:16:18 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:16:18:16:22 | ... + ... | ((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: (kind:Expr(44)))) | | StructuralComparison.cs:16:22:16:22 | access to field y | (kind:Expr(16),true,y) | | StructuralComparison.cs:16:22:16:22 | this access | (kind:Expr(12),false,Class) | -| StructuralComparison.cs:20:5:29:5 | {...} | ((((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) :: ((((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) :: ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) :: ((((kind:Expr(14),false,z7) :: ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z6) :: (((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z5) :: (((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z4) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,z3) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1)))))))))) | -| StructuralComparison.cs:21:9:21:23 | ... ...; | (((kind:Expr(14),false,z3) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:20:5:29:5 | {...} | ((((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) :: ((((kind:Expr(16),true,x) :: ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) :: ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Stmt(2))) :: ((((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) :: ((kind:Expr(14),false,z7) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (((((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) :: ((kind:Expr(14),false,z6) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (((((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: ((kind:Expr(14),false,z5) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (((((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: ((kind:Expr(14),false,z4) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (((((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: ((kind:Expr(14),false,z3) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1)))))))))) | +| StructuralComparison.cs:21:9:21:23 | ... ...; | ((((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: ((kind:Expr(14),false,z3) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:21:13:21:14 | access to local variable z3 | (kind:Expr(14),false,z3) | -| StructuralComparison.cs:21:13:21:22 | Int32 z3 = ... | ((kind:Expr(14),false,z3) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:21:13:21:22 | Int32 z3 = ... | (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: ((kind:Expr(14),false,z3) :: (kind:Expr(83)))) | | StructuralComparison.cs:21:18:21:22 | call to method M1 | ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) | | StructuralComparison.cs:21:18:21:22 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:21:21:21:21 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:21:21:21:21 | this access | (kind:Expr(12),false,Class) | -| StructuralComparison.cs:22:9:22:23 | ... ...; | (((kind:Expr(14),false,z4) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:22:9:22:23 | ... ...; | ((((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: ((kind:Expr(14),false,z4) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:22:13:22:14 | access to local variable z4 | (kind:Expr(14),false,z4) | -| StructuralComparison.cs:22:13:22:22 | Int32 z4 = ... | ((kind:Expr(14),false,z4) :: (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:22:13:22:22 | Int32 z4 = ... | (((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: ((kind:Expr(14),false,z4) :: (kind:Expr(83)))) | | StructuralComparison.cs:22:18:22:22 | call to method M1 | ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) | | StructuralComparison.cs:22:18:22:22 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:22:21:22:21 | access to field x | (kind:Expr(16),true,x) | | StructuralComparison.cs:22:21:22:21 | this access | (kind:Expr(12),false,Class) | -| StructuralComparison.cs:23:9:23:23 | ... ...; | (((kind:Expr(14),false,z5) :: (((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:23:9:23:23 | ... ...; | ((((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: ((kind:Expr(14),false,z5) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:23:13:23:14 | access to local variable z5 | (kind:Expr(14),false,z5) | -| StructuralComparison.cs:23:13:23:22 | Int32 z5 = ... | ((kind:Expr(14),false,z5) :: (((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:23:13:23:22 | Int32 z5 = ... | (((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) :: ((kind:Expr(14),false,z5) :: (kind:Expr(83)))) | | StructuralComparison.cs:23:18:23:22 | call to method M1 | ((kind:Expr(16),true,y) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M1))) | | StructuralComparison.cs:23:18:23:22 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:23:21:23:21 | access to field y | (kind:Expr(16),true,y) | | StructuralComparison.cs:23:21:23:21 | this access | (kind:Expr(12),false,Class) | -| StructuralComparison.cs:24:9:24:22 | ... ...; | (((kind:Expr(14),false,z6) :: (((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:24:9:24:22 | ... ...; | ((((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) :: ((kind:Expr(14),false,z6) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:24:13:24:14 | access to local variable z6 | (kind:Expr(14),false,z6) | -| StructuralComparison.cs:24:13:24:21 | Int32 z6 = ... | ((kind:Expr(14),false,z6) :: (((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) :: (kind:Expr(83)))) | +| StructuralComparison.cs:24:13:24:21 | Int32 z6 = ... | (((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) :: ((kind:Expr(14),false,z6) :: (kind:Expr(83)))) | | StructuralComparison.cs:24:18:24:21 | call to method M0 | ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M0)) | | StructuralComparison.cs:24:18:24:21 | this access | (kind:Expr(12),false,Class) | -| StructuralComparison.cs:25:9:25:37 | ... ...; | (((kind:Expr(14),false,z7) :: ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:25:9:25:37 | ... ...; | (((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) :: ((kind:Expr(14),false,z7) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:25:13:25:14 | access to local variable z7 | (kind:Expr(14),false,z7) | -| StructuralComparison.cs:25:13:25:36 | Int32 z7 = ... | ((kind:Expr(14),false,z7) :: ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) :: (kind:Expr(83)))) | +| StructuralComparison.cs:25:13:25:36 | Int32 z7 = ... | ((((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) :: ((kind:Expr(14),false,z7) :: (kind:Expr(83)))) | | StructuralComparison.cs:25:18:25:25 | call to method M2 | ((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) | | StructuralComparison.cs:25:18:25:25 | this access | (kind:Expr(12),false,Class) | | StructuralComparison.cs:25:18:25:36 | ... + ... | (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (((kind:Expr(16),true,y) :: ((kind:Expr(16),true,x) :: ((kind:Expr(12),false,Class) :: (kind:Expr(24),false,M2)))) :: (kind:Expr(44)))) | @@ -157,35 +157,35 @@ gvn | StructuralComparison.cs:38:14:38:25 | call to method | ((kind:Expr(12),false,DerivedClass) :: (kind:Expr(24),false,)) | | StructuralComparison.cs:38:14:38:25 | this access | (kind:Expr(12),false,DerivedClass) | | 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:41:5:45:5 | {...} | ((((kind:Expr(16),true,Field) :: ((kind:Expr(14),false,x3) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(16),true,Field) :: ((kind:Expr(14),false,x2) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(16),true,Field) :: ((kind:Expr(14),false,x1) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1))))) | +| StructuralComparison.cs:42:9:42:28 | ... ...; | (((kind:Expr(16),true,Field) :: ((kind:Expr(14),false,x1) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:42:13:42:14 | access to local variable x1 | (kind:Expr(14),false,x1) | -| StructuralComparison.cs:42:13:42:27 | Int32 x1 = ... | ((kind:Expr(14),false,x1) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) | +| StructuralComparison.cs:42:13:42:27 | Int32 x1 = ... | ((kind:Expr(16),true,Field) :: ((kind:Expr(14),false,x1) :: (kind:Expr(83)))) | | StructuralComparison.cs:42:18:42:21 | base access | (kind:Expr(13),false,BaseClass) | | StructuralComparison.cs:42:18:42:27 | access to field Field | (kind:Expr(16),true,Field) | -| StructuralComparison.cs:43:9:43:23 | ... ...; | (((kind:Expr(14),false,x2) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:43:9:43:23 | ... ...; | (((kind:Expr(16),true,Field) :: ((kind:Expr(14),false,x2) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:43:13:43:14 | access to local variable x2 | (kind:Expr(14),false,x2) | -| StructuralComparison.cs:43:13:43:22 | Int32 x2 = ... | ((kind:Expr(14),false,x2) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) | +| StructuralComparison.cs:43:13:43:22 | Int32 x2 = ... | ((kind:Expr(16),true,Field) :: ((kind:Expr(14),false,x2) :: (kind:Expr(83)))) | | StructuralComparison.cs:43:18:43:22 | access to field Field | (kind:Expr(16),true,Field) | | StructuralComparison.cs:43:18:43:22 | this access | (kind:Expr(12),false,DerivedClass) | -| StructuralComparison.cs:44:9:44:28 | ... ...; | (((kind:Expr(14),false,x3) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:44:9:44:28 | ... ...; | (((kind:Expr(16),true,Field) :: ((kind:Expr(14),false,x3) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:44:13:44:14 | access to local variable x3 | (kind:Expr(14),false,x3) | -| StructuralComparison.cs:44:13:44:27 | Int32 x3 = ... | ((kind:Expr(14),false,x3) :: ((kind:Expr(16),true,Field) :: (kind:Expr(83)))) | +| StructuralComparison.cs:44:13:44:27 | Int32 x3 = ... | ((kind:Expr(16),true,Field) :: ((kind:Expr(14),false,x3) :: (kind:Expr(83)))) | | StructuralComparison.cs:44:18:44:21 | this access | (kind:Expr(12),false,DerivedClass) | | StructuralComparison.cs:44:18:44:27 | access to field Field | (kind:Expr(16),true,Field) | -| StructuralComparison.cs:48:5:52:5 | {...} | ((((kind:Expr(14),false,y3) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,y2) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(14),false,y1) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1))))) | -| StructuralComparison.cs:49:9:49:27 | ... ...; | (((kind:Expr(14),false,y1) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:48:5:52:5 | {...} | ((((kind:Expr(17),true,Prop) :: ((kind:Expr(14),false,y3) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(17),true,Prop) :: ((kind:Expr(14),false,y2) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: ((((kind:Expr(17),true,Prop) :: ((kind:Expr(14),false,y1) :: (kind:Expr(83)))) :: (kind:Stmt(22))) :: (kind:Stmt(1))))) | +| StructuralComparison.cs:49:9:49:27 | ... ...; | (((kind:Expr(17),true,Prop) :: ((kind:Expr(14),false,y1) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:49:13:49:14 | access to local variable y1 | (kind:Expr(14),false,y1) | -| StructuralComparison.cs:49:13:49:26 | Object y1 = ... | ((kind:Expr(14),false,y1) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) | +| StructuralComparison.cs:49:13:49:26 | Object y1 = ... | ((kind:Expr(17),true,Prop) :: ((kind:Expr(14),false,y1) :: (kind:Expr(83)))) | | StructuralComparison.cs:49:18:49:21 | base access | (kind:Expr(13),false,BaseClass) | | StructuralComparison.cs:49:18:49:26 | access to property Prop | (kind:Expr(17),true,Prop) | -| StructuralComparison.cs:50:9:50:22 | ... ...; | (((kind:Expr(14),false,y2) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:50:9:50:22 | ... ...; | (((kind:Expr(17),true,Prop) :: ((kind:Expr(14),false,y2) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:50:13:50:14 | access to local variable y2 | (kind:Expr(14),false,y2) | -| StructuralComparison.cs:50:13:50:21 | Object y2 = ... | ((kind:Expr(14),false,y2) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) | +| StructuralComparison.cs:50:13:50:21 | Object y2 = ... | ((kind:Expr(17),true,Prop) :: ((kind:Expr(14),false,y2) :: (kind:Expr(83)))) | | StructuralComparison.cs:50:18:50:21 | access to property Prop | (kind:Expr(17),true,Prop) | | StructuralComparison.cs:50:18:50:21 | this access | (kind:Expr(12),false,DerivedClass) | -| StructuralComparison.cs:51:9:51:27 | ... ...; | (((kind:Expr(14),false,y3) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | +| StructuralComparison.cs:51:9:51:27 | ... ...; | (((kind:Expr(17),true,Prop) :: ((kind:Expr(14),false,y3) :: (kind:Expr(83)))) :: (kind:Stmt(22))) | | StructuralComparison.cs:51:13:51:14 | access to local variable y3 | (kind:Expr(14),false,y3) | -| StructuralComparison.cs:51:13:51:26 | Object y3 = ... | ((kind:Expr(14),false,y3) :: ((kind:Expr(17),true,Prop) :: (kind:Expr(83)))) | +| StructuralComparison.cs:51:13:51:26 | Object y3 = ... | ((kind:Expr(17),true,Prop) :: ((kind:Expr(14),false,y3) :: (kind:Expr(83)))) | | StructuralComparison.cs:51:18:51:21 | this access | (kind:Expr(12),false,DerivedClass) | | StructuralComparison.cs:51:18:51:26 | access to property Prop | (kind:Expr(17),true,Prop) | diff --git a/csharp/ql/test/query-tests/Concurrency/SynchSetUnsynchGet/SynchSetUnsynchGet.cs b/csharp/ql/test/query-tests/Concurrency/SynchSetUnsynchGet/SynchSetUnsynchGet.cs index 7d90bb69b5c..8b41604a9e6 100644 --- a/csharp/ql/test/query-tests/Concurrency/SynchSetUnsynchGet/SynchSetUnsynchGet.cs +++ b/csharp/ql/test/query-tests/Concurrency/SynchSetUnsynchGet/SynchSetUnsynchGet.cs @@ -89,4 +89,25 @@ class C1 lock (mutex) GoodProperty3 = value; } } + + // GOOD: both getter and setter are locked. + int? property2; + int? GoodProperty5 + { + get + { + lock (mutex) + { + property2 ??= 0; + return property2; + } + } + set + { + lock (mutex) + { + property2 = value; + } + } + } } diff --git a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected index 6271d6276c7..2073fce06a7 100644 --- a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected +++ b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected @@ -1,7 +1,7 @@ | DeadStoreOfLocal.cs:12:13:12:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:12:13:12:13 | x | x | | DeadStoreOfLocal.cs:19:21:19:25 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:18:13:18:13 | x | x | | DeadStoreOfLocal.cs:44:13:44:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:44:13:44:13 | x | x | -| DeadStoreOfLocal.cs:50:9:50:14 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:49:13:49:13 | x | x | +| DeadStoreOfLocal.cs:50:9:50:14 | ... += ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:49:13:49:13 | x | x | | DeadStoreOfLocal.cs:56:9:56:11 | ...++ | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:55:13:55:13 | x | x | | DeadStoreOfLocal.cs:82:22:82:24 | String val | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:82:22:82:24 | val | val | | DeadStoreOfLocal.cs:101:13:101:37 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:94:40:94:44 | extra | extra | diff --git a/csharp/ql/test/query-tests/Language Abuse/UselessNullCoalescingExpression/UselessNullCoalescingExpression.cs b/csharp/ql/test/query-tests/Language Abuse/UselessNullCoalescingExpression/UselessNullCoalescingExpression.cs index ab8588d0255..f05782416fd 100644 --- a/csharp/ql/test/query-tests/Language Abuse/UselessNullCoalescingExpression/UselessNullCoalescingExpression.cs +++ b/csharp/ql/test/query-tests/Language Abuse/UselessNullCoalescingExpression/UselessNullCoalescingExpression.cs @@ -12,6 +12,8 @@ class Tests a = param ?? param; // BAD a = a ?? use(a); // BAD a = Field ?? this.Field; // BAD + a ??= a; // BAD + a ??= b = a; // BAD a = a ?? cache(ref a); // GOOD a = a ?? store(out a); // GOOD @@ -23,6 +25,7 @@ class Tests ?? a; // GOOD a = a ?? store(out a) ?? a; // GOOD + a ??= param; // GOOD } int? cache(ref int? a) diff --git a/csharp/ql/test/query-tests/Language Abuse/UselessNullCoalescingExpression/UselessNullCoalescingExpression.expected b/csharp/ql/test/query-tests/Language Abuse/UselessNullCoalescingExpression/UselessNullCoalescingExpression.expected index 2b68f731870..3f4af5b8210 100644 --- a/csharp/ql/test/query-tests/Language Abuse/UselessNullCoalescingExpression/UselessNullCoalescingExpression.expected +++ b/csharp/ql/test/query-tests/Language Abuse/UselessNullCoalescingExpression/UselessNullCoalescingExpression.expected @@ -4,3 +4,5 @@ | UselessNullCoalescingExpression.cs:12:13:12:26 | ... ?? ... | Both operands of this null-coalescing expression access the same variable or property. | | UselessNullCoalescingExpression.cs:13:13:13:23 | ... ?? ... | Both operands of this null-coalescing expression access the same variable or property. | | UselessNullCoalescingExpression.cs:14:13:14:31 | ... ?? ... | Both operands of this null-coalescing expression access the same variable or property. | +| UselessNullCoalescingExpression.cs:15:9:15:15 | ... ??= ... | Both operands of this null-coalescing expression access the same variable or property. | +| UselessNullCoalescingExpression.cs:16:9:16:19 | ... ??= ... | Both operands of this null-coalescing expression access the same variable or property. | diff --git a/csharp/ql/test/query-tests/WriteOnlyContainer/WriteOnlyContainer.cs b/csharp/ql/test/query-tests/WriteOnlyContainer/WriteOnlyContainer.cs index 97c33685a95..6d870cad08b 100644 --- a/csharp/ql/test/query-tests/WriteOnlyContainer/WriteOnlyContainer.cs +++ b/csharp/ql/test/query-tests/WriteOnlyContainer/WriteOnlyContainer.cs @@ -307,4 +307,10 @@ public class ContainerTest { Out(out var strings); // BAD: but allow for now (only C# 7 allows discards) } + + IList TestNullcoalescingInitializations() + { + var l = new List { 1, 2, 3 }; // GOOD: returned + return l ??= new List(); + } } From 96f55fbdf15fd1346df6ae97a9c504ddac24d1ae Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 23 Mar 2026 14:02:38 +0100 Subject: [PATCH 32/81] C#: Add operation types to the DB scheme. --- csharp/ql/lib/semmlecode.csharp.dbscheme | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme index 7763debea24..19b8cc3e2dc 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme @@ -1220,6 +1220,19 @@ case @expr.kind of @assign_op_expr = @assign_op_call_expr | @assign_event_expr | @assign_coalesce_expr; @assign_event_expr = @add_event_expr | @remove_event_expr; +@add_operation = @add_expr | @assign_add_expr; +@sub_operation = @sub_expr | @assign_sub_expr; +@mul_operation = @mul_expr | @assign_mul_expr; +@div_operation = @div_expr | @assign_div_expr; +@rem_operation = @rem_expr | @assign_rem_expr; +@and_operation = @bit_and_expr | @assign_and_expr; +@xor_operation = @bit_xor_expr | @assign_xor_expr; +@or_operation = @bit_or_expr | @assign_or_expr; +@lshift_operation = @lshift_expr | @assign_lshift_expr; +@rshift_operation = @rshift_expr | @assign_rshift_expr; +@urshift_operation = @urshift_expr | @assign_urshift_expr; +@null_coalescing_operation = @null_coalescing_expr | @assign_coalesce_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 From 3d2d09d0bc73b0700b9e735aac3876ec12f76aeb Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 23 Mar 2026 14:03:50 +0100 Subject: [PATCH 33/81] C#: Use the DB types and replace the abstract class implementation. --- .../code/csharp/exprs/ArithmeticOperation.qll | 16 +- .../semmle/code/csharp/exprs/Assignment.qll | 26 +-- .../code/csharp/exprs/BitwiseOperation.qll | 14 +- .../code/csharp/exprs/LogicalOperation.qll | 4 +- .../semmle/code/csharp/exprs/Operation.qll | 151 ++++++------------ 5 files changed, 80 insertions(+), 131 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/ArithmeticOperation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/ArithmeticOperation.qll index f20bfba1589..193c48ed3a2 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/ArithmeticOperation.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/ArithmeticOperation.qll @@ -107,7 +107,7 @@ class BinaryArithmeticOperation extends ArithmeticOperation, BinaryOperation, @b /** * An addition operation, for example `x + y`. */ -class AddExpr extends BinaryArithmeticOperation, @add_expr { +class AddExpr extends BinaryArithmeticOperation, AddOperation, @add_expr { override string getOperator() { result = "+" } override string getAPrimaryQlClass() { result = "AddExpr" } @@ -116,7 +116,7 @@ class AddExpr extends BinaryArithmeticOperation, @add_expr { /** * A subtraction operation, for example `x - y`. */ -class SubExpr extends BinaryArithmeticOperation, @sub_expr { +class SubExpr extends BinaryArithmeticOperation, SubOperation, @sub_expr { override string getOperator() { result = "-" } override string getAPrimaryQlClass() { result = "SubExpr" } @@ -125,7 +125,7 @@ class SubExpr extends BinaryArithmeticOperation, @sub_expr { /** * A multiplication operation, for example `x * y`. */ -class MulExpr extends BinaryArithmeticOperation, @mul_expr { +class MulExpr extends BinaryArithmeticOperation, MulOperation, @mul_expr { override string getOperator() { result = "*" } override string getAPrimaryQlClass() { result = "MulExpr" } @@ -134,22 +134,16 @@ class MulExpr extends BinaryArithmeticOperation, @mul_expr { /** * A division operation, for example `x / y`. */ -class DivExpr extends BinaryArithmeticOperation, @div_expr { +class DivExpr extends BinaryArithmeticOperation, DivOperation, @div_expr { override string getOperator() { result = "/" } - /** Gets the numerator of this division operation. */ - Expr getNumerator() { result = this.getLeftOperand() } - - /** Gets the denominator of this division operation. */ - Expr getDenominator() { result = this.getRightOperand() } - override string getAPrimaryQlClass() { result = "DivExpr" } } /** * A remainder operation, for example `x % y`. */ -class RemExpr extends BinaryArithmeticOperation, @rem_expr { +class RemExpr extends BinaryArithmeticOperation, RemOperation, @rem_expr { override string getOperator() { result = "%" } override string getAPrimaryQlClass() { result = "RemExpr" } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll index baf366be1ba..e751bddc670 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll @@ -99,7 +99,7 @@ class AssignArithmeticOperation extends AssignCallOperation, @assign_arith_expr /** * An addition assignment operation, for example `x += y`. */ -class AssignAddExpr extends AssignArithmeticOperation, @assign_add_expr { +class AssignAddExpr extends AssignArithmeticOperation, AddOperation, @assign_add_expr { override string getOperator() { result = "+=" } override string getAPrimaryQlClass() { result = "AssignAddExpr" } @@ -108,7 +108,7 @@ class AssignAddExpr extends AssignArithmeticOperation, @assign_add_expr { /** * A subtraction assignment operation, for example `x -= y`. */ -class AssignSubExpr extends AssignArithmeticOperation, @assign_sub_expr { +class AssignSubExpr extends AssignArithmeticOperation, SubOperation, @assign_sub_expr { override string getOperator() { result = "-=" } override string getAPrimaryQlClass() { result = "AssignSubExpr" } @@ -117,7 +117,7 @@ class AssignSubExpr extends AssignArithmeticOperation, @assign_sub_expr { /** * An multiplication assignment operation, for example `x *= y`. */ -class AssignMulExpr extends AssignArithmeticOperation, @assign_mul_expr { +class AssignMulExpr extends AssignArithmeticOperation, MulOperation, @assign_mul_expr { override string getOperator() { result = "*=" } override string getAPrimaryQlClass() { result = "AssignMulExpr" } @@ -126,7 +126,7 @@ class AssignMulExpr extends AssignArithmeticOperation, @assign_mul_expr { /** * An division assignment operation, for example `x /= y`. */ -class AssignDivExpr extends AssignArithmeticOperation, @assign_div_expr { +class AssignDivExpr extends AssignArithmeticOperation, DivOperation, @assign_div_expr { override string getOperator() { result = "/=" } override string getAPrimaryQlClass() { result = "AssignDivExpr" } @@ -135,7 +135,7 @@ class AssignDivExpr extends AssignArithmeticOperation, @assign_div_expr { /** * A remainder assignment operation, for example `x %= y`. */ -class AssignRemExpr extends AssignArithmeticOperation, @assign_rem_expr { +class AssignRemExpr extends AssignArithmeticOperation, RemOperation, @assign_rem_expr { override string getOperator() { result = "%=" } override string getAPrimaryQlClass() { result = "AssignRemExpr" } @@ -155,7 +155,7 @@ class AssignBitwiseOperation extends AssignCallOperation, @assign_bitwise_expr { /** * A bitwise-and assignment operation, for example `x &= y`. */ -class AssignAndExpr extends AssignBitwiseOperation, @assign_and_expr { +class AssignAndExpr extends AssignBitwiseOperation, BitwiseAndOperation, @assign_and_expr { override string getOperator() { result = "&=" } override string getAPrimaryQlClass() { result = "AssignAndExpr" } @@ -164,7 +164,7 @@ class AssignAndExpr extends AssignBitwiseOperation, @assign_and_expr { /** * A bitwise-or assignment operation, for example `x |= y`. */ -class AssignOrExpr extends AssignBitwiseOperation, @assign_or_expr { +class AssignOrExpr extends AssignBitwiseOperation, BitwiseOrOperation, @assign_or_expr { override string getOperator() { result = "|=" } override string getAPrimaryQlClass() { result = "AssignOrExpr" } @@ -173,7 +173,7 @@ class AssignOrExpr extends AssignBitwiseOperation, @assign_or_expr { /** * A bitwise exclusive-or assignment operation, for example `x ^= y`. */ -class AssignXorExpr extends AssignBitwiseOperation, @assign_xor_expr { +class AssignXorExpr extends AssignBitwiseOperation, BitwiseXorOperation, @assign_xor_expr { override string getOperator() { result = "^=" } override string getAPrimaryQlClass() { result = "AssignXorExpr" } @@ -182,7 +182,7 @@ class AssignXorExpr extends AssignBitwiseOperation, @assign_xor_expr { /** * A left-shift assignment operation, for example `x <<= y`. */ -class AssignLeftShiftExpr extends AssignBitwiseOperation, @assign_lshift_expr { +class AssignLeftShiftExpr extends AssignBitwiseOperation, LeftShiftOperation, @assign_lshift_expr { override string getOperator() { result = "<<=" } override string getAPrimaryQlClass() { result = "AssignLeftShiftExpr" } @@ -191,7 +191,7 @@ class AssignLeftShiftExpr extends AssignBitwiseOperation, @assign_lshift_expr { /** * A right-shift assignment operation, for example `x >>= y`. */ -class AssignRightShiftExpr extends AssignBitwiseOperation, @assign_rshift_expr { +class AssignRightShiftExpr extends AssignBitwiseOperation, RightShiftOperation, @assign_rshift_expr { override string getOperator() { result = ">>=" } override string getAPrimaryQlClass() { result = "AssignRightShiftExpr" } @@ -200,7 +200,9 @@ class AssignRightShiftExpr extends AssignBitwiseOperation, @assign_rshift_expr { /** * An unsigned right-shift assignment operation, for example `x >>>= y`. */ -class AssignUnsignedRightShiftExpr extends AssignBitwiseOperation, @assign_urshift_expr { +class AssignUnsignedRightShiftExpr extends AssignBitwiseOperation, UnsignedRightShiftOperation, + @assign_urshift_expr +{ override string getOperator() { result = ">>>=" } override string getAPrimaryQlClass() { result = "AssignUnsignedRightShiftExpr" } @@ -273,7 +275,7 @@ class RemoveEventExpr extends AddOrRemoveEventExpr, @remove_event_expr { /** * A null-coalescing assignment operation, for example `x ??= y`. */ -class AssignCoalesceExpr extends AssignOperation, @assign_coalesce_expr { +class AssignCoalesceExpr extends AssignOperation, NullCoalescingOperation, @assign_coalesce_expr { override string toString() { result = "... ??= ..." } override string getAPrimaryQlClass() { result = "AssignCoalesceExpr" } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll index d818a1d08f8..14bb3d74e2b 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll @@ -41,7 +41,7 @@ class BinaryBitwiseOperation extends BitwiseOperation, BinaryOperation, @bin_bit /** * A left-shift operation, for example `x << y`. */ -class LeftShiftExpr extends BinaryBitwiseOperation, @lshift_expr { +class LeftShiftExpr extends BinaryBitwiseOperation, LeftShiftOperation, @lshift_expr { override string getOperator() { result = "<<" } override string getAPrimaryQlClass() { result = "LeftShiftExpr" } @@ -50,7 +50,7 @@ class LeftShiftExpr extends BinaryBitwiseOperation, @lshift_expr { /** * A right-shift operation, for example `x >> y`. */ -class RightShiftExpr extends BinaryBitwiseOperation, @rshift_expr { +class RightShiftExpr extends BinaryBitwiseOperation, RightShiftOperation, @rshift_expr { override string getOperator() { result = ">>" } override string getAPrimaryQlClass() { result = "RightShiftExpr" } @@ -59,7 +59,9 @@ class RightShiftExpr extends BinaryBitwiseOperation, @rshift_expr { /** * An unsigned right-shift operation, for example `x >>> y`. */ -class UnsignedRightShiftExpr extends BinaryBitwiseOperation, @urshift_expr { +class UnsignedRightShiftExpr extends BinaryBitwiseOperation, UnsignedRightShiftOperation, + @urshift_expr +{ override string getOperator() { result = ">>>" } override string getAPrimaryQlClass() { result = "UnsignedRightShiftExpr" } @@ -68,7 +70,7 @@ class UnsignedRightShiftExpr extends BinaryBitwiseOperation, @urshift_expr { /** * A bitwise-and operation, for example `x & y`. */ -class BitwiseAndExpr extends BinaryBitwiseOperation, @bit_and_expr { +class BitwiseAndExpr extends BinaryBitwiseOperation, BitwiseAndOperation, @bit_and_expr { override string getOperator() { result = "&" } override string getAPrimaryQlClass() { result = "BitwiseAndExpr" } @@ -77,7 +79,7 @@ class BitwiseAndExpr extends BinaryBitwiseOperation, @bit_and_expr { /** * A bitwise-or operation, for example `x | y`. */ -class BitwiseOrExpr extends BinaryBitwiseOperation, @bit_or_expr { +class BitwiseOrExpr extends BinaryBitwiseOperation, BitwiseOrOperation, @bit_or_expr { override string getOperator() { result = "|" } override string getAPrimaryQlClass() { result = "BitwiseOrExpr" } @@ -86,7 +88,7 @@ class BitwiseOrExpr extends BinaryBitwiseOperation, @bit_or_expr { /** * A bitwise exclusive-or operation, for example `x ^ y`. */ -class BitwiseXorExpr extends BinaryBitwiseOperation, @bit_xor_expr { +class BitwiseXorExpr extends BinaryBitwiseOperation, BitwiseXorOperation, @bit_xor_expr { override string getOperator() { result = "^" } override string getAPrimaryQlClass() { result = "BitwiseXorExpr" } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/LogicalOperation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/LogicalOperation.qll index e94d8ff93e7..4161f734c9b 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/LogicalOperation.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/LogicalOperation.qll @@ -65,7 +65,9 @@ class LogicalOrExpr extends BinaryLogicalOperation, @log_or_expr { * } * ``` */ -class NullCoalescingExpr extends BinaryLogicalOperation, @null_coalescing_expr { +class NullCoalescingExpr extends BinaryLogicalOperation, NullCoalescingOperation, + @null_coalescing_expr +{ override string getOperator() { result = "??" } override string getAPrimaryQlClass() { result = "NullCoalescingExpr" } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Operation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Operation.qll index 3310fe4de1a..1f816baea86 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Operation.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Operation.qll @@ -4,119 +4,68 @@ import Expr -/** A binary operation that involves a null-coalescing operation. */ -abstract private class NullCoalescingOperationImpl extends BinaryOperation { } +/** + * An addition operation, either `x + y` or `x += y`. + */ +class AddOperation extends BinaryOperation, @add_operation { } -final class NullCoalescingOperation = NullCoalescingOperationImpl; +/** + * A subtraction operation, either `x - y` or `x -= y`. + */ +class SubOperation extends BinaryOperation, @sub_operation { } -private class AddNullCoalescingExpr extends NullCoalescingOperationImpl instanceof NullCoalescingExpr -{ } +/** + * A multiplication operation, either `x * y` or `x *= y`. + */ +class MulOperation extends BinaryOperation, @mul_operation { } -private class AddAssignCoalesceExpr extends NullCoalescingOperationImpl instanceof AssignCoalesceExpr -{ } +/** + * A division operation, either `x / y` or `x /= y`. + */ +class DivOperation extends BinaryOperation, @div_operation { + /** Gets the numerator of this division operation. */ + Expr getNumerator() { result = this.getLeftOperand() } -/** A binary operations that involves an addition operation. */ -abstract private class AddOperationImpl extends BinaryOperation { } - -final class AddOperation = AddOperationImpl; - -private class AddAddExpr extends AddOperationImpl instanceof AddExpr { } - -private class AddAssignExpr extends AddOperationImpl instanceof AssignAddExpr { } - -/** A binary operation that involves a subtraction operation. */ -abstract private class SubOperationImpl extends BinaryOperation { } - -final class SubOperation = SubOperationImpl; - -private class AddSubExpr extends SubOperationImpl instanceof SubExpr { } - -private class AddSubAssignExpr extends SubOperationImpl instanceof AssignSubExpr { } - -/** A binary operation that involves a multiplication operation. */ -abstract private class MulOperationImpl extends BinaryOperation { } - -final class MulOperation = MulOperationImpl; - -private class AddMulExpr extends MulOperationImpl instanceof MulExpr { } - -private class AddMulAssignExpr extends MulOperationImpl instanceof AssignMulExpr { } - -/** A binary operation that involves a division operation. */ -abstract private class DivOperationImpl extends BinaryOperation { /** Gets the denominator of this division operation. */ Expr getDenominator() { result = this.getRightOperand() } } -final class DivOperation = DivOperationImpl; +/** + * A remainder operation, either `x % y` or `x %= y`. + */ +class RemOperation extends BinaryOperation, @rem_operation { } -private class AddDivExpr extends DivOperationImpl instanceof DivExpr { } +/** + * A bitwise-and operation, either `x & y` or `x &= y`. + */ +class BitwiseAndOperation extends BinaryOperation, @and_operation { } -private class AddDivAssignExpr extends DivOperationImpl instanceof AssignDivExpr { } +/** + * A bitwise-or operation, either `x | y` or `x |= y`. + */ +class BitwiseOrOperation extends BinaryOperation, @or_operation { } -/** A binary operation that involves a remainder operation. */ -abstract private class RemOperationImpl extends BinaryOperation { } +/** + * A bitwise exclusive-or operation, either `x ^ y` or `x ^= y`. + */ +class BitwiseXorOperation extends BinaryOperation, @xor_operation { } -final class RemOperation = RemOperationImpl; +/** + * A left-shift operation, either `x << y` or `x <<= y`. + */ +class LeftShiftOperation extends BinaryOperation, @lshift_operation { } -private class AddRemExpr extends RemOperationImpl instanceof RemExpr { } +/** + * A right-shift operation, either `x >> y` or `x >>= y`. + */ +class RightShiftOperation extends BinaryOperation, @rshift_operation { } -private class AddRemAssignExpr extends RemOperationImpl instanceof AssignRemExpr { } +/** + * An unsigned right-shift operation, either `x >>> y` or `x >>>= y`. + */ +class UnsignedRightShiftOperation extends BinaryOperation, @urshift_operation { } -/** A binary operation that involves a bitwise AND operation. */ -abstract private class BitwiseAndOperationImpl extends BinaryOperation { } - -final class BitwiseAndOperation = BitwiseAndOperationImpl; - -private class AddBitwiseAndExpr extends BitwiseAndOperationImpl instanceof BitwiseAndExpr { } - -private class AddAssignBitwiseAndExpr extends BitwiseAndOperationImpl instanceof AssignAndExpr { } - -/** A binary operation that involves a bitwise OR operation. */ -abstract private class BitwiseOrOperationImpl extends BinaryOperation { } - -final class BitwiseOrOperation = BitwiseOrOperationImpl; - -private class AddBitwiseOrExpr extends BitwiseOrOperationImpl instanceof BitwiseOrExpr { } - -private class AddAssignBitwiseOrExpr extends BitwiseOrOperationImpl instanceof AssignOrExpr { } - -/** A binary operation that involves a bitwise XOR operation. */ -abstract private class BitwiseXorOperationImpl extends BinaryOperation { } - -final class BitwiseXorOperation = BitwiseXorOperationImpl; - -private class AddBitwiseXorExpr extends BitwiseXorOperationImpl instanceof BitwiseXorExpr { } - -private class AddAssignBitwiseXorExpr extends BitwiseXorOperationImpl instanceof AssignXorExpr { } - -/** A binary operation that involves a left shift operation. */ -abstract private class LeftShiftOperationImpl extends BinaryOperation { } - -final class LeftShiftOperation = LeftShiftOperationImpl; - -private class AddLeftShiftExpr extends LeftShiftOperationImpl instanceof LeftShiftExpr { } - -private class AddAssignLeftShiftExpr extends LeftShiftOperationImpl instanceof AssignLeftShiftExpr { -} - -/** A binary operation that involves a right shift operation. */ -abstract private class RightShiftOperationImpl extends BinaryOperation { } - -final class RightShiftOperation = RightShiftOperationImpl; - -private class AddRightShiftExpr extends RightShiftOperationImpl instanceof RightShiftExpr { } - -private class AddAssignRightShiftExpr extends RightShiftOperationImpl instanceof AssignRightShiftExpr -{ } - -/** A binary operation that involves a unsigned right shift operation. */ -abstract private class UnsignedRightShiftOperationImpl extends BinaryOperation { } - -final class UnsignedRightShiftOperation = UnsignedRightShiftOperationImpl; - -private class AddUnsignedRightShiftExpr extends UnsignedRightShiftOperationImpl instanceof UnsignedRightShiftExpr -{ } - -private class AddAssignUnsignedRightShiftExpr extends UnsignedRightShiftOperationImpl instanceof AssignUnsignedRightShiftExpr -{ } +/** + * A null-coalescing operation, either `x ?? y` or `x ??= y`. + */ +class NullCoalescingOperation extends BinaryOperation, @null_coalescing_operation { } From a900fe8657990b9a9104d183b846298a354665b3 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 23 Mar 2026 14:55:24 +0100 Subject: [PATCH 34/81] C#: Adress review comments. --- csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll | 10 +++++++--- csharp/ql/lib/semmle/code/csharp/exprs/Call.qll | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll index e751bddc670..467149011d2 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll @@ -60,7 +60,7 @@ class AssignExpr extends Assignment, @simple_assign_expr { /** * An assignment operation. Either an arithmetic assignment operation - * (`AssignArithmeticOperation`), a bitwise assignment operation or + * (`AssignArithmeticOperation`), a bitwise assignment operation * (`AssignBitwiseOperation`), an event assignment (`AddOrRemoveEventExpr`), or * a null-coalescing assignment (`AssignCoalesceExpr`). */ @@ -81,10 +81,14 @@ class AssignOperation extends Assignment, @assign_op_expr { } /** - * An assignment operation that corresponds to an operator call, for example `x += y` corresponds to `x = x + y`. + * A compound assignment operation that implicitly invokes an operator. + * For example, `x += y` assigns the result of `x + y` to `x`. + * + * Either an arithmetic assignment operation (`AssignArithmeticOperation`) or a bitwise + * assignment operation (`AssignBitwiseOperation`). */ class AssignCallOperation extends AssignOperation, OperatorCall, @assign_op_call_expr { - override string toString() { result = "... " + this.getOperator() + " ..." } + override string toString() { result = AssignOperation.super.toString() } } /** diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll index 912cb23e06b..0d9e414a5c4 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll @@ -478,7 +478,7 @@ class ConstructorInitializer extends Call, @constructor_init_expr { } /** - * A call to a user-defined operator, for example `this + other` + * A call to an operator, for example `this + other` * on line 7 in * * ```csharp From d96e8cb70480a8fbeea2163ce5817a76a4ab04ca Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 23 Mar 2026 15:13:35 +0100 Subject: [PATCH 35/81] C#: Remove expr_parent_adjusted. --- csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll | 6 ------ 1 file changed, 6 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll index ae9ed04e018..8102b4a0288 100644 --- a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll +++ b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll @@ -118,12 +118,6 @@ private module Cached { i = 0 } - /** - * Use `expr_parent` instead. - */ - cached - deprecated predicate expr_parent_adjusted(Expr child, int i, ControlFlowElement parent) { none() } - private Expr getAChildExpr(ExprOrStmtParent parent) { result = parent.getAChildExpr() and not result = parent.(DeclarationWithGetSetAccessors).getExpressionBody() From 5aabd90eff2069fa4f2c2d4c96b1b83a55eb7e8c Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 24 Mar 2026 13:06:52 +0100 Subject: [PATCH 36/81] C++: Add direct and default initialization subclasses for `ConstructorFieldInit` --- cpp/ql/lib/semmle/code/cpp/exprs/Call.qll | 29 ++++++- .../library-tests/ctorinits/ctors.expected | 18 ++-- .../library-tests/ir/ir/PrintAST.expected | 82 +++++++++---------- 3 files changed, 77 insertions(+), 52 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Call.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Call.qll index 4ef241e3d25..66a89490dd0 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Call.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Call.qll @@ -585,12 +585,15 @@ class ConstructorDelegationInit extends ConstructorBaseInit, @ctordelegatinginit /** * An initialization of a member variable performed as part of a - * constructor's explicit initializer list or implicit actions. + * constructor's initializer list or by default initialization. + * * In the example below, member variable `b` is being initialized by - * constructor parameter `a`: + * constructor parameter `a`, and `c` is initialized by default + * initialization: * ``` * struct S { * int b; + * int c = 3; * S(int a): b(a) {} * } s(2); * ``` @@ -616,6 +619,28 @@ class ConstructorFieldInit extends ConstructorInit, @ctorfieldinit { override predicate mayBeGloballyImpure() { this.getExpr().mayBeGloballyImpure() } } +/** + * An initialization of a member variable performed as part of a + * constructor's explicit initializer list. + */ +class ConstructorDirectFieldInit extends ConstructorFieldInit { + ConstructorDirectFieldInit() { exists(this.getChild(0)) } + + override string getAPrimaryQlClass() { result = "ConstructorDirectFieldInit" } +} + +/** + * An initialization of a member variable performed by default + * initialization. + */ +class ConstructorDefaultFieldInit extends ConstructorFieldInit { + ConstructorDefaultFieldInit() { + not exists(this.getChild(0)) and exists(this.getTarget().getInitializer()) + } + + override string getAPrimaryQlClass() { result = "ConstructorDefaultFieldInit" } +} + /** * A call to a destructor of a base class or field as part of a destructor's * compiler-generated actions. diff --git a/cpp/ql/test/library-tests/ctorinits/ctors.expected b/cpp/ql/test/library-tests/ctorinits/ctors.expected index 8a14ee6001a..e8eba338560 100644 --- a/cpp/ql/test/library-tests/ctorinits/ctors.expected +++ b/cpp/ql/test/library-tests/ctorinits/ctors.expected @@ -1,17 +1,17 @@ -| ctorinits.cpp:5:3:5:10 | NoisyInt | 0 | ConstructorFieldInit | ctorinits.cpp:5:29:5:42 | constructor init of field m_value | 1 | 0 | -| ctorinits.cpp:13:3:13:11 | NoisyPair | 0 | ConstructorFieldInit | ctorinits.cpp:14:7:14:16 | constructor init of field m_fst | 1 | 0 | -| ctorinits.cpp:13:3:13:11 | NoisyPair | 1 | ConstructorFieldInit | ctorinits.cpp:15:7:15:16 | constructor init of field m_snd | 1 | 0 | +| ctorinits.cpp:5:3:5:10 | NoisyInt | 0 | ConstructorDirectFieldInit | ctorinits.cpp:5:29:5:42 | constructor init of field m_value | 1 | 0 | +| ctorinits.cpp:13:3:13:11 | NoisyPair | 0 | ConstructorDirectFieldInit | ctorinits.cpp:14:7:14:16 | constructor init of field m_fst | 1 | 0 | +| ctorinits.cpp:13:3:13:11 | NoisyPair | 1 | ConstructorDirectFieldInit | ctorinits.cpp:15:7:15:16 | constructor init of field m_snd | 1 | 0 | | ctorinits.cpp:16:3:16:11 | NoisyPair | 0 | ConstructorDelegationInit | ctorinits.cpp:16:17:16:31 | call to NoisyPair | 2 | 2 | | ctorinits.cpp:21:8:21:8 | NoisyTriple | 0 | ConstructorDirectInit | ctorinits.cpp:21:8:21:8 | call to NoisyPair | 0 | 0 | -| ctorinits.cpp:21:8:21:8 | NoisyTriple | 1 | ConstructorFieldInit | ctorinits.cpp:21:8:21:8 | constructor init of field m_third | 1 | 0 | -| ctorinits.cpp:28:2:28:9 | ArrayInt | 0 | ConstructorFieldInit | ctorinits.cpp:28:13:28:13 | constructor init of field m_array | 1 | 0 | -| ctorinits.cpp:42:2:42:16 | ArrayMemberInit | 0 | ConstructorFieldInit | ctorinits.cpp:42:22:42:32 | constructor init of field xs | 1 | 4 | +| ctorinits.cpp:21:8:21:8 | NoisyTriple | 1 | ConstructorDirectFieldInit | ctorinits.cpp:21:8:21:8 | constructor init of field m_third | 1 | 0 | +| ctorinits.cpp:28:2:28:9 | ArrayInt | 0 | ConstructorDirectFieldInit | ctorinits.cpp:28:13:28:13 | constructor init of field m_array | 1 | 0 | +| ctorinits.cpp:42:2:42:16 | ArrayMemberInit | 0 | ConstructorDirectFieldInit | ctorinits.cpp:42:22:42:32 | constructor init of field xs | 1 | 4 | | ctorinits.cpp:65:3:65:15 | MultipleBases | 0 | ConstructorDirectInit | ctorinits.cpp:69:5:69:8 | call to A | 1 | 1 | | ctorinits.cpp:65:3:65:15 | MultipleBases | 1 | ConstructorDirectInit | ctorinits.cpp:67:5:67:8 | call to B | 1 | 1 | | ctorinits.cpp:65:3:65:15 | MultipleBases | 2 | ConstructorDirectInit | ctorinits.cpp:70:5:70:8 | call to C | 1 | 1 | -| ctorinits.cpp:65:3:65:15 | MultipleBases | 3 | ConstructorFieldInit | ctorinits.cpp:68:5:68:8 | constructor init of field x | 1 | 1 | -| ctorinits.cpp:65:3:65:15 | MultipleBases | 4 | ConstructorFieldInit | ctorinits.cpp:71:5:71:8 | constructor init of field y | 1 | 1 | -| ctorinits.cpp:65:3:65:15 | MultipleBases | 5 | ConstructorFieldInit | ctorinits.cpp:66:5:66:8 | constructor init of field z | 1 | 1 | +| ctorinits.cpp:65:3:65:15 | MultipleBases | 3 | ConstructorDirectFieldInit | ctorinits.cpp:68:5:68:8 | constructor init of field x | 1 | 1 | +| ctorinits.cpp:65:3:65:15 | MultipleBases | 4 | ConstructorDirectFieldInit | ctorinits.cpp:71:5:71:8 | constructor init of field y | 1 | 1 | +| ctorinits.cpp:65:3:65:15 | MultipleBases | 5 | ConstructorDirectFieldInit | ctorinits.cpp:66:5:66:8 | constructor init of field z | 1 | 1 | | ctorinits.cpp:81:8:81:8 | VD | 0 | ConstructorVirtualInit | ctorinits.cpp:81:8:81:8 | call to VB | 0 | 0 | | ctorinits.cpp:85:3:85:22 | VirtualAndNonVirtual | 0 | ConstructorVirtualInit | ctorinits.cpp:85:26:85:26 | call to VB | 0 | 0 | | ctorinits.cpp:85:3:85:22 | VirtualAndNonVirtual | 1 | ConstructorDirectInit | ctorinits.cpp:85:26:85:26 | call to VD | 0 | 0 | diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 45666a3b50b..ec5db0c8400 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -277,7 +277,7 @@ bad_asts.cpp: #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const Point & # 19| : -# 19| getInitializer(0): [ConstructorFieldInit] constructor init of field x +# 19| getInitializer(0): [ConstructorDirectFieldInit] constructor init of field x # 19| Type = [IntType] int # 19| ValueCategory = prvalue # 19| getExpr(): [ReferenceFieldAccess] x @@ -289,7 +289,7 @@ bad_asts.cpp: # 19| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 19| Type = [SpecifiedType] const Point # 19| ValueCategory = lvalue -# 19| getInitializer(1): [ConstructorFieldInit] constructor init of field y +# 19| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field y # 19| Type = [IntType] int # 19| ValueCategory = prvalue # 19| getExpr(): [ReferenceFieldAccess] y @@ -8986,20 +8986,20 @@ ir.cpp: # 658| [Constructor] void C::C() # 658| : # 658| : -# 659| getInitializer(0): [ConstructorFieldInit] constructor init of field m_a +# 659| getInitializer(0): [ConstructorDirectFieldInit] constructor init of field m_a # 659| Type = [IntType] int # 659| ValueCategory = prvalue # 659| getExpr(): [Literal] 1 # 659| Type = [IntType] int # 659| Value = [Literal] 1 # 659| ValueCategory = prvalue -# 663| getInitializer(1): [ConstructorFieldInit] constructor init of field m_b +# 663| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field m_b # 663| Type = [Struct] String # 663| ValueCategory = prvalue # 663| getExpr(): [ConstructorCall] call to String # 663| Type = [VoidType] void # 663| ValueCategory = prvalue -# 660| getInitializer(2): [ConstructorFieldInit] constructor init of field m_c +# 660| getInitializer(2): [ConstructorDirectFieldInit] constructor init of field m_c # 660| Type = [PlainCharType] char # 660| ValueCategory = prvalue # 660| getExpr(): [Literal] 3 @@ -9011,14 +9011,14 @@ ir.cpp: # 660| Type = [PlainCharType] char # 660| Value = [CStyleCast] 3 # 660| ValueCategory = prvalue -# 661| getInitializer(3): [ConstructorFieldInit] constructor init of field m_e +# 661| getInitializer(3): [ConstructorDirectFieldInit] constructor init of field m_e # 661| Type = [VoidPointerType] void * # 661| ValueCategory = prvalue # 661| getExpr(): [Literal] 0 # 661| Type = [VoidPointerType] void * # 661| Value = [Literal] 0 # 661| ValueCategory = prvalue -# 662| getInitializer(4): [ConstructorFieldInit] constructor init of field m_f +# 662| getInitializer(4): [ConstructorDirectFieldInit] constructor init of field m_f # 662| Type = [Struct] String # 662| ValueCategory = prvalue # 662| getExpr(): [ConstructorCall] call to String @@ -9474,7 +9474,7 @@ ir.cpp: #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const Base & # 745| : -# 745| getInitializer(0): [ConstructorFieldInit] constructor init of field base_s +# 745| getInitializer(0): [ConstructorDirectFieldInit] constructor init of field base_s # 745| Type = [Struct] String # 745| ValueCategory = prvalue # 745| getExpr(): [ConstructorCall] call to String @@ -9485,7 +9485,7 @@ ir.cpp: # 748| [Constructor] void Base::Base() # 748| : # 748| : -# 748| getInitializer(0): [ConstructorFieldInit] constructor init of field base_s +# 748| getInitializer(0): [ConstructorDirectFieldInit] constructor init of field base_s # 748| Type = [Struct] String # 748| ValueCategory = prvalue # 748| getExpr(): [ConstructorCall] call to String @@ -9593,7 +9593,7 @@ ir.cpp: # 757| getInitializer(0): [ConstructorDirectInit] call to Base # 757| Type = [VoidType] void # 757| ValueCategory = prvalue -# 757| getInitializer(1): [ConstructorFieldInit] constructor init of field middle_s +# 757| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field middle_s # 757| Type = [Struct] String # 757| ValueCategory = prvalue # 757| getExpr(): [ConstructorCall] call to String @@ -9704,7 +9704,7 @@ ir.cpp: # 766| getInitializer(0): [ConstructorDirectInit] call to Middle # 766| Type = [VoidType] void # 766| ValueCategory = prvalue -# 766| getInitializer(1): [ConstructorFieldInit] constructor init of field derived_s +# 766| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field derived_s # 766| Type = [Struct] String # 766| ValueCategory = prvalue # 766| getExpr(): [ConstructorCall] call to String @@ -9743,7 +9743,7 @@ ir.cpp: # 775| getInitializer(0): [ConstructorVirtualInit] call to Base # 775| Type = [VoidType] void # 775| ValueCategory = prvalue -# 775| getInitializer(1): [ConstructorFieldInit] constructor init of field middlevb1_s +# 775| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field middlevb1_s # 775| Type = [Struct] String # 775| ValueCategory = prvalue # 775| getExpr(): [ConstructorCall] call to String @@ -9782,7 +9782,7 @@ ir.cpp: # 784| getInitializer(0): [ConstructorVirtualInit] call to Base # 784| Type = [VoidType] void # 784| ValueCategory = prvalue -# 784| getInitializer(1): [ConstructorFieldInit] constructor init of field middlevb2_s +# 784| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field middlevb2_s # 784| Type = [Struct] String # 784| ValueCategory = prvalue # 784| getExpr(): [ConstructorCall] call to String @@ -9827,7 +9827,7 @@ ir.cpp: # 793| getInitializer(2): [ConstructorDirectInit] call to MiddleVB2 # 793| Type = [VoidType] void # 793| ValueCategory = prvalue -# 793| getInitializer(3): [ConstructorFieldInit] constructor init of field derivedvb_s +# 793| getInitializer(3): [ConstructorDirectFieldInit] constructor init of field derivedvb_s # 793| Type = [Struct] String # 793| ValueCategory = prvalue # 793| getExpr(): [ConstructorCall] call to String @@ -15190,7 +15190,7 @@ ir.cpp: # 1508| getInitializer(0): [ConstructorInit] constructor init # 1508| Type = [Struct] Inheritance_Test_B # 1508| ValueCategory = prvalue -# 1508| getInitializer(1): [ConstructorFieldInit] constructor init of field x +# 1508| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field x # 1508| Type = [IntType] int # 1508| ValueCategory = prvalue # 1508| getExpr(): [Literal] 42 @@ -15414,7 +15414,7 @@ ir.cpp: # 1533| [Constructor] void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct() # 1533| : # 1533| : -# 1533| getInitializer(0): [ConstructorFieldInit] constructor init of field x +# 1533| getInitializer(0): [ConstructorDefaultFieldInit] constructor init of field x # 1533| Type = [IntType] int # 1533| ValueCategory = prvalue # 1533| getEntryPoint(): [BlockStmt] { ... } @@ -15434,25 +15434,25 @@ ir.cpp: # 1537| [Constructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() # 1537| : # 1537| : -# 1537| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1537| getInitializer(0): [ConstructorDefaultFieldInit] constructor init of field i # 1537| Type = [IntType] int # 1537| ValueCategory = prvalue -# 1537| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1537| getInitializer(1): [ConstructorDefaultFieldInit] constructor init of field d # 1537| Type = [DoubleType] double # 1537| ValueCategory = prvalue -# 1537| getInitializer(2): [ConstructorFieldInit] constructor init of field r +# 1537| getInitializer(2): [ConstructorDefaultFieldInit] constructor init of field r # 1537| Type = [LValueReferenceType] int & # 1537| ValueCategory = prvalue -# 1537| getInitializer(3): [ConstructorFieldInit] constructor init of field p +# 1537| getInitializer(3): [ConstructorDefaultFieldInit] constructor init of field p # 1537| Type = [IntPointerType] int * # 1537| ValueCategory = prvalue -# 1537| getInitializer(4): [ConstructorFieldInit] constructor init of field xs +# 1537| getInitializer(4): [ConstructorDefaultFieldInit] constructor init of field xs # 1537| Type = [CTypedefType,NestedTypedefType] ArrayType # 1537| ValueCategory = prvalue -# 1537| getInitializer(5): [ConstructorFieldInit] constructor init of field r_alt +# 1537| getInitializer(5): [ConstructorDefaultFieldInit] constructor init of field r_alt # 1537| Type = [CTypedefType,NestedTypedefType] RefType # 1537| ValueCategory = prvalue -# 1537| getInitializer(6): [ConstructorFieldInit] constructor init of field m +# 1537| getInitializer(6): [ConstructorDirectFieldInit] constructor init of field m # 1537| Type = [Struct] StructuredBindingDataMemberMemberStruct # 1537| ValueCategory = prvalue # 1537| getExpr(): [ConstructorCall] call to StructuredBindingDataMemberMemberStruct @@ -15465,7 +15465,7 @@ ir.cpp: #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & # 1537| : -# 1537| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1537| getInitializer(0): [ConstructorDirectFieldInit] constructor init of field i # 1537| Type = [IntType] int # 1537| ValueCategory = prvalue # 1537| getExpr(): [ReferenceFieldAccess] i @@ -15477,7 +15477,7 @@ ir.cpp: # 1537| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1537| Type = [SpecifiedType] const StructuredBindingDataMemberStruct # 1537| ValueCategory = lvalue -# 1537| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1537| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field d # 1537| Type = [DoubleType] double # 1537| ValueCategory = prvalue # 1537| getExpr(): [ReferenceFieldAccess] d @@ -15489,7 +15489,7 @@ ir.cpp: # 1537| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1537| Type = [SpecifiedType] const StructuredBindingDataMemberStruct # 1537| ValueCategory = lvalue -# 1537| getInitializer(2): [ConstructorFieldInit] constructor init of field b +# 1537| getInitializer(2): [ConstructorDirectFieldInit] constructor init of field b # 1537| Type = [IntType] unsigned int # 1537| ValueCategory = prvalue # 1537| getExpr(): [ReferenceFieldAccess] b @@ -15501,7 +15501,7 @@ ir.cpp: # 1537| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1537| Type = [SpecifiedType] const StructuredBindingDataMemberStruct # 1537| ValueCategory = lvalue -# 1537| getInitializer(3): [ConstructorFieldInit] constructor init of field r +# 1537| getInitializer(3): [ConstructorDirectFieldInit] constructor init of field r # 1537| Type = [LValueReferenceType] int & # 1537| ValueCategory = prvalue # 1537| getExpr(): [ReferenceFieldAccess] r @@ -15513,7 +15513,7 @@ ir.cpp: # 1537| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1537| Type = [SpecifiedType] const StructuredBindingDataMemberStruct # 1537| ValueCategory = lvalue -# 1537| getInitializer(4): [ConstructorFieldInit] constructor init of field p +# 1537| getInitializer(4): [ConstructorDirectFieldInit] constructor init of field p # 1537| Type = [IntPointerType] int * # 1537| ValueCategory = prvalue # 1537| getExpr(): [ReferenceFieldAccess] p @@ -15525,7 +15525,7 @@ ir.cpp: # 1537| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1537| Type = [SpecifiedType] const StructuredBindingDataMemberStruct # 1537| ValueCategory = lvalue -# 1537| getInitializer(5): [ConstructorFieldInit] constructor init of field xs +# 1537| getInitializer(5): [ConstructorDirectFieldInit] constructor init of field xs # 1537| Type = [CTypedefType,NestedTypedefType] ArrayType # 1537| ValueCategory = prvalue # 1537| getExpr(): [ReferenceFieldAccess] xs @@ -15537,7 +15537,7 @@ ir.cpp: # 1537| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1537| Type = [SpecifiedType] const StructuredBindingDataMemberStruct # 1537| ValueCategory = lvalue -# 1537| getInitializer(6): [ConstructorFieldInit] constructor init of field r_alt +# 1537| getInitializer(6): [ConstructorDirectFieldInit] constructor init of field r_alt # 1537| Type = [CTypedefType,NestedTypedefType] RefType # 1537| ValueCategory = prvalue # 1537| getExpr(): [ReferenceFieldAccess] r_alt @@ -15549,7 +15549,7 @@ ir.cpp: # 1537| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1537| Type = [SpecifiedType] const StructuredBindingDataMemberStruct # 1537| ValueCategory = lvalue -# 1537| getInitializer(7): [ConstructorFieldInit] constructor init of field m +# 1537| getInitializer(7): [ConstructorDirectFieldInit] constructor init of field m # 1537| Type = [Struct] StructuredBindingDataMemberMemberStruct # 1537| ValueCategory = prvalue # 1537| getExpr(): [ReferenceFieldAccess] m @@ -15918,13 +15918,13 @@ ir.cpp: # 1590| [Constructor] void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet() # 1590| : # 1590| : -# 1590| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1590| getInitializer(0): [ConstructorDefaultFieldInit] constructor init of field i # 1590| Type = [IntType] int # 1590| ValueCategory = prvalue -# 1590| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1590| getInitializer(1): [ConstructorDefaultFieldInit] constructor init of field d # 1590| Type = [DoubleType] double # 1590| ValueCategory = prvalue -# 1590| getInitializer(2): [ConstructorFieldInit] constructor init of field r +# 1590| getInitializer(2): [ConstructorDefaultFieldInit] constructor init of field r # 1590| Type = [LValueReferenceType] int & # 1590| ValueCategory = prvalue # 1590| getEntryPoint(): [BlockStmt] { ... } @@ -15934,7 +15934,7 @@ ir.cpp: #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & # 1590| : -# 1590| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1590| getInitializer(0): [ConstructorDirectFieldInit] constructor init of field i # 1590| Type = [IntType] int # 1590| ValueCategory = prvalue # 1590| getExpr(): [ReferenceFieldAccess] i @@ -15946,7 +15946,7 @@ ir.cpp: # 1590| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1590| Type = [SpecifiedType] const StructuredBindingTupleRefGet # 1590| ValueCategory = lvalue -# 1590| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1590| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field d # 1590| Type = [DoubleType] double # 1590| ValueCategory = prvalue # 1590| getExpr(): [ReferenceFieldAccess] d @@ -15958,7 +15958,7 @@ ir.cpp: # 1590| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1590| Type = [SpecifiedType] const StructuredBindingTupleRefGet # 1590| ValueCategory = lvalue -# 1590| getInitializer(2): [ConstructorFieldInit] constructor init of field r +# 1590| getInitializer(2): [ConstructorDirectFieldInit] constructor init of field r # 1590| Type = [LValueReferenceType] int & # 1590| ValueCategory = prvalue # 1590| getExpr(): [ReferenceFieldAccess] r @@ -16327,10 +16327,10 @@ ir.cpp: # 1657| [Constructor] void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet() # 1657| : # 1657| : -# 1657| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1657| getInitializer(0): [ConstructorDefaultFieldInit] constructor init of field i # 1657| Type = [IntType] int # 1657| ValueCategory = prvalue -# 1657| getInitializer(1): [ConstructorFieldInit] constructor init of field r +# 1657| getInitializer(1): [ConstructorDefaultFieldInit] constructor init of field r # 1657| Type = [LValueReferenceType] int & # 1657| ValueCategory = prvalue # 1657| getEntryPoint(): [BlockStmt] { ... } @@ -19817,7 +19817,7 @@ ir.cpp: #-----| getParameter(0): [Parameter] (unnamed parameter 0) #-----| Type = [LValueReferenceType] const ClassWithDestructor & # 2188| : -# 2188| getInitializer(0): [ConstructorFieldInit] constructor init of field x +# 2188| getInitializer(0): [ConstructorDirectFieldInit] constructor init of field x # 2188| Type = [CharPointerType] char * # 2188| ValueCategory = prvalue # 2188| getExpr(): [ReferenceFieldAccess] x @@ -50386,7 +50386,7 @@ perf-regression.cpp: # 6| [Constructor] void Big::Big() # 6| : # 6| : -# 6| getInitializer(0): [ConstructorFieldInit] constructor init of field buffer +# 6| getInitializer(0): [ConstructorDirectFieldInit] constructor init of field buffer # 6| Type = [ArrayType] char[1073741824] # 6| ValueCategory = prvalue # 6| getExpr(): [ArrayAggregateLiteral] {...} From 07603a835a6a8b763907f25a2f19753442d156cf Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 24 Mar 2026 14:36:02 +0100 Subject: [PATCH 37/81] C++: Rename `CallOrAllocationExpr` to something more generic --- .../ir/implementation/raw/internal/SideEffects.qll | 12 ++++++------ .../raw/internal/TranslatedElement.qll | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll index 00863781257..b7b4be7f787 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll @@ -130,13 +130,13 @@ private predicate hasDefaultSideEffect(Call call, ParameterIndex i, boolean buff } /** - * A `Call` or `NewOrNewArrayExpr` or `DeleteOrDeleteArrayExpr`. + * An expression that can have call side effects. * - * All kinds of expression invoke a function as part of their evaluation. This class provides a - * way to treat both kinds of function similarly, and to get the invoked `Function`. + * All kinds of expressions invoke a function as part of their evaluation. This class provides a + * way to treat those functions similarly, and to get the invoked `Function`. */ -class CallOrAllocationExpr extends Expr { - CallOrAllocationExpr() { +class ExprWithCallSizeEffects extends Expr { + ExprWithCallSizeEffects() { this instanceof Call or this instanceof NewOrNewArrayExpr @@ -158,7 +158,7 @@ class CallOrAllocationExpr extends Expr { * Returns the side effect opcode, if any, that represents any side effects not specifically modeled * by an argument side effect. */ -Opcode getCallSideEffectOpcode(CallOrAllocationExpr expr) { +Opcode getCallSideEffectOpcode(ExprWithCallSizeEffects expr) { not exists(expr.getTarget().(SideEffectFunction)) and result instanceof Opcode::CallSideEffect or exists(SideEffectFunction sideEffectFunction | 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 9829388ef17..93d7e9b02cf 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 @@ -871,7 +871,7 @@ newtype TTranslatedElement = // The declaration/initialization part of a `ConditionDeclExpr` TTranslatedConditionDecl(ConditionDeclExpr expr) { not ignoreExpr(expr) } or // The side effects of a `Call` - TTranslatedCallSideEffects(CallOrAllocationExpr expr) { + TTranslatedCallSideEffects(ExprWithCallSizeEffects expr) { not ignoreExpr(expr) and not ignoreSideEffects(expr) } or From 59c27a2196873064d37bd56d8ea9bbbc3307c2ef Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 27 Feb 2026 14:38:46 +0100 Subject: [PATCH 38/81] C++: Add NSDMI tests --- .../library-tests/ir/ir/PrintAST.expected | 91 +++++++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 60 ++++++++++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 15 +++ .../ir/ir/raw_consistency.expected | 3 + .../test/library-tests/ir/ir/raw_ir.expected | 87 ++++++++++++++++++ 5 files changed, 256 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index ec5db0c8400..c9c1334a391 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -25642,6 +25642,97 @@ ir.cpp: # 2884| Type = [VoidType] void # 2884| ValueCategory = prvalue # 2886| getStmt(6): [ReturnStmt] return ... +# 2889| [CopyAssignmentOperator] StructInit& StructInit::operator=(StructInit const&) +# 2889| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructInit & +# 2889| [MoveAssignmentOperator] StructInit& StructInit::operator=(StructInit&&) +# 2889| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructInit && +# 2889| [CopyConstructor] void StructInit::StructInit(StructInit const&) +# 2889| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructInit & +# 2889| [MoveConstructor] void StructInit::StructInit(StructInit&&) +# 2889| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructInit && +# 2897| [Constructor] void StructInit::StructInit(int) +# 2897| : +# 2897| getParameter(0): [Parameter] j +# 2897| Type = [IntType] int +# 2897| : +# 2897| getInitializer(0): [ConstructorDefaultFieldInit] constructor init of field i +# 2897| Type = [IntType] int +# 2897| ValueCategory = prvalue +# 2897| getInitializer(1): [ConstructorDirectFieldInit] constructor init of field j +# 2897| Type = [IntType] int +# 2897| ValueCategory = prvalue +# 2897| getExpr(): [VariableAccess] j +# 2897| Type = [IntType] int +# 2897| ValueCategory = prvalue(load) +# 2897| getInitializer(2): [ConstructorDefaultFieldInit] constructor init of field k +# 2897| Type = [IntType] int +# 2897| ValueCategory = prvalue +# 2897| getInitializer(3): [ConstructorDefaultFieldInit] constructor init of field l +# 2897| Type = [IntType] int +# 2897| ValueCategory = prvalue +# 2897| getInitializer(4): [ConstructorDefaultFieldInit] constructor init of field m +# 2897| Type = [IntType] int +# 2897| ValueCategory = prvalue +# 2897| getInitializer(5): [ConstructorDirectFieldInit] constructor init of field n +# 2897| Type = [IntType] int +# 2897| ValueCategory = prvalue +# 2897| getExpr(): [FunctionCall] call to get_val +# 2897| Type = [IntType] int +# 2897| ValueCategory = prvalue +# 2897| getQualifier(): [ThisExpr] this +# 2897| Type = [PointerType] StructInit * +# 2897| ValueCategory = prvalue(load) +# 2897| getEntryPoint(): [BlockStmt] { ... } +# 2897| getStmt(0): [ReturnStmt] return ... +# 2899| [Constructor] void StructInit::StructInit() +# 2899| : +# 2899| : +# 2899| getInitializer(0): [ConstructorDirectFieldInit] constructor init of field i +# 2899| Type = [IntType] int +# 2899| ValueCategory = prvalue +# 2899| getExpr(): [Literal] 41 +# 2899| Type = [IntType] int +# 2899| Value = [Literal] 41 +# 2899| ValueCategory = prvalue +# 2899| getInitializer(1): [ConstructorDefaultFieldInit] constructor init of field j +# 2899| Type = [IntType] int +# 2899| ValueCategory = prvalue +# 2899| getInitializer(2): [ConstructorDirectFieldInit] constructor init of field k +# 2899| Type = [IntType] int +# 2899| ValueCategory = prvalue +# 2899| getExpr(): [Literal] 41 +# 2899| Type = [IntType] int +# 2899| Value = [Literal] 41 +# 2899| ValueCategory = prvalue +# 2899| getInitializer(3): [ConstructorDefaultFieldInit] constructor init of field l +# 2899| Type = [IntType] int +# 2899| ValueCategory = prvalue +# 2899| getInitializer(4): [ConstructorDefaultFieldInit] constructor init of field m +# 2899| Type = [IntType] int +# 2899| ValueCategory = prvalue +# 2899| getInitializer(5): [ConstructorDefaultFieldInit] constructor init of field n +# 2899| Type = [IntType] int +# 2899| ValueCategory = prvalue +# 2899| getEntryPoint(): [BlockStmt] { ... } +# 2899| getStmt(0): [ReturnStmt] return ... +# 2901| [MemberFunction] int StructInit::get_val() +# 2901| : +# 2901| getEntryPoint(): [BlockStmt] { ... } +# 2901| getStmt(0): [ReturnStmt] return ... +# 2901| getExpr(): [ImplicitThisFieldAccess,PointerFieldAccess] k +# 2901| Type = [IntType] int +# 2901| ValueCategory = prvalue(load) +# 2901| getQualifier(): [ThisExpr] this +# 2901| Type = [PointerType] StructInit * +# 2901| ValueCategory = prvalue(load) ir23.cpp: # 1| [TopLevelFunction] bool consteval_1() # 1| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 369cc9495a2..5d2b92aed73 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -21066,6 +21066,66 @@ ir.cpp: # 2867| v2867_14(void) = ReturnVoid : #-----| Goto -> Block 1 +# 2897| void StructInit::StructInit(int) +# 2897| Block 0 +# 2897| v2897_1(void) = EnterFunction : +# 2897| m2897_2(unknown) = AliasedDefinition : +# 2897| m2897_3(unknown) = InitializeNonLocal : +# 2897| m2897_4(unknown) = Chi : total:m2897_2, partial:m2897_3 +# 2897| r2897_5(glval) = VariableAddress[#this] : +# 2897| m2897_6(glval) = InitializeParameter[#this] : &:r2897_5 +# 2897| r2897_7(glval) = Load[#this] : &:r2897_5, m2897_6 +# 2897| m2897_8(StructInit) = InitializeIndirection[#this] : &:r2897_7 +# 2897| r2897_9(glval) = VariableAddress[j] : +# 2897| m2897_10(int) = InitializeParameter[j] : &:r2897_9 +# 2897| v2897_11(void) = NoOp : +# 2897| v2897_12(void) = ReturnIndirection[#this] : &:r2897_7, m2897_8 +# 2897| v2897_13(void) = ReturnVoid : +# 2897| v2897_14(void) = AliasedUse : m2897_3 +# 2897| v2897_15(void) = ExitFunction : + +# 2899| void StructInit::StructInit() +# 2899| Block 0 +# 2899| v2899_1(void) = EnterFunction : +# 2899| m2899_2(unknown) = AliasedDefinition : +# 2899| m2899_3(unknown) = InitializeNonLocal : +# 2899| m2899_4(unknown) = Chi : total:m2899_2, partial:m2899_3 +# 2899| r2899_5(glval) = VariableAddress[#this] : +# 2899| m2899_6(glval) = InitializeParameter[#this] : &:r2899_5 +# 2899| r2899_7(glval) = Load[#this] : &:r2899_5, m2899_6 +# 2899| m2899_8(StructInit) = InitializeIndirection[#this] : &:r2899_7 +# 2899| r2899_9(glval) = FieldAddress[i] : r2899_7 +# 2899| r2899_10(int) = Constant[41] : +# 2899| m2899_11(int) = Store[?] : &:r2899_9, r2899_10 +# 2899| m2899_12(unknown) = Chi : total:m2899_8, partial:m2899_11 +# 2899| v2899_13(void) = NoOp : +# 2899| v2899_14(void) = ReturnIndirection[#this] : &:r2899_7, m2899_12 +# 2899| v2899_15(void) = ReturnVoid : +# 2899| v2899_16(void) = AliasedUse : m2899_3 +# 2899| v2899_17(void) = ExitFunction : + +# 2901| int StructInit::get_val() +# 2901| Block 0 +# 2901| v2901_1(void) = EnterFunction : +# 2901| m2901_2(unknown) = AliasedDefinition : +# 2901| m2901_3(unknown) = InitializeNonLocal : +# 2901| m2901_4(unknown) = Chi : total:m2901_2, partial:m2901_3 +# 2901| r2901_5(glval) = VariableAddress[#this] : +# 2901| m2901_6(glval) = InitializeParameter[#this] : &:r2901_5 +# 2901| r2901_7(glval) = Load[#this] : &:r2901_5, m2901_6 +# 2901| m2901_8(StructInit) = InitializeIndirection[#this] : &:r2901_7 +# 2901| r2901_9(glval) = VariableAddress[#return] : +# 2901| r2901_10(glval) = VariableAddress[#this] : +# 2901| r2901_11(StructInit *) = Load[#this] : &:r2901_10, m2901_6 +# 2901| r2901_12(glval) = FieldAddress[k] : r2901_11 +# 2901| r2901_13(int) = Load[?] : &:r2901_12, ~m2901_8 +# 2901| m2901_14(int) = Store[#return] : &:r2901_9, r2901_13 +# 2901| v2901_15(void) = ReturnIndirection[#this] : &:r2901_7, m2901_8 +# 2901| r2901_16(glval) = VariableAddress[#return] : +# 2901| v2901_17(void) = ReturnValue : &:r2901_16, m2901_14 +# 2901| v2901_18(void) = AliasedUse : m2901_3 +# 2901| v2901_19(void) = ExitFunction : + ir23.cpp: # 1| bool consteval_1() # 1| 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 41494ec00b3..ddb1b41fdbc 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2886,4 +2886,19 @@ namespace { } } +struct StructInit { + int i = 42; + int j = 42; + int k = 42; + int l = k; + int m = get_val(); + int n = 42; + + StructInit(int j) : j(j), n(get_val()) {} + + StructInit() : i(41), k(41) {} + + int get_val() { return k; } +}; + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index de43ad9631a..230d0805cd2 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -21,6 +21,9 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1537:8:1537:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1537:8:1537:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | +| ir.cpp:2897:5:2897:14 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2897:5:2897:14 | void StructInit::StructInit(int) | void StructInit::StructInit(int) | +| ir.cpp:2897:5:2897:14 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2897:5:2897:14 | void StructInit::StructInit(int) | void StructInit::StructInit(int) | +| ir.cpp:2899:5:2899:14 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2899:5:2899:14 | void StructInit::StructInit() | void StructInit::StructInit() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 03278f9aa72..8d61ec6789b 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -19200,6 +19200,93 @@ ir.cpp: # 2867| v2867_13(void) = ReturnVoid : #-----| Goto -> Block 1 +# 2897| void StructInit::StructInit(int) +# 2897| Block 0 +# 2897| v2897_1(void) = EnterFunction : +# 2897| mu2897_2(unknown) = AliasedDefinition : +# 2897| mu2897_3(unknown) = InitializeNonLocal : +# 2897| r2897_4(glval) = VariableAddress[#this] : +# 2897| mu2897_5(glval) = InitializeParameter[#this] : &:r2897_4 +# 2897| r2897_6(glval) = Load[#this] : &:r2897_4, ~m? +# 2897| mu2897_7(StructInit) = InitializeIndirection[#this] : &:r2897_6 +# 2897| r2897_8(glval) = VariableAddress[j] : +# 2897| mu2897_9(int) = InitializeParameter[j] : &:r2897_8 +#-----| Goto -> Block 3 + +# 2897| Block 1 +# 2897| r2897_10(glval) = FieldAddress[j] : r2897_6 +# 2897| r2897_11(glval) = VariableAddress[j] : +# 2897| r2897_12(int) = Load[j] : &:r2897_11, ~m? +# 2897| mu2897_13(int) = Store[?] : &:r2897_10, r2897_12 +#-----| Goto -> Block 3 + +# 2897| Block 2 +# 2897| r2897_14(glval) = FieldAddress[n] : r2897_6 +# 2897| r2897_15(glval) = VariableAddress[#this] : +# 2897| r2897_16(StructInit *) = Load[#this] : &:r2897_15, ~m? +# 2897| r2897_17(glval) = FunctionAddress[get_val] : +# 2897| r2897_18(int) = Call[get_val] : func:r2897_17, this:r2897_16 +# 2897| mu2897_19(unknown) = ^CallSideEffect : ~m? +# 2897| v2897_20(void) = ^IndirectReadSideEffect[-1] : &:r2897_16, ~m? +# 2897| mu2897_21(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_16 +# 2897| mu2897_22(int) = Store[?] : &:r2897_14, r2897_18 +#-----| Goto -> Block 3 + +# 2897| Block 3 +# 2897| v2897_23(void) = NoOp : +# 2897| v2897_24(void) = ReturnIndirection[#this] : &:r2897_6, ~m? +# 2897| v2897_25(void) = ReturnVoid : +# 2897| v2897_26(void) = AliasedUse : ~m? +# 2897| v2897_27(void) = ExitFunction : + +# 2899| void StructInit::StructInit() +# 2899| Block 0 +# 2899| v2899_1(void) = EnterFunction : +# 2899| mu2899_2(unknown) = AliasedDefinition : +# 2899| mu2899_3(unknown) = InitializeNonLocal : +# 2899| r2899_4(glval) = VariableAddress[#this] : +# 2899| mu2899_5(glval) = InitializeParameter[#this] : &:r2899_4 +# 2899| r2899_6(glval) = Load[#this] : &:r2899_4, ~m? +# 2899| mu2899_7(StructInit) = InitializeIndirection[#this] : &:r2899_6 +# 2899| r2899_8(glval) = FieldAddress[i] : r2899_6 +# 2899| r2899_9(int) = Constant[41] : +# 2899| mu2899_10(int) = Store[?] : &:r2899_8, r2899_9 +#-----| Goto -> Block 2 + +# 2899| Block 1 +# 2899| r2899_11(glval) = FieldAddress[k] : r2899_6 +# 2899| r2899_12(int) = Constant[41] : +# 2899| mu2899_13(int) = Store[?] : &:r2899_11, r2899_12 +#-----| Goto -> Block 2 + +# 2899| Block 2 +# 2899| v2899_14(void) = NoOp : +# 2899| v2899_15(void) = ReturnIndirection[#this] : &:r2899_6, ~m? +# 2899| v2899_16(void) = ReturnVoid : +# 2899| v2899_17(void) = AliasedUse : ~m? +# 2899| v2899_18(void) = ExitFunction : + +# 2901| int StructInit::get_val() +# 2901| Block 0 +# 2901| v2901_1(void) = EnterFunction : +# 2901| mu2901_2(unknown) = AliasedDefinition : +# 2901| mu2901_3(unknown) = InitializeNonLocal : +# 2901| r2901_4(glval) = VariableAddress[#this] : +# 2901| mu2901_5(glval) = InitializeParameter[#this] : &:r2901_4 +# 2901| r2901_6(glval) = Load[#this] : &:r2901_4, ~m? +# 2901| mu2901_7(StructInit) = InitializeIndirection[#this] : &:r2901_6 +# 2901| r2901_8(glval) = VariableAddress[#return] : +# 2901| r2901_9(glval) = VariableAddress[#this] : +# 2901| r2901_10(StructInit *) = Load[#this] : &:r2901_9, ~m? +# 2901| r2901_11(glval) = FieldAddress[k] : r2901_10 +# 2901| r2901_12(int) = Load[?] : &:r2901_11, ~m? +# 2901| mu2901_13(int) = Store[#return] : &:r2901_8, r2901_12 +# 2901| v2901_14(void) = ReturnIndirection[#this] : &:r2901_6, ~m? +# 2901| r2901_15(glval) = VariableAddress[#return] : +# 2901| v2901_16(void) = ReturnValue : &:r2901_15, ~m? +# 2901| v2901_17(void) = AliasedUse : ~m? +# 2901| v2901_18(void) = ExitFunction : + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 From 68039ecd687f3cf45910e8e10dbb6f61cf62a532 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 3 Mar 2026 16:33:27 +0100 Subject: [PATCH 39/81] C++: Add NSDMI dataflow test --- .../dataflow-consistency.expected | 2 ++ .../dataflow-tests/test-source-sink.expected | 2 ++ .../dataflow/dataflow-tests/test.cpp | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected index ff41f299f9c..4e145427a36 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected @@ -10,11 +10,13 @@ uniqueEnclosingCallable | test.cpp:1158:18:1158:42 | ... , ... | Node should have one enclosing callable but has 0. | | test.cpp:1158:23:1158:31 | recursion | Node should have one enclosing callable but has 0. | | test.cpp:1158:35:1158:40 | call to source | Node should have one enclosing callable but has 0. | +| test.cpp:1318:13:1318:18 | call to source | Node should have one enclosing callable but has 0. | uniqueCallEnclosingCallable | test.cpp:864:47:864:54 | call to source | Call should have one enclosing callable but has 0. | | test.cpp:872:46:872:51 | call to source | Call should have one enclosing callable but has 0. | | test.cpp:1158:18:1158:21 | call to sink | Call should have one enclosing callable but has 0. | | test.cpp:1158:35:1158:40 | call to source | Call should have one enclosing callable but has 0. | +| test.cpp:1318:13:1318:18 | call to source | Call should have one enclosing callable but has 0. | uniqueType uniqueNodeLocation missingLocation 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 03a106208a5..420bd110e1f 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 @@ -170,6 +170,7 @@ astFlow | test.cpp:1308:7:1308:12 | call to source | test.cpp:1309:14:1309:16 | ... ++ | | test.cpp:1312:7:1312:12 | call to source | test.cpp:1313:8:1313:24 | ... ? ... : ... | | test.cpp:1312:7:1312:12 | call to source | test.cpp:1314:8:1314:8 | x | +| test.cpp:1329:11:1329:16 | call to source | test.cpp:1330:10:1330:10 | i | | true_upon_entry.cpp:17:11:17:16 | call to source | true_upon_entry.cpp:21:8:21:8 | x | | true_upon_entry.cpp:27:9:27:14 | call to source | true_upon_entry.cpp:29:8:29:8 | x | | true_upon_entry.cpp:33:11:33:16 | call to source | true_upon_entry.cpp:39:8:39:8 | x | @@ -390,6 +391,7 @@ irFlow | test.cpp:1308:7:1308:12 | call to source | test.cpp:1309:8:1309:16 | ... ++ | | test.cpp:1312:7:1312:12 | call to source | test.cpp:1313:8:1313:24 | ... ? ... : ... | | test.cpp:1312:7:1312:12 | call to source | test.cpp:1314:8:1314:8 | x | +| test.cpp:1329:11:1329:16 | call to source | test.cpp:1330:10:1330:10 | i | | true_upon_entry.cpp:9:11:9:16 | call to source | true_upon_entry.cpp:13:8:13:8 | x | | true_upon_entry.cpp:17:11:17:16 | call to source | true_upon_entry.cpp:21:8:21:8 | x | | true_upon_entry.cpp:27:9:27:14 | call to source | true_upon_entry.cpp:29:8:29:8 | x | 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 e1c3ef98fb7..ca240eb7b2b 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp @@ -1312,4 +1312,20 @@ void crement_test2(bool b, int y) { x = source(); sink(b ? (long)x++ : 0); // $ ir ast sink(x); // $ ir ast -} \ No newline at end of file +} + +struct nsdmi { + int i = source(); + + nsdmi() {} + + nsdmi(int i) : i(i) {} +}; + +void nsdmi_test() { + nsdmi x; + sink(x.i); // $ MISSING: ir ast + + nsdmi y(source()); + sink(y.i); // $ ir ast +} From 09f930f4e86d64f5b65455682d4d8e8ecac9a828 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 27 Feb 2026 16:42:31 +0100 Subject: [PATCH 40/81] C++: Generate initialization function for each NSDMI --- .../raw/internal/IRConstruction.qll | 5 + .../raw/internal/TranslatedCondition.qll | 3 +- .../internal/TranslatedDeclarationEntry.qll | 1 + .../raw/internal/TranslatedElement.qll | 7 +- .../raw/internal/TranslatedExpr.qll | 53 ++++- .../raw/internal/TranslatedInitialization.qll | 8 +- .../TranslatedNonStaticDataMember.qll | 217 ++++++++++++++++++ 7 files changed, 288 insertions(+), 6 deletions(-) create mode 100644 cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedNonStaticDataMember.qll 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 9e9a47a5b4f..7a667fcc017 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 @@ -15,6 +15,7 @@ private import TranslatedCall private import TranslatedStmt private import TranslatedFunction private import TranslatedGlobalVar +private import TranslatedNonStaticDataMember private import TranslatedInitialization TranslatedElement getInstructionTranslatedElement(Instruction instruction) { @@ -45,6 +46,8 @@ module Raw { or not var.isFromUninstantiatedTemplate(_) and var instanceof StaticInitializedStaticLocalVariable + or + var instanceof Field ) and var.hasInitializer() and ( @@ -64,6 +67,8 @@ module Raw { getTranslatedFunction(decl).hasUserVariable(var, type) or getTranslatedVarInit(decl).hasUserVariable(var, type) + or + getTranslatedFieldInit(decl).hasUserVariable(var, type) } cached 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 ff8867db696..be8bff5b05c 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 @@ -36,7 +36,8 @@ abstract class TranslatedCondition extends TranslatedElement { final override Declaration getFunction() { result = getEnclosingFunction(expr) or result = getEnclosingVariable(expr).(GlobalOrNamespaceVariable) or - result = getEnclosingVariable(expr).(StaticInitializedStaticLocalVariable) + result = getEnclosingVariable(expr).(StaticInitializedStaticLocalVariable) or + result = getEnclosingVariable(expr).(Field) } final Type getResultType() { result = expr.getUnspecifiedType() } 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 c0fe9cd2207..b10bba90536 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 @@ -36,6 +36,7 @@ abstract class TranslatedDeclarationEntry extends TranslatedElement, TTranslated or not entry.getDeclaration() instanceof StaticInitializedStaticLocalVariable and not entry.getDeclaration() instanceof GlobalOrNamespaceVariable and + not entry.getDeclaration() instanceof Field and result = stmt.getEnclosingFunction() ) } 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 93d7e9b02cf..c30cc4bbc5c 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 @@ -918,7 +918,10 @@ newtype TTranslatedElement = } or // The side effect that initializes newly-allocated memory. TTranslatedAllocationSideEffect(AllocationExpr expr) { not ignoreSideEffects(expr) } or - TTranslatedStaticStorageDurationVarInit(Variable var) { Raw::varHasIRFunc(var) } or + TTranslatedStaticStorageDurationVarInit(Variable var) { + Raw::varHasIRFunc(var) and not var instanceof Field + } or + TTranslatedNonStaticDataMemberVarInit(Field var) { Raw::varHasIRFunc(var) } or TTranslatedAssertionOperand(MacroInvocation mi, int index) { hasAssertionOperand(mi, index) } /** @@ -1297,5 +1300,7 @@ abstract class TranslatedRootElement extends TranslatedElement { this instanceof TTranslatedFunction or this instanceof TTranslatedStaticStorageDurationVarInit + or + this instanceof TTranslatedNonStaticDataMemberVarInit } } 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 2f7ffa636da..712f140e5b8 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 TranslatedNonStaticDataMember private import IRConstruction import TranslatedCall @@ -138,6 +139,8 @@ abstract class TranslatedExpr extends TranslatedElement { result = getTranslatedFunction(getEnclosingFunction(expr)) or result = getTranslatedVarInit(getEnclosingVariable(expr)) + or + result = getTranslatedFieldInit(getEnclosingVariable(expr)) } } @@ -153,7 +156,10 @@ Declaration getEnclosingDeclaration0(Expr e) { i.getExpr().getFullyConverted() = e and v = i.getDeclaration() | - if v instanceof StaticInitializedStaticLocalVariable or v instanceof GlobalOrNamespaceVariable + if + v instanceof StaticInitializedStaticLocalVariable or + v instanceof GlobalOrNamespaceVariable or + v instanceof Field then result = v else result = e.getEnclosingDeclaration() ) @@ -173,7 +179,10 @@ Variable getEnclosingVariable0(Expr e) { i.getExpr().getFullyConverted() = e and v = i.getDeclaration() | - if v instanceof StaticInitializedStaticLocalVariable or v instanceof GlobalOrNamespaceVariable + if + v instanceof StaticInitializedStaticLocalVariable or + v instanceof GlobalOrNamespaceVariable or + v instanceof Field then result = v else result = e.getEnclosingVariable() ) @@ -826,6 +835,46 @@ class TranslatedPostfixCrementOperation extends TranslatedCrementOperation { override Instruction getResult() { result = this.getLoadedOperand().getResult() } } +class TranslatedParamAccessForType extends TranslatedNonConstantExpr { + override ParamAccessForType expr; + + TranslatedParamAccessForType() { + // Currently only needed for this parameter accesses. + expr.isThisAccess() + } + + final override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getInstruction(OnlyInstructionTag()) and + kind instanceof GotoEdge + } + + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + + final override TranslatedElement getChildInternal(int id) { none() } + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + tag = OnlyInstructionTag() and + result = this.getParent().getChildSuccessor(this, kind) + } + + override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + tag = OnlyInstructionTag() and + opcode instanceof Opcode::CopyValue and + resultType = getTypeForPRValue(expr.getType()) + } + + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + tag = OnlyInstructionTag() and + operandTag instanceof UnaryOperandTag and + result = + this.getEnclosingFunction().(TranslatedNonStaticDataMemberVarInit).getLoadThisInstruction() + } +} + /** * IR translation of an array access expression (e.g. `a[i]`). The array being accessed will either * be a prvalue of pointer type (possibly due to an implicit array-to-pointer conversion), or a 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 b280dd7bc70..581b0886f7f 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 @@ -148,7 +148,8 @@ abstract class TranslatedInitialization extends TranslatedElement, TTranslatedIn final override Declaration getFunction() { result = getEnclosingFunction(expr) or result = getEnclosingVariable(expr).(GlobalOrNamespaceVariable) or - result = getEnclosingVariable(expr).(StaticInitializedStaticLocalVariable) + result = getEnclosingVariable(expr).(StaticInitializedStaticLocalVariable) or + result = getEnclosingVariable(expr).(Field) } final override Locatable getAst() { result = expr } @@ -528,7 +529,8 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { final override Declaration getFunction() { result = getEnclosingFunction(ast) or result = getEnclosingVariable(ast).(GlobalOrNamespaceVariable) or - result = getEnclosingVariable(ast).(StaticInitializedStaticLocalVariable) + result = getEnclosingVariable(ast).(StaticInitializedStaticLocalVariable) or + result = getEnclosingVariable(ast).(Field) } final override Instruction getFirstInstruction(EdgeKind kind) { @@ -701,6 +703,8 @@ abstract class TranslatedElementInitialization extends TranslatedElement { result = getEnclosingVariable(initList).(GlobalOrNamespaceVariable) or result = getEnclosingVariable(initList).(StaticInitializedStaticLocalVariable) + or + result = getEnclosingVariable(initList).(Field) } final override Instruction getFirstInstruction(EdgeKind kind) { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedNonStaticDataMember.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedNonStaticDataMember.qll new file mode 100644 index 00000000000..ff06ff3198e --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedNonStaticDataMember.qll @@ -0,0 +1,217 @@ +import semmle.code.cpp.ir.implementation.raw.internal.TranslatedElement +private import TranslatedExpr +private import cpp +private import semmle.code.cpp.ir.implementation.internal.OperandTag +private import semmle.code.cpp.ir.internal.TempVariableTag +private import semmle.code.cpp.ir.internal.CppType +private import TranslatedInitialization +private import InstructionTag +private import semmle.code.cpp.ir.internal.IRUtilities + +class TranslatedNonStaticDataMemberVarInit extends TranslatedRootElement, + TTranslatedNonStaticDataMemberVarInit, InitializationContext +{ + Field field; + Class cls; + + TranslatedNonStaticDataMemberVarInit() { + this = TTranslatedNonStaticDataMemberVarInit(field) and + cls.getAMember() = field + } + + override string toString() { result = cls.toString() + "::" + field.toString() } + + final override Field getAst() { result = field } + + final override Declaration getFunction() { result = field } + + override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getInstruction(EnterFunctionTag()) and + kind instanceof GotoEdge + } + + override Instruction getALastInstructionInternal() { + result = this.getInstruction(ExitFunctionTag()) + } + + override TranslatedElement getChild(int n) { + n = 1 and + result = getTranslatedInitialization(field.getInitializer().getExpr().getFullyConverted()) + } + + override predicate hasInstruction(Opcode op, InstructionTag tag, CppType type) { + op instanceof Opcode::EnterFunction and + tag = EnterFunctionTag() and + type = getVoidType() + or + op instanceof Opcode::AliasedDefinition and + tag = AliasedDefinitionTag() and + type = getUnknownType() + or + op instanceof Opcode::InitializeNonLocal and + tag = InitializeNonLocalTag() and + type = getUnknownType() + or + tag = ThisAddressTag() and + op instanceof Opcode::VariableAddress and + type = getTypeForGLValue(any(UnknownType t)) + or + tag = InitializerStoreTag() and + op instanceof Opcode::InitializeParameter and + type = this.getThisType() + or + tag = ThisLoadTag() and + op instanceof Opcode::Load and + type = this.getThisType() + or + tag = InitializerIndirectStoreTag() and + op instanceof Opcode::InitializeIndirection and + type = getTypeForPRValue(cls) + or + op instanceof Opcode::FieldAddress and + tag = InitializerFieldAddressTag() and + type = getTypeForGLValue(field.getType()) + or + op instanceof Opcode::ReturnVoid and + tag = ReturnTag() and + type = getVoidType() + or + op instanceof Opcode::AliasedUse and + tag = AliasedUseTag() and + type = getVoidType() + or + op instanceof Opcode::ExitFunction and + tag = ExitFunctionTag() and + type = getVoidType() + } + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + kind instanceof GotoEdge and + ( + tag = EnterFunctionTag() and + result = this.getInstruction(AliasedDefinitionTag()) + or + tag = AliasedDefinitionTag() and + result = this.getInstruction(InitializeNonLocalTag()) + or + tag = InitializeNonLocalTag() and + result = this.getInstruction(ThisAddressTag()) + or + tag = ThisAddressTag() and + result = this.getInstruction(InitializerStoreTag()) + or + tag = InitializerStoreTag() and + result = this.getInstruction(ThisLoadTag()) + or + tag = ThisLoadTag() and + result = this.getInstruction(InitializerIndirectStoreTag()) + or + tag = InitializerIndirectStoreTag() and + result = this.getInstruction(InitializerFieldAddressTag()) + ) + or + tag = InitializerFieldAddressTag() and + result = this.getChild(1).getFirstInstruction(kind) + or + kind instanceof GotoEdge and + ( + tag = ReturnTag() and + result = this.getInstruction(AliasedUseTag()) + or + tag = AliasedUseTag() and + result = this.getInstruction(ExitFunctionTag()) + ) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + child = this.getChild(1) and + result = this.getInstruction(ReturnTag()) and + kind instanceof GotoEdge + } + + final override CppType getInstructionMemoryOperandType( + InstructionTag tag, TypedOperandTag operandTag + ) { + tag = AliasedUseTag() and + operandTag instanceof SideEffectOperandTag and + result = getUnknownType() + } + + override IRVariable getInstructionVariable(InstructionTag tag) { + ( + tag = ThisAddressTag() or + tag = InitializerStoreTag() or + tag = InitializerIndirectStoreTag() + ) and + result = getIRTempVariable(field, ThisTempVar()) + } + + override Field getInstructionField(InstructionTag tag) { + tag = InitializerFieldAddressTag() and + result = field + } + + override predicate hasTempVariable(TempVariableTag tag, CppType type) { + tag = ThisTempVar() and + type = this.getThisType() + } + + /** + * Holds if this variable defines or accesses variable `var` with type `type`. This includes all + * parameters and local variables, plus any global variables or static data members that are + * directly accessed by the function. + */ + final predicate hasUserVariable(Variable varUsed, CppType type) { + ( + ( + varUsed instanceof GlobalOrNamespaceVariable + or + varUsed instanceof StaticLocalVariable + or + varUsed instanceof MemberVariable and not varUsed instanceof Field + ) and + exists(VariableAccess access | + access.getTarget() = varUsed and + getEnclosingVariable(access) = field + ) + or + field = varUsed + or + varUsed.(LocalScopeVariable).getEnclosingElement*() = field + or + varUsed.(Parameter).getCatchBlock().getEnclosingElement*() = field + ) and + type = getTypeForPRValue(getVariableType(varUsed)) + } + + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + ( + tag = InitializerStoreTag() + or + tag = ThisLoadTag() + ) and + operandTag instanceof AddressOperandTag and + result = this.getInstruction(ThisAddressTag()) + or + ( + tag = InitializerIndirectStoreTag() and + operandTag instanceof AddressOperandTag + or + tag = InitializerFieldAddressTag() and + operandTag instanceof UnaryOperandTag + ) and + result = this.getInstruction(ThisLoadTag()) + } + + override Instruction getTargetAddress() { + result = this.getInstruction(InitializerFieldAddressTag()) + } + + override Type getTargetType() { result = field.getUnspecifiedType() } + + final Instruction getLoadThisInstruction() { result = this.getInstruction(ThisLoadTag()) } + + private CppType getThisType() { result = getTypeForGLValue(cls) } +} + +TranslatedNonStaticDataMemberVarInit getTranslatedFieldInit(Field field) { result.getAst() = field } From 9e60e1217f8e274f90ba3aae6b9130cf69a3f452 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 27 Feb 2026 16:43:11 +0100 Subject: [PATCH 41/81] C++: Update expected test results --- .../test/library-tests/ir/ir/PrintConfig.qll | 2 + .../library-tests/ir/ir/aliased_ir.expected | 355 ++++++++++++++++++ .../test/library-tests/ir/ir/raw_ir.expected | 311 +++++++++++++++ 3 files changed, 668 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintConfig.qll b/cpp/ql/test/library-tests/ir/ir/PrintConfig.qll index aa23cf423ad..6e98d23bcf4 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintConfig.qll +++ b/cpp/ql/test/library-tests/ir/ir/PrintConfig.qll @@ -20,5 +20,7 @@ predicate shouldDumpDeclaration(Declaration decl) { decl.(GlobalOrNamespaceVariable).hasInitializer() or decl.(StaticLocalVariable).hasInitializer() + or + decl.(Field).hasInitializer() ) } 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 5d2b92aed73..40a424f7f9a 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -12375,6 +12375,24 @@ ir.cpp: # 1533| v1533_12(void) = AliasedUse : m1533_3 # 1533| v1533_13(void) = ExitFunction : +# 1534| int StructuredBindingDataMemberMemberStruct::x +# 1534| Block 0 +# 1534| v1534_1(void) = EnterFunction : +# 1534| m1534_2(unknown) = AliasedDefinition : +# 1534| m1534_3(unknown) = InitializeNonLocal : +# 1534| m1534_4(unknown) = Chi : total:m1534_2, partial:m1534_3 +# 1534| r1534_5(glval) = VariableAddress[#this] : +# 1534| m1534_6(glval) = InitializeParameter[#this] : &:r1534_5 +# 1534| r1534_7(glval) = Load[#this] : &:r1534_5, m1534_6 +# 1534| m1534_8(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1534_7 +# 1534| r1534_9(glval) = FieldAddress[x] : r1534_7 +# 1534| r1534_10(int) = Constant[5] : +# 1534| m1534_11(int) = Store[?] : &:r1534_9, r1534_10 +# 1534| m1534_12(unknown) = Chi : total:m1534_8, partial:m1534_11 +# 1534| v1534_13(void) = ReturnVoid : +# 1534| v1534_14(void) = AliasedUse : m1534_3 +# 1534| v1534_15(void) = ExitFunction : + # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() # 1537| Block 0 # 1537| v1537_1(void) = EnterFunction : @@ -12476,6 +12494,130 @@ ir.cpp: # 1537| v1537_76(void) = AliasedUse : m1537_3 # 1537| v1537_77(void) = ExitFunction : +# 1540| int StructuredBindingDataMemberStruct::i +# 1540| Block 0 +# 1540| v1540_1(void) = EnterFunction : +# 1540| m1540_2(unknown) = AliasedDefinition : +# 1540| m1540_3(unknown) = InitializeNonLocal : +# 1540| m1540_4(unknown) = Chi : total:m1540_2, partial:m1540_3 +# 1540| r1540_5(glval) = VariableAddress[#this] : +# 1540| m1540_6(glval) = InitializeParameter[#this] : &:r1540_5 +# 1540| r1540_7(glval) = Load[#this] : &:r1540_5, m1540_6 +# 1540| m1540_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1540_7 +# 1540| r1540_9(glval) = FieldAddress[i] : r1540_7 +# 1540| r1540_10(int) = Constant[1] : +# 1540| m1540_11(int) = Store[?] : &:r1540_9, r1540_10 +# 1540| m1540_12(unknown) = Chi : total:m1540_8, partial:m1540_11 +# 1540| v1540_13(void) = ReturnVoid : +# 1540| v1540_14(void) = AliasedUse : m1540_3 +# 1540| v1540_15(void) = ExitFunction : + +# 1541| double StructuredBindingDataMemberStruct::d +# 1541| Block 0 +# 1541| v1541_1(void) = EnterFunction : +# 1541| m1541_2(unknown) = AliasedDefinition : +# 1541| m1541_3(unknown) = InitializeNonLocal : +# 1541| m1541_4(unknown) = Chi : total:m1541_2, partial:m1541_3 +# 1541| r1541_5(glval) = VariableAddress[#this] : +# 1541| m1541_6(glval) = InitializeParameter[#this] : &:r1541_5 +# 1541| r1541_7(glval) = Load[#this] : &:r1541_5, m1541_6 +# 1541| m1541_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1541_7 +# 1541| r1541_9(glval) = FieldAddress[d] : r1541_7 +# 1541| r1541_10(double) = Constant[2.0] : +# 1541| m1541_11(double) = Store[?] : &:r1541_9, r1541_10 +# 1541| m1541_12(unknown) = Chi : total:m1541_8, partial:m1541_11 +# 1541| v1541_13(void) = ReturnVoid : +# 1541| v1541_14(void) = AliasedUse : m1541_3 +# 1541| v1541_15(void) = ExitFunction : + +# 1543| int& StructuredBindingDataMemberStruct::r +# 1543| Block 0 +# 1543| v1543_1(void) = EnterFunction : +# 1543| m1543_2(unknown) = AliasedDefinition : +# 1543| m1543_3(unknown) = InitializeNonLocal : +# 1543| m1543_4(unknown) = Chi : total:m1543_2, partial:m1543_3 +# 1543| r1543_5(glval) = VariableAddress[#this] : +# 1543| m1543_6(glval) = InitializeParameter[#this] : &:r1543_5 +# 1543| r1543_7(glval) = Load[#this] : &:r1543_5, m1543_6 +# 1543| m1543_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1543_7 +# 1543| m1543_9(unknown) = Chi : total:m1543_4, partial:m1543_8 +# 1543| r1543_10(glval) = FieldAddress[r] : r1543_7 +# 1543| r1543_11(StructuredBindingDataMemberStruct *) = CopyValue : r1543_7 +# 1543| r1543_12(glval) = FieldAddress[i] : r1543_11 +#-----| r0_1(int &) = CopyValue : r1543_12 +#-----| m0_2(int &) = Store[?] : &:r1543_10, r0_1 +#-----| m0_3(unknown) = Chi : total:m1543_9, partial:m0_2 +# 1543| v1543_13(void) = ReturnVoid : +# 1543| v1543_14(void) = AliasedUse : ~m0_3 +# 1543| v1543_15(void) = ExitFunction : + +# 1544| int* StructuredBindingDataMemberStruct::p +# 1544| Block 0 +# 1544| v1544_1(void) = EnterFunction : +# 1544| m1544_2(unknown) = AliasedDefinition : +# 1544| m1544_3(unknown) = InitializeNonLocal : +# 1544| m1544_4(unknown) = Chi : total:m1544_2, partial:m1544_3 +# 1544| r1544_5(glval) = VariableAddress[#this] : +# 1544| m1544_6(glval) = InitializeParameter[#this] : &:r1544_5 +# 1544| r1544_7(glval) = Load[#this] : &:r1544_5, m1544_6 +# 1544| m1544_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1544_7 +# 1544| m1544_9(unknown) = Chi : total:m1544_4, partial:m1544_8 +# 1544| r1544_10(glval) = FieldAddress[p] : r1544_7 +# 1544| r1544_11(StructuredBindingDataMemberStruct *) = CopyValue : r1544_7 +# 1544| r1544_12(glval) = FieldAddress[i] : r1544_11 +# 1544| r1544_13(int *) = CopyValue : r1544_12 +# 1544| m1544_14(int *) = Store[?] : &:r1544_10, r1544_13 +# 1544| m1544_15(unknown) = Chi : total:m1544_9, partial:m1544_14 +# 1544| v1544_16(void) = ReturnVoid : +# 1544| v1544_17(void) = AliasedUse : ~m1544_15 +# 1544| v1544_18(void) = ExitFunction : + +# 1545| StructuredBindingDataMemberStruct::ArrayType StructuredBindingDataMemberStruct::xs +# 1545| Block 0 +# 1545| v1545_1(void) = EnterFunction : +# 1545| m1545_2(unknown) = AliasedDefinition : +# 1545| m1545_3(unknown) = InitializeNonLocal : +# 1545| m1545_4(unknown) = Chi : total:m1545_2, partial:m1545_3 +# 1545| r1545_5(glval) = VariableAddress[#this] : +# 1545| m1545_6(glval) = InitializeParameter[#this] : &:r1545_5 +# 1545| r1545_7(glval) = Load[#this] : &:r1545_5, m1545_6 +# 1545| m1545_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1545_7 +# 1545| r1545_9(glval) = FieldAddress[xs] : r1545_7 +# 1545| r1545_10(int) = Constant[0] : +# 1545| r1545_11(glval) = PointerAdd[4] : r1545_9, r1545_10 +# 1545| r1545_12(int) = Constant[1] : +# 1545| m1545_13(int) = Store[?] : &:r1545_11, r1545_12 +# 1545| m1545_14(unknown) = Chi : total:m1545_8, partial:m1545_13 +# 1545| r1545_15(int) = Constant[1] : +# 1545| r1545_16(glval) = PointerAdd[4] : r1545_9, r1545_15 +# 1545| r1545_17(int) = Constant[2] : +# 1545| m1545_18(int) = Store[?] : &:r1545_16, r1545_17 +# 1545| m1545_19(unknown) = Chi : total:m1545_14, partial:m1545_18 +# 1545| v1545_20(void) = ReturnVoid : +# 1545| v1545_21(void) = AliasedUse : m1545_3 +# 1545| v1545_22(void) = ExitFunction : + +# 1546| StructuredBindingDataMemberStruct::RefType StructuredBindingDataMemberStruct::r_alt +# 1546| Block 0 +# 1546| v1546_1(void) = EnterFunction : +# 1546| m1546_2(unknown) = AliasedDefinition : +# 1546| m1546_3(unknown) = InitializeNonLocal : +# 1546| m1546_4(unknown) = Chi : total:m1546_2, partial:m1546_3 +# 1546| r1546_5(glval) = VariableAddress[#this] : +# 1546| m1546_6(glval) = InitializeParameter[#this] : &:r1546_5 +# 1546| r1546_7(glval) = Load[#this] : &:r1546_5, m1546_6 +# 1546| m1546_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1546_7 +# 1546| m1546_9(unknown) = Chi : total:m1546_4, partial:m1546_8 +# 1546| r1546_10(glval) = FieldAddress[r_alt] : r1546_7 +# 1546| r1546_11(StructuredBindingDataMemberStruct *) = CopyValue : r1546_7 +# 1546| r1546_12(glval) = FieldAddress[i] : r1546_11 +#-----| r0_1(int &) = CopyValue : r1546_12 +#-----| m0_2(int &) = Store[?] : &:r1546_10, r0_1 +#-----| m0_3(unknown) = Chi : total:m1546_9, partial:m0_2 +# 1546| v1546_13(void) = ReturnVoid : +# 1546| v1546_14(void) = AliasedUse : ~m0_3 +# 1546| v1546_15(void) = ExitFunction : + # 1550| void data_member_structured_binding() # 1550| Block 0 # 1550| v1550_1(void) = EnterFunction : @@ -12711,6 +12853,63 @@ ir.cpp: # 1590| v1590_36(void) = AliasedUse : m1590_3 # 1590| v1590_37(void) = ExitFunction : +# 1591| int StructuredBindingTupleRefGet::i +# 1591| Block 0 +# 1591| v1591_1(void) = EnterFunction : +# 1591| m1591_2(unknown) = AliasedDefinition : +# 1591| m1591_3(unknown) = InitializeNonLocal : +# 1591| m1591_4(unknown) = Chi : total:m1591_2, partial:m1591_3 +# 1591| r1591_5(glval) = VariableAddress[#this] : +# 1591| m1591_6(glval) = InitializeParameter[#this] : &:r1591_5 +# 1591| r1591_7(glval) = Load[#this] : &:r1591_5, m1591_6 +# 1591| m1591_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1591_7 +# 1591| r1591_9(glval) = FieldAddress[i] : r1591_7 +# 1591| r1591_10(int) = Constant[1] : +# 1591| m1591_11(int) = Store[?] : &:r1591_9, r1591_10 +# 1591| m1591_12(unknown) = Chi : total:m1591_8, partial:m1591_11 +# 1591| v1591_13(void) = ReturnVoid : +# 1591| v1591_14(void) = AliasedUse : m1591_3 +# 1591| v1591_15(void) = ExitFunction : + +# 1592| double StructuredBindingTupleRefGet::d +# 1592| Block 0 +# 1592| v1592_1(void) = EnterFunction : +# 1592| m1592_2(unknown) = AliasedDefinition : +# 1592| m1592_3(unknown) = InitializeNonLocal : +# 1592| m1592_4(unknown) = Chi : total:m1592_2, partial:m1592_3 +# 1592| r1592_5(glval) = VariableAddress[#this] : +# 1592| m1592_6(glval) = InitializeParameter[#this] : &:r1592_5 +# 1592| r1592_7(glval) = Load[#this] : &:r1592_5, m1592_6 +# 1592| m1592_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1592_7 +# 1592| r1592_9(glval) = FieldAddress[d] : r1592_7 +# 1592| r1592_10(double) = Constant[2.200000000000000178] : +# 1592| m1592_11(double) = Store[?] : &:r1592_9, r1592_10 +# 1592| m1592_12(unknown) = Chi : total:m1592_8, partial:m1592_11 +# 1592| v1592_13(void) = ReturnVoid : +# 1592| v1592_14(void) = AliasedUse : m1592_3 +# 1592| v1592_15(void) = ExitFunction : + +# 1593| int& StructuredBindingTupleRefGet::r +# 1593| Block 0 +# 1593| v1593_1(void) = EnterFunction : +# 1593| m1593_2(unknown) = AliasedDefinition : +# 1593| m1593_3(unknown) = InitializeNonLocal : +# 1593| m1593_4(unknown) = Chi : total:m1593_2, partial:m1593_3 +# 1593| r1593_5(glval) = VariableAddress[#this] : +# 1593| m1593_6(glval) = InitializeParameter[#this] : &:r1593_5 +# 1593| r1593_7(glval) = Load[#this] : &:r1593_5, m1593_6 +# 1593| m1593_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1593_7 +# 1593| m1593_9(unknown) = Chi : total:m1593_4, partial:m1593_8 +# 1593| r1593_10(glval) = FieldAddress[r] : r1593_7 +# 1593| r1593_11(StructuredBindingTupleRefGet *) = CopyValue : r1593_7 +# 1593| r1593_12(glval) = FieldAddress[i] : r1593_11 +#-----| r0_1(int &) = CopyValue : r1593_12 +#-----| m0_2(int &) = Store[?] : &:r1593_10, r0_1 +#-----| m0_3(unknown) = Chi : total:m1593_9, partial:m0_2 +# 1593| v1593_13(void) = ReturnVoid : +# 1593| v1593_14(void) = AliasedUse : ~m0_3 +# 1593| v1593_15(void) = ExitFunction : + # 1618| std::tuple_element::type& StructuredBindingTupleRefGet::get() # 1618| Block 0 # 1618| v1618_1(void) = EnterFunction : @@ -12962,6 +13161,45 @@ ir.cpp: # 1657| v1657_12(void) = AliasedUse : m1657_3 # 1657| v1657_13(void) = ExitFunction : +# 1658| int StructuredBindingTupleNoRefGet::i +# 1658| Block 0 +# 1658| v1658_1(void) = EnterFunction : +# 1658| m1658_2(unknown) = AliasedDefinition : +# 1658| m1658_3(unknown) = InitializeNonLocal : +# 1658| m1658_4(unknown) = Chi : total:m1658_2, partial:m1658_3 +# 1658| r1658_5(glval) = VariableAddress[#this] : +# 1658| m1658_6(glval) = InitializeParameter[#this] : &:r1658_5 +# 1658| r1658_7(glval) = Load[#this] : &:r1658_5, m1658_6 +# 1658| m1658_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1658_7 +# 1658| r1658_9(glval) = FieldAddress[i] : r1658_7 +# 1658| r1658_10(int) = Constant[1] : +# 1658| m1658_11(int) = Store[?] : &:r1658_9, r1658_10 +# 1658| m1658_12(unknown) = Chi : total:m1658_8, partial:m1658_11 +# 1658| v1658_13(void) = ReturnVoid : +# 1658| v1658_14(void) = AliasedUse : m1658_3 +# 1658| v1658_15(void) = ExitFunction : + +# 1659| int& StructuredBindingTupleNoRefGet::r +# 1659| Block 0 +# 1659| v1659_1(void) = EnterFunction : +# 1659| m1659_2(unknown) = AliasedDefinition : +# 1659| m1659_3(unknown) = InitializeNonLocal : +# 1659| m1659_4(unknown) = Chi : total:m1659_2, partial:m1659_3 +# 1659| r1659_5(glval) = VariableAddress[#this] : +# 1659| m1659_6(glval) = InitializeParameter[#this] : &:r1659_5 +# 1659| r1659_7(glval) = Load[#this] : &:r1659_5, m1659_6 +# 1659| m1659_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1659_7 +# 1659| m1659_9(unknown) = Chi : total:m1659_4, partial:m1659_8 +# 1659| r1659_10(glval) = FieldAddress[r] : r1659_7 +# 1659| r1659_11(StructuredBindingTupleNoRefGet *) = CopyValue : r1659_7 +# 1659| r1659_12(glval) = FieldAddress[i] : r1659_11 +#-----| r0_1(int &) = CopyValue : r1659_12 +#-----| m0_2(int &) = Store[?] : &:r1659_10, r0_1 +#-----| m0_3(unknown) = Chi : total:m1659_9, partial:m0_2 +# 1659| v1659_13(void) = ReturnVoid : +# 1659| v1659_14(void) = AliasedUse : ~m0_3 +# 1659| v1659_15(void) = ExitFunction : + # 1684| std::tuple_element::type StructuredBindingTupleNoRefGet::get() # 1684| Block 0 # 1684| v1684_1(void) = EnterFunction : @@ -21066,6 +21304,123 @@ ir.cpp: # 2867| v2867_14(void) = ReturnVoid : #-----| Goto -> Block 1 +# 2890| int StructInit::i +# 2890| Block 0 +# 2890| v2890_1(void) = EnterFunction : +# 2890| m2890_2(unknown) = AliasedDefinition : +# 2890| m2890_3(unknown) = InitializeNonLocal : +# 2890| m2890_4(unknown) = Chi : total:m2890_2, partial:m2890_3 +# 2890| r2890_5(glval) = VariableAddress[#this] : +# 2890| m2890_6(glval) = InitializeParameter[#this] : &:r2890_5 +# 2890| r2890_7(glval) = Load[#this] : &:r2890_5, m2890_6 +# 2890| m2890_8(StructInit) = InitializeIndirection[#this] : &:r2890_7 +# 2890| r2890_9(glval) = FieldAddress[i] : r2890_7 +# 2890| r2890_10(int) = Constant[42] : +# 2890| m2890_11(int) = Store[?] : &:r2890_9, r2890_10 +# 2890| m2890_12(unknown) = Chi : total:m2890_8, partial:m2890_11 +# 2890| v2890_13(void) = ReturnVoid : +# 2890| v2890_14(void) = AliasedUse : m2890_3 +# 2890| v2890_15(void) = ExitFunction : + +# 2891| int StructInit::j +# 2891| Block 0 +# 2891| v2891_1(void) = EnterFunction : +# 2891| m2891_2(unknown) = AliasedDefinition : +# 2891| m2891_3(unknown) = InitializeNonLocal : +# 2891| m2891_4(unknown) = Chi : total:m2891_2, partial:m2891_3 +# 2891| r2891_5(glval) = VariableAddress[#this] : +# 2891| m2891_6(glval) = InitializeParameter[#this] : &:r2891_5 +# 2891| r2891_7(glval) = Load[#this] : &:r2891_5, m2891_6 +# 2891| m2891_8(StructInit) = InitializeIndirection[#this] : &:r2891_7 +# 2891| r2891_9(glval) = FieldAddress[j] : r2891_7 +# 2891| r2891_10(int) = Constant[42] : +# 2891| m2891_11(int) = Store[?] : &:r2891_9, r2891_10 +# 2891| m2891_12(unknown) = Chi : total:m2891_8, partial:m2891_11 +# 2891| v2891_13(void) = ReturnVoid : +# 2891| v2891_14(void) = AliasedUse : m2891_3 +# 2891| v2891_15(void) = ExitFunction : + +# 2892| int StructInit::k +# 2892| Block 0 +# 2892| v2892_1(void) = EnterFunction : +# 2892| m2892_2(unknown) = AliasedDefinition : +# 2892| m2892_3(unknown) = InitializeNonLocal : +# 2892| m2892_4(unknown) = Chi : total:m2892_2, partial:m2892_3 +# 2892| r2892_5(glval) = VariableAddress[#this] : +# 2892| m2892_6(glval) = InitializeParameter[#this] : &:r2892_5 +# 2892| r2892_7(glval) = Load[#this] : &:r2892_5, m2892_6 +# 2892| m2892_8(StructInit) = InitializeIndirection[#this] : &:r2892_7 +# 2892| r2892_9(glval) = FieldAddress[k] : r2892_7 +# 2892| r2892_10(int) = Constant[42] : +# 2892| m2892_11(int) = Store[?] : &:r2892_9, r2892_10 +# 2892| m2892_12(unknown) = Chi : total:m2892_8, partial:m2892_11 +# 2892| v2892_13(void) = ReturnVoid : +# 2892| v2892_14(void) = AliasedUse : m2892_3 +# 2892| v2892_15(void) = ExitFunction : + +# 2893| int StructInit::l +# 2893| Block 0 +# 2893| v2893_1(void) = EnterFunction : +# 2893| m2893_2(unknown) = AliasedDefinition : +# 2893| m2893_3(unknown) = InitializeNonLocal : +# 2893| m2893_4(unknown) = Chi : total:m2893_2, partial:m2893_3 +# 2893| r2893_5(glval) = VariableAddress[#this] : +# 2893| m2893_6(glval) = InitializeParameter[#this] : &:r2893_5 +# 2893| r2893_7(glval) = Load[#this] : &:r2893_5, m2893_6 +# 2893| m2893_8(StructInit) = InitializeIndirection[#this] : &:r2893_7 +# 2893| r2893_9(glval) = FieldAddress[l] : r2893_7 +# 2893| r2893_10(StructInit *) = CopyValue : r2893_7 +# 2893| r2893_11(glval) = FieldAddress[k] : r2893_10 +# 2893| r2893_12(int) = Load[?] : &:r2893_11, ~m2893_8 +# 2893| m2893_13(int) = Store[?] : &:r2893_9, r2893_12 +# 2893| m2893_14(unknown) = Chi : total:m2893_8, partial:m2893_13 +# 2893| v2893_15(void) = ReturnVoid : +# 2893| v2893_16(void) = AliasedUse : m2893_3 +# 2893| v2893_17(void) = ExitFunction : + +# 2894| int StructInit::m +# 2894| Block 0 +# 2894| v2894_1(void) = EnterFunction : +# 2894| m2894_2(unknown) = AliasedDefinition : +# 2894| m2894_3(unknown) = InitializeNonLocal : +# 2894| m2894_4(unknown) = Chi : total:m2894_2, partial:m2894_3 +# 2894| r2894_5(glval) = VariableAddress[#this] : +# 2894| m2894_6(glval) = InitializeParameter[#this] : &:r2894_5 +# 2894| r2894_7(glval) = Load[#this] : &:r2894_5, m2894_6 +# 2894| m2894_8(StructInit) = InitializeIndirection[#this] : &:r2894_7 +# 2894| r2894_9(glval) = FieldAddress[m] : r2894_7 +# 2894| r2894_10(StructInit *) = CopyValue : r2894_7 +# 2894| r2894_11(glval) = FunctionAddress[get_val] : +# 2894| r2894_12(int) = Call[get_val] : func:r2894_11, this:r2894_10 +# 2894| m2894_13(unknown) = ^CallSideEffect : ~m2894_4 +# 2894| m2894_14(unknown) = Chi : total:m2894_4, partial:m2894_13 +# 2894| v2894_15(void) = ^IndirectReadSideEffect[-1] : &:r2894_10, ~m2894_8 +# 2894| m2894_16(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2894_10 +# 2894| m2894_17(unknown) = Chi : total:m2894_8, partial:m2894_16 +# 2894| m2894_18(int) = Store[?] : &:r2894_9, r2894_12 +# 2894| m2894_19(unknown) = Chi : total:m2894_17, partial:m2894_18 +# 2894| v2894_20(void) = ReturnVoid : +# 2894| v2894_21(void) = AliasedUse : ~m2894_14 +# 2894| v2894_22(void) = ExitFunction : + +# 2895| int StructInit::n +# 2895| Block 0 +# 2895| v2895_1(void) = EnterFunction : +# 2895| m2895_2(unknown) = AliasedDefinition : +# 2895| m2895_3(unknown) = InitializeNonLocal : +# 2895| m2895_4(unknown) = Chi : total:m2895_2, partial:m2895_3 +# 2895| r2895_5(glval) = VariableAddress[#this] : +# 2895| m2895_6(glval) = InitializeParameter[#this] : &:r2895_5 +# 2895| r2895_7(glval) = Load[#this] : &:r2895_5, m2895_6 +# 2895| m2895_8(StructInit) = InitializeIndirection[#this] : &:r2895_7 +# 2895| r2895_9(glval) = FieldAddress[n] : r2895_7 +# 2895| r2895_10(int) = Constant[42] : +# 2895| m2895_11(int) = Store[?] : &:r2895_9, r2895_10 +# 2895| m2895_12(unknown) = Chi : total:m2895_8, partial:m2895_11 +# 2895| v2895_13(void) = ReturnVoid : +# 2895| v2895_14(void) = AliasedUse : m2895_3 +# 2895| v2895_15(void) = ExitFunction : + # 2897| void StructInit::StructInit(int) # 2897| Block 0 # 2897| v2897_1(void) = EnterFunction : 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 8d61ec6789b..16649e72d08 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -11352,6 +11352,22 @@ ir.cpp: # 1533| v1533_11(void) = AliasedUse : ~m? # 1533| v1533_12(void) = ExitFunction : +# 1534| int StructuredBindingDataMemberMemberStruct::x +# 1534| Block 0 +# 1534| v1534_1(void) = EnterFunction : +# 1534| mu1534_2(unknown) = AliasedDefinition : +# 1534| mu1534_3(unknown) = InitializeNonLocal : +# 1534| r1534_4(glval) = VariableAddress[#this] : +# 1534| mu1534_5(glval) = InitializeParameter[#this] : &:r1534_4 +# 1534| r1534_6(glval) = Load[#this] : &:r1534_4, ~m? +# 1534| mu1534_7(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1534_6 +# 1534| r1534_8(glval) = FieldAddress[x] : r1534_6 +# 1534| r1534_9(int) = Constant[5] : +# 1534| mu1534_10(int) = Store[?] : &:r1534_8, r1534_9 +# 1534| v1534_11(void) = ReturnVoid : +# 1534| v1534_12(void) = AliasedUse : ~m? +# 1534| v1534_13(void) = ExitFunction : + # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() # 1537| Block 0 # 1537| v1537_1(void) = EnterFunction : @@ -11454,6 +11470,114 @@ ir.cpp: # 1537| v1537_67(void) = AliasedUse : ~m? # 1537| v1537_68(void) = ExitFunction : +# 1540| int StructuredBindingDataMemberStruct::i +# 1540| Block 0 +# 1540| v1540_1(void) = EnterFunction : +# 1540| mu1540_2(unknown) = AliasedDefinition : +# 1540| mu1540_3(unknown) = InitializeNonLocal : +# 1540| r1540_4(glval) = VariableAddress[#this] : +# 1540| mu1540_5(glval) = InitializeParameter[#this] : &:r1540_4 +# 1540| r1540_6(glval) = Load[#this] : &:r1540_4, ~m? +# 1540| mu1540_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1540_6 +# 1540| r1540_8(glval) = FieldAddress[i] : r1540_6 +# 1540| r1540_9(int) = Constant[1] : +# 1540| mu1540_10(int) = Store[?] : &:r1540_8, r1540_9 +# 1540| v1540_11(void) = ReturnVoid : +# 1540| v1540_12(void) = AliasedUse : ~m? +# 1540| v1540_13(void) = ExitFunction : + +# 1541| double StructuredBindingDataMemberStruct::d +# 1541| Block 0 +# 1541| v1541_1(void) = EnterFunction : +# 1541| mu1541_2(unknown) = AliasedDefinition : +# 1541| mu1541_3(unknown) = InitializeNonLocal : +# 1541| r1541_4(glval) = VariableAddress[#this] : +# 1541| mu1541_5(glval) = InitializeParameter[#this] : &:r1541_4 +# 1541| r1541_6(glval) = Load[#this] : &:r1541_4, ~m? +# 1541| mu1541_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1541_6 +# 1541| r1541_8(glval) = FieldAddress[d] : r1541_6 +# 1541| r1541_9(double) = Constant[2.0] : +# 1541| mu1541_10(double) = Store[?] : &:r1541_8, r1541_9 +# 1541| v1541_11(void) = ReturnVoid : +# 1541| v1541_12(void) = AliasedUse : ~m? +# 1541| v1541_13(void) = ExitFunction : + +# 1543| int& StructuredBindingDataMemberStruct::r +# 1543| Block 0 +# 1543| v1543_1(void) = EnterFunction : +# 1543| mu1543_2(unknown) = AliasedDefinition : +# 1543| mu1543_3(unknown) = InitializeNonLocal : +# 1543| r1543_4(glval) = VariableAddress[#this] : +# 1543| mu1543_5(glval) = InitializeParameter[#this] : &:r1543_4 +# 1543| r1543_6(glval) = Load[#this] : &:r1543_4, ~m? +# 1543| mu1543_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1543_6 +# 1543| r1543_8(glval) = FieldAddress[r] : r1543_6 +# 1543| r1543_9(StructuredBindingDataMemberStruct *) = CopyValue : r1543_6 +# 1543| r1543_10(glval) = FieldAddress[i] : r1543_9 +#-----| r0_1(int &) = CopyValue : r1543_10 +#-----| mu0_2(int &) = Store[?] : &:r1543_8, r0_1 +# 1543| v1543_11(void) = ReturnVoid : +# 1543| v1543_12(void) = AliasedUse : ~m? +# 1543| v1543_13(void) = ExitFunction : + +# 1544| int* StructuredBindingDataMemberStruct::p +# 1544| Block 0 +# 1544| v1544_1(void) = EnterFunction : +# 1544| mu1544_2(unknown) = AliasedDefinition : +# 1544| mu1544_3(unknown) = InitializeNonLocal : +# 1544| r1544_4(glval) = VariableAddress[#this] : +# 1544| mu1544_5(glval) = InitializeParameter[#this] : &:r1544_4 +# 1544| r1544_6(glval) = Load[#this] : &:r1544_4, ~m? +# 1544| mu1544_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1544_6 +# 1544| r1544_8(glval) = FieldAddress[p] : r1544_6 +# 1544| r1544_9(StructuredBindingDataMemberStruct *) = CopyValue : r1544_6 +# 1544| r1544_10(glval) = FieldAddress[i] : r1544_9 +# 1544| r1544_11(int *) = CopyValue : r1544_10 +# 1544| mu1544_12(int *) = Store[?] : &:r1544_8, r1544_11 +# 1544| v1544_13(void) = ReturnVoid : +# 1544| v1544_14(void) = AliasedUse : ~m? +# 1544| v1544_15(void) = ExitFunction : + +# 1545| StructuredBindingDataMemberStruct::ArrayType StructuredBindingDataMemberStruct::xs +# 1545| Block 0 +# 1545| v1545_1(void) = EnterFunction : +# 1545| mu1545_2(unknown) = AliasedDefinition : +# 1545| mu1545_3(unknown) = InitializeNonLocal : +# 1545| r1545_4(glval) = VariableAddress[#this] : +# 1545| mu1545_5(glval) = InitializeParameter[#this] : &:r1545_4 +# 1545| r1545_6(glval) = Load[#this] : &:r1545_4, ~m? +# 1545| mu1545_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1545_6 +# 1545| r1545_8(glval) = FieldAddress[xs] : r1545_6 +# 1545| r1545_9(int) = Constant[0] : +# 1545| r1545_10(glval) = PointerAdd[4] : r1545_8, r1545_9 +# 1545| r1545_11(int) = Constant[1] : +# 1545| mu1545_12(int) = Store[?] : &:r1545_10, r1545_11 +# 1545| r1545_13(int) = Constant[1] : +# 1545| r1545_14(glval) = PointerAdd[4] : r1545_8, r1545_13 +# 1545| r1545_15(int) = Constant[2] : +# 1545| mu1545_16(int) = Store[?] : &:r1545_14, r1545_15 +# 1545| v1545_17(void) = ReturnVoid : +# 1545| v1545_18(void) = AliasedUse : ~m? +# 1545| v1545_19(void) = ExitFunction : + +# 1546| StructuredBindingDataMemberStruct::RefType StructuredBindingDataMemberStruct::r_alt +# 1546| Block 0 +# 1546| v1546_1(void) = EnterFunction : +# 1546| mu1546_2(unknown) = AliasedDefinition : +# 1546| mu1546_3(unknown) = InitializeNonLocal : +# 1546| r1546_4(glval) = VariableAddress[#this] : +# 1546| mu1546_5(glval) = InitializeParameter[#this] : &:r1546_4 +# 1546| r1546_6(glval) = Load[#this] : &:r1546_4, ~m? +# 1546| mu1546_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1546_6 +# 1546| r1546_8(glval) = FieldAddress[r_alt] : r1546_6 +# 1546| r1546_9(StructuredBindingDataMemberStruct *) = CopyValue : r1546_6 +# 1546| r1546_10(glval) = FieldAddress[i] : r1546_9 +#-----| r0_1(int &) = CopyValue : r1546_10 +#-----| mu0_2(int &) = Store[?] : &:r1546_8, r0_1 +# 1546| v1546_11(void) = ReturnVoid : +# 1546| v1546_12(void) = AliasedUse : ~m? +# 1546| v1546_13(void) = ExitFunction : + # 1550| void data_member_structured_binding() # 1550| Block 0 # 1550| v1550_1(void) = EnterFunction : @@ -11675,6 +11799,56 @@ ir.cpp: # 1590| v1590_32(void) = AliasedUse : ~m? # 1590| v1590_33(void) = ExitFunction : +# 1591| int StructuredBindingTupleRefGet::i +# 1591| Block 0 +# 1591| v1591_1(void) = EnterFunction : +# 1591| mu1591_2(unknown) = AliasedDefinition : +# 1591| mu1591_3(unknown) = InitializeNonLocal : +# 1591| r1591_4(glval) = VariableAddress[#this] : +# 1591| mu1591_5(glval) = InitializeParameter[#this] : &:r1591_4 +# 1591| r1591_6(glval) = Load[#this] : &:r1591_4, ~m? +# 1591| mu1591_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1591_6 +# 1591| r1591_8(glval) = FieldAddress[i] : r1591_6 +# 1591| r1591_9(int) = Constant[1] : +# 1591| mu1591_10(int) = Store[?] : &:r1591_8, r1591_9 +# 1591| v1591_11(void) = ReturnVoid : +# 1591| v1591_12(void) = AliasedUse : ~m? +# 1591| v1591_13(void) = ExitFunction : + +# 1592| double StructuredBindingTupleRefGet::d +# 1592| Block 0 +# 1592| v1592_1(void) = EnterFunction : +# 1592| mu1592_2(unknown) = AliasedDefinition : +# 1592| mu1592_3(unknown) = InitializeNonLocal : +# 1592| r1592_4(glval) = VariableAddress[#this] : +# 1592| mu1592_5(glval) = InitializeParameter[#this] : &:r1592_4 +# 1592| r1592_6(glval) = Load[#this] : &:r1592_4, ~m? +# 1592| mu1592_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1592_6 +# 1592| r1592_8(glval) = FieldAddress[d] : r1592_6 +# 1592| r1592_9(double) = Constant[2.200000000000000178] : +# 1592| mu1592_10(double) = Store[?] : &:r1592_8, r1592_9 +# 1592| v1592_11(void) = ReturnVoid : +# 1592| v1592_12(void) = AliasedUse : ~m? +# 1592| v1592_13(void) = ExitFunction : + +# 1593| int& StructuredBindingTupleRefGet::r +# 1593| Block 0 +# 1593| v1593_1(void) = EnterFunction : +# 1593| mu1593_2(unknown) = AliasedDefinition : +# 1593| mu1593_3(unknown) = InitializeNonLocal : +# 1593| r1593_4(glval) = VariableAddress[#this] : +# 1593| mu1593_5(glval) = InitializeParameter[#this] : &:r1593_4 +# 1593| r1593_6(glval) = Load[#this] : &:r1593_4, ~m? +# 1593| mu1593_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1593_6 +# 1593| r1593_8(glval) = FieldAddress[r] : r1593_6 +# 1593| r1593_9(StructuredBindingTupleRefGet *) = CopyValue : r1593_6 +# 1593| r1593_10(glval) = FieldAddress[i] : r1593_9 +#-----| r0_1(int &) = CopyValue : r1593_10 +#-----| mu0_2(int &) = Store[?] : &:r1593_8, r0_1 +# 1593| v1593_11(void) = ReturnVoid : +# 1593| v1593_12(void) = AliasedUse : ~m? +# 1593| v1593_13(void) = ExitFunction : + # 1618| std::tuple_element::type& StructuredBindingTupleRefGet::get() # 1618| Block 0 # 1618| v1618_1(void) = EnterFunction : @@ -11903,6 +12077,40 @@ ir.cpp: # 1657| v1657_11(void) = AliasedUse : ~m? # 1657| v1657_12(void) = ExitFunction : +# 1658| int StructuredBindingTupleNoRefGet::i +# 1658| Block 0 +# 1658| v1658_1(void) = EnterFunction : +# 1658| mu1658_2(unknown) = AliasedDefinition : +# 1658| mu1658_3(unknown) = InitializeNonLocal : +# 1658| r1658_4(glval) = VariableAddress[#this] : +# 1658| mu1658_5(glval) = InitializeParameter[#this] : &:r1658_4 +# 1658| r1658_6(glval) = Load[#this] : &:r1658_4, ~m? +# 1658| mu1658_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1658_6 +# 1658| r1658_8(glval) = FieldAddress[i] : r1658_6 +# 1658| r1658_9(int) = Constant[1] : +# 1658| mu1658_10(int) = Store[?] : &:r1658_8, r1658_9 +# 1658| v1658_11(void) = ReturnVoid : +# 1658| v1658_12(void) = AliasedUse : ~m? +# 1658| v1658_13(void) = ExitFunction : + +# 1659| int& StructuredBindingTupleNoRefGet::r +# 1659| Block 0 +# 1659| v1659_1(void) = EnterFunction : +# 1659| mu1659_2(unknown) = AliasedDefinition : +# 1659| mu1659_3(unknown) = InitializeNonLocal : +# 1659| r1659_4(glval) = VariableAddress[#this] : +# 1659| mu1659_5(glval) = InitializeParameter[#this] : &:r1659_4 +# 1659| r1659_6(glval) = Load[#this] : &:r1659_4, ~m? +# 1659| mu1659_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1659_6 +# 1659| r1659_8(glval) = FieldAddress[r] : r1659_6 +# 1659| r1659_9(StructuredBindingTupleNoRefGet *) = CopyValue : r1659_6 +# 1659| r1659_10(glval) = FieldAddress[i] : r1659_9 +#-----| r0_1(int &) = CopyValue : r1659_10 +#-----| mu0_2(int &) = Store[?] : &:r1659_8, r0_1 +# 1659| v1659_11(void) = ReturnVoid : +# 1659| v1659_12(void) = AliasedUse : ~m? +# 1659| v1659_13(void) = ExitFunction : + # 1684| std::tuple_element::type StructuredBindingTupleNoRefGet::get() # 1684| Block 0 # 1684| v1684_1(void) = EnterFunction : @@ -19200,6 +19408,109 @@ ir.cpp: # 2867| v2867_13(void) = ReturnVoid : #-----| Goto -> Block 1 +# 2890| int StructInit::i +# 2890| Block 0 +# 2890| v2890_1(void) = EnterFunction : +# 2890| mu2890_2(unknown) = AliasedDefinition : +# 2890| mu2890_3(unknown) = InitializeNonLocal : +# 2890| r2890_4(glval) = VariableAddress[#this] : +# 2890| mu2890_5(glval) = InitializeParameter[#this] : &:r2890_4 +# 2890| r2890_6(glval) = Load[#this] : &:r2890_4, ~m? +# 2890| mu2890_7(StructInit) = InitializeIndirection[#this] : &:r2890_6 +# 2890| r2890_8(glval) = FieldAddress[i] : r2890_6 +# 2890| r2890_9(int) = Constant[42] : +# 2890| mu2890_10(int) = Store[?] : &:r2890_8, r2890_9 +# 2890| v2890_11(void) = ReturnVoid : +# 2890| v2890_12(void) = AliasedUse : ~m? +# 2890| v2890_13(void) = ExitFunction : + +# 2891| int StructInit::j +# 2891| Block 0 +# 2891| v2891_1(void) = EnterFunction : +# 2891| mu2891_2(unknown) = AliasedDefinition : +# 2891| mu2891_3(unknown) = InitializeNonLocal : +# 2891| r2891_4(glval) = VariableAddress[#this] : +# 2891| mu2891_5(glval) = InitializeParameter[#this] : &:r2891_4 +# 2891| r2891_6(glval) = Load[#this] : &:r2891_4, ~m? +# 2891| mu2891_7(StructInit) = InitializeIndirection[#this] : &:r2891_6 +# 2891| r2891_8(glval) = FieldAddress[j] : r2891_6 +# 2891| r2891_9(int) = Constant[42] : +# 2891| mu2891_10(int) = Store[?] : &:r2891_8, r2891_9 +# 2891| v2891_11(void) = ReturnVoid : +# 2891| v2891_12(void) = AliasedUse : ~m? +# 2891| v2891_13(void) = ExitFunction : + +# 2892| int StructInit::k +# 2892| Block 0 +# 2892| v2892_1(void) = EnterFunction : +# 2892| mu2892_2(unknown) = AliasedDefinition : +# 2892| mu2892_3(unknown) = InitializeNonLocal : +# 2892| r2892_4(glval) = VariableAddress[#this] : +# 2892| mu2892_5(glval) = InitializeParameter[#this] : &:r2892_4 +# 2892| r2892_6(glval) = Load[#this] : &:r2892_4, ~m? +# 2892| mu2892_7(StructInit) = InitializeIndirection[#this] : &:r2892_6 +# 2892| r2892_8(glval) = FieldAddress[k] : r2892_6 +# 2892| r2892_9(int) = Constant[42] : +# 2892| mu2892_10(int) = Store[?] : &:r2892_8, r2892_9 +# 2892| v2892_11(void) = ReturnVoid : +# 2892| v2892_12(void) = AliasedUse : ~m? +# 2892| v2892_13(void) = ExitFunction : + +# 2893| int StructInit::l +# 2893| Block 0 +# 2893| v2893_1(void) = EnterFunction : +# 2893| mu2893_2(unknown) = AliasedDefinition : +# 2893| mu2893_3(unknown) = InitializeNonLocal : +# 2893| r2893_4(glval) = VariableAddress[#this] : +# 2893| mu2893_5(glval) = InitializeParameter[#this] : &:r2893_4 +# 2893| r2893_6(glval) = Load[#this] : &:r2893_4, ~m? +# 2893| mu2893_7(StructInit) = InitializeIndirection[#this] : &:r2893_6 +# 2893| r2893_8(glval) = FieldAddress[l] : r2893_6 +# 2893| r2893_9(StructInit *) = CopyValue : r2893_6 +# 2893| r2893_10(glval) = FieldAddress[k] : r2893_9 +# 2893| r2893_11(int) = Load[?] : &:r2893_10, ~m? +# 2893| mu2893_12(int) = Store[?] : &:r2893_8, r2893_11 +# 2893| v2893_13(void) = ReturnVoid : +# 2893| v2893_14(void) = AliasedUse : ~m? +# 2893| v2893_15(void) = ExitFunction : + +# 2894| int StructInit::m +# 2894| Block 0 +# 2894| v2894_1(void) = EnterFunction : +# 2894| mu2894_2(unknown) = AliasedDefinition : +# 2894| mu2894_3(unknown) = InitializeNonLocal : +# 2894| r2894_4(glval) = VariableAddress[#this] : +# 2894| mu2894_5(glval) = InitializeParameter[#this] : &:r2894_4 +# 2894| r2894_6(glval) = Load[#this] : &:r2894_4, ~m? +# 2894| mu2894_7(StructInit) = InitializeIndirection[#this] : &:r2894_6 +# 2894| r2894_8(glval) = FieldAddress[m] : r2894_6 +# 2894| r2894_9(StructInit *) = CopyValue : r2894_6 +# 2894| r2894_10(glval) = FunctionAddress[get_val] : +# 2894| r2894_11(int) = Call[get_val] : func:r2894_10, this:r2894_9 +# 2894| mu2894_12(unknown) = ^CallSideEffect : ~m? +# 2894| v2894_13(void) = ^IndirectReadSideEffect[-1] : &:r2894_9, ~m? +# 2894| mu2894_14(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2894_9 +# 2894| mu2894_15(int) = Store[?] : &:r2894_8, r2894_11 +# 2894| v2894_16(void) = ReturnVoid : +# 2894| v2894_17(void) = AliasedUse : ~m? +# 2894| v2894_18(void) = ExitFunction : + +# 2895| int StructInit::n +# 2895| Block 0 +# 2895| v2895_1(void) = EnterFunction : +# 2895| mu2895_2(unknown) = AliasedDefinition : +# 2895| mu2895_3(unknown) = InitializeNonLocal : +# 2895| r2895_4(glval) = VariableAddress[#this] : +# 2895| mu2895_5(glval) = InitializeParameter[#this] : &:r2895_4 +# 2895| r2895_6(glval) = Load[#this] : &:r2895_4, ~m? +# 2895| mu2895_7(StructInit) = InitializeIndirection[#this] : &:r2895_6 +# 2895| r2895_8(glval) = FieldAddress[n] : r2895_6 +# 2895| r2895_9(int) = Constant[42] : +# 2895| mu2895_10(int) = Store[?] : &:r2895_8, r2895_9 +# 2895| v2895_11(void) = ReturnVoid : +# 2895| v2895_12(void) = AliasedUse : ~m? +# 2895| v2895_13(void) = ExitFunction : + # 2897| void StructInit::StructInit(int) # 2897| Block 0 # 2897| v2897_1(void) = EnterFunction : From b91a52a050c521842951ecbb42ede17f48945aa6 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Mon, 2 Mar 2026 15:59:34 +0100 Subject: [PATCH 42/81] C++: Allow `getInstructionFunction` to yield a declaration --- .../semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll | 6 +++++- .../semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll | 5 +++-- .../code/cpp/ir/implementation/aliased_ssa/Instruction.qll | 6 +++--- .../semmle/code/cpp/ir/implementation/raw/Instruction.qll | 6 +++--- .../cpp/ir/implementation/raw/internal/IRConstruction.qll | 2 +- .../cpp/ir/implementation/raw/internal/TranslatedCall.qll | 2 +- .../ir/implementation/raw/internal/TranslatedElement.qll | 2 +- .../cpp/ir/implementation/raw/internal/TranslatedExpr.qll | 6 +++--- .../cpp/ir/implementation/unaliased_ssa/Instruction.qll | 6 +++--- 9 files changed, 23 insertions(+), 18 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index 1895726ecb4..afec2384b23 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -878,7 +878,11 @@ module Public { /** Gets the parameter through which this value is assigned. */ Parameter getParameter() { - result = this.getCallInstruction().getStaticCallTarget().getParameter(this.getArgumentIndex()) + result = + this.getCallInstruction() + .getStaticCallTarget() + .(Function) + .getParameter(this.getArgumentIndex()) } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll index 45a6755356b..4d109c0716d 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll @@ -175,7 +175,8 @@ private class PointerWrapperTypeIndirection extends Indirection instanceof Point override predicate isAdditionalDereference(Instruction deref, Operand address) { exists(CallInstruction call | operandForFullyConvertedCall(getAUse(deref), call) and - this = call.getStaticCallTarget().getClassAndName(["operator*", "operator->", "get"]) and + this = + call.getStaticCallTarget().(Function).getClassAndName(["operator*", "operator->", "get"]) and address = call.getThisArgumentOperand() ) } @@ -194,7 +195,7 @@ private module IteratorIndirections { override predicate isAdditionalWrite(Node0Impl value, Operand address, boolean certain) { exists(CallInstruction call | call.getArgumentOperand(0) = value.asOperand() | - this = call.getStaticCallTarget().getClassAndName("operator=") and + this = call.getStaticCallTarget().(Function).getClassAndName("operator=") and address = call.getThisArgumentOperand() and certain = false ) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index 8d3e960c3f8..b7dcd4d8f75 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -495,7 +495,7 @@ class FieldInstruction extends Instruction { * `FunctionAddress` instruction. */ class FunctionInstruction extends Instruction { - Language::Function funcSymbol; + Language::Declaration funcSymbol; FunctionInstruction() { funcSymbol = Raw::getInstructionFunction(this) } @@ -504,7 +504,7 @@ class FunctionInstruction extends Instruction { /** * Gets the function that this instruction references. */ - final Language::Function getFunctionSymbol() { result = funcSymbol } + final Language::Declaration getFunctionSymbol() { result = funcSymbol } } /** @@ -1678,7 +1678,7 @@ class CallInstruction extends Instruction { /** * Gets the `Function` that the call targets, if this is statically known. */ - final Language::Function getStaticCallTarget() { + final Language::Declaration getStaticCallTarget() { result = this.getCallTarget().(FunctionAddressInstruction).getFunctionSymbol() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll index 8d3e960c3f8..b7dcd4d8f75 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -495,7 +495,7 @@ class FieldInstruction extends Instruction { * `FunctionAddress` instruction. */ class FunctionInstruction extends Instruction { - Language::Function funcSymbol; + Language::Declaration funcSymbol; FunctionInstruction() { funcSymbol = Raw::getInstructionFunction(this) } @@ -504,7 +504,7 @@ class FunctionInstruction extends Instruction { /** * Gets the function that this instruction references. */ - final Language::Function getFunctionSymbol() { result = funcSymbol } + final Language::Declaration getFunctionSymbol() { result = funcSymbol } } /** @@ -1678,7 +1678,7 @@ class CallInstruction extends Instruction { /** * Gets the `Function` that the call targets, if this is statically known. */ - final Language::Function getStaticCallTarget() { + final Language::Declaration getStaticCallTarget() { result = this.getCallTarget().(FunctionAddressInstruction).getFunctionSymbol() } 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 7a667fcc017..f3d88908cd6 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 @@ -115,7 +115,7 @@ module Raw { } cached - Function getInstructionFunction(Instruction instruction) { + Declaration getInstructionFunction(Instruction instruction) { result = getInstructionTranslatedElement(instruction) .getInstructionFunction(getInstructionTag(instruction)) 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 1a5c65d364d..f3d084883a7 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 @@ -348,7 +348,7 @@ class TranslatedExprCall extends TranslatedCallExpr { class TranslatedFunctionCall extends TranslatedCallExpr, TranslatedDirectCall { override FunctionCall expr; - override Function getInstructionFunction(InstructionTag tag) { + override Declaration getInstructionFunction(InstructionTag tag) { tag = CallTargetTag() and result = expr.getTarget() } 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 c30cc4bbc5c..117c92e3fe5 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 @@ -1182,7 +1182,7 @@ abstract class TranslatedElement extends TTranslatedElement { * If the instruction specified by `tag` is a `FunctionInstruction`, gets the * `Function` for that instruction. */ - Function getInstructionFunction(InstructionTag tag) { none() } + Declaration getInstructionFunction(InstructionTag tag) { none() } /** * If the instruction specified by `tag` is a `VariableInstruction`, gets the diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 712f140e5b8..9a437b90538 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 @@ -1264,7 +1264,7 @@ class TranslatedFunctionAccess extends TranslatedNonConstantExpr { resultType = this.getResultType() } - override Function getInstructionFunction(InstructionTag tag) { + override Declaration getInstructionFunction(InstructionTag tag) { tag = OnlyInstructionTag() and result = expr.getTarget() } @@ -2547,7 +2547,7 @@ class TranslatedAllocatorCall extends TTranslatedAllocatorCall, TranslatedDirect any() } - override Function getInstructionFunction(InstructionTag tag) { + override Declaration getInstructionFunction(InstructionTag tag) { tag = CallTargetTag() and result = expr.getAllocator() } @@ -2630,7 +2630,7 @@ class TranslatedDeleteOrDeleteArrayExpr extends TranslatedNonConstantExpr, Trans result = this.getFirstArgumentOrCallInstruction(kind) } - override Function getInstructionFunction(InstructionTag tag) { + override Declaration getInstructionFunction(InstructionTag tag) { tag = CallTargetTag() and result = expr.getDeallocator() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index 8d3e960c3f8..b7dcd4d8f75 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -495,7 +495,7 @@ class FieldInstruction extends Instruction { * `FunctionAddress` instruction. */ class FunctionInstruction extends Instruction { - Language::Function funcSymbol; + Language::Declaration funcSymbol; FunctionInstruction() { funcSymbol = Raw::getInstructionFunction(this) } @@ -504,7 +504,7 @@ class FunctionInstruction extends Instruction { /** * Gets the function that this instruction references. */ - final Language::Function getFunctionSymbol() { result = funcSymbol } + final Language::Declaration getFunctionSymbol() { result = funcSymbol } } /** @@ -1678,7 +1678,7 @@ class CallInstruction extends Instruction { /** * Gets the `Function` that the call targets, if this is statically known. */ - final Language::Function getStaticCallTarget() { + final Language::Declaration getStaticCallTarget() { result = this.getCallTarget().(FunctionAddressInstruction).getFunctionSymbol() } From e986d8922aefb2c3c6afb98a2ebdccab002b309d Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 3 Mar 2026 11:20:17 +0100 Subject: [PATCH 43/81] C++: Call functions for NSDMI initialization Currently missing: side-effect information for the functions --- .../raw/internal/TranslatedElement.qll | 10 +- .../raw/internal/TranslatedInitialization.qll | 88 +++++- .../library-tests/ir/ir/aliased_ir.expected | 279 +++++++++++------- .../ir/ir/raw_consistency.expected | 4 - .../test/library-tests/ir/ir/raw_ir.expected | 195 ++++++------ 5 files changed, 369 insertions(+), 207 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 117c92e3fe5..66ad2ae2679 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 @@ -767,7 +767,7 @@ newtype TTranslatedElement = expr = initList.getFieldExpr(field, position).getFullyConverted() ) or - exists(ConstructorFieldInit init | + exists(ConstructorDirectFieldInit init | not ignoreExpr(init) and ast = init and field = init.getTarget() and @@ -775,6 +775,14 @@ newtype TTranslatedElement = position = -1 ) } or + // The initialization of a field via a default member initializer. + TTranslatedDefaultFieldInitialization(Expr ast, Field field) { + exists(ConstructorDefaultFieldInit init | + not ignoreExpr(init) and + ast = init and + field = init.getTarget() + ) + } or // The value initialization of a field due to an omitted member of an // initializer list. TTranslatedFieldValueInitialization(Expr ast, Field field) { 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 581b0886f7f..f5d092ca44a 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 @@ -533,10 +533,7 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { result = getEnclosingVariable(ast).(Field) } - final override Instruction getFirstInstruction(EdgeKind kind) { - result = this.getInstruction(this.getFieldAddressTag()) and - kind instanceof GotoEdge - } + final Field getField() { result = field } /** * Gets the zero-based index describing the order in which this field is to be @@ -544,6 +541,20 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { */ final int getOrder() { result = field.getInitializationOrder() } + /** Gets the position in the initializer list, or `-1` if the initialization is implicit. */ + int getPosition() { result = -1 } +} + +/** + * Represents the IR translation of the initialization of a field from an + * element of an initializer list where default initialization is not used. + */ +abstract class TranslatedNonDefaultFieldInitialization extends TranslatedFieldInitialization { + final override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getInstruction(this.getFieldAddressTag()) and + kind instanceof GotoEdge + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = this.getFieldAddressTag() and opcode instanceof Opcode::FieldAddress and @@ -561,18 +572,13 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { } final InstructionTag getFieldAddressTag() { result = InitializerFieldAddressTag() } - - final Field getField() { result = field } - - /** Gets the position in the initializer list, or `-1` if the initialization is implicit. */ - int getPosition() { result = -1 } } /** * Represents the IR translation of the initialization of a field from an * explicit element in an initializer list. */ -class TranslatedExplicitFieldInitialization extends TranslatedFieldInitialization, +class TranslatedExplicitFieldInitialization extends TranslatedNonDefaultFieldInitialization, InitializationContext, TTranslatedExplicitFieldInitialization { Expr expr; @@ -612,6 +618,61 @@ class TranslatedExplicitFieldInitialization extends TranslatedFieldInitializatio override int getPosition() { result = position } } +/** + * Represents the IR translation of the initialization of a field from an + * element of an initializer list where default initialization is used. + */ +class TranslatedDefaultFieldInitialization extends TranslatedFieldInitialization, + TTranslatedDefaultFieldInitialization +{ + TranslatedDefaultFieldInitialization() { + this = TTranslatedDefaultFieldInitialization(ast, field) + } + + final override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getInstruction(CallTargetTag()) and + kind instanceof GotoEdge + } + + override Instruction getALastInstructionInternal() { result = this.getInstruction(CallTag()) } + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + tag = CallTargetTag() and + result = this.getInstruction(CallTag()) + or + tag = CallTag() and + result = this.getParent().getChildSuccessor(this, kind) + } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + tag = CallTargetTag() and + opcode instanceof Opcode::FunctionAddress and + resultType = getFunctionGLValueType() + or + tag = CallTag() and + opcode instanceof Opcode::Call and + resultType = getVoidType() + } + + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + tag = CallTag() and + ( + operandTag instanceof CallTargetOperandTag and + result = this.getInstruction(CallTargetTag()) + or + operandTag instanceof ThisArgumentOperandTag and + result = getTranslatedFunction(this.getFunction()).getLoadThisInstruction() + ) + } + + override Declaration getInstructionFunction(InstructionTag tag) { + tag = CallTargetTag() and + result = field + } + + override TranslatedElement getChild(int id) { none() } +} + private string getZeroValue(Type type) { if type instanceof FloatingPointType then result = "0.0" else result = "0" } @@ -620,7 +681,7 @@ private string getZeroValue(Type type) { * Represents the IR translation of the initialization of a field without a * corresponding element in the initializer list. */ -class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, +class TranslatedFieldValueInitialization extends TranslatedNonDefaultFieldInitialization, TTranslatedFieldValueInitialization { TranslatedFieldValueInitialization() { this = TTranslatedFieldValueInitialization(ast, field) } @@ -630,7 +691,7 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { - TranslatedFieldInitialization.super.hasInstruction(opcode, tag, resultType) + TranslatedNonDefaultFieldInitialization.super.hasInstruction(opcode, tag, resultType) or tag = this.getFieldDefaultValueTag() and opcode instanceof Opcode::Constant and @@ -661,7 +722,8 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, } override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { - result = TranslatedFieldInitialization.super.getInstructionRegisterOperand(tag, operandTag) + result = + TranslatedNonDefaultFieldInitialization.super.getInstructionRegisterOperand(tag, operandTag) or tag = this.getFieldDefaultValueStoreTag() 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 40a424f7f9a..20e254f066e 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -12369,11 +12369,14 @@ ir.cpp: # 1533| m1533_6(glval) = InitializeParameter[#this] : &:r1533_5 # 1533| r1533_7(glval) = Load[#this] : &:r1533_5, m1533_6 # 1533| m1533_8(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1533_7 -# 1533| v1533_9(void) = NoOp : -# 1533| v1533_10(void) = ReturnIndirection[#this] : &:r1533_7, m1533_8 -# 1533| v1533_11(void) = ReturnVoid : -# 1533| v1533_12(void) = AliasedUse : m1533_3 -# 1533| v1533_13(void) = ExitFunction : +# 1533| m1533_9(unknown) = Chi : total:m1533_4, partial:m1533_8 +# 1533| r1533_10(glval) = FunctionAddress[x] : +# 1533| v1533_11(void) = Call[x] : func:r1533_10, this:r1533_7 +# 1533| v1533_12(void) = NoOp : +# 1533| v1533_13(void) = ReturnIndirection[#this] : &:r1533_7, m1533_8 +# 1533| v1533_14(void) = ReturnVoid : +# 1533| v1533_15(void) = AliasedUse : ~m1533_9 +# 1533| v1533_16(void) = ExitFunction : # 1534| int StructuredBindingDataMemberMemberStruct::x # 1534| Block 0 @@ -12395,19 +12398,39 @@ ir.cpp: # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() # 1537| Block 0 -# 1537| v1537_1(void) = EnterFunction : -# 1537| m1537_2(unknown) = AliasedDefinition : -# 1537| m1537_3(unknown) = InitializeNonLocal : -# 1537| m1537_4(unknown) = Chi : total:m1537_2, partial:m1537_3 -# 1537| r1537_5(glval) = VariableAddress[#this] : -# 1537| m1537_6(glval) = InitializeParameter[#this] : &:r1537_5 -# 1537| r1537_7(glval) = Load[#this] : &:r1537_5, m1537_6 -# 1537| m1537_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1537_7 -# 1537| v1537_9(void) = NoOp : -# 1537| v1537_10(void) = ReturnIndirection[#this] : &:r1537_7, m1537_8 -# 1537| v1537_11(void) = ReturnVoid : -# 1537| v1537_12(void) = AliasedUse : m1537_3 -# 1537| v1537_13(void) = ExitFunction : +# 1537| v1537_1(void) = EnterFunction : +# 1537| m1537_2(unknown) = AliasedDefinition : +# 1537| m1537_3(unknown) = InitializeNonLocal : +# 1537| m1537_4(unknown) = Chi : total:m1537_2, partial:m1537_3 +# 1537| r1537_5(glval) = VariableAddress[#this] : +# 1537| m1537_6(glval) = InitializeParameter[#this] : &:r1537_5 +# 1537| r1537_7(glval) = Load[#this] : &:r1537_5, m1537_6 +# 1537| m1537_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1537_7 +# 1537| m1537_9(unknown) = Chi : total:m1537_4, partial:m1537_8 +# 1537| r1537_10(glval) = FunctionAddress[i] : +# 1537| v1537_11(void) = Call[i] : func:r1537_10, this:r1537_7 +# 1537| r1537_12(glval) = FunctionAddress[d] : +# 1537| v1537_13(void) = Call[d] : func:r1537_12, this:r1537_7 +# 1537| r1537_14(glval) = FunctionAddress[r] : +# 1537| v1537_15(void) = Call[r] : func:r1537_14, this:r1537_7 +# 1537| r1537_16(glval) = FunctionAddress[p] : +# 1537| v1537_17(void) = Call[p] : func:r1537_16, this:r1537_7 +# 1537| r1537_18(glval) = FunctionAddress[xs] : +# 1537| v1537_19(void) = Call[xs] : func:r1537_18, this:r1537_7 +# 1537| r1537_20(glval) = FunctionAddress[r_alt] : +# 1537| v1537_21(void) = Call[r_alt] : func:r1537_20, this:r1537_7 +# 1537| r1537_22(glval) = FieldAddress[m] : r1537_7 +# 1537| r1537_23(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : +# 1537| v1537_24(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_23, this:r1537_22 +# 1537| m1537_25(unknown) = ^CallSideEffect : ~m1537_9 +# 1537| m1537_26(unknown) = Chi : total:m1537_9, partial:m1537_25 +# 1537| m1537_27(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_22 +# 1537| m1537_28(unknown) = Chi : total:m1537_26, partial:m1537_27 +# 1537| v1537_29(void) = NoOp : +# 1537| v1537_30(void) = ReturnIndirection[#this] : &:r1537_7, ~m1537_28 +# 1537| v1537_31(void) = ReturnVoid : +# 1537| v1537_32(void) = AliasedUse : ~m1537_28 +# 1537| v1537_33(void) = ExitFunction : # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) # 1537| Block 0 @@ -12626,15 +12649,16 @@ ir.cpp: # 1550| m1550_4(unknown) = Chi : total:m1550_2, partial:m1550_3 # 1551| r1551_1(glval) = VariableAddress[s] : # 1551| m1551_2(StructuredBindingDataMemberStruct) = Uninitialized[s] : &:r1551_1 -# 1551| r1551_3(glval) = FunctionAddress[StructuredBindingDataMemberStruct] : -# 1551| v1551_4(void) = Call[StructuredBindingDataMemberStruct] : func:r1551_3, this:r1551_1 -# 1551| m1551_5(unknown) = ^CallSideEffect : ~m1550_4 -# 1551| m1551_6(unknown) = Chi : total:m1550_4, partial:m1551_5 -# 1551| m1551_7(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1551_1 -# 1551| m1551_8(StructuredBindingDataMemberStruct) = Chi : total:m1551_2, partial:m1551_7 +# 1551| m1551_3(unknown) = Chi : total:m1550_4, partial:m1551_2 +# 1551| r1551_4(glval) = FunctionAddress[StructuredBindingDataMemberStruct] : +# 1551| v1551_5(void) = Call[StructuredBindingDataMemberStruct] : func:r1551_4, this:r1551_1 +# 1551| m1551_6(unknown) = ^CallSideEffect : ~m1551_3 +# 1551| m1551_7(unknown) = Chi : total:m1551_3, partial:m1551_6 +# 1551| m1551_8(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1551_1 +# 1551| m1551_9(unknown) = Chi : total:m1551_7, partial:m1551_8 # 1554| r1554_1(glval) = VariableAddress[(unnamed local variable)] : # 1554| r1554_2(glval) = VariableAddress[s] : -# 1554| r1554_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1554_2, m1551_8 +# 1554| r1554_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1554_2, ~m1551_9 # 1554| m1554_4(StructuredBindingDataMemberStruct) = Store[(unnamed local variable)] : &:r1554_1, r1554_3 # 1554| r1554_5(glval) = VariableAddress[i] : # 1554| r1554_6(glval) = VariableAddress[(unnamed local variable)] : @@ -12691,7 +12715,7 @@ ir.cpp: # 1558| r1558_2(glval) = VariableAddress[r] : # 1558| r1558_3(int &) = Load[r] : &:r1558_2, m1554_22 # 1558| m1558_4(int) = Store[?] : &:r1558_3, r1558_1 -# 1558| m1558_5(unknown) = Chi : total:m1551_6, partial:m1558_4 +# 1558| m1558_5(unknown) = Chi : total:m1551_9, partial:m1558_4 # 1559| r1559_1(int) = Constant[6] : # 1559| r1559_2(glval) = VariableAddress[p] : # 1559| r1559_3(int *&) = Load[p] : &:r1559_2, m1554_26 @@ -12716,7 +12740,7 @@ ir.cpp: # 1562| m1562_5(int) = Store[w] : &:r1562_1, r1562_4 # 1566| r1566_1(glval) = VariableAddress[unnamed_local_variable] : # 1566| r1566_2(glval) = VariableAddress[s] : -# 1566| r1566_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1566_2, m1551_8 +# 1566| r1566_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1566_2, ~m1559_7 # 1566| m1566_4(StructuredBindingDataMemberStruct) = Store[unnamed_local_variable] : &:r1566_1, r1566_3 # 1567| r1567_1(glval) = VariableAddress[i] : # 1567| r1567_2(glval) = VariableAddress[unnamed_local_variable] : @@ -12802,11 +12826,18 @@ ir.cpp: # 1590| m1590_6(glval) = InitializeParameter[#this] : &:r1590_5 # 1590| r1590_7(glval) = Load[#this] : &:r1590_5, m1590_6 # 1590| m1590_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1590_7 -# 1590| v1590_9(void) = NoOp : -# 1590| v1590_10(void) = ReturnIndirection[#this] : &:r1590_7, m1590_8 -# 1590| v1590_11(void) = ReturnVoid : -# 1590| v1590_12(void) = AliasedUse : m1590_3 -# 1590| v1590_13(void) = ExitFunction : +# 1590| m1590_9(unknown) = Chi : total:m1590_4, partial:m1590_8 +# 1590| r1590_10(glval) = FunctionAddress[i] : +# 1590| v1590_11(void) = Call[i] : func:r1590_10, this:r1590_7 +# 1590| r1590_12(glval) = FunctionAddress[d] : +# 1590| v1590_13(void) = Call[d] : func:r1590_12, this:r1590_7 +# 1590| r1590_14(glval) = FunctionAddress[r] : +# 1590| v1590_15(void) = Call[r] : func:r1590_14, this:r1590_7 +# 1590| v1590_16(void) = NoOp : +# 1590| v1590_17(void) = ReturnIndirection[#this] : &:r1590_7, m1590_8 +# 1590| v1590_18(void) = ReturnVoid : +# 1590| v1590_19(void) = AliasedUse : ~m1590_9 +# 1590| v1590_20(void) = ExitFunction : # 1590| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) # 1590| Block 0 @@ -12986,22 +13017,23 @@ ir.cpp: # 1630| m1630_4(unknown) = Chi : total:m1630_2, partial:m1630_3 # 1631| r1631_1(glval) = VariableAddress[t] : # 1631| m1631_2(StructuredBindingTupleRefGet) = Uninitialized[t] : &:r1631_1 -# 1631| r1631_3(glval) = FunctionAddress[StructuredBindingTupleRefGet] : -# 1631| v1631_4(void) = Call[StructuredBindingTupleRefGet] : func:r1631_3, this:r1631_1 -# 1631| m1631_5(unknown) = ^CallSideEffect : ~m1630_4 -# 1631| m1631_6(unknown) = Chi : total:m1630_4, partial:m1631_5 -# 1631| m1631_7(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1631_1 -# 1631| m1631_8(StructuredBindingTupleRefGet) = Chi : total:m1631_2, partial:m1631_7 +# 1631| m1631_3(unknown) = Chi : total:m1630_4, partial:m1631_2 +# 1631| r1631_4(glval) = FunctionAddress[StructuredBindingTupleRefGet] : +# 1631| v1631_5(void) = Call[StructuredBindingTupleRefGet] : func:r1631_4, this:r1631_1 +# 1631| m1631_6(unknown) = ^CallSideEffect : ~m1631_3 +# 1631| m1631_7(unknown) = Chi : total:m1631_3, partial:m1631_6 +# 1631| m1631_8(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1631_1 +# 1631| m1631_9(unknown) = Chi : total:m1631_7, partial:m1631_8 # 1634| r1634_1(glval) = VariableAddress[(unnamed local variable)] : # 1634| r1634_2(glval) = VariableAddress[t] : -# 1634| r1634_3(StructuredBindingTupleRefGet) = Load[t] : &:r1634_2, m1631_8 +# 1634| r1634_3(StructuredBindingTupleRefGet) = Load[t] : &:r1634_2, ~m1631_9 # 1634| m1634_4(StructuredBindingTupleRefGet) = Store[(unnamed local variable)] : &:r1634_1, r1634_3 # 1634| r1634_5(glval) = VariableAddress[i] : # 1634| r1634_6(glval) = VariableAddress[(unnamed local variable)] : # 1634| r1634_7(glval) = FunctionAddress[get] : # 1634| r1634_8(int &) = Call[get] : func:r1634_7, this:r1634_6 -# 1634| m1634_9(unknown) = ^CallSideEffect : ~m1631_6 -# 1634| m1634_10(unknown) = Chi : total:m1631_6, partial:m1634_9 +# 1634| m1634_9(unknown) = ^CallSideEffect : ~m1631_9 +# 1634| m1634_10(unknown) = Chi : total:m1631_9, partial:m1634_9 # 1634| v1634_11(void) = ^IndirectReadSideEffect[-1] : &:r1634_6, m1634_4 # 1634| m1634_12(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1634_6 # 1634| m1634_13(StructuredBindingTupleRefGet) = Chi : total:m1634_4, partial:m1634_12 @@ -13068,7 +13100,7 @@ ir.cpp: # 1640| m1640_5(int) = Store[w] : &:r1640_1, r1640_4 # 1644| r1644_1(glval) = VariableAddress[unnamed_local_variable] : # 1644| r1644_2(glval) = VariableAddress[t] : -# 1644| r1644_3(StructuredBindingTupleRefGet) = Load[t] : &:r1644_2, m1631_8 +# 1644| r1644_3(StructuredBindingTupleRefGet) = Load[t] : &:r1644_2, ~m1638_6 # 1644| m1644_4(StructuredBindingTupleRefGet) = Store[unnamed_local_variable] : &:r1644_1, r1644_3 # 1645| r1645_1(glval) = VariableAddress[i] : # 1645| r1645_2(glval) = VariableAddress[unnamed_local_variable] : @@ -13155,11 +13187,16 @@ ir.cpp: # 1657| m1657_6(glval) = InitializeParameter[#this] : &:r1657_5 # 1657| r1657_7(glval) = Load[#this] : &:r1657_5, m1657_6 # 1657| m1657_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1657_7 -# 1657| v1657_9(void) = NoOp : -# 1657| v1657_10(void) = ReturnIndirection[#this] : &:r1657_7, m1657_8 -# 1657| v1657_11(void) = ReturnVoid : -# 1657| v1657_12(void) = AliasedUse : m1657_3 -# 1657| v1657_13(void) = ExitFunction : +# 1657| m1657_9(unknown) = Chi : total:m1657_4, partial:m1657_8 +# 1657| r1657_10(glval) = FunctionAddress[i] : +# 1657| v1657_11(void) = Call[i] : func:r1657_10, this:r1657_7 +# 1657| r1657_12(glval) = FunctionAddress[r] : +# 1657| v1657_13(void) = Call[r] : func:r1657_12, this:r1657_7 +# 1657| v1657_14(void) = NoOp : +# 1657| v1657_15(void) = ReturnIndirection[#this] : &:r1657_7, m1657_8 +# 1657| v1657_16(void) = ReturnVoid : +# 1657| v1657_17(void) = AliasedUse : ~m1657_9 +# 1657| v1657_18(void) = ExitFunction : # 1658| int StructuredBindingTupleNoRefGet::i # 1658| Block 0 @@ -13276,12 +13313,13 @@ ir.cpp: # 1696| m1696_4(unknown) = Chi : total:m1696_2, partial:m1696_3 # 1697| r1697_1(glval) = VariableAddress[t] : # 1697| m1697_2(StructuredBindingTupleNoRefGet) = Uninitialized[t] : &:r1697_1 -# 1697| r1697_3(glval) = FunctionAddress[StructuredBindingTupleNoRefGet] : -# 1697| v1697_4(void) = Call[StructuredBindingTupleNoRefGet] : func:r1697_3, this:r1697_1 -# 1697| m1697_5(unknown) = ^CallSideEffect : ~m1696_4 -# 1697| m1697_6(unknown) = Chi : total:m1696_4, partial:m1697_5 -# 1697| m1697_7(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1697_1 -# 1697| m1697_8(StructuredBindingTupleNoRefGet) = Chi : total:m1697_2, partial:m1697_7 +# 1697| m1697_3(unknown) = Chi : total:m1696_4, partial:m1697_2 +# 1697| r1697_4(glval) = FunctionAddress[StructuredBindingTupleNoRefGet] : +# 1697| v1697_5(void) = Call[StructuredBindingTupleNoRefGet] : func:r1697_4, this:r1697_1 +# 1697| m1697_6(unknown) = ^CallSideEffect : ~m1697_3 +# 1697| m1697_7(unknown) = Chi : total:m1697_3, partial:m1697_6 +# 1697| m1697_8(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1697_1 +# 1697| m1697_9(unknown) = Chi : total:m1697_7, partial:m1697_8 # 1700| r1700_1(glval) = VariableAddress[(unnamed local variable)] : # 1700| r1700_2(glval) = VariableAddress[t] : # 1700| r1700_3(StructuredBindingTupleNoRefGet &) = CopyValue : r1700_2 @@ -13293,11 +13331,11 @@ ir.cpp: # 1700| r1700_9(glval) = CopyValue : r1700_8 # 1700| r1700_10(glval) = FunctionAddress[get] : # 1700| r1700_11(int) = Call[get] : func:r1700_10, this:r1700_9 -# 1700| m1700_12(unknown) = ^CallSideEffect : ~m1697_6 -# 1700| m1700_13(unknown) = Chi : total:m1697_6, partial:m1700_12 -# 1700| v1700_14(void) = ^IndirectReadSideEffect[-1] : &:r1700_9, m1697_8 +# 1700| m1700_12(unknown) = ^CallSideEffect : ~m1697_9 +# 1700| m1700_13(unknown) = Chi : total:m1697_9, partial:m1700_12 +# 1700| v1700_14(void) = ^IndirectReadSideEffect[-1] : &:r1700_9, ~m1700_13 # 1700| m1700_15(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1700_9 -# 1700| m1700_16(StructuredBindingTupleNoRefGet) = Chi : total:m1697_8, partial:m1700_15 +# 1700| m1700_16(unknown) = Chi : total:m1700_13, partial:m1700_15 # 1700| m1700_17(int) = Store[#temp1700:16] : &:r1700_6, r1700_11 # 1700| r1700_18(int &) = CopyValue : r1700_6 # 1700| m1700_19(int &&) = Store[i] : &:r1700_5, r1700_18 @@ -13307,11 +13345,11 @@ ir.cpp: # 1700| r1700_23(glval) = CopyValue : r1700_22 # 1700| r1700_24(glval) = FunctionAddress[get] : # 1700| r1700_25(int &) = Call[get] : func:r1700_24, this:r1700_23 -# 1700| m1700_26(unknown) = ^CallSideEffect : ~m1700_13 -# 1700| m1700_27(unknown) = Chi : total:m1700_13, partial:m1700_26 -# 1700| v1700_28(void) = ^IndirectReadSideEffect[-1] : &:r1700_23, m1700_16 +# 1700| m1700_26(unknown) = ^CallSideEffect : ~m1700_16 +# 1700| m1700_27(unknown) = Chi : total:m1700_16, partial:m1700_26 +# 1700| v1700_28(void) = ^IndirectReadSideEffect[-1] : &:r1700_23, ~m1700_27 # 1700| m1700_29(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1700_23 -# 1700| m1700_30(StructuredBindingTupleNoRefGet) = Chi : total:m1700_16, partial:m1700_29 +# 1700| m1700_30(unknown) = Chi : total:m1700_27, partial:m1700_29 # 1700| r1700_31(glval) = CopyValue : r1700_25 # 1700| r1700_32(int &) = CopyValue : r1700_31 # 1700| m1700_33(int &) = Store[r] : &:r1700_20, r1700_32 @@ -13321,11 +13359,11 @@ ir.cpp: # 1700| r1700_37(glval) = CopyValue : r1700_36 # 1700| r1700_38(glval) = FunctionAddress[get] : # 1700| r1700_39(int &&) = Call[get] : func:r1700_38, this:r1700_37 -# 1700| m1700_40(unknown) = ^CallSideEffect : ~m1700_27 -# 1700| m1700_41(unknown) = Chi : total:m1700_27, partial:m1700_40 -# 1700| v1700_42(void) = ^IndirectReadSideEffect[-1] : &:r1700_37, m1700_30 +# 1700| m1700_40(unknown) = ^CallSideEffect : ~m1700_30 +# 1700| m1700_41(unknown) = Chi : total:m1700_30, partial:m1700_40 +# 1700| v1700_42(void) = ^IndirectReadSideEffect[-1] : &:r1700_37, ~m1700_41 # 1700| m1700_43(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1700_37 -# 1700| m1700_44(StructuredBindingTupleNoRefGet) = Chi : total:m1700_30, partial:m1700_43 +# 1700| m1700_44(unknown) = Chi : total:m1700_41, partial:m1700_43 # 1700| r1700_45(glval) = CopyValue : r1700_39 # 1700| r1700_46(int &) = CopyValue : r1700_45 # 1700| m1700_47(int &&) = Store[rv] : &:r1700_34, r1700_46 @@ -13350,7 +13388,7 @@ ir.cpp: # 1704| r1704_3(int &) = Load[r] : &:r1704_2, m1700_33 # 1704| r1704_4(glval) = CopyValue : r1704_3 # 1704| m1704_5(int) = Store[?] : &:r1704_4, r1704_1 -# 1704| m1704_6(unknown) = Chi : total:m1700_41, partial:m1704_5 +# 1704| m1704_6(unknown) = Chi : total:m1700_44, partial:m1704_5 # 1705| r1705_1(glval) = VariableAddress[rr] : # 1705| r1705_2(glval) = VariableAddress[r] : # 1705| r1705_3(int &) = Load[r] : &:r1705_2, m1700_33 @@ -13375,9 +13413,9 @@ ir.cpp: # 1711| r1711_7(int) = Call[get] : func:r1711_6, this:r1711_5 # 1711| m1711_8(unknown) = ^CallSideEffect : ~m1704_6 # 1711| m1711_9(unknown) = Chi : total:m1704_6, partial:m1711_8 -# 1711| v1711_10(void) = ^IndirectReadSideEffect[-1] : &:r1711_5, m1700_44 +# 1711| v1711_10(void) = ^IndirectReadSideEffect[-1] : &:r1711_5, ~m1711_9 # 1711| m1711_11(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1711_5 -# 1711| m1711_12(StructuredBindingTupleNoRefGet) = Chi : total:m1700_44, partial:m1711_11 +# 1711| m1711_12(unknown) = Chi : total:m1711_9, partial:m1711_11 # 1711| m1711_13(int) = Store[#temp1711:20] : &:r1711_2, r1711_7 # 1711| r1711_14(int &) = CopyValue : r1711_2 # 1711| m1711_15(int &&) = Store[i] : &:r1711_1, r1711_14 @@ -13387,11 +13425,11 @@ ir.cpp: # 1712| r1712_4(glval) = CopyValue : r1712_3 # 1712| r1712_5(glval) = FunctionAddress[get] : # 1712| r1712_6(int &) = Call[get] : func:r1712_5, this:r1712_4 -# 1712| m1712_7(unknown) = ^CallSideEffect : ~m1711_9 -# 1712| m1712_8(unknown) = Chi : total:m1711_9, partial:m1712_7 -# 1712| v1712_9(void) = ^IndirectReadSideEffect[-1] : &:r1712_4, m1711_12 +# 1712| m1712_7(unknown) = ^CallSideEffect : ~m1711_12 +# 1712| m1712_8(unknown) = Chi : total:m1711_12, partial:m1712_7 +# 1712| v1712_9(void) = ^IndirectReadSideEffect[-1] : &:r1712_4, ~m1712_8 # 1712| m1712_10(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1712_4 -# 1712| m1712_11(StructuredBindingTupleNoRefGet) = Chi : total:m1711_12, partial:m1712_10 +# 1712| m1712_11(unknown) = Chi : total:m1712_8, partial:m1712_10 # 1712| r1712_12(glval) = CopyValue : r1712_6 # 1712| r1712_13(int &) = CopyValue : r1712_12 # 1712| m1712_14(int &) = Store[r] : &:r1712_1, r1712_13 @@ -13401,11 +13439,11 @@ ir.cpp: # 1713| r1713_4(glval) = CopyValue : r1713_3 # 1713| r1713_5(glval) = FunctionAddress[get] : # 1713| r1713_6(int &&) = Call[get] : func:r1713_5, this:r1713_4 -# 1713| m1713_7(unknown) = ^CallSideEffect : ~m1712_8 -# 1713| m1713_8(unknown) = Chi : total:m1712_8, partial:m1713_7 -# 1713| v1713_9(void) = ^IndirectReadSideEffect[-1] : &:r1713_4, m1712_11 +# 1713| m1713_7(unknown) = ^CallSideEffect : ~m1712_11 +# 1713| m1713_8(unknown) = Chi : total:m1712_11, partial:m1713_7 +# 1713| v1713_9(void) = ^IndirectReadSideEffect[-1] : &:r1713_4, ~m1713_8 # 1713| m1713_10(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1713_4 -# 1713| m1713_11(StructuredBindingTupleNoRefGet) = Chi : total:m1712_11, partial:m1713_10 +# 1713| m1713_11(unknown) = Chi : total:m1713_8, partial:m1713_10 # 1713| r1713_12(glval) = CopyValue : r1713_6 # 1713| r1713_13(int &) = CopyValue : r1713_12 # 1713| m1713_14(int &&) = Store[rv] : &:r1713_1, r1713_13 @@ -13430,7 +13468,7 @@ ir.cpp: # 1717| r1717_3(int &) = Load[r] : &:r1717_2, m1712_14 # 1717| r1717_4(glval) = CopyValue : r1717_3 # 1717| m1717_5(int) = Store[?] : &:r1717_4, r1717_1 -# 1717| m1717_6(unknown) = Chi : total:m1713_8, partial:m1717_5 +# 1717| m1717_6(unknown) = Chi : total:m1713_11, partial:m1717_5 # 1718| r1718_1(glval) = VariableAddress[rr] : # 1718| r1718_2(glval) = VariableAddress[r] : # 1718| r1718_3(int &) = Load[r] : &:r1718_2, m1712_14 @@ -21423,21 +21461,47 @@ ir.cpp: # 2897| void StructInit::StructInit(int) # 2897| Block 0 -# 2897| v2897_1(void) = EnterFunction : -# 2897| m2897_2(unknown) = AliasedDefinition : -# 2897| m2897_3(unknown) = InitializeNonLocal : -# 2897| m2897_4(unknown) = Chi : total:m2897_2, partial:m2897_3 -# 2897| r2897_5(glval) = VariableAddress[#this] : -# 2897| m2897_6(glval) = InitializeParameter[#this] : &:r2897_5 -# 2897| r2897_7(glval) = Load[#this] : &:r2897_5, m2897_6 -# 2897| m2897_8(StructInit) = InitializeIndirection[#this] : &:r2897_7 -# 2897| r2897_9(glval) = VariableAddress[j] : -# 2897| m2897_10(int) = InitializeParameter[j] : &:r2897_9 -# 2897| v2897_11(void) = NoOp : -# 2897| v2897_12(void) = ReturnIndirection[#this] : &:r2897_7, m2897_8 -# 2897| v2897_13(void) = ReturnVoid : -# 2897| v2897_14(void) = AliasedUse : m2897_3 -# 2897| v2897_15(void) = ExitFunction : +# 2897| v2897_1(void) = EnterFunction : +# 2897| m2897_2(unknown) = AliasedDefinition : +# 2897| m2897_3(unknown) = InitializeNonLocal : +# 2897| m2897_4(unknown) = Chi : total:m2897_2, partial:m2897_3 +# 2897| r2897_5(glval) = VariableAddress[#this] : +# 2897| m2897_6(glval) = InitializeParameter[#this] : &:r2897_5 +# 2897| r2897_7(glval) = Load[#this] : &:r2897_5, m2897_6 +# 2897| m2897_8(StructInit) = InitializeIndirection[#this] : &:r2897_7 +# 2897| m2897_9(unknown) = Chi : total:m2897_4, partial:m2897_8 +# 2897| r2897_10(glval) = VariableAddress[j] : +# 2897| m2897_11(int) = InitializeParameter[j] : &:r2897_10 +# 2897| r2897_12(glval) = FunctionAddress[i] : +# 2897| v2897_13(void) = Call[i] : func:r2897_12, this:r2897_7 +# 2897| r2897_14(glval) = FieldAddress[j] : r2897_7 +# 2897| r2897_15(glval) = VariableAddress[j] : +# 2897| r2897_16(int) = Load[j] : &:r2897_15, m2897_11 +# 2897| m2897_17(int) = Store[?] : &:r2897_14, r2897_16 +# 2897| m2897_18(unknown) = Chi : total:m2897_9, partial:m2897_17 +# 2897| r2897_19(glval) = FunctionAddress[k] : +# 2897| v2897_20(void) = Call[k] : func:r2897_19, this:r2897_7 +# 2897| r2897_21(glval) = FunctionAddress[l] : +# 2897| v2897_22(void) = Call[l] : func:r2897_21, this:r2897_7 +# 2897| r2897_23(glval) = FunctionAddress[m] : +# 2897| v2897_24(void) = Call[m] : func:r2897_23, this:r2897_7 +# 2897| r2897_25(glval) = FieldAddress[n] : r2897_7 +# 2897| r2897_26(glval) = VariableAddress[#this] : +# 2897| r2897_27(StructInit *) = Load[#this] : &:r2897_26, m2897_6 +# 2897| r2897_28(glval) = FunctionAddress[get_val] : +# 2897| r2897_29(int) = Call[get_val] : func:r2897_28, this:r2897_27 +# 2897| m2897_30(unknown) = ^CallSideEffect : ~m2897_18 +# 2897| m2897_31(unknown) = Chi : total:m2897_18, partial:m2897_30 +# 2897| v2897_32(void) = ^IndirectReadSideEffect[-1] : &:r2897_27, ~m2897_31 +# 2897| m2897_33(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_27 +# 2897| m2897_34(unknown) = Chi : total:m2897_31, partial:m2897_33 +# 2897| m2897_35(int) = Store[?] : &:r2897_25, r2897_29 +# 2897| m2897_36(unknown) = Chi : total:m2897_34, partial:m2897_35 +# 2897| v2897_37(void) = NoOp : +# 2897| v2897_38(void) = ReturnIndirection[#this] : &:r2897_7, ~m2897_36 +# 2897| v2897_39(void) = ReturnVoid : +# 2897| v2897_40(void) = AliasedUse : ~m2897_36 +# 2897| v2897_41(void) = ExitFunction : # 2899| void StructInit::StructInit() # 2899| Block 0 @@ -21449,15 +21513,28 @@ ir.cpp: # 2899| m2899_6(glval) = InitializeParameter[#this] : &:r2899_5 # 2899| r2899_7(glval) = Load[#this] : &:r2899_5, m2899_6 # 2899| m2899_8(StructInit) = InitializeIndirection[#this] : &:r2899_7 -# 2899| r2899_9(glval) = FieldAddress[i] : r2899_7 -# 2899| r2899_10(int) = Constant[41] : -# 2899| m2899_11(int) = Store[?] : &:r2899_9, r2899_10 -# 2899| m2899_12(unknown) = Chi : total:m2899_8, partial:m2899_11 -# 2899| v2899_13(void) = NoOp : -# 2899| v2899_14(void) = ReturnIndirection[#this] : &:r2899_7, m2899_12 -# 2899| v2899_15(void) = ReturnVoid : -# 2899| v2899_16(void) = AliasedUse : m2899_3 -# 2899| v2899_17(void) = ExitFunction : +# 2899| m2899_9(unknown) = Chi : total:m2899_4, partial:m2899_8 +# 2899| r2899_10(glval) = FieldAddress[i] : r2899_7 +# 2899| r2899_11(int) = Constant[41] : +# 2899| m2899_12(int) = Store[?] : &:r2899_10, r2899_11 +# 2899| m2899_13(unknown) = Chi : total:m2899_9, partial:m2899_12 +# 2899| r2899_14(glval) = FunctionAddress[j] : +# 2899| v2899_15(void) = Call[j] : func:r2899_14, this:r2899_7 +# 2899| r2899_16(glval) = FieldAddress[k] : r2899_7 +# 2899| r2899_17(int) = Constant[41] : +# 2899| m2899_18(int) = Store[?] : &:r2899_16, r2899_17 +# 2899| m2899_19(unknown) = Chi : total:m2899_13, partial:m2899_18 +# 2899| r2899_20(glval) = FunctionAddress[l] : +# 2899| v2899_21(void) = Call[l] : func:r2899_20, this:r2899_7 +# 2899| r2899_22(glval) = FunctionAddress[m] : +# 2899| v2899_23(void) = Call[m] : func:r2899_22, this:r2899_7 +# 2899| r2899_24(glval) = FunctionAddress[n] : +# 2899| v2899_25(void) = Call[n] : func:r2899_24, this:r2899_7 +# 2899| v2899_26(void) = NoOp : +# 2899| v2899_27(void) = ReturnIndirection[#this] : &:r2899_7, ~m2899_19 +# 2899| v2899_28(void) = ReturnVoid : +# 2899| v2899_29(void) = AliasedUse : ~m2899_19 +# 2899| v2899_30(void) = ExitFunction : # 2901| int StructInit::get_val() # 2901| Block 0 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 230d0805cd2..f1b75895c3e 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -20,10 +20,6 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:1537:8:1537:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1537:8:1537:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | -| ir.cpp:2897:5:2897:14 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2897:5:2897:14 | void StructInit::StructInit(int) | void StructInit::StructInit(int) | -| ir.cpp:2897:5:2897:14 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2897:5:2897:14 | void StructInit::StructInit(int) | void StructInit::StructInit(int) | -| ir.cpp:2899:5:2899:14 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2899:5:2899:14 | void StructInit::StructInit() | void StructInit::StructInit() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 16649e72d08..acb250ed58b 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -11346,11 +11346,13 @@ ir.cpp: # 1533| mu1533_5(glval) = InitializeParameter[#this] : &:r1533_4 # 1533| r1533_6(glval) = Load[#this] : &:r1533_4, ~m? # 1533| mu1533_7(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1533_6 -# 1533| v1533_8(void) = NoOp : -# 1533| v1533_9(void) = ReturnIndirection[#this] : &:r1533_6, ~m? -# 1533| v1533_10(void) = ReturnVoid : -# 1533| v1533_11(void) = AliasedUse : ~m? -# 1533| v1533_12(void) = ExitFunction : +# 1533| r1533_8(glval) = FunctionAddress[x] : +# 1533| v1533_9(void) = Call[x] : func:r1533_8, this:r1533_6 +# 1533| v1533_10(void) = NoOp : +# 1533| v1533_11(void) = ReturnIndirection[#this] : &:r1533_6, ~m? +# 1533| v1533_12(void) = ReturnVoid : +# 1533| v1533_13(void) = AliasedUse : ~m? +# 1533| v1533_14(void) = ExitFunction : # 1534| int StructuredBindingDataMemberMemberStruct::x # 1534| Block 0 @@ -11370,29 +11372,35 @@ ir.cpp: # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() # 1537| Block 0 -# 1537| v1537_1(void) = EnterFunction : -# 1537| mu1537_2(unknown) = AliasedDefinition : -# 1537| mu1537_3(unknown) = InitializeNonLocal : -# 1537| r1537_4(glval) = VariableAddress[#this] : -# 1537| mu1537_5(glval) = InitializeParameter[#this] : &:r1537_4 -# 1537| r1537_6(glval) = Load[#this] : &:r1537_4, ~m? -# 1537| mu1537_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1537_6 -#-----| Goto -> Block 2 - -# 1537| Block 1 -# 1537| r1537_8(glval) = FieldAddress[m] : r1537_6 -# 1537| r1537_9(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : -# 1537| v1537_10(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_9, this:r1537_8 -# 1537| mu1537_11(unknown) = ^CallSideEffect : ~m? -# 1537| mu1537_12(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_8 -#-----| Goto -> Block 2 - -# 1537| Block 2 -# 1537| v1537_13(void) = NoOp : -# 1537| v1537_14(void) = ReturnIndirection[#this] : &:r1537_6, ~m? -# 1537| v1537_15(void) = ReturnVoid : -# 1537| v1537_16(void) = AliasedUse : ~m? -# 1537| v1537_17(void) = ExitFunction : +# 1537| v1537_1(void) = EnterFunction : +# 1537| mu1537_2(unknown) = AliasedDefinition : +# 1537| mu1537_3(unknown) = InitializeNonLocal : +# 1537| r1537_4(glval) = VariableAddress[#this] : +# 1537| mu1537_5(glval) = InitializeParameter[#this] : &:r1537_4 +# 1537| r1537_6(glval) = Load[#this] : &:r1537_4, ~m? +# 1537| mu1537_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1537_6 +# 1537| r1537_8(glval) = FunctionAddress[i] : +# 1537| v1537_9(void) = Call[i] : func:r1537_8, this:r1537_6 +# 1537| r1537_10(glval) = FunctionAddress[d] : +# 1537| v1537_11(void) = Call[d] : func:r1537_10, this:r1537_6 +# 1537| r1537_12(glval) = FunctionAddress[r] : +# 1537| v1537_13(void) = Call[r] : func:r1537_12, this:r1537_6 +# 1537| r1537_14(glval) = FunctionAddress[p] : +# 1537| v1537_15(void) = Call[p] : func:r1537_14, this:r1537_6 +# 1537| r1537_16(glval) = FunctionAddress[xs] : +# 1537| v1537_17(void) = Call[xs] : func:r1537_16, this:r1537_6 +# 1537| r1537_18(glval) = FunctionAddress[r_alt] : +# 1537| v1537_19(void) = Call[r_alt] : func:r1537_18, this:r1537_6 +# 1537| r1537_20(glval) = FieldAddress[m] : r1537_6 +# 1537| r1537_21(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : +# 1537| v1537_22(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_21, this:r1537_20 +# 1537| mu1537_23(unknown) = ^CallSideEffect : ~m? +# 1537| mu1537_24(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_20 +# 1537| v1537_25(void) = NoOp : +# 1537| v1537_26(void) = ReturnIndirection[#this] : &:r1537_6, ~m? +# 1537| v1537_27(void) = ReturnVoid : +# 1537| v1537_28(void) = AliasedUse : ~m? +# 1537| v1537_29(void) = ExitFunction : # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) # 1537| Block 0 @@ -11752,11 +11760,17 @@ ir.cpp: # 1590| mu1590_5(glval) = InitializeParameter[#this] : &:r1590_4 # 1590| r1590_6(glval) = Load[#this] : &:r1590_4, ~m? # 1590| mu1590_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1590_6 -# 1590| v1590_8(void) = NoOp : -# 1590| v1590_9(void) = ReturnIndirection[#this] : &:r1590_6, ~m? -# 1590| v1590_10(void) = ReturnVoid : -# 1590| v1590_11(void) = AliasedUse : ~m? -# 1590| v1590_12(void) = ExitFunction : +# 1590| r1590_8(glval) = FunctionAddress[i] : +# 1590| v1590_9(void) = Call[i] : func:r1590_8, this:r1590_6 +# 1590| r1590_10(glval) = FunctionAddress[d] : +# 1590| v1590_11(void) = Call[d] : func:r1590_10, this:r1590_6 +# 1590| r1590_12(glval) = FunctionAddress[r] : +# 1590| v1590_13(void) = Call[r] : func:r1590_12, this:r1590_6 +# 1590| v1590_14(void) = NoOp : +# 1590| v1590_15(void) = ReturnIndirection[#this] : &:r1590_6, ~m? +# 1590| v1590_16(void) = ReturnVoid : +# 1590| v1590_17(void) = AliasedUse : ~m? +# 1590| v1590_18(void) = ExitFunction : # 1590| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) # 1590| Block 0 @@ -12071,11 +12085,15 @@ ir.cpp: # 1657| mu1657_5(glval) = InitializeParameter[#this] : &:r1657_4 # 1657| r1657_6(glval) = Load[#this] : &:r1657_4, ~m? # 1657| mu1657_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1657_6 -# 1657| v1657_8(void) = NoOp : -# 1657| v1657_9(void) = ReturnIndirection[#this] : &:r1657_6, ~m? -# 1657| v1657_10(void) = ReturnVoid : -# 1657| v1657_11(void) = AliasedUse : ~m? -# 1657| v1657_12(void) = ExitFunction : +# 1657| r1657_8(glval) = FunctionAddress[i] : +# 1657| v1657_9(void) = Call[i] : func:r1657_8, this:r1657_6 +# 1657| r1657_10(glval) = FunctionAddress[r] : +# 1657| v1657_11(void) = Call[r] : func:r1657_10, this:r1657_6 +# 1657| v1657_12(void) = NoOp : +# 1657| v1657_13(void) = ReturnIndirection[#this] : &:r1657_6, ~m? +# 1657| v1657_14(void) = ReturnVoid : +# 1657| v1657_15(void) = AliasedUse : ~m? +# 1657| v1657_16(void) = ExitFunction : # 1658| int StructuredBindingTupleNoRefGet::i # 1658| Block 0 @@ -19513,42 +19531,41 @@ ir.cpp: # 2897| void StructInit::StructInit(int) # 2897| Block 0 -# 2897| v2897_1(void) = EnterFunction : -# 2897| mu2897_2(unknown) = AliasedDefinition : -# 2897| mu2897_3(unknown) = InitializeNonLocal : -# 2897| r2897_4(glval) = VariableAddress[#this] : -# 2897| mu2897_5(glval) = InitializeParameter[#this] : &:r2897_4 -# 2897| r2897_6(glval) = Load[#this] : &:r2897_4, ~m? -# 2897| mu2897_7(StructInit) = InitializeIndirection[#this] : &:r2897_6 -# 2897| r2897_8(glval) = VariableAddress[j] : -# 2897| mu2897_9(int) = InitializeParameter[j] : &:r2897_8 -#-----| Goto -> Block 3 - -# 2897| Block 1 -# 2897| r2897_10(glval) = FieldAddress[j] : r2897_6 -# 2897| r2897_11(glval) = VariableAddress[j] : -# 2897| r2897_12(int) = Load[j] : &:r2897_11, ~m? -# 2897| mu2897_13(int) = Store[?] : &:r2897_10, r2897_12 -#-----| Goto -> Block 3 - -# 2897| Block 2 -# 2897| r2897_14(glval) = FieldAddress[n] : r2897_6 -# 2897| r2897_15(glval) = VariableAddress[#this] : -# 2897| r2897_16(StructInit *) = Load[#this] : &:r2897_15, ~m? -# 2897| r2897_17(glval) = FunctionAddress[get_val] : -# 2897| r2897_18(int) = Call[get_val] : func:r2897_17, this:r2897_16 -# 2897| mu2897_19(unknown) = ^CallSideEffect : ~m? -# 2897| v2897_20(void) = ^IndirectReadSideEffect[-1] : &:r2897_16, ~m? -# 2897| mu2897_21(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_16 -# 2897| mu2897_22(int) = Store[?] : &:r2897_14, r2897_18 -#-----| Goto -> Block 3 - -# 2897| Block 3 -# 2897| v2897_23(void) = NoOp : -# 2897| v2897_24(void) = ReturnIndirection[#this] : &:r2897_6, ~m? -# 2897| v2897_25(void) = ReturnVoid : -# 2897| v2897_26(void) = AliasedUse : ~m? -# 2897| v2897_27(void) = ExitFunction : +# 2897| v2897_1(void) = EnterFunction : +# 2897| mu2897_2(unknown) = AliasedDefinition : +# 2897| mu2897_3(unknown) = InitializeNonLocal : +# 2897| r2897_4(glval) = VariableAddress[#this] : +# 2897| mu2897_5(glval) = InitializeParameter[#this] : &:r2897_4 +# 2897| r2897_6(glval) = Load[#this] : &:r2897_4, ~m? +# 2897| mu2897_7(StructInit) = InitializeIndirection[#this] : &:r2897_6 +# 2897| r2897_8(glval) = VariableAddress[j] : +# 2897| mu2897_9(int) = InitializeParameter[j] : &:r2897_8 +# 2897| r2897_10(glval) = FunctionAddress[i] : +# 2897| v2897_11(void) = Call[i] : func:r2897_10, this:r2897_6 +# 2897| r2897_12(glval) = FieldAddress[j] : r2897_6 +# 2897| r2897_13(glval) = VariableAddress[j] : +# 2897| r2897_14(int) = Load[j] : &:r2897_13, ~m? +# 2897| mu2897_15(int) = Store[?] : &:r2897_12, r2897_14 +# 2897| r2897_16(glval) = FunctionAddress[k] : +# 2897| v2897_17(void) = Call[k] : func:r2897_16, this:r2897_6 +# 2897| r2897_18(glval) = FunctionAddress[l] : +# 2897| v2897_19(void) = Call[l] : func:r2897_18, this:r2897_6 +# 2897| r2897_20(glval) = FunctionAddress[m] : +# 2897| v2897_21(void) = Call[m] : func:r2897_20, this:r2897_6 +# 2897| r2897_22(glval) = FieldAddress[n] : r2897_6 +# 2897| r2897_23(glval) = VariableAddress[#this] : +# 2897| r2897_24(StructInit *) = Load[#this] : &:r2897_23, ~m? +# 2897| r2897_25(glval) = FunctionAddress[get_val] : +# 2897| r2897_26(int) = Call[get_val] : func:r2897_25, this:r2897_24 +# 2897| mu2897_27(unknown) = ^CallSideEffect : ~m? +# 2897| v2897_28(void) = ^IndirectReadSideEffect[-1] : &:r2897_24, ~m? +# 2897| mu2897_29(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_24 +# 2897| mu2897_30(int) = Store[?] : &:r2897_22, r2897_26 +# 2897| v2897_31(void) = NoOp : +# 2897| v2897_32(void) = ReturnIndirection[#this] : &:r2897_6, ~m? +# 2897| v2897_33(void) = ReturnVoid : +# 2897| v2897_34(void) = AliasedUse : ~m? +# 2897| v2897_35(void) = ExitFunction : # 2899| void StructInit::StructInit() # 2899| Block 0 @@ -19562,20 +19579,22 @@ ir.cpp: # 2899| r2899_8(glval) = FieldAddress[i] : r2899_6 # 2899| r2899_9(int) = Constant[41] : # 2899| mu2899_10(int) = Store[?] : &:r2899_8, r2899_9 -#-----| Goto -> Block 2 - -# 2899| Block 1 -# 2899| r2899_11(glval) = FieldAddress[k] : r2899_6 -# 2899| r2899_12(int) = Constant[41] : -# 2899| mu2899_13(int) = Store[?] : &:r2899_11, r2899_12 -#-----| Goto -> Block 2 - -# 2899| Block 2 -# 2899| v2899_14(void) = NoOp : -# 2899| v2899_15(void) = ReturnIndirection[#this] : &:r2899_6, ~m? -# 2899| v2899_16(void) = ReturnVoid : -# 2899| v2899_17(void) = AliasedUse : ~m? -# 2899| v2899_18(void) = ExitFunction : +# 2899| r2899_11(glval) = FunctionAddress[j] : +# 2899| v2899_12(void) = Call[j] : func:r2899_11, this:r2899_6 +# 2899| r2899_13(glval) = FieldAddress[k] : r2899_6 +# 2899| r2899_14(int) = Constant[41] : +# 2899| mu2899_15(int) = Store[?] : &:r2899_13, r2899_14 +# 2899| r2899_16(glval) = FunctionAddress[l] : +# 2899| v2899_17(void) = Call[l] : func:r2899_16, this:r2899_6 +# 2899| r2899_18(glval) = FunctionAddress[m] : +# 2899| v2899_19(void) = Call[m] : func:r2899_18, this:r2899_6 +# 2899| r2899_20(glval) = FunctionAddress[n] : +# 2899| v2899_21(void) = Call[n] : func:r2899_20, this:r2899_6 +# 2899| v2899_22(void) = NoOp : +# 2899| v2899_23(void) = ReturnIndirection[#this] : &:r2899_6, ~m? +# 2899| v2899_24(void) = ReturnVoid : +# 2899| v2899_25(void) = AliasedUse : ~m? +# 2899| v2899_26(void) = ExitFunction : # 2901| int StructInit::get_val() # 2901| Block 0 From 22eda4ef0aa46f86967634ba4bf48e9a20cb3f06 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 20 Mar 2026 17:44:14 +0100 Subject: [PATCH 44/81] C++: Add call side effects for default field initializations to the IR --- .../raw/internal/SideEffects.qll | 23 ++++++-- .../raw/internal/TranslatedCall.qll | 52 +++++++++++++------ .../raw/internal/TranslatedElement.qll | 11 ++-- .../raw/internal/TranslatedInitialization.qll | 15 +++++- 4 files changed, 77 insertions(+), 24 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll index b7b4be7f787..0ce1f898c0d 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll @@ -133,7 +133,7 @@ private predicate hasDefaultSideEffect(Call call, ParameterIndex i, boolean buff * An expression that can have call side effects. * * All kinds of expressions invoke a function as part of their evaluation. This class provides a - * way to treat those functions similarly, and to get the invoked `Function`. + * way to treat those expressions similarly, and to get the invoked `Declaration`. */ class ExprWithCallSizeEffects extends Expr { ExprWithCallSizeEffects() { @@ -142,15 +142,19 @@ class ExprWithCallSizeEffects extends Expr { this instanceof NewOrNewArrayExpr or this instanceof DeleteOrDeleteArrayExpr + or + this instanceof ConstructorDefaultFieldInit } - /** Gets the `Function` invoked by this expression, if known. */ - final Function getTarget() { + /** Gets the `Declaration` invoked by this expression, if known. */ + final Declaration getTarget() { result = this.(Call).getTarget() or result = this.(NewOrNewArrayExpr).getAllocator() or result = this.(DeleteOrDeleteArrayExpr).getDeallocator() + or + result = this.(ConstructorDefaultFieldInit).getTarget() } } @@ -175,7 +179,7 @@ Opcode getCallSideEffectOpcode(ExprWithCallSizeEffects expr) { /** * Returns a side effect opcode for parameter index `i` of the specified call. * - * This predicate will return at most two results: one read side effect, and one write side effect. + * This predicate will yield at most two results: one read side effect, and one write side effect. */ Opcode getASideEffectOpcode(Call call, ParameterIndex i) { exists(boolean buffer | @@ -228,3 +232,14 @@ Opcode getASideEffectOpcode(Call call, ParameterIndex i) { ) ) } + +/** + * Returns a side effect opcode for a default field initialization. + * + * This predicate will yield two results: one read side effect, and one write side effect. + */ +Opcode getDefaultFieldInitSideEffectOpcode() { + result instanceof Opcode::IndirectReadSideEffect + or + result instanceof Opcode::IndirectMayWriteSideEffect +} 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 f3d084883a7..572ce5f2858 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 @@ -10,6 +10,7 @@ private import SideEffects private import TranslatedElement private import TranslatedExpr private import TranslatedFunction +private import TranslatedInitialization private import DefaultOptions as DefaultOptions /** @@ -429,6 +430,9 @@ class TranslatedCallSideEffects extends TranslatedSideEffects, TTranslatedCallSi or expr instanceof DeleteOrDeleteArrayExpr and result = getTranslatedDeleteOrDeleteArray(expr).getInstruction(CallTag()) + or + expr instanceof ConstructorDefaultFieldInit and + result = getTranslatedConstructorFieldInitialization(expr).getInstruction(CallTag()) } } @@ -504,11 +508,25 @@ abstract class TranslatedSideEffect extends TranslatedElement { abstract predicate sideEffectInstruction(Opcode opcode, CppType type); } +private class CallOrDefaultFieldInit extends Expr { + CallOrDefaultFieldInit() { + this instanceof Call + or + this instanceof ConstructorDefaultFieldInit + } + + Declaration getTarget() { + result = this.(Call).getTarget() + or + result = this.(ConstructorDefaultFieldInit).getTarget() + } +} + /** * The IR translation of a single argument side effect for a call. */ abstract class TranslatedArgumentSideEffect extends TranslatedSideEffect { - Call call; + CallOrDefaultFieldInit callOrInit; int index; SideEffectOpcode sideEffectOpcode; @@ -524,7 +542,7 @@ abstract class TranslatedArgumentSideEffect extends TranslatedSideEffect { result = "(read side effect for " + this.getArgString() + ")" } - override Call getPrimaryExpr() { result = call } + override Expr getPrimaryExpr() { result = callOrInit } override predicate sortOrder(int group, int indexInGroup) { indexInGroup = index and @@ -586,9 +604,10 @@ abstract class TranslatedArgumentSideEffect extends TranslatedSideEffect { tag instanceof OnlyInstructionTag and operandTag instanceof BufferSizeOperandTag and result = - getTranslatedExpr(call.getArgument(call.getTarget() - .(SideEffectFunction) - .getParameterSizeIndex(index)).getFullyConverted()).getResult() + getTranslatedExpr(callOrInit + .(Call) + .getArgument(callOrInit.getTarget().(SideEffectFunction).getParameterSizeIndex(index)) + .getFullyConverted()).getResult() } /** Holds if this side effect is a write side effect, rather than a read side effect. */ @@ -616,7 +635,7 @@ class TranslatedArgumentExprSideEffect extends TranslatedArgumentSideEffect, Expr arg; TranslatedArgumentExprSideEffect() { - this = TTranslatedArgumentExprSideEffect(call, arg, index, sideEffectOpcode) + this = TTranslatedArgumentExprSideEffect(callOrInit, arg, index, sideEffectOpcode) } final override Locatable getAst() { result = arg } @@ -640,28 +659,31 @@ class TranslatedArgumentExprSideEffect extends TranslatedArgumentSideEffect, * The IR translation of an argument side effect for `*this` on a call, where there is no `Expr` * object that represents the `this` argument. * - * The applies only to constructor calls, as the AST has exploit qualifier `Expr`s for all other - * calls to non-static member functions. + * The applies to constructor calls and default field initializations, as the AST has explicit + * qualifier `Expr`s for all other calls to non-static member functions. */ -class TranslatedStructorQualifierSideEffect extends TranslatedArgumentSideEffect, - TTranslatedStructorQualifierSideEffect +class TranslatedImplicitThisQualifierSideEffect extends TranslatedArgumentSideEffect, + TTranslatedImplicitThisQualifierSideEffect { - TranslatedStructorQualifierSideEffect() { - this = TTranslatedStructorQualifierSideEffect(call, sideEffectOpcode) and + TranslatedImplicitThisQualifierSideEffect() { + this = TTranslatedImplicitThisQualifierSideEffect(callOrInit, sideEffectOpcode) and index = -1 } - final override Locatable getAst() { result = call } + final override Locatable getAst() { result = callOrInit } - final override Type getIndirectionType() { result = call.getTarget().getDeclaringType() } + final override Type getIndirectionType() { result = callOrInit.getTarget().getDeclaringType() } final override string getArgString() { result = "this" } final override Instruction getArgInstruction() { exists(TranslatedStructorCall structorCall | - structorCall.getExpr() = call and + structorCall.getExpr() = callOrInit and result = structorCall.getQualifierResult() ) + or + callOrInit instanceof ConstructorDefaultFieldInit and + result = getTranslatedFunction(callOrInit.getEnclosingFunction()).getLoadThisInstruction() } } 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 66ad2ae2679..2f86a3f476b 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 @@ -918,11 +918,16 @@ newtype TTranslatedElement = } or // Constructor calls lack a qualifier (`this`) expression, so we need to handle the side effects // on `*this` without an `Expr`. - TTranslatedStructorQualifierSideEffect(Call call, SideEffectOpcode opcode) { + TTranslatedImplicitThisQualifierSideEffect(ExprWithCallSizeEffects call, SideEffectOpcode opcode) { not ignoreExpr(call) and not ignoreSideEffects(call) and - call instanceof ConstructorCall and - opcode = getASideEffectOpcode(call, -1) + ( + call instanceof ConstructorCall and + opcode = getASideEffectOpcode(call, -1) + or + call instanceof ConstructorFieldInit and + opcode = getDefaultFieldInitSideEffectOpcode() + ) } or // The side effect that initializes newly-allocated memory. TTranslatedAllocationSideEffect(AllocationExpr expr) { not ignoreSideEffects(expr) } or 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 f5d092ca44a..614d9dd5899 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 @@ -634,13 +634,22 @@ class TranslatedDefaultFieldInitialization extends TranslatedFieldInitialization kind instanceof GotoEdge } - override Instruction getALastInstructionInternal() { result = this.getInstruction(CallTag()) } + override Instruction getALastInstructionInternal() { + result = this.getSideEffects().getALastInstruction() + } + + override TranslatedElement getLastChild() { result = this.getSideEffects() } override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = CallTargetTag() and result = this.getInstruction(CallTag()) or tag = CallTag() and + result = this.getSideEffects().getFirstInstruction(kind) + } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + child = this.getSideEffects() and result = this.getParent().getChildSuccessor(this, kind) } @@ -670,7 +679,9 @@ class TranslatedDefaultFieldInitialization extends TranslatedFieldInitialization result = field } - override TranslatedElement getChild(int id) { none() } + override TranslatedElement getChild(int id) { id = 0 and result = this.getSideEffects() } + + final TranslatedSideEffects getSideEffects() { result.getExpr() = ast } } private string getZeroValue(Type type) { From f3fc80a080287553789191712179cff0b7072d36 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 24 Mar 2026 10:57:10 +0100 Subject: [PATCH 45/81] C++: Update expected test results --- .../library-tests/ir/ir/aliased_ir.expected | 368 +++++++++++------- .../test/library-tests/ir/ir/raw_ir.expected | 296 ++++++++------ 2 files changed, 412 insertions(+), 252 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 20e254f066e..e6fc2db62f1 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -12361,22 +12361,27 @@ ir.cpp: # 1533| void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct() # 1533| Block 0 -# 1533| v1533_1(void) = EnterFunction : -# 1533| m1533_2(unknown) = AliasedDefinition : -# 1533| m1533_3(unknown) = InitializeNonLocal : -# 1533| m1533_4(unknown) = Chi : total:m1533_2, partial:m1533_3 -# 1533| r1533_5(glval) = VariableAddress[#this] : -# 1533| m1533_6(glval) = InitializeParameter[#this] : &:r1533_5 -# 1533| r1533_7(glval) = Load[#this] : &:r1533_5, m1533_6 -# 1533| m1533_8(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1533_7 -# 1533| m1533_9(unknown) = Chi : total:m1533_4, partial:m1533_8 -# 1533| r1533_10(glval) = FunctionAddress[x] : -# 1533| v1533_11(void) = Call[x] : func:r1533_10, this:r1533_7 -# 1533| v1533_12(void) = NoOp : -# 1533| v1533_13(void) = ReturnIndirection[#this] : &:r1533_7, m1533_8 -# 1533| v1533_14(void) = ReturnVoid : -# 1533| v1533_15(void) = AliasedUse : ~m1533_9 -# 1533| v1533_16(void) = ExitFunction : +# 1533| v1533_1(void) = EnterFunction : +# 1533| m1533_2(unknown) = AliasedDefinition : +# 1533| m1533_3(unknown) = InitializeNonLocal : +# 1533| m1533_4(unknown) = Chi : total:m1533_2, partial:m1533_3 +# 1533| r1533_5(glval) = VariableAddress[#this] : +# 1533| m1533_6(glval) = InitializeParameter[#this] : &:r1533_5 +# 1533| r1533_7(glval) = Load[#this] : &:r1533_5, m1533_6 +# 1533| m1533_8(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1533_7 +# 1533| m1533_9(unknown) = Chi : total:m1533_4, partial:m1533_8 +# 1533| r1533_10(glval) = FunctionAddress[x] : +# 1533| v1533_11(void) = Call[x] : func:r1533_10, this:r1533_7 +# 1533| m1533_12(unknown) = ^CallSideEffect : ~m1533_9 +# 1533| m1533_13(unknown) = Chi : total:m1533_9, partial:m1533_12 +# 1533| v1533_14(void) = ^IndirectReadSideEffect[-1] : &:r1533_7, ~m1533_13 +# 1533| m1533_15(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1533_7 +# 1533| m1533_16(unknown) = Chi : total:m1533_13, partial:m1533_15 +# 1533| v1533_17(void) = NoOp : +# 1533| v1533_18(void) = ReturnIndirection[#this] : &:r1533_7, ~m1533_16 +# 1533| v1533_19(void) = ReturnVoid : +# 1533| v1533_20(void) = AliasedUse : ~m1533_16 +# 1533| v1533_21(void) = ExitFunction : # 1534| int StructuredBindingDataMemberMemberStruct::x # 1534| Block 0 @@ -12409,28 +12414,58 @@ ir.cpp: # 1537| m1537_9(unknown) = Chi : total:m1537_4, partial:m1537_8 # 1537| r1537_10(glval) = FunctionAddress[i] : # 1537| v1537_11(void) = Call[i] : func:r1537_10, this:r1537_7 -# 1537| r1537_12(glval) = FunctionAddress[d] : -# 1537| v1537_13(void) = Call[d] : func:r1537_12, this:r1537_7 -# 1537| r1537_14(glval) = FunctionAddress[r] : -# 1537| v1537_15(void) = Call[r] : func:r1537_14, this:r1537_7 -# 1537| r1537_16(glval) = FunctionAddress[p] : -# 1537| v1537_17(void) = Call[p] : func:r1537_16, this:r1537_7 -# 1537| r1537_18(glval) = FunctionAddress[xs] : -# 1537| v1537_19(void) = Call[xs] : func:r1537_18, this:r1537_7 -# 1537| r1537_20(glval) = FunctionAddress[r_alt] : -# 1537| v1537_21(void) = Call[r_alt] : func:r1537_20, this:r1537_7 -# 1537| r1537_22(glval) = FieldAddress[m] : r1537_7 -# 1537| r1537_23(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : -# 1537| v1537_24(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_23, this:r1537_22 -# 1537| m1537_25(unknown) = ^CallSideEffect : ~m1537_9 -# 1537| m1537_26(unknown) = Chi : total:m1537_9, partial:m1537_25 -# 1537| m1537_27(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_22 -# 1537| m1537_28(unknown) = Chi : total:m1537_26, partial:m1537_27 -# 1537| v1537_29(void) = NoOp : -# 1537| v1537_30(void) = ReturnIndirection[#this] : &:r1537_7, ~m1537_28 -# 1537| v1537_31(void) = ReturnVoid : -# 1537| v1537_32(void) = AliasedUse : ~m1537_28 -# 1537| v1537_33(void) = ExitFunction : +# 1537| m1537_12(unknown) = ^CallSideEffect : ~m1537_9 +# 1537| m1537_13(unknown) = Chi : total:m1537_9, partial:m1537_12 +# 1537| v1537_14(void) = ^IndirectReadSideEffect[-1] : &:r1537_7, ~m1537_13 +# 1537| m1537_15(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_7 +# 1537| m1537_16(unknown) = Chi : total:m1537_13, partial:m1537_15 +# 1537| r1537_17(glval) = FunctionAddress[d] : +# 1537| v1537_18(void) = Call[d] : func:r1537_17, this:r1537_7 +# 1537| m1537_19(unknown) = ^CallSideEffect : ~m1537_16 +# 1537| m1537_20(unknown) = Chi : total:m1537_16, partial:m1537_19 +# 1537| v1537_21(void) = ^IndirectReadSideEffect[-1] : &:r1537_7, ~m1537_20 +# 1537| m1537_22(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_7 +# 1537| m1537_23(unknown) = Chi : total:m1537_20, partial:m1537_22 +# 1537| r1537_24(glval) = FunctionAddress[r] : +# 1537| v1537_25(void) = Call[r] : func:r1537_24, this:r1537_7 +# 1537| m1537_26(unknown) = ^CallSideEffect : ~m1537_23 +# 1537| m1537_27(unknown) = Chi : total:m1537_23, partial:m1537_26 +# 1537| v1537_28(void) = ^IndirectReadSideEffect[-1] : &:r1537_7, ~m1537_27 +# 1537| m1537_29(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_7 +# 1537| m1537_30(unknown) = Chi : total:m1537_27, partial:m1537_29 +# 1537| r1537_31(glval) = FunctionAddress[p] : +# 1537| v1537_32(void) = Call[p] : func:r1537_31, this:r1537_7 +# 1537| m1537_33(unknown) = ^CallSideEffect : ~m1537_30 +# 1537| m1537_34(unknown) = Chi : total:m1537_30, partial:m1537_33 +# 1537| v1537_35(void) = ^IndirectReadSideEffect[-1] : &:r1537_7, ~m1537_34 +# 1537| m1537_36(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_7 +# 1537| m1537_37(unknown) = Chi : total:m1537_34, partial:m1537_36 +# 1537| r1537_38(glval) = FunctionAddress[xs] : +# 1537| v1537_39(void) = Call[xs] : func:r1537_38, this:r1537_7 +# 1537| m1537_40(unknown) = ^CallSideEffect : ~m1537_37 +# 1537| m1537_41(unknown) = Chi : total:m1537_37, partial:m1537_40 +# 1537| v1537_42(void) = ^IndirectReadSideEffect[-1] : &:r1537_7, ~m1537_41 +# 1537| m1537_43(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_7 +# 1537| m1537_44(unknown) = Chi : total:m1537_41, partial:m1537_43 +# 1537| r1537_45(glval) = FunctionAddress[r_alt] : +# 1537| v1537_46(void) = Call[r_alt] : func:r1537_45, this:r1537_7 +# 1537| m1537_47(unknown) = ^CallSideEffect : ~m1537_44 +# 1537| m1537_48(unknown) = Chi : total:m1537_44, partial:m1537_47 +# 1537| v1537_49(void) = ^IndirectReadSideEffect[-1] : &:r1537_7, ~m1537_48 +# 1537| m1537_50(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_7 +# 1537| m1537_51(unknown) = Chi : total:m1537_48, partial:m1537_50 +# 1537| r1537_52(glval) = FieldAddress[m] : r1537_7 +# 1537| r1537_53(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : +# 1537| v1537_54(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_53, this:r1537_52 +# 1537| m1537_55(unknown) = ^CallSideEffect : ~m1537_51 +# 1537| m1537_56(unknown) = Chi : total:m1537_51, partial:m1537_55 +# 1537| m1537_57(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_52 +# 1537| m1537_58(unknown) = Chi : total:m1537_56, partial:m1537_57 +# 1537| v1537_59(void) = NoOp : +# 1537| v1537_60(void) = ReturnIndirection[#this] : &:r1537_7, ~m1537_58 +# 1537| v1537_61(void) = ReturnVoid : +# 1537| v1537_62(void) = AliasedUse : ~m1537_58 +# 1537| v1537_63(void) = ExitFunction : # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) # 1537| Block 0 @@ -12818,26 +12853,41 @@ ir.cpp: # 1590| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet() # 1590| Block 0 -# 1590| v1590_1(void) = EnterFunction : -# 1590| m1590_2(unknown) = AliasedDefinition : -# 1590| m1590_3(unknown) = InitializeNonLocal : -# 1590| m1590_4(unknown) = Chi : total:m1590_2, partial:m1590_3 -# 1590| r1590_5(glval) = VariableAddress[#this] : -# 1590| m1590_6(glval) = InitializeParameter[#this] : &:r1590_5 -# 1590| r1590_7(glval) = Load[#this] : &:r1590_5, m1590_6 -# 1590| m1590_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1590_7 -# 1590| m1590_9(unknown) = Chi : total:m1590_4, partial:m1590_8 -# 1590| r1590_10(glval) = FunctionAddress[i] : -# 1590| v1590_11(void) = Call[i] : func:r1590_10, this:r1590_7 -# 1590| r1590_12(glval) = FunctionAddress[d] : -# 1590| v1590_13(void) = Call[d] : func:r1590_12, this:r1590_7 -# 1590| r1590_14(glval) = FunctionAddress[r] : -# 1590| v1590_15(void) = Call[r] : func:r1590_14, this:r1590_7 -# 1590| v1590_16(void) = NoOp : -# 1590| v1590_17(void) = ReturnIndirection[#this] : &:r1590_7, m1590_8 -# 1590| v1590_18(void) = ReturnVoid : -# 1590| v1590_19(void) = AliasedUse : ~m1590_9 -# 1590| v1590_20(void) = ExitFunction : +# 1590| v1590_1(void) = EnterFunction : +# 1590| m1590_2(unknown) = AliasedDefinition : +# 1590| m1590_3(unknown) = InitializeNonLocal : +# 1590| m1590_4(unknown) = Chi : total:m1590_2, partial:m1590_3 +# 1590| r1590_5(glval) = VariableAddress[#this] : +# 1590| m1590_6(glval) = InitializeParameter[#this] : &:r1590_5 +# 1590| r1590_7(glval) = Load[#this] : &:r1590_5, m1590_6 +# 1590| m1590_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1590_7 +# 1590| m1590_9(unknown) = Chi : total:m1590_4, partial:m1590_8 +# 1590| r1590_10(glval) = FunctionAddress[i] : +# 1590| v1590_11(void) = Call[i] : func:r1590_10, this:r1590_7 +# 1590| m1590_12(unknown) = ^CallSideEffect : ~m1590_9 +# 1590| m1590_13(unknown) = Chi : total:m1590_9, partial:m1590_12 +# 1590| v1590_14(void) = ^IndirectReadSideEffect[-1] : &:r1590_7, ~m1590_13 +# 1590| m1590_15(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1590_7 +# 1590| m1590_16(unknown) = Chi : total:m1590_13, partial:m1590_15 +# 1590| r1590_17(glval) = FunctionAddress[d] : +# 1590| v1590_18(void) = Call[d] : func:r1590_17, this:r1590_7 +# 1590| m1590_19(unknown) = ^CallSideEffect : ~m1590_16 +# 1590| m1590_20(unknown) = Chi : total:m1590_16, partial:m1590_19 +# 1590| v1590_21(void) = ^IndirectReadSideEffect[-1] : &:r1590_7, ~m1590_20 +# 1590| m1590_22(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1590_7 +# 1590| m1590_23(unknown) = Chi : total:m1590_20, partial:m1590_22 +# 1590| r1590_24(glval) = FunctionAddress[r] : +# 1590| v1590_25(void) = Call[r] : func:r1590_24, this:r1590_7 +# 1590| m1590_26(unknown) = ^CallSideEffect : ~m1590_23 +# 1590| m1590_27(unknown) = Chi : total:m1590_23, partial:m1590_26 +# 1590| v1590_28(void) = ^IndirectReadSideEffect[-1] : &:r1590_7, ~m1590_27 +# 1590| m1590_29(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1590_7 +# 1590| m1590_30(unknown) = Chi : total:m1590_27, partial:m1590_29 +# 1590| v1590_31(void) = NoOp : +# 1590| v1590_32(void) = ReturnIndirection[#this] : &:r1590_7, ~m1590_30 +# 1590| v1590_33(void) = ReturnVoid : +# 1590| v1590_34(void) = AliasedUse : ~m1590_30 +# 1590| v1590_35(void) = ExitFunction : # 1590| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) # 1590| Block 0 @@ -13179,24 +13229,34 @@ ir.cpp: # 1657| void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet() # 1657| Block 0 -# 1657| v1657_1(void) = EnterFunction : -# 1657| m1657_2(unknown) = AliasedDefinition : -# 1657| m1657_3(unknown) = InitializeNonLocal : -# 1657| m1657_4(unknown) = Chi : total:m1657_2, partial:m1657_3 -# 1657| r1657_5(glval) = VariableAddress[#this] : -# 1657| m1657_6(glval) = InitializeParameter[#this] : &:r1657_5 -# 1657| r1657_7(glval) = Load[#this] : &:r1657_5, m1657_6 -# 1657| m1657_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1657_7 -# 1657| m1657_9(unknown) = Chi : total:m1657_4, partial:m1657_8 -# 1657| r1657_10(glval) = FunctionAddress[i] : -# 1657| v1657_11(void) = Call[i] : func:r1657_10, this:r1657_7 -# 1657| r1657_12(glval) = FunctionAddress[r] : -# 1657| v1657_13(void) = Call[r] : func:r1657_12, this:r1657_7 -# 1657| v1657_14(void) = NoOp : -# 1657| v1657_15(void) = ReturnIndirection[#this] : &:r1657_7, m1657_8 -# 1657| v1657_16(void) = ReturnVoid : -# 1657| v1657_17(void) = AliasedUse : ~m1657_9 -# 1657| v1657_18(void) = ExitFunction : +# 1657| v1657_1(void) = EnterFunction : +# 1657| m1657_2(unknown) = AliasedDefinition : +# 1657| m1657_3(unknown) = InitializeNonLocal : +# 1657| m1657_4(unknown) = Chi : total:m1657_2, partial:m1657_3 +# 1657| r1657_5(glval) = VariableAddress[#this] : +# 1657| m1657_6(glval) = InitializeParameter[#this] : &:r1657_5 +# 1657| r1657_7(glval) = Load[#this] : &:r1657_5, m1657_6 +# 1657| m1657_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1657_7 +# 1657| m1657_9(unknown) = Chi : total:m1657_4, partial:m1657_8 +# 1657| r1657_10(glval) = FunctionAddress[i] : +# 1657| v1657_11(void) = Call[i] : func:r1657_10, this:r1657_7 +# 1657| m1657_12(unknown) = ^CallSideEffect : ~m1657_9 +# 1657| m1657_13(unknown) = Chi : total:m1657_9, partial:m1657_12 +# 1657| v1657_14(void) = ^IndirectReadSideEffect[-1] : &:r1657_7, ~m1657_13 +# 1657| m1657_15(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1657_7 +# 1657| m1657_16(unknown) = Chi : total:m1657_13, partial:m1657_15 +# 1657| r1657_17(glval) = FunctionAddress[r] : +# 1657| v1657_18(void) = Call[r] : func:r1657_17, this:r1657_7 +# 1657| m1657_19(unknown) = ^CallSideEffect : ~m1657_16 +# 1657| m1657_20(unknown) = Chi : total:m1657_16, partial:m1657_19 +# 1657| v1657_21(void) = ^IndirectReadSideEffect[-1] : &:r1657_7, ~m1657_20 +# 1657| m1657_22(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1657_7 +# 1657| m1657_23(unknown) = Chi : total:m1657_20, partial:m1657_22 +# 1657| v1657_24(void) = NoOp : +# 1657| v1657_25(void) = ReturnIndirection[#this] : &:r1657_7, ~m1657_23 +# 1657| v1657_26(void) = ReturnVoid : +# 1657| v1657_27(void) = AliasedUse : ~m1657_23 +# 1657| v1657_28(void) = ExitFunction : # 1658| int StructuredBindingTupleNoRefGet::i # 1658| Block 0 @@ -21474,67 +21534,107 @@ ir.cpp: # 2897| m2897_11(int) = InitializeParameter[j] : &:r2897_10 # 2897| r2897_12(glval) = FunctionAddress[i] : # 2897| v2897_13(void) = Call[i] : func:r2897_12, this:r2897_7 -# 2897| r2897_14(glval) = FieldAddress[j] : r2897_7 -# 2897| r2897_15(glval) = VariableAddress[j] : -# 2897| r2897_16(int) = Load[j] : &:r2897_15, m2897_11 -# 2897| m2897_17(int) = Store[?] : &:r2897_14, r2897_16 -# 2897| m2897_18(unknown) = Chi : total:m2897_9, partial:m2897_17 -# 2897| r2897_19(glval) = FunctionAddress[k] : -# 2897| v2897_20(void) = Call[k] : func:r2897_19, this:r2897_7 -# 2897| r2897_21(glval) = FunctionAddress[l] : -# 2897| v2897_22(void) = Call[l] : func:r2897_21, this:r2897_7 -# 2897| r2897_23(glval) = FunctionAddress[m] : -# 2897| v2897_24(void) = Call[m] : func:r2897_23, this:r2897_7 -# 2897| r2897_25(glval) = FieldAddress[n] : r2897_7 -# 2897| r2897_26(glval) = VariableAddress[#this] : -# 2897| r2897_27(StructInit *) = Load[#this] : &:r2897_26, m2897_6 -# 2897| r2897_28(glval) = FunctionAddress[get_val] : -# 2897| r2897_29(int) = Call[get_val] : func:r2897_28, this:r2897_27 -# 2897| m2897_30(unknown) = ^CallSideEffect : ~m2897_18 -# 2897| m2897_31(unknown) = Chi : total:m2897_18, partial:m2897_30 -# 2897| v2897_32(void) = ^IndirectReadSideEffect[-1] : &:r2897_27, ~m2897_31 -# 2897| m2897_33(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_27 -# 2897| m2897_34(unknown) = Chi : total:m2897_31, partial:m2897_33 -# 2897| m2897_35(int) = Store[?] : &:r2897_25, r2897_29 -# 2897| m2897_36(unknown) = Chi : total:m2897_34, partial:m2897_35 -# 2897| v2897_37(void) = NoOp : -# 2897| v2897_38(void) = ReturnIndirection[#this] : &:r2897_7, ~m2897_36 -# 2897| v2897_39(void) = ReturnVoid : -# 2897| v2897_40(void) = AliasedUse : ~m2897_36 -# 2897| v2897_41(void) = ExitFunction : +# 2897| m2897_14(unknown) = ^CallSideEffect : ~m2897_9 +# 2897| m2897_15(unknown) = Chi : total:m2897_9, partial:m2897_14 +# 2897| v2897_16(void) = ^IndirectReadSideEffect[-1] : &:r2897_7, ~m2897_15 +# 2897| m2897_17(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_7 +# 2897| m2897_18(unknown) = Chi : total:m2897_15, partial:m2897_17 +# 2897| r2897_19(glval) = FieldAddress[j] : r2897_7 +# 2897| r2897_20(glval) = VariableAddress[j] : +# 2897| r2897_21(int) = Load[j] : &:r2897_20, m2897_11 +# 2897| m2897_22(int) = Store[?] : &:r2897_19, r2897_21 +# 2897| m2897_23(unknown) = Chi : total:m2897_18, partial:m2897_22 +# 2897| r2897_24(glval) = FunctionAddress[k] : +# 2897| v2897_25(void) = Call[k] : func:r2897_24, this:r2897_7 +# 2897| m2897_26(unknown) = ^CallSideEffect : ~m2897_23 +# 2897| m2897_27(unknown) = Chi : total:m2897_23, partial:m2897_26 +# 2897| v2897_28(void) = ^IndirectReadSideEffect[-1] : &:r2897_7, ~m2897_27 +# 2897| m2897_29(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_7 +# 2897| m2897_30(unknown) = Chi : total:m2897_27, partial:m2897_29 +# 2897| r2897_31(glval) = FunctionAddress[l] : +# 2897| v2897_32(void) = Call[l] : func:r2897_31, this:r2897_7 +# 2897| m2897_33(unknown) = ^CallSideEffect : ~m2897_30 +# 2897| m2897_34(unknown) = Chi : total:m2897_30, partial:m2897_33 +# 2897| v2897_35(void) = ^IndirectReadSideEffect[-1] : &:r2897_7, ~m2897_34 +# 2897| m2897_36(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_7 +# 2897| m2897_37(unknown) = Chi : total:m2897_34, partial:m2897_36 +# 2897| r2897_38(glval) = FunctionAddress[m] : +# 2897| v2897_39(void) = Call[m] : func:r2897_38, this:r2897_7 +# 2897| m2897_40(unknown) = ^CallSideEffect : ~m2897_37 +# 2897| m2897_41(unknown) = Chi : total:m2897_37, partial:m2897_40 +# 2897| v2897_42(void) = ^IndirectReadSideEffect[-1] : &:r2897_7, ~m2897_41 +# 2897| m2897_43(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_7 +# 2897| m2897_44(unknown) = Chi : total:m2897_41, partial:m2897_43 +# 2897| r2897_45(glval) = FieldAddress[n] : r2897_7 +# 2897| r2897_46(glval) = VariableAddress[#this] : +# 2897| r2897_47(StructInit *) = Load[#this] : &:r2897_46, m2897_6 +# 2897| r2897_48(glval) = FunctionAddress[get_val] : +# 2897| r2897_49(int) = Call[get_val] : func:r2897_48, this:r2897_47 +# 2897| m2897_50(unknown) = ^CallSideEffect : ~m2897_44 +# 2897| m2897_51(unknown) = Chi : total:m2897_44, partial:m2897_50 +# 2897| v2897_52(void) = ^IndirectReadSideEffect[-1] : &:r2897_47, ~m2897_51 +# 2897| m2897_53(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_47 +# 2897| m2897_54(unknown) = Chi : total:m2897_51, partial:m2897_53 +# 2897| m2897_55(int) = Store[?] : &:r2897_45, r2897_49 +# 2897| m2897_56(unknown) = Chi : total:m2897_54, partial:m2897_55 +# 2897| v2897_57(void) = NoOp : +# 2897| v2897_58(void) = ReturnIndirection[#this] : &:r2897_7, ~m2897_56 +# 2897| v2897_59(void) = ReturnVoid : +# 2897| v2897_60(void) = AliasedUse : ~m2897_56 +# 2897| v2897_61(void) = ExitFunction : # 2899| void StructInit::StructInit() # 2899| Block 0 -# 2899| v2899_1(void) = EnterFunction : -# 2899| m2899_2(unknown) = AliasedDefinition : -# 2899| m2899_3(unknown) = InitializeNonLocal : -# 2899| m2899_4(unknown) = Chi : total:m2899_2, partial:m2899_3 -# 2899| r2899_5(glval) = VariableAddress[#this] : -# 2899| m2899_6(glval) = InitializeParameter[#this] : &:r2899_5 -# 2899| r2899_7(glval) = Load[#this] : &:r2899_5, m2899_6 -# 2899| m2899_8(StructInit) = InitializeIndirection[#this] : &:r2899_7 -# 2899| m2899_9(unknown) = Chi : total:m2899_4, partial:m2899_8 -# 2899| r2899_10(glval) = FieldAddress[i] : r2899_7 -# 2899| r2899_11(int) = Constant[41] : -# 2899| m2899_12(int) = Store[?] : &:r2899_10, r2899_11 -# 2899| m2899_13(unknown) = Chi : total:m2899_9, partial:m2899_12 -# 2899| r2899_14(glval) = FunctionAddress[j] : -# 2899| v2899_15(void) = Call[j] : func:r2899_14, this:r2899_7 -# 2899| r2899_16(glval) = FieldAddress[k] : r2899_7 -# 2899| r2899_17(int) = Constant[41] : -# 2899| m2899_18(int) = Store[?] : &:r2899_16, r2899_17 -# 2899| m2899_19(unknown) = Chi : total:m2899_13, partial:m2899_18 -# 2899| r2899_20(glval) = FunctionAddress[l] : -# 2899| v2899_21(void) = Call[l] : func:r2899_20, this:r2899_7 -# 2899| r2899_22(glval) = FunctionAddress[m] : -# 2899| v2899_23(void) = Call[m] : func:r2899_22, this:r2899_7 -# 2899| r2899_24(glval) = FunctionAddress[n] : -# 2899| v2899_25(void) = Call[n] : func:r2899_24, this:r2899_7 -# 2899| v2899_26(void) = NoOp : -# 2899| v2899_27(void) = ReturnIndirection[#this] : &:r2899_7, ~m2899_19 -# 2899| v2899_28(void) = ReturnVoid : -# 2899| v2899_29(void) = AliasedUse : ~m2899_19 -# 2899| v2899_30(void) = ExitFunction : +# 2899| v2899_1(void) = EnterFunction : +# 2899| m2899_2(unknown) = AliasedDefinition : +# 2899| m2899_3(unknown) = InitializeNonLocal : +# 2899| m2899_4(unknown) = Chi : total:m2899_2, partial:m2899_3 +# 2899| r2899_5(glval) = VariableAddress[#this] : +# 2899| m2899_6(glval) = InitializeParameter[#this] : &:r2899_5 +# 2899| r2899_7(glval) = Load[#this] : &:r2899_5, m2899_6 +# 2899| m2899_8(StructInit) = InitializeIndirection[#this] : &:r2899_7 +# 2899| m2899_9(unknown) = Chi : total:m2899_4, partial:m2899_8 +# 2899| r2899_10(glval) = FieldAddress[i] : r2899_7 +# 2899| r2899_11(int) = Constant[41] : +# 2899| m2899_12(int) = Store[?] : &:r2899_10, r2899_11 +# 2899| m2899_13(unknown) = Chi : total:m2899_9, partial:m2899_12 +# 2899| r2899_14(glval) = FunctionAddress[j] : +# 2899| v2899_15(void) = Call[j] : func:r2899_14, this:r2899_7 +# 2899| m2899_16(unknown) = ^CallSideEffect : ~m2899_13 +# 2899| m2899_17(unknown) = Chi : total:m2899_13, partial:m2899_16 +# 2899| v2899_18(void) = ^IndirectReadSideEffect[-1] : &:r2899_7, ~m2899_17 +# 2899| m2899_19(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2899_7 +# 2899| m2899_20(unknown) = Chi : total:m2899_17, partial:m2899_19 +# 2899| r2899_21(glval) = FieldAddress[k] : r2899_7 +# 2899| r2899_22(int) = Constant[41] : +# 2899| m2899_23(int) = Store[?] : &:r2899_21, r2899_22 +# 2899| m2899_24(unknown) = Chi : total:m2899_20, partial:m2899_23 +# 2899| r2899_25(glval) = FunctionAddress[l] : +# 2899| v2899_26(void) = Call[l] : func:r2899_25, this:r2899_7 +# 2899| m2899_27(unknown) = ^CallSideEffect : ~m2899_24 +# 2899| m2899_28(unknown) = Chi : total:m2899_24, partial:m2899_27 +# 2899| v2899_29(void) = ^IndirectReadSideEffect[-1] : &:r2899_7, ~m2899_28 +# 2899| m2899_30(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2899_7 +# 2899| m2899_31(unknown) = Chi : total:m2899_28, partial:m2899_30 +# 2899| r2899_32(glval) = FunctionAddress[m] : +# 2899| v2899_33(void) = Call[m] : func:r2899_32, this:r2899_7 +# 2899| m2899_34(unknown) = ^CallSideEffect : ~m2899_31 +# 2899| m2899_35(unknown) = Chi : total:m2899_31, partial:m2899_34 +# 2899| v2899_36(void) = ^IndirectReadSideEffect[-1] : &:r2899_7, ~m2899_35 +# 2899| m2899_37(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2899_7 +# 2899| m2899_38(unknown) = Chi : total:m2899_35, partial:m2899_37 +# 2899| r2899_39(glval) = FunctionAddress[n] : +# 2899| v2899_40(void) = Call[n] : func:r2899_39, this:r2899_7 +# 2899| m2899_41(unknown) = ^CallSideEffect : ~m2899_38 +# 2899| m2899_42(unknown) = Chi : total:m2899_38, partial:m2899_41 +# 2899| v2899_43(void) = ^IndirectReadSideEffect[-1] : &:r2899_7, ~m2899_42 +# 2899| m2899_44(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2899_7 +# 2899| m2899_45(unknown) = Chi : total:m2899_42, partial:m2899_44 +# 2899| v2899_46(void) = NoOp : +# 2899| v2899_47(void) = ReturnIndirection[#this] : &:r2899_7, ~m2899_45 +# 2899| v2899_48(void) = ReturnVoid : +# 2899| v2899_49(void) = AliasedUse : ~m2899_45 +# 2899| v2899_50(void) = ExitFunction : # 2901| int StructInit::get_val() # 2901| Block 0 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 acb250ed58b..06655517dbb 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -11339,20 +11339,23 @@ ir.cpp: # 1533| void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct() # 1533| Block 0 -# 1533| v1533_1(void) = EnterFunction : -# 1533| mu1533_2(unknown) = AliasedDefinition : -# 1533| mu1533_3(unknown) = InitializeNonLocal : -# 1533| r1533_4(glval) = VariableAddress[#this] : -# 1533| mu1533_5(glval) = InitializeParameter[#this] : &:r1533_4 -# 1533| r1533_6(glval) = Load[#this] : &:r1533_4, ~m? -# 1533| mu1533_7(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1533_6 -# 1533| r1533_8(glval) = FunctionAddress[x] : -# 1533| v1533_9(void) = Call[x] : func:r1533_8, this:r1533_6 -# 1533| v1533_10(void) = NoOp : -# 1533| v1533_11(void) = ReturnIndirection[#this] : &:r1533_6, ~m? -# 1533| v1533_12(void) = ReturnVoid : -# 1533| v1533_13(void) = AliasedUse : ~m? -# 1533| v1533_14(void) = ExitFunction : +# 1533| v1533_1(void) = EnterFunction : +# 1533| mu1533_2(unknown) = AliasedDefinition : +# 1533| mu1533_3(unknown) = InitializeNonLocal : +# 1533| r1533_4(glval) = VariableAddress[#this] : +# 1533| mu1533_5(glval) = InitializeParameter[#this] : &:r1533_4 +# 1533| r1533_6(glval) = Load[#this] : &:r1533_4, ~m? +# 1533| mu1533_7(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1533_6 +# 1533| r1533_8(glval) = FunctionAddress[x] : +# 1533| v1533_9(void) = Call[x] : func:r1533_8, this:r1533_6 +# 1533| mu1533_10(unknown) = ^CallSideEffect : ~m? +# 1533| v1533_11(void) = ^IndirectReadSideEffect[-1] : &:r1533_6, ~m? +# 1533| mu1533_12(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1533_6 +# 1533| v1533_13(void) = NoOp : +# 1533| v1533_14(void) = ReturnIndirection[#this] : &:r1533_6, ~m? +# 1533| v1533_15(void) = ReturnVoid : +# 1533| v1533_16(void) = AliasedUse : ~m? +# 1533| v1533_17(void) = ExitFunction : # 1534| int StructuredBindingDataMemberMemberStruct::x # 1534| Block 0 @@ -11381,26 +11384,44 @@ ir.cpp: # 1537| mu1537_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1537_6 # 1537| r1537_8(glval) = FunctionAddress[i] : # 1537| v1537_9(void) = Call[i] : func:r1537_8, this:r1537_6 -# 1537| r1537_10(glval) = FunctionAddress[d] : -# 1537| v1537_11(void) = Call[d] : func:r1537_10, this:r1537_6 -# 1537| r1537_12(glval) = FunctionAddress[r] : -# 1537| v1537_13(void) = Call[r] : func:r1537_12, this:r1537_6 -# 1537| r1537_14(glval) = FunctionAddress[p] : -# 1537| v1537_15(void) = Call[p] : func:r1537_14, this:r1537_6 -# 1537| r1537_16(glval) = FunctionAddress[xs] : -# 1537| v1537_17(void) = Call[xs] : func:r1537_16, this:r1537_6 -# 1537| r1537_18(glval) = FunctionAddress[r_alt] : -# 1537| v1537_19(void) = Call[r_alt] : func:r1537_18, this:r1537_6 -# 1537| r1537_20(glval) = FieldAddress[m] : r1537_6 -# 1537| r1537_21(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : -# 1537| v1537_22(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_21, this:r1537_20 -# 1537| mu1537_23(unknown) = ^CallSideEffect : ~m? -# 1537| mu1537_24(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_20 -# 1537| v1537_25(void) = NoOp : -# 1537| v1537_26(void) = ReturnIndirection[#this] : &:r1537_6, ~m? -# 1537| v1537_27(void) = ReturnVoid : -# 1537| v1537_28(void) = AliasedUse : ~m? -# 1537| v1537_29(void) = ExitFunction : +# 1537| mu1537_10(unknown) = ^CallSideEffect : ~m? +# 1537| v1537_11(void) = ^IndirectReadSideEffect[-1] : &:r1537_6, ~m? +# 1537| mu1537_12(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_6 +# 1537| r1537_13(glval) = FunctionAddress[d] : +# 1537| v1537_14(void) = Call[d] : func:r1537_13, this:r1537_6 +# 1537| mu1537_15(unknown) = ^CallSideEffect : ~m? +# 1537| v1537_16(void) = ^IndirectReadSideEffect[-1] : &:r1537_6, ~m? +# 1537| mu1537_17(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_6 +# 1537| r1537_18(glval) = FunctionAddress[r] : +# 1537| v1537_19(void) = Call[r] : func:r1537_18, this:r1537_6 +# 1537| mu1537_20(unknown) = ^CallSideEffect : ~m? +# 1537| v1537_21(void) = ^IndirectReadSideEffect[-1] : &:r1537_6, ~m? +# 1537| mu1537_22(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_6 +# 1537| r1537_23(glval) = FunctionAddress[p] : +# 1537| v1537_24(void) = Call[p] : func:r1537_23, this:r1537_6 +# 1537| mu1537_25(unknown) = ^CallSideEffect : ~m? +# 1537| v1537_26(void) = ^IndirectReadSideEffect[-1] : &:r1537_6, ~m? +# 1537| mu1537_27(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_6 +# 1537| r1537_28(glval) = FunctionAddress[xs] : +# 1537| v1537_29(void) = Call[xs] : func:r1537_28, this:r1537_6 +# 1537| mu1537_30(unknown) = ^CallSideEffect : ~m? +# 1537| v1537_31(void) = ^IndirectReadSideEffect[-1] : &:r1537_6, ~m? +# 1537| mu1537_32(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_6 +# 1537| r1537_33(glval) = FunctionAddress[r_alt] : +# 1537| v1537_34(void) = Call[r_alt] : func:r1537_33, this:r1537_6 +# 1537| mu1537_35(unknown) = ^CallSideEffect : ~m? +# 1537| v1537_36(void) = ^IndirectReadSideEffect[-1] : &:r1537_6, ~m? +# 1537| mu1537_37(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_6 +# 1537| r1537_38(glval) = FieldAddress[m] : r1537_6 +# 1537| r1537_39(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : +# 1537| v1537_40(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_39, this:r1537_38 +# 1537| mu1537_41(unknown) = ^CallSideEffect : ~m? +# 1537| mu1537_42(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_38 +# 1537| v1537_43(void) = NoOp : +# 1537| v1537_44(void) = ReturnIndirection[#this] : &:r1537_6, ~m? +# 1537| v1537_45(void) = ReturnVoid : +# 1537| v1537_46(void) = AliasedUse : ~m? +# 1537| v1537_47(void) = ExitFunction : # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) # 1537| Block 0 @@ -11753,24 +11774,33 @@ ir.cpp: # 1590| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet() # 1590| Block 0 -# 1590| v1590_1(void) = EnterFunction : -# 1590| mu1590_2(unknown) = AliasedDefinition : -# 1590| mu1590_3(unknown) = InitializeNonLocal : -# 1590| r1590_4(glval) = VariableAddress[#this] : -# 1590| mu1590_5(glval) = InitializeParameter[#this] : &:r1590_4 -# 1590| r1590_6(glval) = Load[#this] : &:r1590_4, ~m? -# 1590| mu1590_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1590_6 -# 1590| r1590_8(glval) = FunctionAddress[i] : -# 1590| v1590_9(void) = Call[i] : func:r1590_8, this:r1590_6 -# 1590| r1590_10(glval) = FunctionAddress[d] : -# 1590| v1590_11(void) = Call[d] : func:r1590_10, this:r1590_6 -# 1590| r1590_12(glval) = FunctionAddress[r] : -# 1590| v1590_13(void) = Call[r] : func:r1590_12, this:r1590_6 -# 1590| v1590_14(void) = NoOp : -# 1590| v1590_15(void) = ReturnIndirection[#this] : &:r1590_6, ~m? -# 1590| v1590_16(void) = ReturnVoid : -# 1590| v1590_17(void) = AliasedUse : ~m? -# 1590| v1590_18(void) = ExitFunction : +# 1590| v1590_1(void) = EnterFunction : +# 1590| mu1590_2(unknown) = AliasedDefinition : +# 1590| mu1590_3(unknown) = InitializeNonLocal : +# 1590| r1590_4(glval) = VariableAddress[#this] : +# 1590| mu1590_5(glval) = InitializeParameter[#this] : &:r1590_4 +# 1590| r1590_6(glval) = Load[#this] : &:r1590_4, ~m? +# 1590| mu1590_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1590_6 +# 1590| r1590_8(glval) = FunctionAddress[i] : +# 1590| v1590_9(void) = Call[i] : func:r1590_8, this:r1590_6 +# 1590| mu1590_10(unknown) = ^CallSideEffect : ~m? +# 1590| v1590_11(void) = ^IndirectReadSideEffect[-1] : &:r1590_6, ~m? +# 1590| mu1590_12(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1590_6 +# 1590| r1590_13(glval) = FunctionAddress[d] : +# 1590| v1590_14(void) = Call[d] : func:r1590_13, this:r1590_6 +# 1590| mu1590_15(unknown) = ^CallSideEffect : ~m? +# 1590| v1590_16(void) = ^IndirectReadSideEffect[-1] : &:r1590_6, ~m? +# 1590| mu1590_17(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1590_6 +# 1590| r1590_18(glval) = FunctionAddress[r] : +# 1590| v1590_19(void) = Call[r] : func:r1590_18, this:r1590_6 +# 1590| mu1590_20(unknown) = ^CallSideEffect : ~m? +# 1590| v1590_21(void) = ^IndirectReadSideEffect[-1] : &:r1590_6, ~m? +# 1590| mu1590_22(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1590_6 +# 1590| v1590_23(void) = NoOp : +# 1590| v1590_24(void) = ReturnIndirection[#this] : &:r1590_6, ~m? +# 1590| v1590_25(void) = ReturnVoid : +# 1590| v1590_26(void) = AliasedUse : ~m? +# 1590| v1590_27(void) = ExitFunction : # 1590| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) # 1590| Block 0 @@ -12078,22 +12108,28 @@ ir.cpp: # 1657| void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet() # 1657| Block 0 -# 1657| v1657_1(void) = EnterFunction : -# 1657| mu1657_2(unknown) = AliasedDefinition : -# 1657| mu1657_3(unknown) = InitializeNonLocal : -# 1657| r1657_4(glval) = VariableAddress[#this] : -# 1657| mu1657_5(glval) = InitializeParameter[#this] : &:r1657_4 -# 1657| r1657_6(glval) = Load[#this] : &:r1657_4, ~m? -# 1657| mu1657_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1657_6 -# 1657| r1657_8(glval) = FunctionAddress[i] : -# 1657| v1657_9(void) = Call[i] : func:r1657_8, this:r1657_6 -# 1657| r1657_10(glval) = FunctionAddress[r] : -# 1657| v1657_11(void) = Call[r] : func:r1657_10, this:r1657_6 -# 1657| v1657_12(void) = NoOp : -# 1657| v1657_13(void) = ReturnIndirection[#this] : &:r1657_6, ~m? -# 1657| v1657_14(void) = ReturnVoid : -# 1657| v1657_15(void) = AliasedUse : ~m? -# 1657| v1657_16(void) = ExitFunction : +# 1657| v1657_1(void) = EnterFunction : +# 1657| mu1657_2(unknown) = AliasedDefinition : +# 1657| mu1657_3(unknown) = InitializeNonLocal : +# 1657| r1657_4(glval) = VariableAddress[#this] : +# 1657| mu1657_5(glval) = InitializeParameter[#this] : &:r1657_4 +# 1657| r1657_6(glval) = Load[#this] : &:r1657_4, ~m? +# 1657| mu1657_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1657_6 +# 1657| r1657_8(glval) = FunctionAddress[i] : +# 1657| v1657_9(void) = Call[i] : func:r1657_8, this:r1657_6 +# 1657| mu1657_10(unknown) = ^CallSideEffect : ~m? +# 1657| v1657_11(void) = ^IndirectReadSideEffect[-1] : &:r1657_6, ~m? +# 1657| mu1657_12(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1657_6 +# 1657| r1657_13(glval) = FunctionAddress[r] : +# 1657| v1657_14(void) = Call[r] : func:r1657_13, this:r1657_6 +# 1657| mu1657_15(unknown) = ^CallSideEffect : ~m? +# 1657| v1657_16(void) = ^IndirectReadSideEffect[-1] : &:r1657_6, ~m? +# 1657| mu1657_17(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1657_6 +# 1657| v1657_18(void) = NoOp : +# 1657| v1657_19(void) = ReturnIndirection[#this] : &:r1657_6, ~m? +# 1657| v1657_20(void) = ReturnVoid : +# 1657| v1657_21(void) = AliasedUse : ~m? +# 1657| v1657_22(void) = ExitFunction : # 1658| int StructuredBindingTupleNoRefGet::i # 1658| Block 0 @@ -19542,59 +19578,83 @@ ir.cpp: # 2897| mu2897_9(int) = InitializeParameter[j] : &:r2897_8 # 2897| r2897_10(glval) = FunctionAddress[i] : # 2897| v2897_11(void) = Call[i] : func:r2897_10, this:r2897_6 -# 2897| r2897_12(glval) = FieldAddress[j] : r2897_6 -# 2897| r2897_13(glval) = VariableAddress[j] : -# 2897| r2897_14(int) = Load[j] : &:r2897_13, ~m? -# 2897| mu2897_15(int) = Store[?] : &:r2897_12, r2897_14 -# 2897| r2897_16(glval) = FunctionAddress[k] : -# 2897| v2897_17(void) = Call[k] : func:r2897_16, this:r2897_6 -# 2897| r2897_18(glval) = FunctionAddress[l] : -# 2897| v2897_19(void) = Call[l] : func:r2897_18, this:r2897_6 -# 2897| r2897_20(glval) = FunctionAddress[m] : -# 2897| v2897_21(void) = Call[m] : func:r2897_20, this:r2897_6 -# 2897| r2897_22(glval) = FieldAddress[n] : r2897_6 -# 2897| r2897_23(glval) = VariableAddress[#this] : -# 2897| r2897_24(StructInit *) = Load[#this] : &:r2897_23, ~m? -# 2897| r2897_25(glval) = FunctionAddress[get_val] : -# 2897| r2897_26(int) = Call[get_val] : func:r2897_25, this:r2897_24 -# 2897| mu2897_27(unknown) = ^CallSideEffect : ~m? -# 2897| v2897_28(void) = ^IndirectReadSideEffect[-1] : &:r2897_24, ~m? -# 2897| mu2897_29(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_24 -# 2897| mu2897_30(int) = Store[?] : &:r2897_22, r2897_26 -# 2897| v2897_31(void) = NoOp : -# 2897| v2897_32(void) = ReturnIndirection[#this] : &:r2897_6, ~m? -# 2897| v2897_33(void) = ReturnVoid : -# 2897| v2897_34(void) = AliasedUse : ~m? -# 2897| v2897_35(void) = ExitFunction : +# 2897| mu2897_12(unknown) = ^CallSideEffect : ~m? +# 2897| v2897_13(void) = ^IndirectReadSideEffect[-1] : &:r2897_6, ~m? +# 2897| mu2897_14(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_6 +# 2897| r2897_15(glval) = FieldAddress[j] : r2897_6 +# 2897| r2897_16(glval) = VariableAddress[j] : +# 2897| r2897_17(int) = Load[j] : &:r2897_16, ~m? +# 2897| mu2897_18(int) = Store[?] : &:r2897_15, r2897_17 +# 2897| r2897_19(glval) = FunctionAddress[k] : +# 2897| v2897_20(void) = Call[k] : func:r2897_19, this:r2897_6 +# 2897| mu2897_21(unknown) = ^CallSideEffect : ~m? +# 2897| v2897_22(void) = ^IndirectReadSideEffect[-1] : &:r2897_6, ~m? +# 2897| mu2897_23(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_6 +# 2897| r2897_24(glval) = FunctionAddress[l] : +# 2897| v2897_25(void) = Call[l] : func:r2897_24, this:r2897_6 +# 2897| mu2897_26(unknown) = ^CallSideEffect : ~m? +# 2897| v2897_27(void) = ^IndirectReadSideEffect[-1] : &:r2897_6, ~m? +# 2897| mu2897_28(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_6 +# 2897| r2897_29(glval) = FunctionAddress[m] : +# 2897| v2897_30(void) = Call[m] : func:r2897_29, this:r2897_6 +# 2897| mu2897_31(unknown) = ^CallSideEffect : ~m? +# 2897| v2897_32(void) = ^IndirectReadSideEffect[-1] : &:r2897_6, ~m? +# 2897| mu2897_33(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_6 +# 2897| r2897_34(glval) = FieldAddress[n] : r2897_6 +# 2897| r2897_35(glval) = VariableAddress[#this] : +# 2897| r2897_36(StructInit *) = Load[#this] : &:r2897_35, ~m? +# 2897| r2897_37(glval) = FunctionAddress[get_val] : +# 2897| r2897_38(int) = Call[get_val] : func:r2897_37, this:r2897_36 +# 2897| mu2897_39(unknown) = ^CallSideEffect : ~m? +# 2897| v2897_40(void) = ^IndirectReadSideEffect[-1] : &:r2897_36, ~m? +# 2897| mu2897_41(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_36 +# 2897| mu2897_42(int) = Store[?] : &:r2897_34, r2897_38 +# 2897| v2897_43(void) = NoOp : +# 2897| v2897_44(void) = ReturnIndirection[#this] : &:r2897_6, ~m? +# 2897| v2897_45(void) = ReturnVoid : +# 2897| v2897_46(void) = AliasedUse : ~m? +# 2897| v2897_47(void) = ExitFunction : # 2899| void StructInit::StructInit() # 2899| Block 0 -# 2899| v2899_1(void) = EnterFunction : -# 2899| mu2899_2(unknown) = AliasedDefinition : -# 2899| mu2899_3(unknown) = InitializeNonLocal : -# 2899| r2899_4(glval) = VariableAddress[#this] : -# 2899| mu2899_5(glval) = InitializeParameter[#this] : &:r2899_4 -# 2899| r2899_6(glval) = Load[#this] : &:r2899_4, ~m? -# 2899| mu2899_7(StructInit) = InitializeIndirection[#this] : &:r2899_6 -# 2899| r2899_8(glval) = FieldAddress[i] : r2899_6 -# 2899| r2899_9(int) = Constant[41] : -# 2899| mu2899_10(int) = Store[?] : &:r2899_8, r2899_9 -# 2899| r2899_11(glval) = FunctionAddress[j] : -# 2899| v2899_12(void) = Call[j] : func:r2899_11, this:r2899_6 -# 2899| r2899_13(glval) = FieldAddress[k] : r2899_6 -# 2899| r2899_14(int) = Constant[41] : -# 2899| mu2899_15(int) = Store[?] : &:r2899_13, r2899_14 -# 2899| r2899_16(glval) = FunctionAddress[l] : -# 2899| v2899_17(void) = Call[l] : func:r2899_16, this:r2899_6 -# 2899| r2899_18(glval) = FunctionAddress[m] : -# 2899| v2899_19(void) = Call[m] : func:r2899_18, this:r2899_6 -# 2899| r2899_20(glval) = FunctionAddress[n] : -# 2899| v2899_21(void) = Call[n] : func:r2899_20, this:r2899_6 -# 2899| v2899_22(void) = NoOp : -# 2899| v2899_23(void) = ReturnIndirection[#this] : &:r2899_6, ~m? -# 2899| v2899_24(void) = ReturnVoid : -# 2899| v2899_25(void) = AliasedUse : ~m? -# 2899| v2899_26(void) = ExitFunction : +# 2899| v2899_1(void) = EnterFunction : +# 2899| mu2899_2(unknown) = AliasedDefinition : +# 2899| mu2899_3(unknown) = InitializeNonLocal : +# 2899| r2899_4(glval) = VariableAddress[#this] : +# 2899| mu2899_5(glval) = InitializeParameter[#this] : &:r2899_4 +# 2899| r2899_6(glval) = Load[#this] : &:r2899_4, ~m? +# 2899| mu2899_7(StructInit) = InitializeIndirection[#this] : &:r2899_6 +# 2899| r2899_8(glval) = FieldAddress[i] : r2899_6 +# 2899| r2899_9(int) = Constant[41] : +# 2899| mu2899_10(int) = Store[?] : &:r2899_8, r2899_9 +# 2899| r2899_11(glval) = FunctionAddress[j] : +# 2899| v2899_12(void) = Call[j] : func:r2899_11, this:r2899_6 +# 2899| mu2899_13(unknown) = ^CallSideEffect : ~m? +# 2899| v2899_14(void) = ^IndirectReadSideEffect[-1] : &:r2899_6, ~m? +# 2899| mu2899_15(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2899_6 +# 2899| r2899_16(glval) = FieldAddress[k] : r2899_6 +# 2899| r2899_17(int) = Constant[41] : +# 2899| mu2899_18(int) = Store[?] : &:r2899_16, r2899_17 +# 2899| r2899_19(glval) = FunctionAddress[l] : +# 2899| v2899_20(void) = Call[l] : func:r2899_19, this:r2899_6 +# 2899| mu2899_21(unknown) = ^CallSideEffect : ~m? +# 2899| v2899_22(void) = ^IndirectReadSideEffect[-1] : &:r2899_6, ~m? +# 2899| mu2899_23(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2899_6 +# 2899| r2899_24(glval) = FunctionAddress[m] : +# 2899| v2899_25(void) = Call[m] : func:r2899_24, this:r2899_6 +# 2899| mu2899_26(unknown) = ^CallSideEffect : ~m? +# 2899| v2899_27(void) = ^IndirectReadSideEffect[-1] : &:r2899_6, ~m? +# 2899| mu2899_28(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2899_6 +# 2899| r2899_29(glval) = FunctionAddress[n] : +# 2899| v2899_30(void) = Call[n] : func:r2899_29, this:r2899_6 +# 2899| mu2899_31(unknown) = ^CallSideEffect : ~m? +# 2899| v2899_32(void) = ^IndirectReadSideEffect[-1] : &:r2899_6, ~m? +# 2899| mu2899_33(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2899_6 +# 2899| v2899_34(void) = NoOp : +# 2899| v2899_35(void) = ReturnIndirection[#this] : &:r2899_6, ~m? +# 2899| v2899_36(void) = ReturnVoid : +# 2899| v2899_37(void) = AliasedUse : ~m? +# 2899| v2899_38(void) = ExitFunction : # 2901| int StructInit::get_val() # 2901| Block 0 From b554d7dd166f85952e72267f7d2785015378a12a Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 24 Mar 2026 11:04:46 +0100 Subject: [PATCH 46/81] C++: Fix QL-for-QL warnings --- .../raw/internal/TranslatedInitialization.qll | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 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 614d9dd5899..10c03313122 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 @@ -515,8 +515,8 @@ TranslatedFieldInitialization getTranslatedConstructorFieldInitialization(Constr } /** - * Represents the IR translation of the initialization of a field from an - * element of an initializer list. + * The IR translation of the initialization of a field from an element of + * an initializer list. */ abstract class TranslatedFieldInitialization extends TranslatedElement { Expr ast; @@ -546,8 +546,8 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { } /** - * Represents the IR translation of the initialization of a field from an - * element of an initializer list where default initialization is not used. + * The IR translation of the initialization of a field from an element of an initializer + * list where default initialization is not used. */ abstract class TranslatedNonDefaultFieldInitialization extends TranslatedFieldInitialization { final override Instruction getFirstInstruction(EdgeKind kind) { @@ -575,8 +575,8 @@ abstract class TranslatedNonDefaultFieldInitialization extends TranslatedFieldIn } /** - * Represents the IR translation of the initialization of a field from an - * explicit element in an initializer list. + * The IR translation of the initialization of a field from an explicit element in + * an initializer list. */ class TranslatedExplicitFieldInitialization extends TranslatedNonDefaultFieldInitialization, InitializationContext, TTranslatedExplicitFieldInitialization @@ -619,8 +619,8 @@ class TranslatedExplicitFieldInitialization extends TranslatedNonDefaultFieldIni } /** - * Represents the IR translation of the initialization of a field from an - * element of an initializer list where default initialization is used. + * The IR translation of the initialization of a field from an element of an initializer + * list where default initialization is used. */ class TranslatedDefaultFieldInitialization extends TranslatedFieldInitialization, TTranslatedDefaultFieldInitialization @@ -689,8 +689,8 @@ private string getZeroValue(Type type) { } /** - * Represents the IR translation of the initialization of a field without a - * corresponding element in the initializer list. + * The IR translation of the initialization of a field without a corresponding + * element in the initializer list. */ class TranslatedFieldValueInitialization extends TranslatedNonDefaultFieldInitialization, TTranslatedFieldValueInitialization @@ -758,8 +758,8 @@ class TranslatedFieldValueInitialization extends TranslatedNonDefaultFieldInitia } /** - * Represents the IR translation of the initialization of an array element from - * an element of an initializer list. + * The IR translation of the initialization of an array element from an element + * of an initializer list. */ abstract class TranslatedElementInitialization extends TranslatedElement { ArrayOrVectorAggregateLiteral initList; @@ -836,8 +836,8 @@ abstract class TranslatedElementInitialization extends TranslatedElement { } /** - * Represents the IR translation of the initialization of an array element from - * an explicit element in an initializer list. + * The IR translation of the initialization of an array element from an explicit + * element in an initializer list. */ class TranslatedExplicitElementInitialization extends TranslatedElementInitialization, TTranslatedExplicitElementInitialization, InitializationContext @@ -885,8 +885,8 @@ class TranslatedExplicitElementInitialization extends TranslatedElementInitializ } /** - * Represents the IR translation of the initialization of a range of array - * elements without corresponding elements in the initializer list. + * The IR translation of the initialization of a range of array elements without + * corresponding elements in the initializer list. */ class TranslatedElementValueInitialization extends TranslatedElementInitialization, TTranslatedElementValueInitialization From 4a637cbe0a0457c52d9db7698e3065151b9d187a Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 24 Mar 2026 15:34:34 +0100 Subject: [PATCH 47/81] C++: Accept dataflow test changes These need to be looked at, but because data flow through default field initialization is currently not working, let's postpone this as part of that work. --- .../dataflow/dataflow-tests/type-bugs.expected | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected index 87ebdc9e83a..f68f9cf3081 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected @@ -36,6 +36,18 @@ irTypeBugs | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | [summary] read: Argument[this].Element[*] in operator-> | | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | [summary] to write: ReturnValue[**] in operator-> | | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | [summary] to write: ReturnValue[*] in operator-> | +| ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | container | +| ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | container | +| ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | container | +| ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | container | +| ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | container | +| ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | container | +| test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | field | +| test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | field | +| test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | field | +| test.cpp:1318:9:1318:9 | test.cpp:1318:9:1318:9 | test.cpp:1318:9:1318:9 | i | +| test.cpp:1318:9:1318:9 | test.cpp:1318:9:1318:9 | test.cpp:1318:9:1318:9 | i | +| test.cpp:1318:9:1318:9 | test.cpp:1318:9:1318:9 | test.cpp:1318:9:1318:9 | i | incorrectBaseType | clang.cpp:22:8:22:20 | *& ... | Expected 'Node.getType()' to be int, but it was int * | | clang.cpp:23:17:23:29 | *& ... | Expected 'Node.getType()' to be int, but it was int * | From 0f44d6a7800678c916aab68b1738d010b389f580 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 24 Mar 2026 15:39:09 +0100 Subject: [PATCH 48/81] C++: Add change note --- cpp/ql/lib/change-notes/2026-03-24-field-init.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-03-24-field-init.md diff --git a/cpp/ql/lib/change-notes/2026-03-24-field-init.md b/cpp/ql/lib/change-notes/2026-03-24-field-init.md new file mode 100644 index 00000000000..0318d31aef5 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-03-24-field-init.md @@ -0,0 +1,5 @@ +--- +category: feature +--- +* Added a class `ConstructorDirectFieldInit` to represent field initializations that occur in member initialization lists. +* Added a class `ConstructorDefaultFieldInit` to represent default field initializations. From 49c5cc05acf8c1fde4cf45055a65a27faa1ae04f Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Tue, 24 Mar 2026 16:09:33 +0100 Subject: [PATCH 49/81] Update cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../code/cpp/ir/implementation/raw/internal/TranslatedCall.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 572ce5f2858..bd012d4b9b4 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 @@ -659,7 +659,7 @@ class TranslatedArgumentExprSideEffect extends TranslatedArgumentSideEffect, * The IR translation of an argument side effect for `*this` on a call, where there is no `Expr` * object that represents the `this` argument. * - * The applies to constructor calls and default field initializations, as the AST has explicit + * This applies to constructor calls and default field initializations, as the AST has explicit * qualifier `Expr`s for all other calls to non-static member functions. */ class TranslatedImplicitThisQualifierSideEffect extends TranslatedArgumentSideEffect, From db7c61969db301262f1bacc562ce3479146ef02f Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Tue, 24 Mar 2026 16:11:10 +0100 Subject: [PATCH 50/81] Update cpp/ql/lib/change-notes/2026-03-24-field-init.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- cpp/ql/lib/change-notes/2026-03-24-field-init.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/change-notes/2026-03-24-field-init.md b/cpp/ql/lib/change-notes/2026-03-24-field-init.md index 0318d31aef5..c11329a3d9f 100644 --- a/cpp/ql/lib/change-notes/2026-03-24-field-init.md +++ b/cpp/ql/lib/change-notes/2026-03-24-field-init.md @@ -1,5 +1,5 @@ --- category: feature --- -* Added a class `ConstructorDirectFieldInit` to represent field initializations that occur in member initialization lists. +* Added a class `ConstructorDirectFieldInit` to represent field initializations that occur in member initializer lists. * Added a class `ConstructorDefaultFieldInit` to represent default field initializations. From dad517ff5e637f4b14cfc86797bd2de8348f492e Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 24 Mar 2026 16:16:14 +0100 Subject: [PATCH 51/81] C++: Fix typo --- .../code/cpp/ir/implementation/raw/internal/SideEffects.qll | 6 +++--- .../ir/implementation/raw/internal/TranslatedElement.qll | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll index 0ce1f898c0d..c6214bf5e4f 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll @@ -135,8 +135,8 @@ private predicate hasDefaultSideEffect(Call call, ParameterIndex i, boolean buff * All kinds of expressions invoke a function as part of their evaluation. This class provides a * way to treat those expressions similarly, and to get the invoked `Declaration`. */ -class ExprWithCallSizeEffects extends Expr { - ExprWithCallSizeEffects() { +class ExprWithCallSideEffects extends Expr { + ExprWithCallSideEffects() { this instanceof Call or this instanceof NewOrNewArrayExpr @@ -162,7 +162,7 @@ class ExprWithCallSizeEffects extends Expr { * Returns the side effect opcode, if any, that represents any side effects not specifically modeled * by an argument side effect. */ -Opcode getCallSideEffectOpcode(ExprWithCallSizeEffects expr) { +Opcode getCallSideEffectOpcode(ExprWithCallSideEffects expr) { not exists(expr.getTarget().(SideEffectFunction)) and result instanceof Opcode::CallSideEffect or exists(SideEffectFunction sideEffectFunction | 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 2f86a3f476b..58456476f6a 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 @@ -879,7 +879,7 @@ newtype TTranslatedElement = // The declaration/initialization part of a `ConditionDeclExpr` TTranslatedConditionDecl(ConditionDeclExpr expr) { not ignoreExpr(expr) } or // The side effects of a `Call` - TTranslatedCallSideEffects(ExprWithCallSizeEffects expr) { + TTranslatedCallSideEffects(ExprWithCallSideEffects expr) { not ignoreExpr(expr) and not ignoreSideEffects(expr) } or @@ -918,7 +918,7 @@ newtype TTranslatedElement = } or // Constructor calls lack a qualifier (`this`) expression, so we need to handle the side effects // on `*this` without an `Expr`. - TTranslatedImplicitThisQualifierSideEffect(ExprWithCallSizeEffects call, SideEffectOpcode opcode) { + TTranslatedImplicitThisQualifierSideEffect(ExprWithCallSideEffects call, SideEffectOpcode opcode) { not ignoreExpr(call) and not ignoreSideEffects(call) and ( From 29acd6960f3f20b31d1853d84ad1e6b9947ed1c9 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 23 Mar 2026 16:52:41 +0100 Subject: [PATCH 52/81] C#: Add upgrade script. --- .../assignments.ql | 117 ++ .../old.dbscheme | 1489 ++++++++++++++++ .../semmlecode.csharp.dbscheme | 1504 +++++++++++++++++ .../upgrade.properties | 8 + 4 files changed, 3118 insertions(+) create mode 100644 csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/assignments.ql create mode 100644 csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/old.dbscheme create mode 100644 csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/semmlecode.csharp.dbscheme create mode 100644 csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/upgrade.properties diff --git a/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/assignments.ql b/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/assignments.ql new file mode 100644 index 00000000000..89e39a6e722 --- /dev/null +++ b/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/assignments.ql @@ -0,0 +1,117 @@ +class Expr extends @expr { + string toString() { none() } +} + +class Location extends @location { + string toString() { none() } +} + +class ControlFlowElement extends @control_flow_element { + string toString() { none() } +} + +class TypeOrRef extends @type_or_ref { + string toString() { none() } +} + +class Callable extends @callable { + string toString() { none() } +} + +class Accessible extends @accessible { + string toString() { none() } +} + +predicate assignmentKind(int kind) { + // | 63 = @simple_assign_expr + // | 80 = @add_event_expr + // | 81 = @remove_event_expr + // | 83 = @local_var_decl_expr + kind = [63, 80, 81, 83] +} + +predicate compoundAssignmentKind(int kind) { + // | 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 + // | 119 = @assign_coalesce_expr + // | 134 = @assign_urshift_expr + kind = [64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 119, 134] +} + +class CompoundAssignmentExpr extends Expr { + CompoundAssignmentExpr() { + exists(int kind | compoundAssignmentKind(kind) | expressions(this, kind, _)) + } +} + +predicate isAssignment(Expr ass) { + exists(int kind | assignmentKind(kind) | + expressions(ass, kind, _) and + // Exclude assignments that are part of a compound assignment. These are handled seperatly. + not exists(CompoundAssignmentExpr e | expr_parent(ass, 2, e)) + ) +} + +Expr getOperatorCall(CompoundAssignmentExpr e) { + exists(Expr assignment | + expr_parent(assignment, 2, e) and + expr_parent(result, 0, assignment) + ) +} + +query predicate new_expressions(Expr e, int kind, TypeOrRef t) { + expressions(e, kind, t) and + // Remove the unused expanded assignment expressions. + not exists(CompoundAssignmentExpr parent, Expr assignment | expr_parent(assignment, 2, parent) | + e = assignment or + expr_parent(e, 0, assignment) or + expr_parent(e, 1, assignment) + ) +} + +query predicate new_expr_parent(Expr e, int child, ControlFlowElement parent) { + if isAssignment(parent) + then + // Swap children for assignments, local variable declarations and add/remove event. + child = 0 and expr_parent(e, 1, parent) + or + child = 1 and expr_parent(e, 0, parent) + else ( + // Case for compound assignments. The parent child relation is contracted. + exists(Expr op | op = getOperatorCall(parent) | expr_parent(e, child, op)) + or + // For other expressions (as long as they are included in the new expressions + // table), the parent child relation is unchanged. + expr_parent(e, child, parent) and + new_expressions(e, _, _) and + (not parent instanceof Expr or new_expressions(parent, _, _)) + ) +} + +query predicate new_expr_location(Expr e, Location loc) { + expr_location(e, loc) and new_expressions(e, _, _) +} + +query predicate new_expr_call(Expr e, Callable c) { + exists(Expr op | op = getOperatorCall(e) | expr_call(op, c)) + or + expr_call(e, c) and not e = getOperatorCall(_) +} + +query predicate new_dynamic_member_name(Expr e, string name) { + exists(Expr op | op = getOperatorCall(e) | dynamic_member_name(op, name)) + or + dynamic_member_name(e, name) and not e = getOperatorCall(_) +} + +query predicate new_expr_access(Expr e, Accessible a) { + expr_access(e, a) and new_expressions(e, _, _) +} diff --git a/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/old.dbscheme b/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/old.dbscheme new file mode 100644 index 00000000000..e73ca2c93df --- /dev/null +++ b/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/old.dbscheme @@ -0,0 +1,1489 @@ +/* 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); + +/* + * Overlay support + */ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : 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; + +@locatable = @declaration_with_accessors | @callable_accessor | @declaration_or_directive + | @diagnostic | @extractor_message | @preprocessor_directive | @attribute | @type_mention | @type_parameter_constraints + | @declaration_with_accessors | @callable_accessor | @operator | @method + | @constructor | @destructor | @field | @local_variable | @parameter | @stmt | @expr + | @xmllocatable | @commentline | @commentblock | @asp_element + +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( + 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 +| 35 = @extension_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 | @extension_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); + +extension_receiver_type( + unique int extension: @extension_type ref, + int receiver_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 | @extension_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, params/array = 3, this = 4, in = 5, ref readonly = 6 */ + 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 +| 138 = @interpolated_string_insert_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 = @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @assign_expr | @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); diff --git a/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/semmlecode.csharp.dbscheme b/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..19b8cc3e2dc --- /dev/null +++ b/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/semmlecode.csharp.dbscheme @@ -0,0 +1,1504 @@ +/* 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); + +/* + * Overlay support + */ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : 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; + +@locatable = @declaration_with_accessors | @callable_accessor | @declaration_or_directive + | @diagnostic | @extractor_message | @preprocessor_directive | @attribute | @type_mention | @type_parameter_constraints + | @declaration_with_accessors | @callable_accessor | @operator | @method + | @constructor | @destructor | @field | @local_variable | @parameter | @stmt | @expr + | @xmllocatable | @commentline | @commentblock | @asp_element + +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( + 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 +| 35 = @extension_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 | @extension_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); + +extension_receiver_type( + unique int extension: @extension_type ref, + int receiver_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 | @extension_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, params/array = 3, this = 4, in = 5, ref readonly = 6 */ + 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 +| 138 = @interpolated_string_insert_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_call_expr = @assign_arith_expr | @assign_bitwise_expr +@assign_op_expr = @assign_op_call_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@add_operation = @add_expr | @assign_add_expr; +@sub_operation = @sub_expr | @assign_sub_expr; +@mul_operation = @mul_expr | @assign_mul_expr; +@div_operation = @div_expr | @assign_div_expr; +@rem_operation = @rem_expr | @assign_rem_expr; +@and_operation = @bit_and_expr | @assign_and_expr; +@xor_operation = @bit_xor_expr | @assign_xor_expr; +@or_operation = @bit_or_expr | @assign_or_expr; +@lshift_operation = @lshift_expr | @assign_lshift_expr; +@rshift_operation = @rshift_expr | @assign_rshift_expr; +@urshift_operation = @urshift_expr | @assign_urshift_expr; +@null_coalescing_operation = @null_coalescing_expr | @assign_coalesce_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 = @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @assign_expr | @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; + +@op_invoke_expr = @operator_invocation_expr | @assign_op_call_expr +@call = @method_invocation_expr | @constructor_init_expr | @op_invoke_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 | @op_invoke_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); diff --git a/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/upgrade.properties b/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/upgrade.properties new file mode 100644 index 00000000000..542231966ed --- /dev/null +++ b/csharp/ql/lib/upgrades/e73ca2c93df8aae162f1704edc4817a5cb330529/upgrade.properties @@ -0,0 +1,8 @@ +description: Add operation kinds for operations, cleanup expanded assignments and rotate assignment child expressions. +compatibility: partial +expr_parent.rel: run assignments.ql new_expr_parent +expressions.rel: run assignments.ql new_expressions +expr_location.rel: run assignments.ql new_expr_location +expr_call.rel: run assignments.ql new_expr_call +dynamic_member_name.rel: run assignments.ql new_dynamic_member_name +expr_access.rel: run assignments.ql new_expr_access From 147ac37feca3ef18e7bab5ac8928e446a3ce9661 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 24 Mar 2026 15:30:20 +0100 Subject: [PATCH 53/81] C#: Add downgrade script. --- .../assignments.ql | 178 ++ .../old.dbscheme | 1504 +++++++++++++++++ .../semmlecode.csharp.dbscheme | 1489 ++++++++++++++++ .../upgrade.properties | 8 + 4 files changed, 3179 insertions(+) create mode 100644 csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/assignments.ql create mode 100644 csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/old.dbscheme create mode 100644 csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/semmlecode.csharp.dbscheme create mode 100644 csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/upgrade.properties diff --git a/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/assignments.ql b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/assignments.ql new file mode 100644 index 00000000000..14e2cea2af6 --- /dev/null +++ b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/assignments.ql @@ -0,0 +1,178 @@ +class Expr extends @expr { + string toString() { none() } +} + +class Location extends @location { + string toString() { none() } +} + +newtype TAddedElement = + TAssignment(Expr e) or + TLhs(Expr e) or + TRhs(Expr e) + +module Fresh = QlBuiltins::NewEntity; + +class TNewExpr = @expr or Fresh::EntityId; + +class NewExpr extends TNewExpr { + string toString() { none() } +} + +class TNewControlFlowElement = @control_flow_element or Fresh::EntityId; + +class NewControlFlowElement extends TNewControlFlowElement { + string toString() { none() } +} + +class TypeOrRef extends @type_or_ref { + string toString() { none() } +} + +class Callable extends @callable { + string toString() { none() } +} + +class Accessible extends @accessible { + string toString() { none() } +} + +predicate assignmentKind(int kind) { + // | 63 = @simple_assign_expr + // | 80 = @add_event_expr + // | 81 = @remove_event_expr + // | 83 = @local_var_decl_expr + kind = [63, 80, 81, 83] +} + +predicate compoundAssignmentKind(int kind) { + // | 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 + // | 119 = @assign_coalesce_expr + // | 134 = @assign_urshift_expr + kind = [64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 119, 134] +} + +int getOperatorKindFromAssignmentKind(int kind) { + kind = 64 and result = 44 // @assign_add_expr -> @add_expr + or + kind = 65 and result = 45 // @assign_sub_expr -> @sub_expr + or + kind = 66 and result = 41 // @assign_mul_expr -> @mul_expr + or + kind = 67 and result = 42 // @assign_div_expr -> @div_expr + or + kind = 68 and result = 43 // @assign_rem_expr -> @rem_expr + or + kind = 69 and result = 54 // @assign_and_expr -> @bit_and_expr + or + kind = 70 and result = 55 // @assign_xor_expr -> @bit_xor_expr + or + kind = 71 and result = 56 // @assign_or_expr -> @bit_or_expr + or + kind = 72 and result = 46 // @assign_lshift_expr -> @lshift_expr + or + kind = 73 and result = 47 // @assign_rshift_expr -> @rshift_expr + or + kind = 119 and result = 61 // @assign_coalesce_expr -> @coalesce_expr + or + kind = 134 and result = 133 // @assign_urshift_expr -> @urshift_expr +} + +predicate isAssignment(Expr ass) { + exists(int kind | assignmentKind(kind) | expressions(ass, kind, _)) +} + +class CompoundAssignmentExpr extends Expr { + CompoundAssignmentExpr() { + exists(int kind | compoundAssignmentKind(kind) | expressions(this, kind, _)) + } +} + +query predicate new_expressions(NewExpr e, int kind, TypeOrRef t) { + expressions(e, kind, t) + or + // Introduce expanded expression nodes. + exists(CompoundAssignmentExpr compound, int kind0, Expr e1, int kind1 | + expressions(compound, kind0, t) and + compoundAssignmentKind(kind0) and + expressions(e1, kind1, _) and + expr_parent(e1, 0, compound) + | + Fresh::map(TAssignment(compound)) = e and kind = 63 + or + Fresh::map(TLhs(compound)) = e and kind = kind1 + or + Fresh::map(TRhs(compound)) = e and kind = getOperatorKindFromAssignmentKind(kind0) + ) +} + +query predicate new_expr_parent(NewExpr e, int child, NewControlFlowElement parent) { + if isAssignment(parent) + then + // Swap children for assignments, local variable declarations and add/remove event. + child = 0 and expr_parent(e, 1, parent) + or + child = 1 and expr_parent(e, 0, parent) + else ( + exists(CompoundAssignmentExpr compound | + Fresh::map(TAssignment(compound)) = e and child = 2 and parent = compound + or + Fresh::map(TLhs(compound)) = e and child = 1 and parent = Fresh::map(TAssignment(compound)) + or + Fresh::map(TRhs(compound)) = e and child = 0 and parent = Fresh::map(TAssignment(compound)) + or + expr_parent(e, child, compound) and parent = Fresh::map(TRhs(compound)) + ) + or + // Copy the expr_parent relation except for compound assignment edges. + expr_parent(e, child, parent) and not parent instanceof CompoundAssignmentExpr + ) +} + +query predicate new_expr_location(NewExpr e, Location loc) { + expr_location(e, loc) + or + exists(CompoundAssignmentExpr compound | + Fresh::map(TAssignment(compound)) = e and expr_location(compound, loc) + or + Fresh::map(TLhs(compound)) = e and + exists(Expr child | expr_location(child, loc) and expr_parent(child, 0, compound)) + or + Fresh::map(TRhs(compound)) = e and expr_location(compound, loc) + ) +} + +query predicate new_expr_call(NewExpr e, Callable c) { + expr_call(e, c) and not e instanceof CompoundAssignmentExpr + or + exists(CompoundAssignmentExpr compound | + Fresh::map(TRhs(compound)) = e and expr_call(compound, c) + ) +} + +query predicate new_dynamic_member_name(NewExpr e, string name) { + dynamic_member_name(e, name) and not e instanceof CompoundAssignmentExpr + or + exists(CompoundAssignmentExpr compound | + Fresh::map(TRhs(compound)) = e and dynamic_member_name(compound, name) + ) +} + +query predicate new_expr_access(NewExpr e, Accessible a) { + expr_access(e, a) + or + exists(CompoundAssignmentExpr compound, Expr access | + expr_parent(access, 0, compound) and + expr_access(access, a) and + Fresh::map(TLhs(compound)) = e + ) +} diff --git a/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/old.dbscheme b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/old.dbscheme new file mode 100644 index 00000000000..19b8cc3e2dc --- /dev/null +++ b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/old.dbscheme @@ -0,0 +1,1504 @@ +/* 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); + +/* + * Overlay support + */ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : 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; + +@locatable = @declaration_with_accessors | @callable_accessor | @declaration_or_directive + | @diagnostic | @extractor_message | @preprocessor_directive | @attribute | @type_mention | @type_parameter_constraints + | @declaration_with_accessors | @callable_accessor | @operator | @method + | @constructor | @destructor | @field | @local_variable | @parameter | @stmt | @expr + | @xmllocatable | @commentline | @commentblock | @asp_element + +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( + 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 +| 35 = @extension_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 | @extension_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); + +extension_receiver_type( + unique int extension: @extension_type ref, + int receiver_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 | @extension_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, params/array = 3, this = 4, in = 5, ref readonly = 6 */ + 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 +| 138 = @interpolated_string_insert_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_call_expr = @assign_arith_expr | @assign_bitwise_expr +@assign_op_expr = @assign_op_call_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@add_operation = @add_expr | @assign_add_expr; +@sub_operation = @sub_expr | @assign_sub_expr; +@mul_operation = @mul_expr | @assign_mul_expr; +@div_operation = @div_expr | @assign_div_expr; +@rem_operation = @rem_expr | @assign_rem_expr; +@and_operation = @bit_and_expr | @assign_and_expr; +@xor_operation = @bit_xor_expr | @assign_xor_expr; +@or_operation = @bit_or_expr | @assign_or_expr; +@lshift_operation = @lshift_expr | @assign_lshift_expr; +@rshift_operation = @rshift_expr | @assign_rshift_expr; +@urshift_operation = @urshift_expr | @assign_urshift_expr; +@null_coalescing_operation = @null_coalescing_expr | @assign_coalesce_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 = @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @assign_expr | @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; + +@op_invoke_expr = @operator_invocation_expr | @assign_op_call_expr +@call = @method_invocation_expr | @constructor_init_expr | @op_invoke_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 | @op_invoke_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); diff --git a/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/semmlecode.csharp.dbscheme b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..e73ca2c93df --- /dev/null +++ b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/semmlecode.csharp.dbscheme @@ -0,0 +1,1489 @@ +/* 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); + +/* + * Overlay support + */ + +/** + * The CLI will automatically emit the tuple `databaseMetadata("isOverlay", "true")`, + * along with an `overlayChangedFiles` tuple for each new/modified/deleted file, + * when building an overlay database, and these can be used by the discard predicates. + */ +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path : 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; + +@locatable = @declaration_with_accessors | @callable_accessor | @declaration_or_directive + | @diagnostic | @extractor_message | @preprocessor_directive | @attribute | @type_mention | @type_parameter_constraints + | @declaration_with_accessors | @callable_accessor | @operator | @method + | @constructor | @destructor | @field | @local_variable | @parameter | @stmt | @expr + | @xmllocatable | @commentline | @commentblock | @asp_element + +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( + 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 +| 35 = @extension_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 | @extension_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); + +extension_receiver_type( + unique int extension: @extension_type ref, + int receiver_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 | @extension_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, params/array = 3, this = 4, in = 5, ref readonly = 6 */ + 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 +| 138 = @interpolated_string_insert_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 = @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @assign_expr | @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); diff --git a/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/upgrade.properties b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/upgrade.properties new file mode 100644 index 00000000000..41d57dd067b --- /dev/null +++ b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/upgrade.properties @@ -0,0 +1,8 @@ +description: Remove operation kinds for operations, introduce expanded assignments and rotate assignment child expressions. +compatibility: partial +expr_parent.rel: run assignments.ql new_expr_parent +expressions.rel: run assignments.ql new_expressions +expr_location.rel: run assignments.ql new_expr_location +expr_call.rel: run assignments.ql new_expr_call +dynamic_member_name.rel: run assignments.ql new_dynamic_member_name +expr_access.rel: run assignments.ql new_expr_access From 346ab9d623b96098816ed247fbf942f26833e7dc Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 25 Mar 2026 16:31:28 +0100 Subject: [PATCH 54/81] C++: Add struct and variable template tests --- .../library-tests/ir/ir/PrintAST.expected | 71 ++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 127 ++++++++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 2 + .../aliased_ssa_consistency_unsound.expected | 2 + cpp/ql/test/library-tests/ir/ir/ir.cpp | 17 +++ .../ir/ir/raw_consistency.expected | 2 + .../test/library-tests/ir/ir/raw_ir.expected | 117 ++++++++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 2 + ...unaliased_ssa_consistency_unsound.expected | 2 + 9 files changed, 342 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index c9c1334a391..c3e46114edf 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -25733,6 +25733,77 @@ ir.cpp: # 2901| getQualifier(): [ThisExpr] this # 2901| Type = [PointerType] StructInit * # 2901| ValueCategory = prvalue(load) +# 2905| [Constructor] void StructInitFromTemplate::StructInitFromTemplate() +# 2905| : +# 2905| : +# 2905| getInitializer(0): [ConstructorDefaultFieldInit] constructor init of field t +# 2905| Type = [IntType] int +# 2905| ValueCategory = prvalue +# 2905| getEntryPoint(): [BlockStmt] { ... } +# 2905| getStmt(0): [ReturnStmt] return ... +# 2909| [GlobalVariable] StructInitFromTemplate StructInitFromTemplateVar +#-----| getInitializer(): [Initializer] initializer for StructInitFromTemplateVar +#-----| getExpr(): [ConstructorCall] call to StructInitFromTemplate +#-----| Type = [VoidType] void +#-----| ValueCategory = prvalue +#-----| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +#-----| Type = [ClassTemplateInstantiation,Struct] StructInitFromTemplate +#-----| ValueCategory = prvalue(load) +# 2912| [GlobalVariable,VariableTemplateInstantiation] double VariableTemplate +# 2912| getInitializer(): [Initializer] initializer for VariableTemplate +# 2912| getExpr(): [Literal] 42 +# 2912| Type = [IntType] int +# 2912| Value = [Literal] 42 +# 2912| ValueCategory = prvalue +# 2912| getExpr().getFullyConverted(): [CStyleCast] (double)... +# 2912| Conversion = [IntegralToFloatingPointConversion] integral to floating point conversion +# 2912| Type = [DoubleType] double +# 2912| Value = [CStyleCast] 42.0 +# 2912| ValueCategory = prvalue +# 2915| [TemplateFunction,TopLevelFunction] T VariableTemplateFunc(T) +# 2915| : +# 2915| getParameter(0): [Parameter] x +# 2915| Type = [TypeTemplateParameter] T +# 2915| getEntryPoint(): [BlockStmt] { ... } +# 2916| getStmt(0): [ReturnStmt] return ... +# 2916| getExpr(): [AddExpr] ... + ... +# 2916| Type = [UnknownType] unknown +# 2916| ValueCategory = prvalue +# 2916| getLeftOperand(): [VariableAccess] VariableTemplate +# 2916| Type = [UnknownType] unknown +# 2916| ValueCategory = lvalue +# 2916| getRightOperand(): [VariableAccess] x +# 2916| Type = [TypeTemplateParameter] T +# 2916| ValueCategory = lvalue +# 2915| [FunctionTemplateInstantiation,TopLevelFunction] double VariableTemplateFunc(double) +# 2915| : +# 2915| getParameter(0): [Parameter] x +# 2915| Type = [DoubleType] double +# 2915| getEntryPoint(): [BlockStmt] { ... } +# 2916| getStmt(0): [ReturnStmt] return ... +# 2916| getExpr(): [AddExpr] ... + ... +# 2916| Type = [DoubleType] double +# 2916| ValueCategory = prvalue +# 2916| getLeftOperand(): [VariableAccess] VariableTemplate +# 2916| Type = [DoubleType] double +# 2916| Value = [VariableAccess] 42.0 +# 2916| ValueCategory = prvalue(load) +# 2916| getRightOperand(): [VariableAccess] x +# 2916| Type = [DoubleType] double +# 2916| ValueCategory = prvalue(load) +# 2919| [GlobalVariable] int VariableTemplateFuncUse +# 2919| getInitializer(): [Initializer] initializer for VariableTemplateFuncUse +# 2919| getExpr(): [FunctionCall] call to VariableTemplateFunc +# 2919| Type = [DoubleType] double +# 2919| ValueCategory = prvalue +# 2919| getArgument(0): [Literal] 2.299999999999999822 +# 2919| Type = [DoubleType] double +# 2919| Value = [Literal] 2.299999999999999822 +# 2919| ValueCategory = prvalue +# 2919| getExpr().getFullyConverted(): [CStyleCast] (int)... +# 2919| Conversion = [FloatingPointToIntegralConversion] floating point to integral conversion +# 2919| Type = [IntType] int +# 2919| ValueCategory = prvalue ir23.cpp: # 1| [TopLevelFunction] bool consteval_1() # 1| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index e6fc2db62f1..4e66d728b03 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -21658,6 +21658,133 @@ ir.cpp: # 2901| v2901_18(void) = AliasedUse : m2901_3 # 2901| v2901_19(void) = ExitFunction : +# 2905| void StructInitFromTemplate::StructInitFromTemplate() +# 2905| Block 0 +# 2905| v2905_1(void) = EnterFunction : +# 2905| m2905_2(unknown) = AliasedDefinition : +# 2905| m2905_3(unknown) = InitializeNonLocal : +# 2905| m2905_4(unknown) = Chi : total:m2905_2, partial:m2905_3 +# 2905| r2905_5(glval) = VariableAddress[#this] : +# 2905| m2905_6(glval>) = InitializeParameter[#this] : &:r2905_5 +# 2905| r2905_7(glval>) = Load[#this] : &:r2905_5, m2905_6 +# 2905| m2905_8(StructInitFromTemplate) = InitializeIndirection[#this] : &:r2905_7 +# 2905| m2905_9(unknown) = Chi : total:m2905_4, partial:m2905_8 +# 2905| r2905_10(glval) = FunctionAddress[t] : +# 2905| v2905_11(void) = Call[t] : func:r2905_10, this:r2905_7 +# 2905| m2905_12(unknown) = ^CallSideEffect : ~m2905_9 +# 2905| m2905_13(unknown) = Chi : total:m2905_9, partial:m2905_12 +# 2905| v2905_14(void) = ^IndirectReadSideEffect[-1] : &:r2905_7, ~m2905_13 +# 2905| m2905_15(StructInitFromTemplate) = ^IndirectMayWriteSideEffect[-1] : &:r2905_7 +# 2905| m2905_16(unknown) = Chi : total:m2905_13, partial:m2905_15 +# 2905| v2905_17(void) = NoOp : +# 2905| v2905_18(void) = ReturnIndirection[#this] : &:r2905_7, ~m2905_16 +# 2905| v2905_19(void) = ReturnVoid : +# 2905| v2905_20(void) = AliasedUse : ~m2905_16 +# 2905| v2905_21(void) = ExitFunction : + +# 2906| T StructInitFromTemplate::t +# 2906| Block 0 +# 2906| v2906_1(void) = EnterFunction : +# 2906| m2906_2(unknown) = AliasedDefinition : +# 2906| m2906_3(unknown) = InitializeNonLocal : +# 2906| m2906_4(unknown) = Chi : total:m2906_2, partial:m2906_3 +# 2906| r2906_5(glval) = VariableAddress[#this] : +# 2906| m2906_6(glval>) = InitializeParameter[#this] : &:r2906_5 +# 2906| r2906_7(glval>) = Load[#this] : &:r2906_5, m2906_6 +# 2906| m2906_8(StructInitFromTemplate) = InitializeIndirection[#this] : &:r2906_7 +# 2906| r2906_9(glval) = FieldAddress[t] : r2906_7 +# 2906| r2906_10(glval) = VariableAddress : + +# 2906| int StructInitFromTemplate::t +# 2906| Block 0 +# 2906| v2906_1(void) = EnterFunction : +# 2906| m2906_2(unknown) = AliasedDefinition : +# 2906| m2906_3(unknown) = InitializeNonLocal : +# 2906| m2906_4(unknown) = Chi : total:m2906_2, partial:m2906_3 +# 2906| r2906_5(glval) = VariableAddress[#this] : +# 2906| m2906_6(glval>) = InitializeParameter[#this] : &:r2906_5 +# 2906| r2906_7(glval>) = Load[#this] : &:r2906_5, m2906_6 +# 2906| m2906_8(StructInitFromTemplate) = InitializeIndirection[#this] : &:r2906_7 +# 2906| r2906_9(glval) = FieldAddress[t] : r2906_7 +# 2906| r2906_10(glval) = VariableAddress[#temp2906:11] : +# 2906| r2906_11(int) = Constant[0] : +# 2906| m2906_12(int) = Store[#temp2906:11] : &:r2906_10, r2906_11 +# 2906| r2906_13(int) = Load[#temp2906:11] : &:r2906_10, m2906_12 +# 2906| m2906_14(int) = Store[?] : &:r2906_9, r2906_13 +# 2906| m2906_15(unknown) = Chi : total:m2906_8, partial:m2906_14 +# 2906| v2906_16(void) = ReturnVoid : +# 2906| v2906_17(void) = AliasedUse : m2906_3 +# 2906| v2906_18(void) = ExitFunction : + +# 2909| StructInitFromTemplate StructInitFromTemplateVar +# 2909| Block 0 +# 2909| v2909_1(void) = EnterFunction : +# 2909| m2909_2(unknown) = AliasedDefinition : +# 2909| r2909_3(glval>) = VariableAddress[StructInitFromTemplateVar] : +#-----| r0_1(glval>) = VariableAddress[#temp0:0] : +#-----| m0_2(StructInitFromTemplate) = Uninitialized[#temp0:0] : &:r0_1 +#-----| m0_3(unknown) = Chi : total:m2909_2, partial:m0_2 +#-----| r0_4(glval) = FunctionAddress[StructInitFromTemplate] : +#-----| v0_5(void) = Call[StructInitFromTemplate] : func:r0_4, this:r0_1 +#-----| m0_6(unknown) = ^CallSideEffect : ~m0_3 +#-----| m0_7(unknown) = Chi : total:m0_3, partial:m0_6 +#-----| m0_8(StructInitFromTemplate) = ^IndirectMayWriteSideEffect[-1] : &:r0_1 +#-----| m0_9(unknown) = Chi : total:m0_7, partial:m0_8 +#-----| r0_10(StructInitFromTemplate) = Load[#temp0:0] : &:r0_1, ~m0_9 +#-----| m0_11(StructInitFromTemplate) = Store[StructInitFromTemplateVar] : &:r2909_3, r0_10 +#-----| m0_12(unknown) = Chi : total:m0_9, partial:m0_11 +# 2909| v2909_4(void) = ReturnVoid : +# 2909| v2909_5(void) = AliasedUse : ~m0_12 +# 2909| v2909_6(void) = ExitFunction : + +# 2912| double VariableTemplate +# 2912| Block 0 +# 2912| v2912_1(void) = EnterFunction : +# 2912| m2912_2(unknown) = AliasedDefinition : +# 2912| r2912_3(glval) = VariableAddress[VariableTemplate] : +# 2912| r2912_4(double) = Constant[42.0] : +# 2912| m2912_5(double) = Store[VariableTemplate] : &:r2912_3, r2912_4 +# 2912| m2912_6(unknown) = Chi : total:m2912_2, partial:m2912_5 +# 2912| v2912_7(void) = ReturnVoid : +# 2912| v2912_8(void) = AliasedUse : ~m2912_6 +# 2912| v2912_9(void) = ExitFunction : + +# 2915| double VariableTemplateFunc(double) +# 2915| Block 0 +# 2915| v2915_1(void) = EnterFunction : +# 2915| m2915_2(unknown) = AliasedDefinition : +# 2915| m2915_3(unknown) = InitializeNonLocal : +# 2915| m2915_4(unknown) = Chi : total:m2915_2, partial:m2915_3 +# 2915| r2915_5(glval) = VariableAddress[x] : +# 2915| m2915_6(double) = InitializeParameter[x] : &:r2915_5 +# 2916| r2916_1(glval) = VariableAddress[#return] : +# 2916| r2916_2(double) = Constant[42.0] : +# 2916| r2916_3(glval) = VariableAddress[x] : +# 2916| r2916_4(double) = Load[x] : &:r2916_3, m2915_6 +# 2916| r2916_5(double) = Add : r2916_2, r2916_4 +# 2916| m2916_6(double) = Store[#return] : &:r2916_1, r2916_5 +# 2915| r2915_7(glval) = VariableAddress[#return] : +# 2915| v2915_8(void) = ReturnValue : &:r2915_7, m2916_6 +# 2915| v2915_9(void) = AliasedUse : m2915_3 +# 2915| v2915_10(void) = ExitFunction : + +# 2919| int VariableTemplateFuncUse +# 2919| Block 0 +# 2919| v2919_1(void) = EnterFunction : +# 2919| m2919_2(unknown) = AliasedDefinition : +# 2919| r2919_3(glval) = VariableAddress[VariableTemplateFuncUse] : +# 2919| r2919_4(glval) = FunctionAddress[VariableTemplateFunc] : +# 2919| r2919_5(double) = Constant[2.299999999999999822] : +# 2919| r2919_6(double) = Call[VariableTemplateFunc] : func:r2919_4, 0:r2919_5 +# 2919| m2919_7(unknown) = ^CallSideEffect : ~m2919_2 +# 2919| m2919_8(unknown) = Chi : total:m2919_2, partial:m2919_7 +# 2919| r2919_9(int) = Convert : r2919_6 +# 2919| m2919_10(int) = Store[VariableTemplateFuncUse] : &:r2919_3, r2919_9 +# 2919| m2919_11(unknown) = Chi : total:m2919_8, partial:m2919_10 +# 2919| v2919_12(void) = ReturnVoid : +# 2919| v2919_13(void) = AliasedUse : ~m2919_11 +# 2919| v2919_14(void) = ExitFunction : + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index f1b75895c3e..1f09b304923 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -29,5 +30,6 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable +| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand 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 f1b75895c3e..1f09b304923 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -29,5 +30,6 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable +| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index ddb1b41fdbc..1d2d4d5a79e 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2901,4 +2901,21 @@ struct StructInit { int get_val() { return k; } }; +template +struct StructInitFromTemplate { + T t = T(); +}; + +StructInitFromTemplate StructInitFromTemplateVar; + +template +constexpr T VariableTemplate = T(42); + +template +T VariableTemplateFunc(T x) { + return VariableTemplate + x; +} + +int VariableTemplateFuncUse = VariableTemplateFunc(2.3); + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index f1b75895c3e..1f09b304923 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -29,5 +30,6 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable +| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand 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 06655517dbb..8ff676c6d73 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -19677,6 +19677,123 @@ ir.cpp: # 2901| v2901_17(void) = AliasedUse : ~m? # 2901| v2901_18(void) = ExitFunction : +# 2905| void StructInitFromTemplate::StructInitFromTemplate() +# 2905| Block 0 +# 2905| v2905_1(void) = EnterFunction : +# 2905| mu2905_2(unknown) = AliasedDefinition : +# 2905| mu2905_3(unknown) = InitializeNonLocal : +# 2905| r2905_4(glval) = VariableAddress[#this] : +# 2905| mu2905_5(glval>) = InitializeParameter[#this] : &:r2905_4 +# 2905| r2905_6(glval>) = Load[#this] : &:r2905_4, ~m? +# 2905| mu2905_7(StructInitFromTemplate) = InitializeIndirection[#this] : &:r2905_6 +# 2905| r2905_8(glval) = FunctionAddress[t] : +# 2905| v2905_9(void) = Call[t] : func:r2905_8, this:r2905_6 +# 2905| mu2905_10(unknown) = ^CallSideEffect : ~m? +# 2905| v2905_11(void) = ^IndirectReadSideEffect[-1] : &:r2905_6, ~m? +# 2905| mu2905_12(StructInitFromTemplate) = ^IndirectMayWriteSideEffect[-1] : &:r2905_6 +# 2905| v2905_13(void) = NoOp : +# 2905| v2905_14(void) = ReturnIndirection[#this] : &:r2905_6, ~m? +# 2905| v2905_15(void) = ReturnVoid : +# 2905| v2905_16(void) = AliasedUse : ~m? +# 2905| v2905_17(void) = ExitFunction : + +# 2906| T StructInitFromTemplate::t +# 2906| Block 0 +# 2906| v2906_1(void) = EnterFunction : +# 2906| mu2906_2(unknown) = AliasedDefinition : +# 2906| mu2906_3(unknown) = InitializeNonLocal : +# 2906| r2906_4(glval) = VariableAddress[#this] : +# 2906| mu2906_5(glval>) = InitializeParameter[#this] : &:r2906_4 +# 2906| r2906_6(glval>) = Load[#this] : &:r2906_4, ~m? +# 2906| mu2906_7(StructInitFromTemplate) = InitializeIndirection[#this] : &:r2906_6 +# 2906| r2906_8(glval) = FieldAddress[t] : r2906_6 +# 2906| r2906_9(glval) = VariableAddress : + +# 2906| Block 1 +# 2906| v2906_10(void) = ReturnVoid : +# 2906| v2906_11(void) = AliasedUse : ~m? +# 2906| v2906_12(void) = ExitFunction : + +# 2906| int StructInitFromTemplate::t +# 2906| Block 0 +# 2906| v2906_1(void) = EnterFunction : +# 2906| mu2906_2(unknown) = AliasedDefinition : +# 2906| mu2906_3(unknown) = InitializeNonLocal : +# 2906| r2906_4(glval) = VariableAddress[#this] : +# 2906| mu2906_5(glval>) = InitializeParameter[#this] : &:r2906_4 +# 2906| r2906_6(glval>) = Load[#this] : &:r2906_4, ~m? +# 2906| mu2906_7(StructInitFromTemplate) = InitializeIndirection[#this] : &:r2906_6 +# 2906| r2906_8(glval) = FieldAddress[t] : r2906_6 +# 2906| r2906_9(glval) = VariableAddress[#temp2906:11] : +# 2906| r2906_10(int) = Constant[0] : +# 2906| mu2906_11(int) = Store[#temp2906:11] : &:r2906_9, r2906_10 +# 2906| r2906_12(int) = Load[#temp2906:11] : &:r2906_9, ~m? +# 2906| mu2906_13(int) = Store[?] : &:r2906_8, r2906_12 +# 2906| v2906_14(void) = ReturnVoid : +# 2906| v2906_15(void) = AliasedUse : ~m? +# 2906| v2906_16(void) = ExitFunction : + +# 2909| StructInitFromTemplate StructInitFromTemplateVar +# 2909| Block 0 +# 2909| v2909_1(void) = EnterFunction : +# 2909| mu2909_2(unknown) = AliasedDefinition : +# 2909| r2909_3(glval>) = VariableAddress[StructInitFromTemplateVar] : +#-----| r0_1(glval>) = VariableAddress[#temp0:0] : +#-----| mu0_2(StructInitFromTemplate) = Uninitialized[#temp0:0] : &:r0_1 +#-----| r0_3(glval) = FunctionAddress[StructInitFromTemplate] : +#-----| v0_4(void) = Call[StructInitFromTemplate] : func:r0_3, this:r0_1 +#-----| mu0_5(unknown) = ^CallSideEffect : ~m? +#-----| mu0_6(StructInitFromTemplate) = ^IndirectMayWriteSideEffect[-1] : &:r0_1 +#-----| r0_7(StructInitFromTemplate) = Load[#temp0:0] : &:r0_1, ~m? +#-----| mu0_8(StructInitFromTemplate) = Store[StructInitFromTemplateVar] : &:r2909_3, r0_7 +# 2909| v2909_4(void) = ReturnVoid : +# 2909| v2909_5(void) = AliasedUse : ~m? +# 2909| v2909_6(void) = ExitFunction : + +# 2912| double VariableTemplate +# 2912| Block 0 +# 2912| v2912_1(void) = EnterFunction : +# 2912| mu2912_2(unknown) = AliasedDefinition : +# 2912| r2912_3(glval) = VariableAddress[VariableTemplate] : +# 2912| r2912_4(double) = Constant[42.0] : +# 2912| mu2912_5(double) = Store[VariableTemplate] : &:r2912_3, r2912_4 +# 2912| v2912_6(void) = ReturnVoid : +# 2912| v2912_7(void) = AliasedUse : ~m? +# 2912| v2912_8(void) = ExitFunction : + +# 2915| double VariableTemplateFunc(double) +# 2915| Block 0 +# 2915| v2915_1(void) = EnterFunction : +# 2915| mu2915_2(unknown) = AliasedDefinition : +# 2915| mu2915_3(unknown) = InitializeNonLocal : +# 2915| r2915_4(glval) = VariableAddress[x] : +# 2915| mu2915_5(double) = InitializeParameter[x] : &:r2915_4 +# 2916| r2916_1(glval) = VariableAddress[#return] : +# 2916| r2916_2(double) = Constant[42.0] : +# 2916| r2916_3(glval) = VariableAddress[x] : +# 2916| r2916_4(double) = Load[x] : &:r2916_3, ~m? +# 2916| r2916_5(double) = Add : r2916_2, r2916_4 +# 2916| mu2916_6(double) = Store[#return] : &:r2916_1, r2916_5 +# 2915| r2915_6(glval) = VariableAddress[#return] : +# 2915| v2915_7(void) = ReturnValue : &:r2915_6, ~m? +# 2915| v2915_8(void) = AliasedUse : ~m? +# 2915| v2915_9(void) = ExitFunction : + +# 2919| int VariableTemplateFuncUse +# 2919| Block 0 +# 2919| v2919_1(void) = EnterFunction : +# 2919| mu2919_2(unknown) = AliasedDefinition : +# 2919| r2919_3(glval) = VariableAddress[VariableTemplateFuncUse] : +# 2919| r2919_4(glval) = FunctionAddress[VariableTemplateFunc] : +# 2919| r2919_5(double) = Constant[2.299999999999999822] : +# 2919| r2919_6(double) = Call[VariableTemplateFunc] : func:r2919_4, 0:r2919_5 +# 2919| mu2919_7(unknown) = ^CallSideEffect : ~m? +# 2919| r2919_8(int) = Convert : r2919_6 +# 2919| mu2919_9(int) = Store[VariableTemplateFuncUse] : &:r2919_3, r2919_8 +# 2919| v2919_10(void) = ReturnVoid : +# 2919| v2919_11(void) = AliasedUse : ~m? +# 2919| v2919_12(void) = ExitFunction : + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index f1b75895c3e..1f09b304923 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -29,5 +30,6 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable +| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand 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 f1b75895c3e..1f09b304923 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -29,5 +30,6 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable +| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand missingCppType From ef780c15fb99b8f9b40aba5872540d2011d0c561 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 25 Mar 2026 16:34:02 +0100 Subject: [PATCH 55/81] C++: NSDMI fixes * Do not generate IR for field initializers from uninstantiated templates. * Add forgotten case to `TranslatedDeclarationEntry` --- .../code/cpp/ir/implementation/raw/internal/IRConstruction.qll | 1 + .../implementation/raw/internal/TranslatedDeclarationEntry.qll | 2 ++ 2 files changed, 3 insertions(+) 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 f3d88908cd6..da8c394c845 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 @@ -47,6 +47,7 @@ module Raw { not var.isFromUninstantiatedTemplate(_) and var instanceof StaticInitializedStaticLocalVariable or + not var.isFromUninstantiatedTemplate(_) and var instanceof Field ) and var.hasInitializer() 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 b10bba90536..6de5c1ba21f 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 @@ -34,6 +34,8 @@ abstract class TranslatedDeclarationEntry extends TranslatedElement, TTranslated or result = entry.getDeclaration().(GlobalOrNamespaceVariable) or + result = entry.getDeclaration().(Field) + or not entry.getDeclaration() instanceof StaticInitializedStaticLocalVariable and not entry.getDeclaration() instanceof GlobalOrNamespaceVariable and not entry.getDeclaration() instanceof Field and From ab1f0c13e559aff522e761d308ac5a8f5c8c3ca3 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 25 Mar 2026 16:36:31 +0100 Subject: [PATCH 56/81] C++: Update expected test results --- .../dataflow/dataflow-tests/type-bugs.expected | 6 ------ .../library-tests/ir/ir/aliased_ir.expected | 13 ------------- .../ir/ir/aliased_ssa_consistency.expected | 2 -- .../ir/aliased_ssa_consistency_unsound.expected | 2 -- .../ir/ir/raw_consistency.expected | 2 -- cpp/ql/test/library-tests/ir/ir/raw_ir.expected | 17 ----------------- .../ir/ir/unaliased_ssa_consistency.expected | 2 -- .../unaliased_ssa_consistency_unsound.expected | 2 -- 8 files changed, 46 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected index f68f9cf3081..b5f4db887b6 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected @@ -36,12 +36,6 @@ irTypeBugs | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | [summary] read: Argument[this].Element[*] in operator-> | | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | [summary] to write: ReturnValue[**] in operator-> | | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | ../../../include/iterator.h:31:16:31:25 | [summary] to write: ReturnValue[*] in operator-> | -| ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | container | -| ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | container | -| ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | ../../../include/iterator.h:50:14:50:22 | container | -| ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | container | -| ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | container | -| ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | ../../../include/iterator.h:75:14:75:22 | container | | test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | field | | test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | field | | test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | test.cpp:356:7:356:11 | field | 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 4e66d728b03..66810913e5d 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -21682,19 +21682,6 @@ ir.cpp: # 2905| v2905_20(void) = AliasedUse : ~m2905_16 # 2905| v2905_21(void) = ExitFunction : -# 2906| T StructInitFromTemplate::t -# 2906| Block 0 -# 2906| v2906_1(void) = EnterFunction : -# 2906| m2906_2(unknown) = AliasedDefinition : -# 2906| m2906_3(unknown) = InitializeNonLocal : -# 2906| m2906_4(unknown) = Chi : total:m2906_2, partial:m2906_3 -# 2906| r2906_5(glval) = VariableAddress[#this] : -# 2906| m2906_6(glval>) = InitializeParameter[#this] : &:r2906_5 -# 2906| r2906_7(glval>) = Load[#this] : &:r2906_5, m2906_6 -# 2906| m2906_8(StructInitFromTemplate) = InitializeIndirection[#this] : &:r2906_7 -# 2906| r2906_9(glval) = FieldAddress[t] : r2906_7 -# 2906| r2906_10(glval) = VariableAddress : - # 2906| int StructInitFromTemplate::t # 2906| Block 0 # 2906| v2906_1(void) = EnterFunction : 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 1f09b304923..f1b75895c3e 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -30,6 +29,5 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand 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 1f09b304923..f1b75895c3e 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -30,6 +29,5 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand missingCppType 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 1f09b304923..f1b75895c3e 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -30,6 +29,5 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand 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 8ff676c6d73..4e73b7d1aa6 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -19697,23 +19697,6 @@ ir.cpp: # 2905| v2905_16(void) = AliasedUse : ~m? # 2905| v2905_17(void) = ExitFunction : -# 2906| T StructInitFromTemplate::t -# 2906| Block 0 -# 2906| v2906_1(void) = EnterFunction : -# 2906| mu2906_2(unknown) = AliasedDefinition : -# 2906| mu2906_3(unknown) = InitializeNonLocal : -# 2906| r2906_4(glval) = VariableAddress[#this] : -# 2906| mu2906_5(glval>) = InitializeParameter[#this] : &:r2906_4 -# 2906| r2906_6(glval>) = Load[#this] : &:r2906_4, ~m? -# 2906| mu2906_7(StructInitFromTemplate) = InitializeIndirection[#this] : &:r2906_6 -# 2906| r2906_8(glval) = FieldAddress[t] : r2906_6 -# 2906| r2906_9(glval) = VariableAddress : - -# 2906| Block 1 -# 2906| v2906_10(void) = ReturnVoid : -# 2906| v2906_11(void) = AliasedUse : ~m? -# 2906| v2906_12(void) = ExitFunction : - # 2906| int StructInitFromTemplate::t # 2906| Block 0 # 2906| v2906_1(void) = EnterFunction : 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 1f09b304923..f1b75895c3e 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -30,6 +29,5 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand 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 1f09b304923..f1b75895c3e 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:2906:11:2906:13 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' has no successors in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -30,6 +29,5 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| ir.cpp:2906:11:2906:13 | VariableAddress: temporary object | Variable address instruction 'VariableAddress: temporary object' has no associated variable, in function '$@'. | ir.cpp:2906:7:2906:7 | T StructInitFromTemplate::t | T StructInitFromTemplate::t | nonBooleanOperand missingCppType From 94ad234a28b13efe08295d24d33363488f5f6ded Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 03:07:47 +0000 Subject: [PATCH 57/81] Bump rules_shell from 0.6.1 to 0.7.1 Bumps [rules_shell](https://github.com/bazel-contrib/rules_shell) from 0.6.1 to 0.7.1. - [Release notes](https://github.com/bazel-contrib/rules_shell/releases) - [Commits](https://github.com/bazel-contrib/rules_shell/compare/v0.6.1...v0.7.1) --- updated-dependencies: - dependency-name: rules_shell dependency-version: 0.7.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- MODULE.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 1ae9b94996f..d1aad277ed4 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -21,7 +21,7 @@ bazel_dep(name = "rules_java", version = "9.6.1") bazel_dep(name = "rules_pkg", version = "1.2.0") bazel_dep(name = "rules_nodejs", version = "6.7.3") bazel_dep(name = "rules_python", version = "1.9.0") -bazel_dep(name = "rules_shell", version = "0.6.1") +bazel_dep(name = "rules_shell", version = "0.7.1") bazel_dep(name = "bazel_skylib", version = "1.9.0") bazel_dep(name = "abseil-cpp", version = "20260107.1", repo_name = "absl") bazel_dep(name = "nlohmann_json", version = "3.11.3", repo_name = "json") From a402ce59f4dd20c300a799ff1b29f2eddb6a8eb7 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 26 Mar 2026 09:44:14 +0100 Subject: [PATCH 58/81] C#: Fix bad join in cs/coalesce-of-identical-expressions. --- .../UselessNullCoalescingExpression.ql | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql b/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql index 78e1ea365a5..0b2201570fb 100644 --- a/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql +++ b/csharp/ql/src/Language Abuse/UselessNullCoalescingExpression.ql @@ -15,13 +15,21 @@ import csharp import semmle.code.csharp.commons.StructuralComparison +pragma[nomagic] +private predicate relevant(Expr left, Expr right) { + exists(NullCoalescingOperation nce | + left = nce.getLeftOperand() and + right = nce.getRightOperand() + ) +} + pragma[noinline] private predicate same(AssignableAccess x, AssignableAccess y) { - exists(NullCoalescingOperation nc | - x = nc.getLeftOperand() and - y = nc.getRightOperand().getAChildExpr*() - ) and - sameGvn(x, y) + exists(Expr e | + relevant(x, e) and + y = e.getAChildExpr*() and + sameGvn(x, y) + ) } private predicate uselessNullCoalescingOperation(NullCoalescingOperation nce) { From a5f27b8f19beb33c6c5bfb6b55f3307eef11927a Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 26 Mar 2026 11:52:42 +0100 Subject: [PATCH 59/81] C#: Add change-note. --- csharp/ql/lib/change-notes/2026-03-26-expanded-assignments.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-03-26-expanded-assignments.md diff --git a/csharp/ql/lib/change-notes/2026-03-26-expanded-assignments.md b/csharp/ql/lib/change-notes/2026-03-26-expanded-assignments.md new file mode 100644 index 00000000000..159ab1ee3c6 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-03-26-expanded-assignments.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The extractor no longer synthesizes expanded forms of compound assignments. This may have a small impact on the results of queries that explicitly or implicitly rely on the expanded form of compound assignments. From 4748c4a4f572c0fb9d7d8a826654db28c9976d4d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 12:31:21 +0000 Subject: [PATCH 60/81] Initial plan From a6377145ac11808edcc1862b2a329f517a74293a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 12:38:19 +0000 Subject: [PATCH 61/81] Convert C++ CSV models from QL files to .model.yml data extensions Migrate ZeroMQ models from ZMQ.qll and getc-family source models from Gets.qll into new .model.yml files in the ext/ directory. Agent-Logs-Url: https://github.com/github/codeql/sessions/da8f5e5b-35f7-47a4-afa0-750616e3df5b Co-authored-by: owen-mc <62447351+owen-mc@users.noreply.github.com> --- .../2026-03-26-convert-csv-models-to-yml.md | 4 ++ cpp/ql/lib/ext/ZMQ.model.yml | 22 +++++++++ cpp/ql/lib/ext/getc.model.yml | 19 ++++++++ cpp/ql/lib/semmle/code/cpp/models/Models.qll | 1 - .../code/cpp/models/implementations/Gets.qll | 17 ------- .../code/cpp/models/implementations/ZMQ.qll | 45 ------------------- 6 files changed, 45 insertions(+), 63 deletions(-) create mode 100644 cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md create mode 100644 cpp/ql/lib/ext/ZMQ.model.yml create mode 100644 cpp/ql/lib/ext/getc.model.yml delete mode 100644 cpp/ql/lib/semmle/code/cpp/models/implementations/ZMQ.qll diff --git a/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md b/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md new file mode 100644 index 00000000000..9fd99403bc4 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* ZeroMQ and `getc`-family models have been migrated from inline CSV specifications in QL files to `.model.yml` data extension files in the `ext/` directory. diff --git a/cpp/ql/lib/ext/ZMQ.model.yml b/cpp/ql/lib/ext/ZMQ.model.yml new file mode 100644 index 00000000000..62c3bb1a3bf --- /dev/null +++ b/cpp/ql/lib/ext/ZMQ.model.yml @@ -0,0 +1,22 @@ +# ZeroMQ networking library models +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: sourceModel + data: # namespace, type, subtypes, name, signature, ext, output, kind, provenance + - ["", "", False, "zmq_recv", "", "", "Argument[*1]", "remote", "manual"] + - ["", "", False, "zmq_recvmsg", "", "", "Argument[*1]", "remote", "manual"] + - ["", "", False, "zmq_msg_recv", "", "", "Argument[*0]", "remote", "manual"] + - addsTo: + pack: codeql/cpp-all + extensible: sinkModel + data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance + - ["", "", False, "zmq_send", "", "", "Argument[*1]", "remote-sink", "manual"] + - ["", "", False, "zmq_sendmsg", "", "", "Argument[*1]", "remote-sink", "manual"] + - ["", "", False, "zmq_msg_send", "", "", "Argument[*0]", "remote-sink", "manual"] + - addsTo: + pack: codeql/cpp-all + extensible: summaryModel + data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance + - ["", "", False, "zmq_msg_init_data", "", "", "Argument[*1]", "Argument[*0]", "taint", "manual"] + - ["", "", False, "zmq_msg_data", "", "", "Argument[*0]", "ReturnValue[*]", "taint", "manual"] diff --git a/cpp/ql/lib/ext/getc.model.yml b/cpp/ql/lib/ext/getc.model.yml new file mode 100644 index 00000000000..43958205e0b --- /dev/null +++ b/cpp/ql/lib/ext/getc.model.yml @@ -0,0 +1,19 @@ +# Models for getc and similar character-reading functions +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: sourceModel + data: # namespace, type, subtypes, name, signature, ext, output, kind, provenance + - ["", "", False, "getc", "", "", "ReturnValue", "remote", "manual"] + - ["", "", False, "getwc", "", "", "ReturnValue", "remote", "manual"] + - ["", "", False, "_getc_nolock", "", "", "ReturnValue", "remote", "manual"] + - ["", "", False, "_getwc_nolock", "", "", "ReturnValue", "remote", "manual"] + - ["", "", False, "getch", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "_getch", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "_getwch", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "_getch_nolock", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "_getwch_nolock", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "getchar", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "getwchar", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "_getchar_nolock", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "_getwchar_nolock", "", "", "ReturnValue", "local", "manual"] diff --git a/cpp/ql/lib/semmle/code/cpp/models/Models.qll b/cpp/ql/lib/semmle/code/cpp/models/Models.qll index 09f0a0df966..3ac08ee7aff 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/Models.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/Models.qll @@ -48,7 +48,6 @@ private import implementations.SqLite3 private import implementations.PostgreSql private import implementations.System private import implementations.StructuredExceptionHandling -private import implementations.ZMQ private import implementations.Win32CommandExecution private import implementations.CA2AEX private import implementations.CComBSTR 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 b5d12083035..66d7730a818 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll @@ -113,20 +113,3 @@ private class GetsFunction extends DataFlowFunction, ArrayFunction, AliasFunctio override predicate hasArrayOutput(int bufParam) { bufParam = 0 } } -/** - * A model for `getc` and similar functions that are flow sources. - */ -private class GetcSource extends SourceModelCsv { - override predicate row(string row) { - row = - [ - ";;false;getc;;;ReturnValue;remote", ";;false;getwc;;;ReturnValue;remote", - ";;false;_getc_nolock;;;ReturnValue;remote", ";;false;_getwc_nolock;;;ReturnValue;remote", - ";;false;getch;;;ReturnValue;local", ";;false;_getch;;;ReturnValue;local", - ";;false;_getwch;;;ReturnValue;local", ";;false;_getch_nolock;;;ReturnValue;local", - ";;false;_getwch_nolock;;;ReturnValue;local", ";;false;getchar;;;ReturnValue;local", - ";;false;getwchar;;;ReturnValue;local", ";;false;_getchar_nolock;;;ReturnValue;local", - ";;false;_getwchar_nolock;;;ReturnValue;local", - ] - } -} diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/ZMQ.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/ZMQ.qll deleted file mode 100644 index 22f04cb9c82..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/ZMQ.qll +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Provides implementation classes modeling the ZeroMQ networking library. - */ - -import semmle.code.cpp.models.interfaces.FlowSource - -/** - * Remote flow sources. - */ -private class ZmqSource extends SourceModelCsv { - override predicate row(string row) { - row = - [ - ";;false;zmq_recv;;;Argument[*1];remote", ";;false;zmq_recvmsg;;;Argument[*1];remote", - ";;false;zmq_msg_recv;;;Argument[*0];remote", - ] - } -} - -/** - * Remote flow sinks. - */ -private class ZmqSinks extends SinkModelCsv { - override predicate row(string row) { - row = - [ - ";;false;zmq_send;;;Argument[*1];remote-sink", - ";;false;zmq_sendmsg;;;Argument[*1];remote-sink", - ";;false;zmq_msg_send;;;Argument[*0];remote-sink", - ] - } -} - -/** - * Flow steps. - */ -private class ZmqSummaries extends SummaryModelCsv { - override predicate row(string row) { - row = - [ - ";;false;zmq_msg_init_data;;;Argument[*1];Argument[*0];taint", - ";;false;zmq_msg_data;;;Argument[*0];ReturnValue[*];taint", - ] - } -} From 41bb349a9b1a67ef37de8e20075fa5eb9046ad8b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 26 Mar 2026 14:34:54 +0100 Subject: [PATCH 62/81] C#: Improve the downgrade script. --- .../assignments.ql | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/assignments.ql b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/assignments.ql index 14e2cea2af6..199385e830e 100644 --- a/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/assignments.ql +++ b/csharp/downgrades/19b8cc3e2dc768d4cbc03d6e3773b709bbebd036/assignments.ql @@ -7,9 +7,9 @@ class Location extends @location { } newtype TAddedElement = - TAssignment(Expr e) or - TLhs(Expr e) or - TRhs(Expr e) + TAssignment(CompoundAssignmentExpr e) or + TLhs(CompoundAssignmentExpr e) or + TRhs(CompoundAssignmentExpr e) module Fresh = QlBuiltins::NewEntity; @@ -103,7 +103,6 @@ query predicate new_expressions(NewExpr e, int kind, TypeOrRef t) { // Introduce expanded expression nodes. exists(CompoundAssignmentExpr compound, int kind0, Expr e1, int kind1 | expressions(compound, kind0, t) and - compoundAssignmentKind(kind0) and expressions(e1, kind1, _) and expr_parent(e1, 0, compound) | From 6769f08f93b44b1b33a6829a91bfa9d5dba97d22 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 26 Mar 2026 14:10:15 +0000 Subject: [PATCH 63/81] Remove blank line at end of file --- cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll | 1 - 1 file changed, 1 deletion(-) 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 66d7730a818..c0e2c0c4538 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll @@ -112,4 +112,3 @@ private class GetsFunction extends DataFlowFunction, ArrayFunction, AliasFunctio override predicate hasArrayOutput(int bufParam) { bufParam = 0 } } - From 64a52ba07fbd722b37b47737c110914bfb4e9a6b Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 26 Mar 2026 14:53:33 +0000 Subject: [PATCH 64/81] Update test that uses zmq models --- .../semmle/tests/ExposedSystemData.expected | 61 ++++++++++--------- .../semmle/tests/ExposedSystemData.qlref | 3 +- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected index 4ae072c6ce4..3958656bb4b 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected @@ -1,3 +1,24 @@ +#select +| tests2.cpp:63:13:63:26 | *call to getenv | tests2.cpp:63:13:63:26 | *call to getenv | tests2.cpp:63:13:63:26 | *call to getenv | This operation exposes system data from $@. | tests2.cpp:63:13:63:26 | *call to getenv | *call to getenv | +| tests2.cpp:64:13:64:26 | *call to getenv | tests2.cpp:64:13:64:26 | *call to getenv | tests2.cpp:64:13:64:26 | *call to getenv | This operation exposes system data from $@. | tests2.cpp:64:13:64:26 | *call to getenv | *call to getenv | +| tests2.cpp:65:13:65:30 | *call to getenv | tests2.cpp:65:13:65:30 | *call to getenv | tests2.cpp:65:13:65:30 | *call to getenv | This operation exposes system data from $@. | tests2.cpp:65:13:65:30 | *call to getenv | *call to getenv | +| tests2.cpp:66:13:66:34 | *call to getenv | tests2.cpp:66:13:66:34 | *call to getenv | tests2.cpp:66:13:66:34 | *call to getenv | This operation exposes system data from $@. | tests2.cpp:66:13:66:34 | *call to getenv | *call to getenv | +| tests2.cpp:80:14:80:34 | *call to mysql_get_client_info | tests2.cpp:80:14:80:34 | *call to mysql_get_client_info | tests2.cpp:80:14:80:34 | *call to mysql_get_client_info | This operation exposes system data from $@. | tests2.cpp:80:14:80:34 | *call to mysql_get_client_info | *call to mysql_get_client_info | +| tests2.cpp:81:14:81:19 | *buffer | tests2.cpp:78:18:78:38 | *call to mysql_get_client_info | tests2.cpp:81:14:81:19 | *buffer | This operation exposes system data from $@. | tests2.cpp:78:18:78:38 | *call to mysql_get_client_info | *call to mysql_get_client_info | +| tests2.cpp:82:14:82:20 | *global1 | tests2.cpp:50:23:50:43 | *call to mysql_get_client_info | tests2.cpp:82:14:82:20 | *global1 | This operation exposes system data from $@. | tests2.cpp:50:23:50:43 | *call to mysql_get_client_info | *call to mysql_get_client_info | +| tests2.cpp:93:14:93:17 | *str1 | tests2.cpp:91:42:91:45 | *str1 | tests2.cpp:93:14:93:17 | *str1 | This operation exposes system data from $@. | tests2.cpp:91:42:91:45 | *str1 | *str1 | +| tests2.cpp:102:14:102:15 | *pw | tests2.cpp:101:8:101:15 | *call to getpwuid | tests2.cpp:102:14:102:15 | *pw | This operation exposes system data from $@. | tests2.cpp:101:8:101:15 | *call to getpwuid | *call to getpwuid | +| tests2.cpp:111:14:111:19 | *ptr | tests2.cpp:109:12:109:17 | *call to getenv | tests2.cpp:111:14:111:19 | *ptr | This operation exposes system data from $@. | tests2.cpp:109:12:109:17 | *call to getenv | *call to getenv | +| tests2.cpp:138:23:138:34 | *message_data | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:138:23:138:34 | *message_data | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:144:33:144:40 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:144:33:144:40 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:147:20:147:27 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:147:20:147:27 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:155:32:155:39 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:155:32:155:39 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:158:20:158:27 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:158:20:158:27 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests_sockets.cpp:39:19:39:22 | *path | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:39:19:39:22 | *path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | *call to getenv | *call to getenv | +| tests_sockets.cpp:43:20:43:23 | *path | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:43:20:43:23 | *path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | *call to getenv | *call to getenv | +| tests_sockets.cpp:76:19:76:22 | *path | tests_sockets.cpp:63:15:63:20 | *call to getenv | tests_sockets.cpp:76:19:76:22 | *path | This operation exposes system data from $@. | tests_sockets.cpp:63:15:63:20 | *call to getenv | *call to getenv | +| tests_sockets.cpp:80:20:80:23 | *path | tests_sockets.cpp:63:15:63:20 | *call to getenv | tests_sockets.cpp:80:20:80:23 | *path | This operation exposes system data from $@. | tests_sockets.cpp:63:15:63:20 | *call to getenv | *call to getenv | +| tests_sysconf.cpp:39:19:39:25 | *pathbuf | tests_sysconf.cpp:36:21:36:27 | confstr output argument | tests_sysconf.cpp:39:19:39:25 | *pathbuf | This operation exposes system data from $@. | tests_sysconf.cpp:36:21:36:27 | confstr output argument | confstr output argument | edges | tests2.cpp:50:13:50:19 | **global1 | tests2.cpp:82:14:82:20 | *global1 | provenance | | | tests2.cpp:50:23:50:43 | *call to mysql_get_client_info | tests2.cpp:50:13:50:19 | **global1 | provenance | | @@ -12,16 +33,16 @@ edges | tests2.cpp:111:14:111:15 | *c1 [*ptr] | tests2.cpp:111:14:111:19 | *ptr | provenance | | | tests2.cpp:111:14:111:15 | *c1 [*ptr] | tests2.cpp:111:17:111:19 | *ptr | provenance | | | tests2.cpp:111:17:111:19 | *ptr | tests2.cpp:111:14:111:19 | *ptr | provenance | | -| tests2.cpp:120:5:120:21 | [summary param] *1 in zmq_msg_init_data | tests2.cpp:120:5:120:21 | [summary param] *0 in zmq_msg_init_data [Return] | provenance | | -| tests2.cpp:134:2:134:30 | *... = ... | tests2.cpp:138:23:138:34 | *message_data | provenance | | +| tests2.cpp:120:5:120:21 | [summary param] *1 in zmq_msg_init_data | tests2.cpp:120:5:120:21 | [summary param] *0 in zmq_msg_init_data [Return] | provenance | MaD:4 | +| tests2.cpp:134:2:134:30 | *... = ... | tests2.cpp:138:23:138:34 | *message_data | provenance | Sink:MaD:2 | | tests2.cpp:134:2:134:30 | *... = ... | tests2.cpp:143:34:143:45 | *message_data | provenance | | | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:134:2:134:30 | *... = ... | provenance | | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:144:33:144:40 | *& ... | provenance | | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:147:20:147:27 | *& ... | provenance | | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:155:32:155:39 | *& ... | provenance | | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:158:20:158:27 | *& ... | provenance | | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:144:33:144:40 | *& ... | provenance | Sink:MaD:3 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:147:20:147:27 | *& ... | provenance | Sink:MaD:1 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:155:32:155:39 | *& ... | provenance | Sink:MaD:3 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:158:20:158:27 | *& ... | provenance | Sink:MaD:1 | | tests2.cpp:143:34:143:45 | *message_data | tests2.cpp:120:5:120:21 | [summary param] *1 in zmq_msg_init_data | provenance | | -| tests2.cpp:143:34:143:45 | *message_data | tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | provenance | | +| tests2.cpp:143:34:143:45 | *message_data | tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | provenance | MaD:4 | | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:26:15:26:20 | *call to getenv | provenance | | | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:39:19:39:22 | *path | provenance | | | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:43:20:43:23 | *path | provenance | | @@ -29,6 +50,11 @@ edges | tests_sockets.cpp:63:15:63:20 | *call to getenv | tests_sockets.cpp:76:19:76:22 | *path | provenance | | | tests_sockets.cpp:63:15:63:20 | *call to getenv | tests_sockets.cpp:80:20:80:23 | *path | provenance | | | tests_sysconf.cpp:36:21:36:27 | confstr output argument | tests_sysconf.cpp:39:19:39:25 | *pathbuf | provenance | | +models +| 1 | Sink: ; ; false; zmq_msg_send; ; ; Argument[*0]; remote-sink; manual | +| 2 | Sink: ; ; false; zmq_send; ; ; Argument[*1]; remote-sink; manual | +| 3 | Sink: ; ; false; zmq_sendmsg; ; ; Argument[*1]; remote-sink; manual | +| 4 | Summary: ; ; false; zmq_msg_init_data; ; ; Argument[*1]; Argument[*0]; taint; manual | nodes | tests2.cpp:50:13:50:19 | **global1 | semmle.label | **global1 | | tests2.cpp:50:23:50:43 | *call to mysql_get_client_info | semmle.label | *call to mysql_get_client_info | @@ -75,24 +101,3 @@ nodes | tests_sysconf.cpp:39:19:39:25 | *pathbuf | semmle.label | *pathbuf | subpaths | tests2.cpp:143:34:143:45 | *message_data | tests2.cpp:120:5:120:21 | [summary param] *1 in zmq_msg_init_data | tests2.cpp:120:5:120:21 | [summary param] *0 in zmq_msg_init_data [Return] | tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | -#select -| tests2.cpp:63:13:63:26 | *call to getenv | tests2.cpp:63:13:63:26 | *call to getenv | tests2.cpp:63:13:63:26 | *call to getenv | This operation exposes system data from $@. | tests2.cpp:63:13:63:26 | *call to getenv | *call to getenv | -| tests2.cpp:64:13:64:26 | *call to getenv | tests2.cpp:64:13:64:26 | *call to getenv | tests2.cpp:64:13:64:26 | *call to getenv | This operation exposes system data from $@. | tests2.cpp:64:13:64:26 | *call to getenv | *call to getenv | -| tests2.cpp:65:13:65:30 | *call to getenv | tests2.cpp:65:13:65:30 | *call to getenv | tests2.cpp:65:13:65:30 | *call to getenv | This operation exposes system data from $@. | tests2.cpp:65:13:65:30 | *call to getenv | *call to getenv | -| tests2.cpp:66:13:66:34 | *call to getenv | tests2.cpp:66:13:66:34 | *call to getenv | tests2.cpp:66:13:66:34 | *call to getenv | This operation exposes system data from $@. | tests2.cpp:66:13:66:34 | *call to getenv | *call to getenv | -| tests2.cpp:80:14:80:34 | *call to mysql_get_client_info | tests2.cpp:80:14:80:34 | *call to mysql_get_client_info | tests2.cpp:80:14:80:34 | *call to mysql_get_client_info | This operation exposes system data from $@. | tests2.cpp:80:14:80:34 | *call to mysql_get_client_info | *call to mysql_get_client_info | -| tests2.cpp:81:14:81:19 | *buffer | tests2.cpp:78:18:78:38 | *call to mysql_get_client_info | tests2.cpp:81:14:81:19 | *buffer | This operation exposes system data from $@. | tests2.cpp:78:18:78:38 | *call to mysql_get_client_info | *call to mysql_get_client_info | -| tests2.cpp:82:14:82:20 | *global1 | tests2.cpp:50:23:50:43 | *call to mysql_get_client_info | tests2.cpp:82:14:82:20 | *global1 | This operation exposes system data from $@. | tests2.cpp:50:23:50:43 | *call to mysql_get_client_info | *call to mysql_get_client_info | -| tests2.cpp:93:14:93:17 | *str1 | tests2.cpp:91:42:91:45 | *str1 | tests2.cpp:93:14:93:17 | *str1 | This operation exposes system data from $@. | tests2.cpp:91:42:91:45 | *str1 | *str1 | -| tests2.cpp:102:14:102:15 | *pw | tests2.cpp:101:8:101:15 | *call to getpwuid | tests2.cpp:102:14:102:15 | *pw | This operation exposes system data from $@. | tests2.cpp:101:8:101:15 | *call to getpwuid | *call to getpwuid | -| tests2.cpp:111:14:111:19 | *ptr | tests2.cpp:109:12:109:17 | *call to getenv | tests2.cpp:111:14:111:19 | *ptr | This operation exposes system data from $@. | tests2.cpp:109:12:109:17 | *call to getenv | *call to getenv | -| tests2.cpp:138:23:138:34 | *message_data | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:138:23:138:34 | *message_data | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:144:33:144:40 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:144:33:144:40 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:147:20:147:27 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:147:20:147:27 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:155:32:155:39 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:155:32:155:39 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:158:20:158:27 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:158:20:158:27 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests_sockets.cpp:39:19:39:22 | *path | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:39:19:39:22 | *path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | *call to getenv | *call to getenv | -| tests_sockets.cpp:43:20:43:23 | *path | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:43:20:43:23 | *path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | *call to getenv | *call to getenv | -| tests_sockets.cpp:76:19:76:22 | *path | tests_sockets.cpp:63:15:63:20 | *call to getenv | tests_sockets.cpp:76:19:76:22 | *path | This operation exposes system data from $@. | tests_sockets.cpp:63:15:63:20 | *call to getenv | *call to getenv | -| tests_sockets.cpp:80:20:80:23 | *path | tests_sockets.cpp:63:15:63:20 | *call to getenv | tests_sockets.cpp:80:20:80:23 | *path | This operation exposes system data from $@. | tests_sockets.cpp:63:15:63:20 | *call to getenv | *call to getenv | -| tests_sysconf.cpp:39:19:39:25 | *pathbuf | tests_sysconf.cpp:36:21:36:27 | confstr output argument | tests_sysconf.cpp:39:19:39:25 | *pathbuf | This operation exposes system data from $@. | tests_sysconf.cpp:36:21:36:27 | confstr output argument | confstr output argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.qlref index 0c88835bf1f..20c49dc2376 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.qlref +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.qlref @@ -1 +1,2 @@ -Security/CWE/CWE-497/ExposedSystemData.ql \ No newline at end of file +query: Security/CWE/CWE-497/ExposedSystemData.ql +postprocess: utils/test/PrettyPrintModels.ql From d69bcca68751fb1b5cbc3a0d719f65824b945c5c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 15:07:39 +0000 Subject: [PATCH 65/81] Remove CSV model infrastructure from ExternalFlow.qll Remove SourceModelCsv, SinkModelCsv, SummaryModelCsv classes, single-argument CSV predicates, CSV parsing in MadInput, and CSV-specific validation checks. Simplify MadInput to only contain the namespace separator. Convert test models to .ext.yml format. Agent-Logs-Url: https://github.com/github/codeql/sessions/89ff81fe-5585-446d-99e2-6fe6966495c5 Co-authored-by: owen-mc <62447351+owen-mc@users.noreply.github.com> --- .../2026-03-26-convert-csv-models-to-yml.md | 4 +- .../semmle/code/cpp/dataflow/ExternalFlow.qll | 158 +----------------- .../models-as-data/testModels.ext.yml | 84 ++++++++++ .../dataflow/models-as-data/testModels.qll | 104 ------------ 4 files changed, 94 insertions(+), 256 deletions(-) create mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml diff --git a/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md b/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md index 9fd99403bc4..1fcb2d6ac6c 100644 --- a/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md +++ b/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md @@ -1,4 +1,4 @@ --- -category: minorAnalysis +category: breaking --- -* ZeroMQ and `getc`-family models have been migrated from inline CSV specifications in QL files to `.model.yml` data extension files in the `ext/` directory. +* ZeroMQ and `getc`-family models have been migrated from inline CSV specifications in QL files to `.model.yml` data extension files in the `ext/` directory. The `SourceModelCsv`, `SinkModelCsv`, and `SummaryModelCsv` classes and the associated CSV parsing infrastructure have been removed from `ExternalFlow.qll`. New models should be added as `.model.yml` files in the `ext/` directory. diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index 7cf3b937ac5..c960f39ec77 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -1,9 +1,10 @@ /** * INTERNAL use only. This is an experimental API subject to change without notice. * - * Provides classes and predicates for dealing with flow models specified in CSV format. + * Provides classes and predicates for dealing with flow models specified + * in data extension files. * - * The CSV specification has the following columns: + * The specification has the following columns: * - Sources: * `namespace; type; subtypes; name; signature; ext; output; kind` * - Sinks: @@ -104,117 +105,9 @@ private import internal.FlowSummaryImpl::Private private import internal.FlowSummaryImpl::Private::External private import internal.ExternalFlowExtensions::Extensions as Extensions private import codeql.mad.ModelValidation as SharedModelVal -private import codeql.util.Unit private import codeql.mad.static.ModelsAsData as SharedMaD -/** - * A unit class for adding additional source model rows. - * - * Extend this class to add additional source definitions. - */ -class SourceModelCsv extends Unit { - /** Holds if `row` specifies a source definition. */ - abstract predicate row(string row); -} - -/** - * A unit class for adding additional sink model rows. - * - * Extend this class to add additional sink definitions. - */ -class SinkModelCsv extends Unit { - /** Holds if `row` specifies a sink definition. */ - abstract predicate row(string row); -} - -/** - * A unit class for adding additional summary model rows. - * - * Extend this class to add additional flow summary definitions. - */ -class SummaryModelCsv extends Unit { - /** Holds if `row` specifies a summary definition. */ - abstract predicate row(string row); -} - -/** Holds if `row` is a source model. */ -predicate sourceModel(string row) { any(SourceModelCsv s).row(row) } - -/** Holds if `row` is a sink model. */ -predicate sinkModel(string row) { any(SinkModelCsv s).row(row) } - -/** Holds if `row` is a summary model. */ -predicate summaryModel(string row) { any(SummaryModelCsv s).row(row) } - private module MadInput implements SharedMaD::InputSig { - /** Holds if a source model exists for the given parameters. */ - predicate additionalSourceModel( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string output, string kind, string provenance, string model - ) { - exists(string row | - sourceModel(row) and - row.splitAt(";", 0) = namespace and - row.splitAt(";", 1) = type and - row.splitAt(";", 2) = subtypes.toString() and - subtypes = [true, false] and - row.splitAt(";", 3) = name and - row.splitAt(";", 4) = signature and - row.splitAt(";", 5) = ext and - row.splitAt(";", 6) = output and - row.splitAt(";", 7) = kind - ) and - provenance = "manual" and - model = "" - } - - /** Holds if a sink model exists for the given parameters. */ - predicate additionalSinkModel( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string kind, string provenance, string model - ) { - exists(string row | - sinkModel(row) and - row.splitAt(";", 0) = namespace and - row.splitAt(";", 1) = type and - row.splitAt(";", 2) = subtypes.toString() and - subtypes = [true, false] and - row.splitAt(";", 3) = name and - row.splitAt(";", 4) = signature and - row.splitAt(";", 5) = ext and - row.splitAt(";", 6) = input and - row.splitAt(";", 7) = kind - ) and - provenance = "manual" and - model = "" - } - - /** - * Holds if a summary model exists for the given parameters. - * - * This predicate does not expand `@` to `*`s. - */ - predicate additionalSummaryModel( - string namespace, string type, boolean subtypes, string name, string signature, string ext, - string input, string output, string kind, string provenance, string model - ) { - exists(string row | - summaryModel(row) and - row.splitAt(";", 0) = namespace and - row.splitAt(";", 1) = type and - row.splitAt(";", 2) = subtypes.toString() and - subtypes = [true, false] and - row.splitAt(";", 3) = name and - row.splitAt(";", 4) = signature and - row.splitAt(";", 5) = ext and - row.splitAt(";", 6) = input and - row.splitAt(";", 7) = output and - row.splitAt(";", 8) = kind - ) and - provenance = "manual" and - model = "" - } - string namespaceSegmentSeparator() { result = "::" } } @@ -250,7 +143,7 @@ predicate summaryModel( ) } -/** Provides a query predicate to check the CSV data for validation errors. */ +/** Provides a query predicate to check the data for validation errors. */ module CsvValidation { private string getInvalidModelInput() { exists(string pred, AccessPath input, string part | @@ -294,40 +187,6 @@ module CsvValidation { private module KindVal = SharedModelVal::KindValidation; - private string getInvalidModelSubtype() { - exists(string pred, string row | - sourceModel(row) and pred = "source" - or - sinkModel(row) and pred = "sink" - or - summaryModel(row) and pred = "summary" - | - exists(string b | - b = row.splitAt(";", 2) and - not b = ["true", "false"] and - result = "Invalid boolean \"" + b + "\" in " + pred + " model." - ) - ) - } - - private string getInvalidModelColumnCount() { - exists(string pred, string row, int expect | - sourceModel(row) and expect = 8 and pred = "source" - or - sinkModel(row) and expect = 8 and pred = "sink" - or - summaryModel(row) and expect = 9 and pred = "summary" - | - exists(int cols | - cols = 1 + max(int n | exists(row.splitAt(";", n))) and - cols != expect and - result = - "Wrong number of columns in " + pred + " model row, expected " + expect + ", got " + cols + - "." - ) - ) - } - private string getInvalidModelSignature() { exists(string pred, string namespace, string type, string name, string signature, string ext | sourceModel(namespace, type, _, name, signature, ext, _, _, _, _) and pred = "source" @@ -366,13 +225,12 @@ module CsvValidation { ) } - /** Holds if some row in a CSV-based flow model appears to contain typos. */ + /** Holds if some row in a MaD flow model appears to contain typos. */ query predicate invalidModelRow(string msg) { msg = [ getInvalidModelSignature(), getInvalidModelInput(), getInvalidModelOutput(), - getInvalidModelSubtype(), getInvalidModelColumnCount(), KindVal::getInvalidModelKind(), - getIncorrectConstructorSummaryOutput() + KindVal::getInvalidModelKind(), getIncorrectConstructorSummaryOutput() ] } } @@ -1026,7 +884,7 @@ private module Cached { } /** - * Holds if `node` is specified as a source with the given kind in a CSV flow + * Holds if `node` is specified as a source with the given kind in a MaD flow * model. */ cached @@ -1037,7 +895,7 @@ private module Cached { } /** - * Holds if `node` is specified as a sink with the given kind in a CSV flow + * Holds if `node` is specified as a sink with the given kind in a MaD flow * model. */ cached diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml new file mode 100644 index 00000000000..bc2709d647b --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml @@ -0,0 +1,84 @@ +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: sourceModel + data: # namespace, type, subtypes, name, signature, ext, output, kind, provenance + - ["", "", False, "localMadSource", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "remoteMadSource", "", "", "ReturnValue", "remote", "manual"] + - ["", "", False, "localMadSourceVoid", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "localMadSourceHasBody", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "remoteMadSourceIndirect", "", "", "ReturnValue[*]", "remote", "manual"] + - ["", "", False, "remoteMadSourceDoubleIndirect", "", "", "ReturnValue[**]", "remote", "manual"] + - ["", "", False, "remoteMadSourceIndirectArg0", "", "", "Argument[*0]", "remote", "manual"] + - ["", "", False, "remoteMadSourceIndirectArg1", "", "", "Argument[*1]", "remote", "manual"] + - ["", "", False, "remoteMadSourceVar", "", "", "", "remote", "manual"] + - ["", "", False, "remoteMadSourceVarIndirect", "", "", "*", "remote", "manual"] + - ["", "", False, "remoteMadSourceParam0", "", "", "Parameter[0]", "remote", "manual"] + - ["MyNamespace", "", False, "namespaceLocalMadSource", "", "", "ReturnValue", "local", "manual"] + - ["MyNamespace", "", False, "namespaceLocalMadSourceVar", "", "", "", "local", "manual"] + - ["MyNamespace::MyNamespace2", "", False, "namespace2LocalMadSource", "", "", "ReturnValue", "local", "manual"] + - ["", "MyClass", True, "memberRemoteMadSource", "", "", "ReturnValue", "remote", "manual"] + - ["", "MyClass", True, "memberRemoteMadSourceIndirectArg0", "", "", "Argument[*0]", "remote", "manual"] + - ["", "MyClass", True, "memberRemoteMadSourceVar", "", "", "", "remote", "manual"] + - ["", "MyClass", True, "subtypeRemoteMadSource1", "", "", "ReturnValue", "remote", "manual"] + - ["", "MyClass", False, "subtypeNonSource", "", "", "ReturnValue", "remote", "manual"] + - ["", "MyClass", True, "qualifierSource", "", "", "Argument[-1]", "remote", "manual"] + - ["", "MyClass", True, "qualifierFieldSource", "", "", "Argument[-1].val", "remote", "manual"] + - ["", "MyDerivedClass", False, "subtypeRemoteMadSource2", "", "", "ReturnValue", "remote", "manual"] + - addsTo: + pack: codeql/cpp-all + extensible: sinkModel + data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance + - ["", "", False, "madSinkArg0", "", "", "Argument[0]", "test-sink", "manual"] + - ["", "", False, "madSinkArg1", "", "", "Argument[1]", "test-sink", "manual"] + - ["", "", False, "madSinkArg01", "", "", "Argument[0..1]", "test-sink", "manual"] + - ["", "", False, "madSinkArg02", "", "", "Argument[0,2]", "test-sink", "manual"] + - ["", "", False, "madSinkIndirectArg0", "", "", "Argument[*0]", "test-sink", "manual"] + - ["", "", False, "madSinkDoubleIndirectArg0", "", "", "Argument[**0]", "test-sink", "manual"] + - ["", "", False, "madSinkVar", "", "", "", "test-sink", "manual"] + - ["", "", False, "madSinkVarIndirect", "", "", "*", "test-sink", "manual"] + - ["", "", False, "madSinkParam0", "", "", "Parameter[0]", "test-sink", "manual"] + - ["", "MyClass", True, "memberMadSinkArg0", "", "", "Argument[0]", "test-sink", "manual"] + - ["", "MyClass", True, "memberMadSinkVar", "", "", "", "test-sink", "manual"] + - ["", "MyClass", True, "qualifierSink", "", "", "Argument[-1]", "test-sink", "manual"] + - ["", "MyClass", True, "qualifierArg0Sink", "", "", "Argument[-1..0]", "test-sink", "manual"] + - ["", "MyClass", True, "qualifierFieldSink", "", "", "Argument[-1].val", "test-sink", "manual"] + - ["MyNamespace", "MyClass", True, "namespaceMemberMadSinkArg0", "", "", "Argument[0]", "test-sink", "manual"] + - ["MyNamespace", "MyClass", True, "namespaceStaticMemberMadSinkArg0", "", "", "Argument[0]", "test-sink", "manual"] + - ["MyNamespace", "MyClass", True, "namespaceMemberMadSinkVar", "", "", "", "test-sink", "manual"] + - ["MyNamespace", "MyClass", True, "namespaceStaticMemberMadSinkVar", "", "", "", "test-sink", "manual"] + - addsTo: + pack: codeql/cpp-all + extensible: summaryModel + data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance + - ["", "", False, "madArg0ToReturn", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArg0ToReturnIndirect", "", "", "Argument[0]", "ReturnValue[*]", "taint", "manual"] + - ["", "", False, "madArg0ToReturnValueFlow", "", "", "Argument[0]", "ReturnValue", "value", "manual"] + - ["", "", False, "madArg0IndirectToReturn", "", "", "Argument[*0]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArg0DoubleIndirectToReturn", "", "", "Argument[**0]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArg0NotIndirectToReturn", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArg0ToArg1Indirect", "", "", "Argument[0]", "Argument[*1]", "taint", "manual"] + - ["", "", False, "madArg0IndirectToArg1Indirect", "", "", "Argument[*0]", "Argument[*1]", "taint", "manual"] + - ["", "", False, "madArgsComplex", "", "", "Argument[*0..1,2]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madAndImplementedComplex", "", "", "Argument[2]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArgsAny", "", "", "Argument", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArg0FieldToReturn", "", "", "Argument[0].Field[value]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArg0IndirectFieldToReturn", "", "", "Argument[*0].Field[value]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArg0FieldIndirectToReturn", "", "", "Argument[0].Field[*ptr]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArg0ToReturnField", "", "", "Argument[0]", "ReturnValue.Field[value]", "taint", "manual"] + - ["", "", False, "madArg0ToReturnIndirectField", "", "", "Argument[0]", "ReturnValue[*].Field[value]", "taint", "manual"] + - ["", "", False, "madArg0ToReturnFieldIndirect", "", "", "Argument[0]", "ReturnValue.Field[*ptr]", "taint", "manual"] + - ["", "", False, "madFieldToFieldVar", "", "", "Field[value]", "Field[value2]", "taint", "manual"] + - ["", "", False, "madFieldToIndirectFieldVar", "", "", "Field[value]", "Field[*ptr]", "taint", "manual"] + - ["", "", False, "madIndirectFieldToFieldVar", "", "", "", "Field[value]", "Field[value2]", "manual"] + - ["", "MyClass", True, "madArg0ToSelf", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "MyClass", True, "madSelfToReturn", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "MyClass", True, "madArg0ToField", "", "", "Argument[0]", "Argument[-1].Field[val]", "taint", "manual"] + - ["", "MyClass", True, "madFieldToReturn", "", "", "Argument[-1].Field[val]", "ReturnValue", "taint", "manual"] + - ["MyNamespace", "MyClass", True, "namespaceMadSelfToReturn", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "", False, "madCallArg0ReturnToReturn", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "", False, "madCallArg0ReturnToReturnFirst", "", "", "Argument[0].ReturnValue", "ReturnValue.Field[first]", "value", "manual"] + - ["", "", False, "madCallArg0WithValue", "", "", "Argument[1]", "Argument[0].Parameter[0]", "value", "manual"] + - ["", "", False, "madCallReturnValueIgnoreFunction", "", "", "Argument[1]", "ReturnValue", "value", "manual"] + - ["", "StructWithTypedefInParameter", True, "parameter_ref_to_return_ref", "(const T &)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"] + - ["", "", False, "receive_array", "(int[20])", "", "Argument[*0]", "ReturnValue", "taint", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.qll b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.qll index e8d1393fc4a..ee5197e1ff2 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.qll +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.qll @@ -1,105 +1 @@ import semmle.code.cpp.security.FlowSources - -/** - * Models-as-data source models for this test. - */ -private class TestSources extends SourceModelCsv { - override predicate row(string row) { - row = - [ - ";;false;localMadSource;;;ReturnValue;local", - ";;false;remoteMadSource;;;ReturnValue;remote", - ";;false;localMadSourceVoid;;;ReturnValue;local", - ";;false;localMadSourceHasBody;;;ReturnValue;local", - ";;false;remoteMadSourceIndirect;;;ReturnValue[*];remote", - ";;false;remoteMadSourceDoubleIndirect;;;ReturnValue[**];remote", - ";;false;remoteMadSourceIndirectArg0;;;Argument[*0];remote", - ";;false;remoteMadSourceIndirectArg1;;;Argument[*1];remote", - ";;false;remoteMadSourceVar;;;;remote", - ";;false;remoteMadSourceVarIndirect;;;*;remote", // not correctly expressed - ";;false;remoteMadSourceParam0;;;Parameter[0];remote", - "MyNamespace;;false;namespaceLocalMadSource;;;ReturnValue;local", - "MyNamespace;;false;namespaceLocalMadSourceVar;;;;local", - "MyNamespace::MyNamespace2;;false;namespace2LocalMadSource;;;ReturnValue;local", - ";MyClass;true;memberRemoteMadSource;;;ReturnValue;remote", - ";MyClass;true;memberRemoteMadSourceIndirectArg0;;;Argument[*0];remote", - ";MyClass;true;memberRemoteMadSourceVar;;;;remote", - ";MyClass;true;subtypeRemoteMadSource1;;;ReturnValue;remote", - ";MyClass;false;subtypeNonSource;;;ReturnValue;remote", // the tests define this in MyDerivedClass, so it should *not* be recongized as a source - ";MyClass;true;qualifierSource;;;Argument[-1];remote", - ";MyClass;true;qualifierFieldSource;;;Argument[-1].val;remote", - ";MyDerivedClass;false;subtypeRemoteMadSource2;;;ReturnValue;remote", - ] - } -} - -/** - * Models-as-data sink models for this test. - */ -private class TestSinks extends SinkModelCsv { - override predicate row(string row) { - row = - [ - ";;false;madSinkArg0;;;Argument[0];test-sink", - ";;false;madSinkArg1;;;Argument[1];test-sink", - ";;false;madSinkArg01;;;Argument[0..1];test-sink", - ";;false;madSinkArg02;;;Argument[0,2];test-sink", - ";;false;madSinkIndirectArg0;;;Argument[*0];test-sink", - ";;false;madSinkDoubleIndirectArg0;;;Argument[**0];test-sink", - ";;false;madSinkVar;;;;test-sink", - ";;false;madSinkVarIndirect;;;*;test-sink", // not correctly expressed - ";;false;madSinkParam0;;;Parameter[0];test-sink", - ";MyClass;true;memberMadSinkArg0;;;Argument[0];test-sink", - ";MyClass;true;memberMadSinkVar;;;;test-sink", - ";MyClass;true;qualifierSink;;;Argument[-1];test-sink", - ";MyClass;true;qualifierArg0Sink;;;Argument[-1..0];test-sink", - ";MyClass;true;qualifierFieldSink;;;Argument[-1].val;test-sink", - "MyNamespace;MyClass;true;namespaceMemberMadSinkArg0;;;Argument[0];test-sink", - "MyNamespace;MyClass;true;namespaceStaticMemberMadSinkArg0;;;Argument[0];test-sink", - "MyNamespace;MyClass;true;namespaceMemberMadSinkVar;;;;test-sink", - "MyNamespace;MyClass;true;namespaceStaticMemberMadSinkVar;;;;test-sink", - ] - } -} - -/** - * Models-as-data summary models for this test. - */ -private class TestSummaries extends SummaryModelCsv { - override predicate row(string row) { - row = - [ - ";;false;madArg0ToReturn;;;Argument[0];ReturnValue;taint", - ";;false;madArg0ToReturnIndirect;;;Argument[0];ReturnValue[*];taint", - ";;false;madArg0ToReturnValueFlow;;;Argument[0];ReturnValue;value", - ";;false;madArg0IndirectToReturn;;;Argument[*0];ReturnValue;taint", - ";;false;madArg0DoubleIndirectToReturn;;;Argument[**0];ReturnValue;taint", - ";;false;madArg0NotIndirectToReturn;;;Argument[0];ReturnValue;taint", - ";;false;madArg0ToArg1Indirect;;;Argument[0];Argument[*1];taint", - ";;false;madArg0IndirectToArg1Indirect;;;Argument[*0];Argument[*1];taint", - ";;false;madArgsComplex;;;Argument[*0..1,2];ReturnValue;taint", - ";;false;madAndImplementedComplex;;;Argument[2];ReturnValue;taint", - ";;false;madArgsAny;;;Argument;ReturnValue;taint", // (syntax not supported) - ";;false;madArg0FieldToReturn;;;Argument[0].Field[value];ReturnValue;taint", - ";;false;madArg0IndirectFieldToReturn;;;Argument[*0].Field[value];ReturnValue;taint", - ";;false;madArg0FieldIndirectToReturn;;;Argument[0].Field[*ptr];ReturnValue;taint", - ";;false;madArg0ToReturnField;;;Argument[0];ReturnValue.Field[value];taint", - ";;false;madArg0ToReturnIndirectField;;;Argument[0];ReturnValue[*].Field[value];taint", - ";;false;madArg0ToReturnFieldIndirect;;;Argument[0];ReturnValue.Field[*ptr];taint", - ";;false;madFieldToFieldVar;;;Field[value];Field[value2];taint", - ";;false;madFieldToIndirectFieldVar;;;Field[value];Field[*ptr];taint", - ";;false;madIndirectFieldToFieldVar;;;;Field[value];Field[value2];taint", // not correctly expressed - ";MyClass;true;madArg0ToSelf;;;Argument[0];Argument[-1];taint", - ";MyClass;true;madSelfToReturn;;;Argument[-1];ReturnValue;taint", - ";MyClass;true;madArg0ToField;;;Argument[0];Argument[-1].Field[val];taint", - ";MyClass;true;madFieldToReturn;;;Argument[-1].Field[val];ReturnValue;taint", - "MyNamespace;MyClass;true;namespaceMadSelfToReturn;;;Argument[-1];ReturnValue;taint", - ";;false;madCallArg0ReturnToReturn;;;Argument[0].ReturnValue;ReturnValue;value", - ";;false;madCallArg0ReturnToReturnFirst;;;Argument[0].ReturnValue;ReturnValue.Field[first];value", - ";;false;madCallArg0WithValue;;;Argument[1];Argument[0].Parameter[0];value", - ";;false;madCallReturnValueIgnoreFunction;;;Argument[1];ReturnValue;value", - ";StructWithTypedefInParameter;true;parameter_ref_to_return_ref;(const T &);;Argument[*0];ReturnValue[*];value", - ";;false;receive_array;(int[20]);;Argument[*0];ReturnValue;taint" - ] - } -} From de4fe6d25cb6531733c736118f00533a1b2bfa0a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 26 Mar 2026 15:27:05 +0000 Subject: [PATCH 66/81] Use inline expectations for query test --- .../semmle/tests/ExposedSystemData.qlref | 4 +- .../CWE/CWE-497/semmle/tests/tests2.cpp | 46 +++++++++---------- .../CWE-497/semmle/tests/tests_sockets.cpp | 20 ++++---- .../CWE-497/semmle/tests/tests_sysconf.cpp | 8 ++-- 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.qlref index 20c49dc2376..c6024387d34 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.qlref +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.qlref @@ -1,2 +1,4 @@ query: Security/CWE/CWE-497/ExposedSystemData.ql -postprocess: utils/test/PrettyPrintModels.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests2.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests2.cpp index c22d74b7a75..4167f6903af 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests2.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests2.cpp @@ -47,7 +47,7 @@ int val(); // --- test cases --- -const char *global1 = mysql_get_client_info(); +const char *global1 = mysql_get_client_info(); // $ Source const char *global2 = "abc"; void test7() @@ -55,15 +55,15 @@ void test7() int sock = socket(val(), val(), val()); // tests for a strict implementation of CWE-497 - std::cout << getenv("HOME"); // BAD: outputs HOME environment variable [NOT DETECTED] - std::cout << "PATH = " << getenv("PATH") << "."; // BAD: outputs PATH environment variable [NOT DETECTED] + std::cout << getenv("HOME"); // $ MISSING: Alert // outputs HOME environment variable + std::cout << "PATH = " << getenv("PATH") << "."; // $ MISSING: Alert // outputs PATH environment variable std::cout << "PATHPATHPATH"; // GOOD: not system data // tests for a more pragmatic implementation of CWE-497 - send(sock, getenv("HOME"), val(), val()); // BAD - send(sock, getenv("PATH"), val(), val()); // BAD - send(sock, getenv("USERNAME"), val(), val()); // BAD - send(sock, getenv("APP_PASSWORD"), val(), val()); // BAD + send(sock, getenv("HOME"), val(), val()); // $ Alert + send(sock, getenv("PATH"), val(), val()); // $ Alert + send(sock, getenv("USERNAME"), val(), val()); // $ Alert + send(sock, getenv("APP_PASSWORD"), val(), val()); // $ Alert send(sock, getenv("HARMLESS"), val(), val()); // GOOD: harmless information send(sock, "HOME", val(), val()); // GOOD: not system data send(sock, "PATH", val(), val()); // GOOD: not system data @@ -75,11 +75,11 @@ void test7() { char buffer[256]; - strcpy(buffer, mysql_get_client_info()); + strcpy(buffer, mysql_get_client_info()); // $ Source - send(sock, mysql_get_client_info(), val(), val()); // BAD - send(sock, buffer, val(), val()); // BAD - send(sock, global1, val(), val()); // BAD + send(sock, mysql_get_client_info(), val(), val()); // $ Alert + send(sock, buffer, val(), val()); // $ Alert + send(sock, global1, val(), val()); // $ Alert send(sock, global2, val(), val()); // GOOD: not system data } @@ -88,9 +88,9 @@ void test7() const char *str1 = "123456"; const char *str2 = "abcdef"; - mysql_real_connect(sock, val(), val(), str1, val(), val(), val(), val()); + mysql_real_connect(sock, val(), val(), str1, val(), val(), val(), val()); // $ Source - send(sock, str1, val(), val()); // BAD + send(sock, str1, val(), val()); // $ Alert send(sock, str2, val(), val()); // GOOD: not system data } @@ -98,17 +98,17 @@ void test7() { passwd *pw; - pw = getpwuid(val()); - send(sock, pw->pw_passwd, val(), val()); // BAD + pw = getpwuid(val()); // $ Source + send(sock, pw->pw_passwd, val(), val()); // $ Alert } // tests for containers { container c1, c2; - c1.ptr = getenv("MY_SECRET_TOKEN"); + c1.ptr = getenv("MY_SECRET_TOKEN"); // $ Source c2.ptr = ""; - send(sock, c1.ptr, val(), val()); // BAD + send(sock, c1.ptr, val(), val()); // $ Alert send(sock, c2.ptr, val(), val()); // GOOD: not system data } } @@ -131,20 +131,20 @@ void test_zmq(void *remoteSocket) size_t message_len; // prepare data - message_data = getenv("HOME"); + message_data = getenv("HOME"); // $ Source message_len = strlen(message_data) + 1; // send as data - if (zmq_send(socket, message_data, message_len, 0) >= 0) { // BAD: outputs HOME environment variable + if (zmq_send(socket, message_data, message_len, 0) >= 0) { // $ Alert: outputs HOME environment variable // ... } // send as message if (zmq_msg_init_data(&message, message_data, message_len, 0, 0)) { - if (zmq_sendmsg(remoteSocket, &message, message_len)) { // BAD: outputs HOME environment variable + if (zmq_sendmsg(remoteSocket, &message, message_len)) { // $ Alert: outputs HOME environment variable // ... } - if (zmq_msg_send(&message, remoteSocket, message_len)) { // BAD: outputs HOME environment variable + if (zmq_msg_send(&message, remoteSocket, message_len)) { // $ Alert: outputs HOME environment variable // ... } } @@ -152,10 +152,10 @@ void test_zmq(void *remoteSocket) // send as message (alternative path) if (zmq_msg_init_size(&message, message_len) == 0) { memcpy(zmq_msg_data(&message), message_data, message_len); - if (zmq_sendmsg(remoteSocket,&message, message_len)) { // BAD: outputs HOME environment variable + if (zmq_sendmsg(remoteSocket,&message, message_len)) { // $ Alert: outputs HOME environment variable // ... } - if (zmq_msg_send(&message, remoteSocket, message_len)) { // BAD: outputs HOME environment variable + if (zmq_msg_send(&message, remoteSocket, message_len)) { // $ Alert: outputs HOME environment variable // ... } } diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sockets.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sockets.cpp index e7e8d9fe89f..f5c47f1a9e6 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sockets.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sockets.cpp @@ -23,7 +23,7 @@ void test_sockets1() int sockfd; sockaddr addr_remote; char *msg = "Hello, world!"; - char *path = getenv("PATH"); + char *path = getenv("PATH"); // $ Source // create socket sockfd = socket(AF_INET, SOCK_STREAM, 0); @@ -36,11 +36,11 @@ void test_sockets1() // send something using 'send' if (send(sockfd, msg, strlen(msg) + 1, 0) < 0) return; // GOOD - if (send(sockfd, path, strlen(path) + 1, 0) < 0) return; // BAD - + if (send(sockfd, path, strlen(path) + 1, 0) < 0) return; // $ Alert + // send something using 'write' if (write(sockfd, msg, strlen(msg) + 1) < 0) return; // GOOD - if (write(sockfd, path, strlen(path) + 1) < 0) return; // BAD + if (write(sockfd, path, strlen(path) + 1) < 0) return; // $ Alert // clean up // ... @@ -49,9 +49,9 @@ void test_sockets1() int mksocket() { int fd; - + fd = socket(AF_INET, SOCK_STREAM, 0); - + return fd; } @@ -60,7 +60,7 @@ void test_sockets2() int sockfd; sockaddr addr_remote; char *msg = "Hello, world!"; - char *path = getenv("PATH"); + char *path = getenv("PATH"); // $ Source // create socket sockfd = mksocket(); @@ -73,11 +73,11 @@ void test_sockets2() // send something using 'send' if (send(sockfd, msg, strlen(msg) + 1, 0) < 0) return; // GOOD - if (send(sockfd, path, strlen(path) + 1, 0) < 0) return; // BAD - + if (send(sockfd, path, strlen(path) + 1, 0) < 0) return; // $ Alert + // send something using 'write' if (write(sockfd, msg, strlen(msg) + 1) < 0) return; // GOOD - if (write(sockfd, path, strlen(path) + 1) < 0) return; // BAD + if (write(sockfd, path, strlen(path) + 1) < 0) return; // $ Alert // clean up // ... diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sysconf.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sysconf.cpp index 0c0cbcc68d3..e0b4e7dc291 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sysconf.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/tests_sysconf.cpp @@ -21,7 +21,7 @@ void test_sc_1() int value = sysconf(_SC_CHILD_MAX); printf("_SC_CHILD_MAX = %i\n", _SC_CHILD_MAX); // GOOD - printf("_SC_CHILD_MAX = %i\n", value); // BAD [NOT DETECTED] + printf("_SC_CHILD_MAX = %i\n", value); // $ MISSING: Alert } void test_sc_2() @@ -33,9 +33,9 @@ void test_sc_2() pathbuf = (char *)malloc(n); if (pathbuf != NULL) { - confstr(_CS_PATH, pathbuf, n); + confstr(_CS_PATH, pathbuf, n); // $ Source - printf("path: %s", pathbuf); // BAD [NOT DETECTED] - write(get_fd(), pathbuf, strlen(pathbuf)); // BAD + printf("path: %s", pathbuf); // $ MISSING: Alert + write(get_fd(), pathbuf, strlen(pathbuf)); // $ Alert } } From 21ecf230ce7904894baa5bf4c95c8d79e648f489 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 26 Mar 2026 15:33:16 +0000 Subject: [PATCH 67/81] Small tweaks --- cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll | 4 ++-- .../library-tests/dataflow/external-models/validatemodels.ql | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index c960f39ec77..8b71f140b01 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -4,7 +4,7 @@ * Provides classes and predicates for dealing with flow models specified * in data extension files. * - * The specification has the following columns: + * The extensible relations have the following columns: * - Sources: * `namespace; type; subtypes; name; signature; ext; output; kind` * - Sinks: @@ -144,7 +144,7 @@ predicate summaryModel( } /** Provides a query predicate to check the data for validation errors. */ -module CsvValidation { +module ModelValidation { private string getInvalidModelInput() { exists(string pred, AccessPath input, string part | sinkModel(_, _, _, _, _, _, input, _, _, _) and pred = "sink" diff --git a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.ql b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.ql index a162349b7cd..63e6520c56f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.ql +++ b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.ql @@ -1,2 +1,2 @@ import cpp -import semmle.code.cpp.dataflow.ExternalFlow::CsvValidation +import semmle.code.cpp.dataflow.ExternalFlow::ModelValidation From 8a99ef45319b06db3da180d488eb9ec3c82f0b37 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 26 Mar 2026 16:39:27 +0000 Subject: [PATCH 68/81] Update csv model tests to use MaD --- .../models-as-data/FlowSummaryNode.ql | 20 -- .../models-as-data/SummaryCall.expected | 267 ---------------- .../dataflow/models-as-data/SummaryCall.ql | 9 - .../models-as-data/consistency.expected | 29 -- .../dataflow/models-as-data/consistency.ql | 2 - .../models-as-data/interpretElement.expected | 0 .../models-as-data/interpretElement.ql | 18 -- .../dataflow/models-as-data/taint.expected | 0 .../dataflow/models-as-data/taint.ql | 32 -- ...mmaryNode.expected => testModels.expected} | 298 ++++++++++++++++++ .../dataflow/models-as-data/testModels.ql | 74 +++++ .../dataflow/models-as-data/testModels.qll | 1 - 12 files changed, 372 insertions(+), 378 deletions(-) delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/FlowSummaryNode.ql delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/SummaryCall.expected delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/SummaryCall.ql delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/consistency.expected delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/consistency.ql delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.expected delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.ql delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/taint.expected delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/taint.ql rename cpp/ql/test/library-tests/dataflow/models-as-data/{FlowSummaryNode.expected => testModels.expected} (50%) create mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ql delete mode 100644 cpp/ql/test/library-tests/dataflow/models-as-data/testModels.qll diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/FlowSummaryNode.ql b/cpp/ql/test/library-tests/dataflow/models-as-data/FlowSummaryNode.ql deleted file mode 100644 index 7b551515b46..00000000000 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/FlowSummaryNode.ql +++ /dev/null @@ -1,20 +0,0 @@ -import testModels -private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate -private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil -private import semmle.code.cpp.ir.dataflow.internal.DataFlowNodes - -string describe(DataFlow::Node n) { - n instanceof ParameterNode and result = "ParameterNode" - or - n instanceof PostUpdateNode and result = "PostUpdateNode" - or - n instanceof ArgumentNode and result = "ArgumentNode" - or - n instanceof ReturnNode and result = "ReturnNode" - or - n instanceof OutNode and result = "OutNode" -} - -from FlowSummaryNode n -select n, concat(describe(n), ", "), concat(n.getSummarizedCallable().toString(), ", "), - concat(n.getEnclosingCallable().toString(), ", ") diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/SummaryCall.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/SummaryCall.expected deleted file mode 100644 index 54bd0ca489a..00000000000 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/SummaryCall.expected +++ /dev/null @@ -1,267 +0,0 @@ -summaryCalls -| file://:0:0:0:0 | [summary] call to [summary param] 0 in madCallArg0ReturnToReturn in madCallArg0ReturnToReturn | -| file://:0:0:0:0 | [summary] call to [summary param] 0 in madCallArg0ReturnToReturnFirst in madCallArg0ReturnToReturnFirst | -| file://:0:0:0:0 | [summary] call to [summary param] 0 in madCallArg0WithValue in madCallArg0WithValue | -summarizedCallables -| tests.cpp:144:5:144:19 | madArg0ToReturn | -| tests.cpp:145:6:145:28 | madArg0ToReturnIndirect | -| tests.cpp:147:5:147:28 | madArg0ToReturnValueFlow | -| tests.cpp:148:5:148:27 | madArg0IndirectToReturn | -| tests.cpp:149:5:149:33 | madArg0DoubleIndirectToReturn | -| tests.cpp:150:5:150:30 | madArg0NotIndirectToReturn | -| tests.cpp:151:6:151:26 | madArg0ToArg1Indirect | -| tests.cpp:152:6:152:34 | madArg0IndirectToArg1Indirect | -| tests.cpp:153:5:153:18 | madArgsComplex | -| tests.cpp:154:5:154:14 | madArgsAny | -| tests.cpp:155:5:155:28 | madAndImplementedComplex | -| tests.cpp:160:5:160:24 | madArg0FieldToReturn | -| tests.cpp:161:5:161:32 | madArg0IndirectFieldToReturn | -| tests.cpp:162:5:162:32 | madArg0FieldIndirectToReturn | -| tests.cpp:163:13:163:32 | madArg0ToReturnField | -| tests.cpp:164:14:164:41 | madArg0ToReturnIndirectField | -| tests.cpp:165:13:165:40 | madArg0ToReturnFieldIndirect | -| tests.cpp:284:7:284:19 | madArg0ToSelf | -| tests.cpp:285:6:285:20 | madSelfToReturn | -| tests.cpp:287:7:287:20 | madArg0ToField | -| tests.cpp:288:6:288:21 | madFieldToReturn | -| tests.cpp:313:7:313:30 | namespaceMadSelfToReturn | -| tests.cpp:434:5:434:29 | madCallArg0ReturnToReturn | -| tests.cpp:435:9:435:38 | madCallArg0ReturnToReturnFirst | -| tests.cpp:436:6:436:25 | madCallArg0WithValue | -| tests.cpp:437:5:437:36 | madCallReturnValueIgnoreFunction | -| tests.cpp:459:5:459:31 | parameter_ref_to_return_ref | -| tests.cpp:471:5:471:17 | receive_array | -sourceCallables -| tests.cpp:3:5:3:10 | source | -| tests.cpp:4:6:4:14 | sourcePtr | -| tests.cpp:5:6:5:19 | sourceIndirect | -| tests.cpp:6:6:6:9 | sink | -| tests.cpp:6:15:6:17 | val | -| tests.cpp:7:6:7:9 | sink | -| tests.cpp:7:16:7:18 | ptr | -| tests.cpp:11:5:11:18 | localMadSource | -| tests.cpp:12:5:12:19 | remoteMadSource | -| tests.cpp:13:5:13:14 | notASource | -| tests.cpp:14:5:14:22 | localMadSourceVoid | -| tests.cpp:15:5:15:25 | localMadSourceHasBody | -| tests.cpp:16:6:16:28 | remoteMadSourceIndirect | -| tests.cpp:17:7:17:35 | remoteMadSourceDoubleIndirect | -| tests.cpp:18:6:18:32 | remoteMadSourceIndirectArg0 | -| tests.cpp:18:39:18:39 | x | -| tests.cpp:18:47:18:47 | y | -| tests.cpp:19:6:19:32 | remoteMadSourceIndirectArg1 | -| tests.cpp:19:39:19:39 | x | -| tests.cpp:19:47:19:47 | y | -| tests.cpp:20:5:20:22 | remoteMadSourceVar | -| tests.cpp:21:6:21:31 | remoteMadSourceVarIndirect | -| tests.cpp:24:6:24:28 | namespaceLocalMadSource | -| tests.cpp:25:6:25:31 | namespaceLocalMadSourceVar | -| tests.cpp:28:7:28:30 | namespace2LocalMadSource | -| tests.cpp:31:6:31:19 | localMadSource | -| tests.cpp:33:5:33:27 | namespaceLocalMadSource | -| tests.cpp:35:6:35:17 | test_sources | -| tests.cpp:50:6:50:6 | v | -| tests.cpp:51:7:51:16 | v_indirect | -| tests.cpp:52:6:52:13 | v_direct | -| tests.cpp:63:6:63:6 | a | -| tests.cpp:63:9:63:9 | b | -| tests.cpp:63:12:63:12 | c | -| tests.cpp:63:15:63:15 | d | -| tests.cpp:75:6:75:6 | e | -| tests.cpp:85:6:85:26 | remoteMadSourceParam0 | -| tests.cpp:85:32:85:32 | x | -| tests.cpp:92:6:92:16 | madSinkArg0 | -| tests.cpp:92:22:92:22 | x | -| tests.cpp:93:6:93:13 | notASink | -| tests.cpp:93:19:93:19 | x | -| tests.cpp:94:6:94:16 | madSinkArg1 | -| tests.cpp:94:22:94:22 | x | -| tests.cpp:94:29:94:29 | y | -| tests.cpp:95:6:95:17 | madSinkArg01 | -| tests.cpp:95:23:95:23 | x | -| tests.cpp:95:30:95:30 | y | -| tests.cpp:95:37:95:37 | z | -| tests.cpp:96:6:96:17 | madSinkArg02 | -| tests.cpp:96:23:96:23 | x | -| tests.cpp:96:30:96:30 | y | -| tests.cpp:96:37:96:37 | z | -| tests.cpp:97:6:97:24 | madSinkIndirectArg0 | -| tests.cpp:97:31:97:31 | x | -| tests.cpp:98:6:98:30 | madSinkDoubleIndirectArg0 | -| tests.cpp:98:38:98:38 | x | -| tests.cpp:99:5:99:14 | madSinkVar | -| tests.cpp:100:6:100:23 | madSinkVarIndirect | -| tests.cpp:102:6:102:15 | test_sinks | -| tests.cpp:116:6:116:6 | a | -| tests.cpp:117:7:117:11 | a_ptr | -| tests.cpp:132:6:132:18 | madSinkParam0 | -| tests.cpp:132:24:132:24 | x | -| tests.cpp:138:8:138:8 | operator= | -| tests.cpp:138:8:138:8 | operator= | -| tests.cpp:138:8:138:18 | MyContainer | -| tests.cpp:139:6:139:10 | value | -| tests.cpp:140:6:140:11 | value2 | -| tests.cpp:141:7:141:9 | ptr | -| tests.cpp:144:5:144:19 | madArg0ToReturn | -| tests.cpp:144:25:144:25 | x | -| tests.cpp:145:6:145:28 | madArg0ToReturnIndirect | -| tests.cpp:145:34:145:34 | x | -| tests.cpp:146:5:146:15 | notASummary | -| tests.cpp:146:21:146:21 | x | -| tests.cpp:147:5:147:28 | madArg0ToReturnValueFlow | -| tests.cpp:147:34:147:34 | x | -| tests.cpp:148:5:148:27 | madArg0IndirectToReturn | -| tests.cpp:148:34:148:34 | x | -| tests.cpp:149:5:149:33 | madArg0DoubleIndirectToReturn | -| tests.cpp:149:41:149:41 | x | -| tests.cpp:150:5:150:30 | madArg0NotIndirectToReturn | -| tests.cpp:150:37:150:37 | x | -| tests.cpp:151:6:151:26 | madArg0ToArg1Indirect | -| tests.cpp:151:32:151:32 | x | -| tests.cpp:151:40:151:40 | y | -| tests.cpp:152:6:152:34 | madArg0IndirectToArg1Indirect | -| tests.cpp:152:47:152:47 | x | -| tests.cpp:152:55:152:55 | y | -| tests.cpp:153:5:153:18 | madArgsComplex | -| tests.cpp:153:25:153:25 | a | -| tests.cpp:153:33:153:33 | b | -| tests.cpp:153:40:153:40 | c | -| tests.cpp:153:47:153:47 | d | -| tests.cpp:154:5:154:14 | madArgsAny | -| tests.cpp:154:20:154:20 | a | -| tests.cpp:154:28:154:28 | b | -| tests.cpp:155:5:155:28 | madAndImplementedComplex | -| tests.cpp:155:34:155:34 | a | -| tests.cpp:155:41:155:41 | b | -| tests.cpp:155:48:155:48 | c | -| tests.cpp:160:5:160:24 | madArg0FieldToReturn | -| tests.cpp:160:38:160:39 | mc | -| tests.cpp:161:5:161:32 | madArg0IndirectFieldToReturn | -| tests.cpp:161:47:161:48 | mc | -| tests.cpp:162:5:162:32 | madArg0FieldIndirectToReturn | -| tests.cpp:162:46:162:47 | mc | -| tests.cpp:163:13:163:32 | madArg0ToReturnField | -| tests.cpp:163:38:163:38 | x | -| tests.cpp:164:14:164:41 | madArg0ToReturnIndirectField | -| tests.cpp:164:47:164:47 | x | -| tests.cpp:165:13:165:40 | madArg0ToReturnFieldIndirect | -| tests.cpp:165:46:165:46 | x | -| tests.cpp:167:13:167:30 | madFieldToFieldVar | -| tests.cpp:168:13:168:38 | madFieldToIndirectFieldVar | -| tests.cpp:169:14:169:39 | madIndirectFieldToFieldVar | -| tests.cpp:171:6:171:19 | test_summaries | -| tests.cpp:174:6:174:6 | a | -| tests.cpp:174:9:174:9 | b | -| tests.cpp:174:12:174:12 | c | -| tests.cpp:174:15:174:15 | d | -| tests.cpp:174:18:174:18 | e | -| tests.cpp:175:7:175:11 | a_ptr | -| tests.cpp:218:14:218:16 | mc1 | -| tests.cpp:218:19:218:21 | mc2 | -| tests.cpp:237:15:237:18 | rtn1 | -| tests.cpp:240:14:240:17 | rtn2 | -| tests.cpp:241:7:241:14 | rtn2_ptr | -| tests.cpp:267:7:267:7 | operator= | -| tests.cpp:267:7:267:7 | operator= | -| tests.cpp:267:7:267:13 | MyClass | -| tests.cpp:270:6:270:26 | memberRemoteMadSource | -| tests.cpp:271:7:271:39 | memberRemoteMadSourceIndirectArg0 | -| tests.cpp:271:46:271:46 | x | -| tests.cpp:272:6:272:29 | memberRemoteMadSourceVar | -| tests.cpp:273:7:273:21 | qualifierSource | -| tests.cpp:274:7:274:26 | qualifierFieldSource | -| tests.cpp:277:7:277:23 | memberMadSinkArg0 | -| tests.cpp:277:29:277:29 | x | -| tests.cpp:278:6:278:21 | memberMadSinkVar | -| tests.cpp:279:7:279:19 | qualifierSink | -| tests.cpp:280:7:280:23 | qualifierArg0Sink | -| tests.cpp:280:29:280:29 | x | -| tests.cpp:281:7:281:24 | qualifierFieldSink | -| tests.cpp:284:7:284:19 | madArg0ToSelf | -| tests.cpp:284:25:284:25 | x | -| tests.cpp:285:6:285:20 | madSelfToReturn | -| tests.cpp:286:6:286:16 | notASummary | -| tests.cpp:287:7:287:20 | madArg0ToField | -| tests.cpp:287:26:287:26 | x | -| tests.cpp:288:6:288:21 | madFieldToReturn | -| tests.cpp:290:6:290:8 | val | -| tests.cpp:293:7:293:7 | MyDerivedClass | -| tests.cpp:293:7:293:7 | operator= | -| tests.cpp:293:7:293:7 | operator= | -| tests.cpp:293:7:293:20 | MyDerivedClass | -| tests.cpp:295:6:295:28 | subtypeRemoteMadSource1 | -| tests.cpp:296:6:296:21 | subtypeNonSource | -| tests.cpp:297:6:297:28 | subtypeRemoteMadSource2 | -| tests.cpp:300:9:300:15 | source2 | -| tests.cpp:301:6:301:9 | sink | -| tests.cpp:301:19:301:20 | mc | -| tests.cpp:304:8:304:8 | operator= | -| tests.cpp:304:8:304:8 | operator= | -| tests.cpp:304:8:304:14 | MyClass | -| tests.cpp:307:8:307:33 | namespaceMemberMadSinkArg0 | -| tests.cpp:307:39:307:39 | x | -| tests.cpp:308:15:308:46 | namespaceStaticMemberMadSinkArg0 | -| tests.cpp:308:52:308:52 | x | -| tests.cpp:309:7:309:31 | namespaceMemberMadSinkVar | -| tests.cpp:310:14:310:44 | namespaceStaticMemberMadSinkVar | -| tests.cpp:313:7:313:30 | namespaceMadSelfToReturn | -| tests.cpp:317:22:317:28 | source3 | -| tests.cpp:319:6:319:23 | test_class_members | -| tests.cpp:320:10:320:11 | mc | -| tests.cpp:320:14:320:16 | mc2 | -| tests.cpp:320:19:320:21 | mc3 | -| tests.cpp:320:24:320:26 | mc4 | -| tests.cpp:320:29:320:31 | mc5 | -| tests.cpp:320:34:320:36 | mc6 | -| tests.cpp:320:39:320:41 | mc7 | -| tests.cpp:320:44:320:46 | mc8 | -| tests.cpp:320:49:320:51 | mc9 | -| tests.cpp:320:54:320:57 | mc10 | -| tests.cpp:320:60:320:63 | mc11 | -| tests.cpp:321:11:321:13 | ptr | -| tests.cpp:321:17:321:23 | mc4_ptr | -| tests.cpp:322:17:322:19 | mdc | -| tests.cpp:323:23:323:25 | mnc | -| tests.cpp:323:28:323:31 | mnc2 | -| tests.cpp:324:24:324:31 | mnc2_ptr | -| tests.cpp:330:6:330:6 | a | -| tests.cpp:429:8:429:8 | operator= | -| tests.cpp:429:8:429:8 | operator= | -| tests.cpp:429:8:429:14 | intPair | -| tests.cpp:430:6:430:10 | first | -| tests.cpp:431:6:431:11 | second | -| tests.cpp:434:5:434:29 | madCallArg0ReturnToReturn | -| tests.cpp:434:37:434:43 | fun_ptr | -| tests.cpp:435:9:435:38 | madCallArg0ReturnToReturnFirst | -| tests.cpp:435:46:435:52 | fun_ptr | -| tests.cpp:436:6:436:25 | madCallArg0WithValue | -| tests.cpp:436:34:436:40 | fun_ptr | -| tests.cpp:436:53:436:57 | value | -| tests.cpp:437:5:437:36 | madCallReturnValueIgnoreFunction | -| tests.cpp:437:45:437:51 | fun_ptr | -| tests.cpp:437:64:437:68 | value | -| tests.cpp:439:5:439:14 | getTainted | -| tests.cpp:440:6:440:13 | useValue | -| tests.cpp:440:19:440:19 | x | -| tests.cpp:441:6:441:17 | dontUseValue | -| tests.cpp:441:23:441:23 | x | -| tests.cpp:443:6:443:27 | test_function_pointers | -| tests.cpp:456:19:456:19 | X | -| tests.cpp:457:8:457:35 | StructWithTypedefInParameter | -| tests.cpp:457:8:457:35 | StructWithTypedefInParameter | -| tests.cpp:458:12:458:15 | Type | -| tests.cpp:459:5:459:31 | parameter_ref_to_return_ref | -| tests.cpp:459:5:459:31 | parameter_ref_to_return_ref | -| tests.cpp:459:45:459:45 | x | -| tests.cpp:459:45:459:45 | x | -| tests.cpp:462:6:462:37 | test_parameter_ref_to_return_ref | -| tests.cpp:463:6:463:6 | x | -| tests.cpp:464:36:464:36 | s | -| tests.cpp:465:6:465:6 | y | -| tests.cpp:469:7:469:9 | INT | -| tests.cpp:471:5:471:17 | receive_array | -| tests.cpp:471:23:471:23 | a | -| tests.cpp:473:6:473:23 | test_receive_array | -| tests.cpp:474:6:474:6 | x | -| tests.cpp:475:6:475:10 | array | -| tests.cpp:476:6:476:6 | y | diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/SummaryCall.ql b/cpp/ql/test/library-tests/dataflow/models-as-data/SummaryCall.ql deleted file mode 100644 index 1b569040028..00000000000 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/SummaryCall.ql +++ /dev/null @@ -1,9 +0,0 @@ -import testModels -private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate -private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil - -query predicate summaryCalls(SummaryCall c) { any() } - -query predicate summarizedCallables(SummarizedCallable c) { any() } - -query predicate sourceCallables(SourceCallable c) { c.getLocation().getFile().toString() != "" } diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.expected deleted file mode 100644 index c89f4455bc5..00000000000 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.expected +++ /dev/null @@ -1,29 +0,0 @@ -uniqueEnclosingCallable -uniqueCallEnclosingCallable -uniqueType -uniqueNodeLocation -missingLocation -uniqueNodeToString -parameterCallable -localFlowIsLocal -readStepIsLocal -storeStepIsLocal -compatibleTypesReflexive -unreachableNodeCCtx -localCallNodes -postIsNotPre -postHasUniquePre -uniquePostUpdate -postIsInSameCallable -reverseRead -argHasPostUpdate -postWithInFlow -viableImplInCallContextTooLarge -uniqueParameterNodeAtPosition -uniqueParameterNodePosition -uniqueContentApprox -identityLocalStep -missingArgumentCall -multipleArgumentCall -lambdaCallEnclosingCallableMismatch -speculativeStepAlreadyHasModel diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.ql b/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.ql deleted file mode 100644 index 1af8d69a356..00000000000 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.ql +++ /dev/null @@ -1,2 +0,0 @@ -import testModels -import semmle.code.cpp.ir.dataflow.internal.DataFlowImplConsistency::Consistency diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.expected deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.ql b/cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.ql deleted file mode 100644 index ccf0c3f886d..00000000000 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.ql +++ /dev/null @@ -1,18 +0,0 @@ -import utils.test.InlineExpectationsTest -import testModels - -module InterpretElementTest implements TestSig { - string getARelevantTag() { result = "interpretElement" } - - predicate hasActualResult(Location location, string element, string tag, string value) { - exists(Element e | - e = interpretElement(_, _, _, _, _, _) and - location = e.getLocation() and - element = e.toString() and - tag = "interpretElement" and - value = "" - ) - } -} - -import MakeTest diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/taint.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/taint.expected deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/taint.ql b/cpp/ql/test/library-tests/dataflow/models-as-data/taint.ql deleted file mode 100644 index 8c362d78e3e..00000000000 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/taint.ql +++ /dev/null @@ -1,32 +0,0 @@ -import utils.test.dataflow.FlowTestCommon -import testModels - -module IRTest { - private import semmle.code.cpp.ir.IR - private import semmle.code.cpp.ir.dataflow.TaintTracking - - /** Common data flow configuration to be used by tests. */ - module TestAllocationConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - source instanceof FlowSource - or - source.asExpr().(FunctionCall).getTarget().getName() = - ["source", "source2", "source3", "sourcePtr"] - or - source.asIndirectExpr(1).(FunctionCall).getTarget().getName() = "sourceIndirect" - } - - predicate isSink(DataFlow::Node sink) { - sinkNode(sink, "test-sink") - or - exists(FunctionCall call | - call.getTarget().getName() = "sink" and - sink.asExpr() = call.getAnArgument() - ) - } - } - - module IRFlow = TaintTracking::Global; -} - -import MakeTest> diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/FlowSummaryNode.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected similarity index 50% rename from cpp/ql/test/library-tests/dataflow/models-as-data/FlowSummaryNode.expected rename to cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected index 756e9a7e22a..0faf016ee41 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/FlowSummaryNode.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected @@ -1,3 +1,301 @@ +uniqueEnclosingCallable +uniqueCallEnclosingCallable +uniqueType +uniqueNodeLocation +missingLocation +uniqueNodeToString +parameterCallable +localFlowIsLocal +readStepIsLocal +storeStepIsLocal +compatibleTypesReflexive +unreachableNodeCCtx +localCallNodes +postIsNotPre +postHasUniquePre +uniquePostUpdate +postIsInSameCallable +reverseRead +argHasPostUpdate +postWithInFlow +viableImplInCallContextTooLarge +uniqueParameterNodeAtPosition +uniqueParameterNodePosition +uniqueContentApprox +identityLocalStep +missingArgumentCall +multipleArgumentCall +lambdaCallEnclosingCallableMismatch +speculativeStepAlreadyHasModel +testFailures +summaryCalls +| file://:0:0:0:0 | [summary] call to [summary param] 0 in madCallArg0ReturnToReturn in madCallArg0ReturnToReturn | +| file://:0:0:0:0 | [summary] call to [summary param] 0 in madCallArg0ReturnToReturnFirst in madCallArg0ReturnToReturnFirst | +| file://:0:0:0:0 | [summary] call to [summary param] 0 in madCallArg0WithValue in madCallArg0WithValue | +summarizedCallables +| tests.cpp:144:5:144:19 | madArg0ToReturn | +| tests.cpp:145:6:145:28 | madArg0ToReturnIndirect | +| tests.cpp:147:5:147:28 | madArg0ToReturnValueFlow | +| tests.cpp:148:5:148:27 | madArg0IndirectToReturn | +| tests.cpp:149:5:149:33 | madArg0DoubleIndirectToReturn | +| tests.cpp:150:5:150:30 | madArg0NotIndirectToReturn | +| tests.cpp:151:6:151:26 | madArg0ToArg1Indirect | +| tests.cpp:152:6:152:34 | madArg0IndirectToArg1Indirect | +| tests.cpp:153:5:153:18 | madArgsComplex | +| tests.cpp:154:5:154:14 | madArgsAny | +| tests.cpp:155:5:155:28 | madAndImplementedComplex | +| tests.cpp:160:5:160:24 | madArg0FieldToReturn | +| tests.cpp:161:5:161:32 | madArg0IndirectFieldToReturn | +| tests.cpp:162:5:162:32 | madArg0FieldIndirectToReturn | +| tests.cpp:163:13:163:32 | madArg0ToReturnField | +| tests.cpp:164:14:164:41 | madArg0ToReturnIndirectField | +| tests.cpp:165:13:165:40 | madArg0ToReturnFieldIndirect | +| tests.cpp:284:7:284:19 | madArg0ToSelf | +| tests.cpp:285:6:285:20 | madSelfToReturn | +| tests.cpp:287:7:287:20 | madArg0ToField | +| tests.cpp:288:6:288:21 | madFieldToReturn | +| tests.cpp:313:7:313:30 | namespaceMadSelfToReturn | +| tests.cpp:434:5:434:29 | madCallArg0ReturnToReturn | +| tests.cpp:435:9:435:38 | madCallArg0ReturnToReturnFirst | +| tests.cpp:436:6:436:25 | madCallArg0WithValue | +| tests.cpp:437:5:437:36 | madCallReturnValueIgnoreFunction | +| tests.cpp:459:5:459:31 | parameter_ref_to_return_ref | +| tests.cpp:471:5:471:17 | receive_array | +sourceCallables +| tests.cpp:3:5:3:10 | source | +| tests.cpp:4:6:4:14 | sourcePtr | +| tests.cpp:5:6:5:19 | sourceIndirect | +| tests.cpp:6:6:6:9 | sink | +| tests.cpp:6:15:6:17 | val | +| tests.cpp:7:6:7:9 | sink | +| tests.cpp:7:16:7:18 | ptr | +| tests.cpp:11:5:11:18 | localMadSource | +| tests.cpp:12:5:12:19 | remoteMadSource | +| tests.cpp:13:5:13:14 | notASource | +| tests.cpp:14:5:14:22 | localMadSourceVoid | +| tests.cpp:15:5:15:25 | localMadSourceHasBody | +| tests.cpp:16:6:16:28 | remoteMadSourceIndirect | +| tests.cpp:17:7:17:35 | remoteMadSourceDoubleIndirect | +| tests.cpp:18:6:18:32 | remoteMadSourceIndirectArg0 | +| tests.cpp:18:39:18:39 | x | +| tests.cpp:18:47:18:47 | y | +| tests.cpp:19:6:19:32 | remoteMadSourceIndirectArg1 | +| tests.cpp:19:39:19:39 | x | +| tests.cpp:19:47:19:47 | y | +| tests.cpp:20:5:20:22 | remoteMadSourceVar | +| tests.cpp:21:6:21:31 | remoteMadSourceVarIndirect | +| tests.cpp:24:6:24:28 | namespaceLocalMadSource | +| tests.cpp:25:6:25:31 | namespaceLocalMadSourceVar | +| tests.cpp:28:7:28:30 | namespace2LocalMadSource | +| tests.cpp:31:6:31:19 | localMadSource | +| tests.cpp:33:5:33:27 | namespaceLocalMadSource | +| tests.cpp:35:6:35:17 | test_sources | +| tests.cpp:50:6:50:6 | v | +| tests.cpp:51:7:51:16 | v_indirect | +| tests.cpp:52:6:52:13 | v_direct | +| tests.cpp:63:6:63:6 | a | +| tests.cpp:63:9:63:9 | b | +| tests.cpp:63:12:63:12 | c | +| tests.cpp:63:15:63:15 | d | +| tests.cpp:75:6:75:6 | e | +| tests.cpp:85:6:85:26 | remoteMadSourceParam0 | +| tests.cpp:85:32:85:32 | x | +| tests.cpp:92:6:92:16 | madSinkArg0 | +| tests.cpp:92:22:92:22 | x | +| tests.cpp:93:6:93:13 | notASink | +| tests.cpp:93:19:93:19 | x | +| tests.cpp:94:6:94:16 | madSinkArg1 | +| tests.cpp:94:22:94:22 | x | +| tests.cpp:94:29:94:29 | y | +| tests.cpp:95:6:95:17 | madSinkArg01 | +| tests.cpp:95:23:95:23 | x | +| tests.cpp:95:30:95:30 | y | +| tests.cpp:95:37:95:37 | z | +| tests.cpp:96:6:96:17 | madSinkArg02 | +| tests.cpp:96:23:96:23 | x | +| tests.cpp:96:30:96:30 | y | +| tests.cpp:96:37:96:37 | z | +| tests.cpp:97:6:97:24 | madSinkIndirectArg0 | +| tests.cpp:97:31:97:31 | x | +| tests.cpp:98:6:98:30 | madSinkDoubleIndirectArg0 | +| tests.cpp:98:38:98:38 | x | +| tests.cpp:99:5:99:14 | madSinkVar | +| tests.cpp:100:6:100:23 | madSinkVarIndirect | +| tests.cpp:102:6:102:15 | test_sinks | +| tests.cpp:116:6:116:6 | a | +| tests.cpp:117:7:117:11 | a_ptr | +| tests.cpp:132:6:132:18 | madSinkParam0 | +| tests.cpp:132:24:132:24 | x | +| tests.cpp:138:8:138:8 | operator= | +| tests.cpp:138:8:138:8 | operator= | +| tests.cpp:138:8:138:18 | MyContainer | +| tests.cpp:139:6:139:10 | value | +| tests.cpp:140:6:140:11 | value2 | +| tests.cpp:141:7:141:9 | ptr | +| tests.cpp:144:5:144:19 | madArg0ToReturn | +| tests.cpp:144:25:144:25 | x | +| tests.cpp:145:6:145:28 | madArg0ToReturnIndirect | +| tests.cpp:145:34:145:34 | x | +| tests.cpp:146:5:146:15 | notASummary | +| tests.cpp:146:21:146:21 | x | +| tests.cpp:147:5:147:28 | madArg0ToReturnValueFlow | +| tests.cpp:147:34:147:34 | x | +| tests.cpp:148:5:148:27 | madArg0IndirectToReturn | +| tests.cpp:148:34:148:34 | x | +| tests.cpp:149:5:149:33 | madArg0DoubleIndirectToReturn | +| tests.cpp:149:41:149:41 | x | +| tests.cpp:150:5:150:30 | madArg0NotIndirectToReturn | +| tests.cpp:150:37:150:37 | x | +| tests.cpp:151:6:151:26 | madArg0ToArg1Indirect | +| tests.cpp:151:32:151:32 | x | +| tests.cpp:151:40:151:40 | y | +| tests.cpp:152:6:152:34 | madArg0IndirectToArg1Indirect | +| tests.cpp:152:47:152:47 | x | +| tests.cpp:152:55:152:55 | y | +| tests.cpp:153:5:153:18 | madArgsComplex | +| tests.cpp:153:25:153:25 | a | +| tests.cpp:153:33:153:33 | b | +| tests.cpp:153:40:153:40 | c | +| tests.cpp:153:47:153:47 | d | +| tests.cpp:154:5:154:14 | madArgsAny | +| tests.cpp:154:20:154:20 | a | +| tests.cpp:154:28:154:28 | b | +| tests.cpp:155:5:155:28 | madAndImplementedComplex | +| tests.cpp:155:34:155:34 | a | +| tests.cpp:155:41:155:41 | b | +| tests.cpp:155:48:155:48 | c | +| tests.cpp:160:5:160:24 | madArg0FieldToReturn | +| tests.cpp:160:38:160:39 | mc | +| tests.cpp:161:5:161:32 | madArg0IndirectFieldToReturn | +| tests.cpp:161:47:161:48 | mc | +| tests.cpp:162:5:162:32 | madArg0FieldIndirectToReturn | +| tests.cpp:162:46:162:47 | mc | +| tests.cpp:163:13:163:32 | madArg0ToReturnField | +| tests.cpp:163:38:163:38 | x | +| tests.cpp:164:14:164:41 | madArg0ToReturnIndirectField | +| tests.cpp:164:47:164:47 | x | +| tests.cpp:165:13:165:40 | madArg0ToReturnFieldIndirect | +| tests.cpp:165:46:165:46 | x | +| tests.cpp:167:13:167:30 | madFieldToFieldVar | +| tests.cpp:168:13:168:38 | madFieldToIndirectFieldVar | +| tests.cpp:169:14:169:39 | madIndirectFieldToFieldVar | +| tests.cpp:171:6:171:19 | test_summaries | +| tests.cpp:174:6:174:6 | a | +| tests.cpp:174:9:174:9 | b | +| tests.cpp:174:12:174:12 | c | +| tests.cpp:174:15:174:15 | d | +| tests.cpp:174:18:174:18 | e | +| tests.cpp:175:7:175:11 | a_ptr | +| tests.cpp:218:14:218:16 | mc1 | +| tests.cpp:218:19:218:21 | mc2 | +| tests.cpp:237:15:237:18 | rtn1 | +| tests.cpp:240:14:240:17 | rtn2 | +| tests.cpp:241:7:241:14 | rtn2_ptr | +| tests.cpp:267:7:267:7 | operator= | +| tests.cpp:267:7:267:7 | operator= | +| tests.cpp:267:7:267:13 | MyClass | +| tests.cpp:270:6:270:26 | memberRemoteMadSource | +| tests.cpp:271:7:271:39 | memberRemoteMadSourceIndirectArg0 | +| tests.cpp:271:46:271:46 | x | +| tests.cpp:272:6:272:29 | memberRemoteMadSourceVar | +| tests.cpp:273:7:273:21 | qualifierSource | +| tests.cpp:274:7:274:26 | qualifierFieldSource | +| tests.cpp:277:7:277:23 | memberMadSinkArg0 | +| tests.cpp:277:29:277:29 | x | +| tests.cpp:278:6:278:21 | memberMadSinkVar | +| tests.cpp:279:7:279:19 | qualifierSink | +| tests.cpp:280:7:280:23 | qualifierArg0Sink | +| tests.cpp:280:29:280:29 | x | +| tests.cpp:281:7:281:24 | qualifierFieldSink | +| tests.cpp:284:7:284:19 | madArg0ToSelf | +| tests.cpp:284:25:284:25 | x | +| tests.cpp:285:6:285:20 | madSelfToReturn | +| tests.cpp:286:6:286:16 | notASummary | +| tests.cpp:287:7:287:20 | madArg0ToField | +| tests.cpp:287:26:287:26 | x | +| tests.cpp:288:6:288:21 | madFieldToReturn | +| tests.cpp:290:6:290:8 | val | +| tests.cpp:293:7:293:7 | MyDerivedClass | +| tests.cpp:293:7:293:7 | operator= | +| tests.cpp:293:7:293:7 | operator= | +| tests.cpp:293:7:293:20 | MyDerivedClass | +| tests.cpp:295:6:295:28 | subtypeRemoteMadSource1 | +| tests.cpp:296:6:296:21 | subtypeNonSource | +| tests.cpp:297:6:297:28 | subtypeRemoteMadSource2 | +| tests.cpp:300:9:300:15 | source2 | +| tests.cpp:301:6:301:9 | sink | +| tests.cpp:301:19:301:20 | mc | +| tests.cpp:304:8:304:8 | operator= | +| tests.cpp:304:8:304:8 | operator= | +| tests.cpp:304:8:304:14 | MyClass | +| tests.cpp:307:8:307:33 | namespaceMemberMadSinkArg0 | +| tests.cpp:307:39:307:39 | x | +| tests.cpp:308:15:308:46 | namespaceStaticMemberMadSinkArg0 | +| tests.cpp:308:52:308:52 | x | +| tests.cpp:309:7:309:31 | namespaceMemberMadSinkVar | +| tests.cpp:310:14:310:44 | namespaceStaticMemberMadSinkVar | +| tests.cpp:313:7:313:30 | namespaceMadSelfToReturn | +| tests.cpp:317:22:317:28 | source3 | +| tests.cpp:319:6:319:23 | test_class_members | +| tests.cpp:320:10:320:11 | mc | +| tests.cpp:320:14:320:16 | mc2 | +| tests.cpp:320:19:320:21 | mc3 | +| tests.cpp:320:24:320:26 | mc4 | +| tests.cpp:320:29:320:31 | mc5 | +| tests.cpp:320:34:320:36 | mc6 | +| tests.cpp:320:39:320:41 | mc7 | +| tests.cpp:320:44:320:46 | mc8 | +| tests.cpp:320:49:320:51 | mc9 | +| tests.cpp:320:54:320:57 | mc10 | +| tests.cpp:320:60:320:63 | mc11 | +| tests.cpp:321:11:321:13 | ptr | +| tests.cpp:321:17:321:23 | mc4_ptr | +| tests.cpp:322:17:322:19 | mdc | +| tests.cpp:323:23:323:25 | mnc | +| tests.cpp:323:28:323:31 | mnc2 | +| tests.cpp:324:24:324:31 | mnc2_ptr | +| tests.cpp:330:6:330:6 | a | +| tests.cpp:429:8:429:8 | operator= | +| tests.cpp:429:8:429:8 | operator= | +| tests.cpp:429:8:429:14 | intPair | +| tests.cpp:430:6:430:10 | first | +| tests.cpp:431:6:431:11 | second | +| tests.cpp:434:5:434:29 | madCallArg0ReturnToReturn | +| tests.cpp:434:37:434:43 | fun_ptr | +| tests.cpp:435:9:435:38 | madCallArg0ReturnToReturnFirst | +| tests.cpp:435:46:435:52 | fun_ptr | +| tests.cpp:436:6:436:25 | madCallArg0WithValue | +| tests.cpp:436:34:436:40 | fun_ptr | +| tests.cpp:436:53:436:57 | value | +| tests.cpp:437:5:437:36 | madCallReturnValueIgnoreFunction | +| tests.cpp:437:45:437:51 | fun_ptr | +| tests.cpp:437:64:437:68 | value | +| tests.cpp:439:5:439:14 | getTainted | +| tests.cpp:440:6:440:13 | useValue | +| tests.cpp:440:19:440:19 | x | +| tests.cpp:441:6:441:17 | dontUseValue | +| tests.cpp:441:23:441:23 | x | +| tests.cpp:443:6:443:27 | test_function_pointers | +| tests.cpp:456:19:456:19 | X | +| tests.cpp:457:8:457:35 | StructWithTypedefInParameter | +| tests.cpp:457:8:457:35 | StructWithTypedefInParameter | +| tests.cpp:458:12:458:15 | Type | +| tests.cpp:459:5:459:31 | parameter_ref_to_return_ref | +| tests.cpp:459:5:459:31 | parameter_ref_to_return_ref | +| tests.cpp:459:45:459:45 | x | +| tests.cpp:459:45:459:45 | x | +| tests.cpp:462:6:462:37 | test_parameter_ref_to_return_ref | +| tests.cpp:463:6:463:6 | x | +| tests.cpp:464:36:464:36 | s | +| tests.cpp:465:6:465:6 | y | +| tests.cpp:469:7:469:9 | INT | +| tests.cpp:471:5:471:17 | receive_array | +| tests.cpp:471:23:471:23 | a | +| tests.cpp:473:6:473:23 | test_receive_array | +| tests.cpp:474:6:474:6 | x | +| tests.cpp:475:6:475:10 | array | +| tests.cpp:476:6:476:6 | y | +flowSummaryNode | tests.cpp:144:5:144:19 | [summary param] 0 in madArg0ToReturn | ParameterNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:144:5:144:19 | [summary] to write: ReturnValue in madArg0ToReturn | ReturnNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:145:6:145:28 | [summary param] 0 in madArg0ToReturnIndirect | ParameterNode | madArg0ToReturnIndirect | madArg0ToReturnIndirect | diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ql b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ql new file mode 100644 index 00000000000..4b89b7da409 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ql @@ -0,0 +1,74 @@ +import semmle.code.cpp.ir.dataflow.internal.DataFlowImplConsistency::Consistency +import semmle.code.cpp.ir.dataflow.internal.DataFlowNodes +import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate +import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil +import semmle.code.cpp.security.FlowSources +import utils.test.dataflow.FlowTestCommon + +module InterpretElementTest implements TestSig { + string getARelevantTag() { result = "interpretElement" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists(Element e | + e = interpretElement(_, _, _, _, _, _) and + location = e.getLocation() and + element = e.toString() and + tag = "interpretElement" and + value = "" + ) + } +} + +query predicate summaryCalls(SummaryCall c) { any() } + +query predicate summarizedCallables(SummarizedCallable c) { any() } + +query predicate sourceCallables(SourceCallable c) { c.getLocation().getFile().toString() != "" } + +module IRTest { + private import semmle.code.cpp.ir.IR + private import semmle.code.cpp.ir.dataflow.TaintTracking + + /** Common data flow configuration to be used by tests. */ + module TestAllocationConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source instanceof FlowSource + or + source.asExpr().(FunctionCall).getTarget().getName() = + ["source", "source2", "source3", "sourcePtr"] + or + source.asIndirectExpr(1).(FunctionCall).getTarget().getName() = "sourceIndirect" + } + + predicate isSink(DataFlow::Node sink) { + sinkNode(sink, "test-sink") + or + exists(FunctionCall call | + call.getTarget().getName() = "sink" and + sink.asExpr() = call.getAnArgument() + ) + } + } + + module IRFlow = TaintTracking::Global; +} + +import MakeTest, InterpretElementTest>> + +string describe(DataFlow::Node n) { + n instanceof ParameterNode and result = "ParameterNode" + or + n instanceof PostUpdateNode and result = "PostUpdateNode" + or + n instanceof ArgumentNode and result = "ArgumentNode" + or + n instanceof ReturnNode and result = "ReturnNode" + or + n instanceof OutNode and result = "OutNode" +} + +query predicate flowSummaryNode(FlowSummaryNode n, string str1, string str2, string str3) { + str1 = concat(describe(n), ", ") and + str2 = concat(n.getSummarizedCallable().toString(), ", ") and + str3 = concat(n.getEnclosingCallable().toString(), ", ") +} diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.qll b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.qll deleted file mode 100644 index ee5197e1ff2..00000000000 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.qll +++ /dev/null @@ -1 +0,0 @@ -import semmle.code.cpp.security.FlowSources From 1a4f333c4a59a21411a0950517fbd476ec0e93fc Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 26 Mar 2026 15:58:31 +0100 Subject: [PATCH 69/81] C#: Update integration tests to use SDK 10.0.201. --- .../all-platforms/autobuild/global.json | 2 +- .../all-platforms/autobuild_slnx/global.json | 2 +- .../all-platforms/binlog/global.json | 2 +- .../all-platforms/binlog_multiple/global.json | 2 +- .../blazor/BlazorTest/global.json | 2 +- .../all-platforms/blazor/Files.expected | 18 +- .../all-platforms/blazor/XSS.expected | 6 +- .../all-platforms/blazor/global.json | 2 +- .../BlazorTest/global.json | 2 +- .../blazor_build_mode_none/Files.expected | 18 +- .../blazor_build_mode_none/XSS.expected | 6 +- .../blazor_build_mode_none/global.json | 2 +- .../conditional_compilation/global.json | 2 +- .../all-platforms/cshtml/Files.expected | 2 +- .../all-platforms/cshtml/global.json | 2 +- .../cshtml_standalone/Files.expected | 2 +- .../cshtml_standalone/global.json | 2 +- .../cshtml_standalone_disabled/global.json | 2 +- .../cshtml_standalone_flowsteps/global.json | 2 +- .../cshtml_standalone_net6/Files.expected | 2 +- .../cshtml_standalone_net6/global.json | 4 +- .../diag_dotnet_incompatible/global.json | 2 +- .../diag_missing_project_files/global.json | 2 +- .../diag_missing_xamarin_sdk/global.json | 2 +- .../diag_recursive_generics/global.json | 2 +- .../all-platforms/dotnet_10/global.json | 2 +- .../all-platforms/dotnet_build/global.json | 2 +- .../dotnet_no_args_inject/global.json | 2 +- .../all-platforms/dotnet_pack/global.json | 2 +- .../all-platforms/dotnet_publish/global.json | 2 +- .../all-platforms/dotnet_run/global.json | 2 +- .../source_generator/global.json | 2 +- .../all-platforms/standalone/global.json | 2 +- .../standalone_buildless_option/global.json | 2 +- .../standalone_dependencies_net48/global.json | 2 +- .../proj/global.json | 2 +- .../standalone_failed/global.json | 2 +- .../all-platforms/standalone_resx/global.json | 2 +- .../all-platforms/standalone_slnx/global.json | 2 +- .../standalone_winforms/Assemblies.expected | 100 ++-- .../standalone_winforms/global.json | 2 +- .../linux/compiler_args/CompilerArgs.expected | 354 +++++++-------- .../linux/compiler_args/global.json | 2 +- .../diag_nuget_config_casing/global.json | 2 +- .../global.json | 2 +- .../posix/dotnet_test/global.json | 2 +- .../posix/dotnet_test_mstest/global.json | 2 +- .../posix/inherit-env-vars/global.json | 2 +- .../Assemblies.expected | 334 +++++++------- .../posix/standalone_dependencies/global.json | 2 +- .../Assemblies.expected | 334 +++++++------- .../global.json | 2 +- .../Assemblies.expected | 334 +++++++------- .../global.json | 2 +- .../global.json | 2 +- .../global.json | 2 +- .../standalone_dependencies_nuget/global.json | 2 +- .../global.json | 2 +- .../global.json | 2 +- .../global.json | 2 +- .../proj/global.json | 2 +- .../global.json | 2 +- .../posix/warn_as_error/global.json | 2 +- .../Assemblies.expected | 428 +++++++++--------- .../standalone_dependencies/global.json | 2 +- 65 files changed, 1022 insertions(+), 1022 deletions(-) diff --git a/csharp/ql/integration-tests/all-platforms/autobuild/global.json b/csharp/ql/integration-tests/all-platforms/autobuild/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/autobuild/global.json +++ b/csharp/ql/integration-tests/all-platforms/autobuild/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/global.json b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/autobuild_slnx/global.json +++ b/csharp/ql/integration-tests/all-platforms/autobuild_slnx/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/binlog/global.json b/csharp/ql/integration-tests/all-platforms/binlog/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog/global.json +++ b/csharp/ql/integration-tests/all-platforms/binlog/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json b/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json +++ b/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/blazor/Files.expected b/csharp/ql/integration-tests/all-platforms/blazor/Files.expected index cd035dc7ae9..0ced64bd9b0 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/blazor/Files.expected @@ -14,12 +14,12 @@ | BlazorTest/obj/Debug/net10.0/EmbeddedAttribute.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/EmbeddedAttribute.cs | | BlazorTest/obj/Debug/net10.0/ValidatableTypeAttribute.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/ValidatableTypeAttribute.cs | | BlazorTest/obj/Debug/net10.0/generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_App_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_App_razor.g.cs | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_MainLayout_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_MainLayout_razor.g.cs | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_NavMenu_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_NavMenu_razor.g.cs | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyInput_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyInput_razor.g.cs | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyOutput_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyOutput_razor.g.cs | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_Error_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_Error_razor.g.cs | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Routes_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Routes_razor.g.cs | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components__Imports_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components__Imports_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/App_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/App_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Layout/MainLayout_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Layout/MainLayout_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Layout/NavMenu_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Layout/NavMenu_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/MyInput_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/MyInput_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/MyOutput_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/MyOutput_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/Error_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/Error_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/TestPage_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/TestPage_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Routes_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Routes_razor.g.cs | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/_Imports_razor.g.cs:0:0:0:0 | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/_Imports_razor.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected b/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected index 6518eb74a9f..d4f4f7cdd73 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected +++ b/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected @@ -3,8 +3,8 @@ | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | $@ flows to here and is written to HTML or JavaScript. | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | User-provided value | | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | $@ flows to here and is written to HTML or JavaScript. | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | User-provided value | edges -| BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | provenance | Src:MaD:2 MaD:3 | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | BlazorTest/Components/MyOutput.razor:5:53:5:57 | access to property Value | provenance | Sink:MaD:1 | +| BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | provenance | Src:MaD:2 MaD:3 | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | BlazorTest/Components/MyOutput.razor:5:53:5:57 | access to property Value | provenance | Sink:MaD:1 | models | 1 | Sink: Microsoft.AspNetCore.Components; MarkupString; false; MarkupString; (System.String); ; Argument[0]; html-injection; manual | | 2 | Source: Microsoft.AspNetCore.Components; SupplyParameterFromQueryAttribute; false; ; ; Attribute.Getter; ReturnValue; remote; manual | @@ -14,5 +14,5 @@ nodes | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | semmle.label | access to property UrlParam | | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | semmle.label | access to property QueryParam | | BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | semmle.label | access to property QueryParam : String | -| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | semmle.label | call to method TypeCheck : String | +| BlazorTest/obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | semmle.label | call to method TypeCheck : String | subpaths diff --git a/csharp/ql/integration-tests/all-platforms/blazor/global.json b/csharp/ql/integration-tests/all-platforms/blazor/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/global.json +++ b/csharp/ql/integration-tests/all-platforms/blazor/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json +++ b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/Files.expected b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/Files.expected index 8811ba1c0c7..a9028ed1530 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/Files.expected @@ -8,13 +8,13 @@ | BlazorTest/Components/Routes.razor | | BlazorTest/Components/_Imports.razor | | BlazorTest/Program.cs | -| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_App_razor.g.cs | -| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_MainLayout_razor.g.cs | -| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Layout_NavMenu_razor.g.cs | -| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyInput_razor.g.cs | -| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_MyOutput_razor.g.cs | -| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_Error_razor.g.cs | -| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs | -| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Routes_razor.g.cs | -| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components__Imports_razor.g.cs | +| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/App_razor.g.cs | +| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Layout/MainLayout_razor.g.cs | +| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Layout/NavMenu_razor.g.cs | +| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/MyInput_razor.g.cs | +| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/MyOutput_razor.g.cs | +| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/Error_razor.g.cs | +| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/TestPage_razor.g.cs | +| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Routes_razor.g.cs | +| [...]/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/_Imports_razor.g.cs | | test-db/working/implicitUsings/GlobalUsings.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/XSS.expected b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/XSS.expected index f20ca29ee85..2ebaaaaf6aa 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/XSS.expected +++ b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/XSS.expected @@ -3,8 +3,8 @@ | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | $@ flows to here and is written to HTML or JavaScript. | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | User-provided value | | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | $@ flows to here and is written to HTML or JavaScript. | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | User-provided value | edges -| BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | test-db/working/razor/AC613014E59A413B9538FF8068364499/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | provenance | Src:MaD:2 MaD:3 | -| test-db/working/razor/AC613014E59A413B9538FF8068364499/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | BlazorTest/Components/MyOutput.razor:5:53:5:57 | access to property Value | provenance | Sink:MaD:1 | +| BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | test-db/working/razor/AC613014E59A413B9538FF8068364499/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | provenance | Src:MaD:2 MaD:3 | +| test-db/working/razor/AC613014E59A413B9538FF8068364499/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | BlazorTest/Components/MyOutput.razor:5:53:5:57 | access to property Value | provenance | Sink:MaD:1 | models | 1 | Sink: Microsoft.AspNetCore.Components; MarkupString; false; MarkupString; (System.String); ; Argument[0]; html-injection; manual | | 2 | Source: Microsoft.AspNetCore.Components; SupplyParameterFromQueryAttribute; false; ; ; Attribute.Getter; ReturnValue; remote; manual | @@ -14,5 +14,5 @@ nodes | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | semmle.label | access to property UrlParam | | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | semmle.label | access to property QueryParam | | BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | semmle.label | access to property QueryParam : String | -| test-db/working/razor/AC613014E59A413B9538FF8068364499/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | semmle.label | call to method TypeCheck : String | +| test-db/working/razor/AC613014E59A413B9538FF8068364499/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components/Pages/TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | semmle.label | call to method TypeCheck : String | subpaths diff --git a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/global.json b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/global.json +++ b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json b/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json +++ b/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml/Files.expected b/csharp/ql/integration-tests/all-platforms/cshtml/Files.expected index ef4dc96389f..4acc37f35e1 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/cshtml/Files.expected @@ -5,4 +5,4 @@ | obj/Debug/net10.0/cshtml.GlobalUsings.g.cs:0:0:0:0 | obj/Debug/net10.0/cshtml.GlobalUsings.g.cs | | obj/Debug/net10.0/cshtml.RazorAssemblyInfo.cs:0:0:0:0 | obj/Debug/net10.0/cshtml.RazorAssemblyInfo.cs | | obj/Debug/net10.0/generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs:0:0:0:0 | obj/Debug/net10.0/generated/Microsoft.AspNetCore.App.SourceGenerators/Microsoft.AspNetCore.SourceGenerators.PublicProgramSourceGenerator/PublicTopLevelProgram.Generated.g.cs | -| obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs:0:0:0:0 | obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs | +| obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views/Home/Index_cshtml.g.cs:0:0:0:0 | obj/Debug/net10.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views/Home/Index_cshtml.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/cshtml/global.json b/csharp/ql/integration-tests/all-platforms/cshtml/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/Files.expected b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/Files.expected index 2b6fea50a1b..c5ff8dee794 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/Files.expected @@ -1,4 +1,4 @@ | Program.cs | | Views/Home/Index.cshtml | | test-db/working/implicitUsings/GlobalUsings.g.cs | -| test-db/working/razor/EC52D77FE9BF67AD10C5C3F248392316/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs | +| test-db/working/razor/EC52D77FE9BF67AD10C5C3F248392316/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views/Home/Index_cshtml.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/Files.expected b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/Files.expected index 4059eb70333..843b4651ea3 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/Files.expected +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/Files.expected @@ -1,4 +1,4 @@ | Program.cs | | Views/Home/Index.cshtml | | test-db/working/implicitUsings/GlobalUsings.g.cs | -| test-db/working/razor/EC52D77FE9BF67AD10C5C3F248392316/[...]/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs | +| test-db/working/razor/EC52D77FE9BF67AD10C5C3F248392316/[...]/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views/Home/Index_cshtml.g.cs | diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/global.json index 2715bb6d9b0..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_net6/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "6.0.418" + "version": "10.0.201" } -} \ No newline at end of file +} diff --git a/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json b/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json b/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_10/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_10/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_10/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_10/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/source_generator/global.json b/csharp/ql/integration-tests/all-platforms/source_generator/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/source_generator/global.json +++ b/csharp/ql/integration-tests/all-platforms/source_generator/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone/global.json b/csharp/ql/integration-tests/all-platforms/standalone/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json b/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json index 376af49c07f..ce67766bbb5 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/global.json b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/global.json index 376af49c07f..ce67766bbb5 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependency_dir/proj/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_failed/global.json b/csharp/ql/integration-tests/all-platforms/standalone_failed/global.json index 376af49c07f..ce67766bbb5 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_failed/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_failed/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json b/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/global.json b/csharp/ql/integration-tests/all-platforms/standalone_slnx/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_slnx/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected index aa00093875c..3419be9d7e8 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected @@ -1,50 +1,50 @@ -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Design.dll:0:0:0:0 | System.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Private.Windows.GdiPlus.dll:0:0:0:0 | System.Private.Windows.GdiPlus, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Primitives.dll:0:0:0:0 | System.Windows.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Design.dll:0:0:0:0 | System.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Private.Windows.GdiPlus.dll:0:0:0:0 | System.Private.Windows.GdiPlus, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Primitives.dll:0:0:0:0 | System.Windows.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json b/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected b/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected index 67a23e2d941..13f7aedb656 100644 --- a/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected +++ b/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected @@ -1,7 +1,7 @@ | 0 | /noconfig | | 1 | /unsafe- | | 2 | /checked- | -| 3 | /nowarn:1701,1702,1701,1702 | +| 3 | /nowarn:1701,1702,1701,1702,8002 | | 4 | /fullpaths | | 5 | /nostdlib+ | | 6 | /errorreport:prompt | @@ -10,173 +10,173 @@ | 9 | /preferreduilang:en | | 10 | /highentropyva+ | | 11 | /nullable:enable | -| 12 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll | -| 13 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll | -| 14 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll | -| 15 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll | -| 16 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll | -| 17 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/mscorlib.dll | -| 18 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/netstandard.dll | -| 19 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.AppContext.dll | -| 20 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Buffers.dll | -| 21 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll | -| 22 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.dll | -| 23 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll | -| 24 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll | -| 25 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll | -| 26 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll | -| 27 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll | -| 28 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.dll | -| 29 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll | -| 30 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll | -| 31 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll | -| 32 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Configuration.dll | -| 33 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Console.dll | -| 34 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Core.dll | -| 35 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Data.Common.dll | -| 36 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll | -| 37 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Data.dll | -| 38 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll | -| 39 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll | -| 40 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll | -| 41 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll | -| 42 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll | -| 43 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll | -| 44 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll | -| 45 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll | -| 46 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll | -| 47 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll | -| 48 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.dll | -| 49 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Drawing.dll | -| 50 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll | -| 51 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll | -| 52 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll | -| 53 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Formats.Tar.dll | -| 54 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll | -| 55 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Globalization.dll | -| 56 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll | -| 57 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll | -| 58 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Compression.dll | -| 59 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll | -| 60 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll | -| 61 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.dll | -| 62 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll | -| 63 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll | -| 64 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll | -| 65 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll | -| 66 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll | -| 67 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll | -| 68 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll | -| 69 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll | -| 70 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll | -| 71 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.Pipes.dll | -| 72 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll | -| 73 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll | -| 74 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.dll | -| 75 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll | -| 76 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll | -| 77 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll | -| 78 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Memory.dll | -| 79 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.dll | -| 80 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Http.dll | -| 81 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll | -| 82 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll | -| 83 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Mail.dll | -| 84 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll | -| 85 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll | -| 86 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Ping.dll | -| 87 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Primitives.dll | -| 88 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Quic.dll | -| 89 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Requests.dll | -| 90 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Security.dll | -| 91 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll | -| 92 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll | -| 93 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.Sockets.dll | -| 94 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebClient.dll | -| 95 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll | -| 96 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll | -| 97 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll | -| 98 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll | -| 99 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Numerics.dll | -| 100 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll | -| 101 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ObjectModel.dll | -| 102 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll | -| 103 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.dll | -| 104 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll | -| 105 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll | -| 106 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll | -| 107 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll | -| 108 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll | -| 109 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll | -| 110 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll | -| 111 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Resources.Reader.dll | -| 112 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll | -| 113 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Resources.Writer.dll | -| 114 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll | -| 115 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll | -| 116 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.dll | -| 117 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll | -| 118 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll | -| 119 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll | -| 120 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll | -| 121 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll | -| 122 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll | -| 123 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll | -| 124 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll | -| 125 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll | -| 126 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll | -| 127 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll | -| 128 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll | -| 129 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll | -| 130 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll | -| 131 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Claims.dll | -| 132 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll | -| 133 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll | -| 134 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll | -| 135 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll | -| 136 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll | -| 137 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll | -| 138 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll | -| 139 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll | -| 140 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.dll | -| 141 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Principal.dll | -| 142 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll | -| 143 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Security.SecureString.dll | -| 144 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll | -| 145 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ServiceProcess.dll | -| 146 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll | -| 147 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Encoding.dll | -| 148 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll | -| 149 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll | -| 150 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.Json.dll | -| 151 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll | -| 152 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll | -| 153 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Channels.dll | -| 154 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.dll | -| 155 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll | -| 156 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll | -| 157 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll | -| 158 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll | -| 159 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll | -| 160 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Thread.dll | -| 161 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll | -| 162 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Threading.Timer.dll | -| 163 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Transactions.dll | -| 164 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Transactions.Local.dll | -| 165 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.ValueTuple.dll | -| 166 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Web.dll | -| 167 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll | -| 168 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Windows.dll | -| 169 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.dll | -| 170 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.Linq.dll | -| 171 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll | -| 172 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll | -| 173 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll | -| 174 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll | -| 175 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll | -| 176 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XPath.dll | -| 177 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll | -| 178 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/ref/net10.0/WindowsBase.dll | +| 12 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/Microsoft.CSharp.dll | +| 13 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.Core.dll | +| 14 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.dll | +| 15 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/Microsoft.Win32.Primitives.dll | +| 16 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/Microsoft.Win32.Registry.dll | +| 17 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/mscorlib.dll | +| 18 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/netstandard.dll | +| 19 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.AppContext.dll | +| 20 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Buffers.dll | +| 21 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Collections.Concurrent.dll | +| 22 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Collections.dll | +| 23 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Collections.Immutable.dll | +| 24 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Collections.NonGeneric.dll | +| 25 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Collections.Specialized.dll | +| 26 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ComponentModel.Annotations.dll | +| 27 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ComponentModel.DataAnnotations.dll | +| 28 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ComponentModel.dll | +| 29 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ComponentModel.EventBasedAsync.dll | +| 30 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ComponentModel.Primitives.dll | +| 31 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ComponentModel.TypeConverter.dll | +| 32 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Configuration.dll | +| 33 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Console.dll | +| 34 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Core.dll | +| 35 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Data.Common.dll | +| 36 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Data.DataSetExtensions.dll | +| 37 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Data.dll | +| 38 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.Contracts.dll | +| 39 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.Debug.dll | +| 40 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.DiagnosticSource.dll | +| 41 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.FileVersionInfo.dll | +| 42 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.Process.dll | +| 43 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.StackTrace.dll | +| 44 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll | +| 45 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.Tools.dll | +| 46 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.TraceSource.dll | +| 47 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Diagnostics.Tracing.dll | +| 48 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.dll | +| 49 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Drawing.dll | +| 50 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Drawing.Primitives.dll | +| 51 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Dynamic.Runtime.dll | +| 52 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Formats.Asn1.dll | +| 53 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Formats.Tar.dll | +| 54 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Globalization.Calendars.dll | +| 55 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Globalization.dll | +| 56 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Globalization.Extensions.dll | +| 57 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.Compression.Brotli.dll | +| 58 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.Compression.dll | +| 59 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.Compression.FileSystem.dll | +| 60 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.Compression.ZipFile.dll | +| 61 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.dll | +| 62 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.FileSystem.AccessControl.dll | +| 63 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.FileSystem.dll | +| 64 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.FileSystem.DriveInfo.dll | +| 65 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.FileSystem.Primitives.dll | +| 66 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.FileSystem.Watcher.dll | +| 67 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.IsolatedStorage.dll | +| 68 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.MemoryMappedFiles.dll | +| 69 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.Pipelines.dll | +| 70 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.Pipes.AccessControl.dll | +| 71 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.Pipes.dll | +| 72 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.IO.UnmanagedMemoryStream.dll | +| 73 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Linq.AsyncEnumerable.dll | +| 74 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Linq.dll | +| 75 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Linq.Expressions.dll | +| 76 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Linq.Parallel.dll | +| 77 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Linq.Queryable.dll | +| 78 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Memory.dll | +| 79 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.dll | +| 80 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.Http.dll | +| 81 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.Http.Json.dll | +| 82 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.HttpListener.dll | +| 83 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.Mail.dll | +| 84 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.NameResolution.dll | +| 85 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.NetworkInformation.dll | +| 86 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.Ping.dll | +| 87 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.Primitives.dll | +| 88 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.Quic.dll | +| 89 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.Requests.dll | +| 90 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.Security.dll | +| 91 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.ServerSentEvents.dll | +| 92 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.ServicePoint.dll | +| 93 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.Sockets.dll | +| 94 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.WebClient.dll | +| 95 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.WebHeaderCollection.dll | +| 96 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.WebProxy.dll | +| 97 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.WebSockets.Client.dll | +| 98 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Net.WebSockets.dll | +| 99 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Numerics.dll | +| 100 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Numerics.Vectors.dll | +| 101 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ObjectModel.dll | +| 102 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Reflection.DispatchProxy.dll | +| 103 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Reflection.dll | +| 104 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Reflection.Emit.dll | +| 105 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Reflection.Emit.ILGeneration.dll | +| 106 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Reflection.Emit.Lightweight.dll | +| 107 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Reflection.Extensions.dll | +| 108 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Reflection.Metadata.dll | +| 109 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Reflection.Primitives.dll | +| 110 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Reflection.TypeExtensions.dll | +| 111 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Resources.Reader.dll | +| 112 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Resources.ResourceManager.dll | +| 113 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Resources.Writer.dll | +| 114 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll | +| 115 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll | +| 116 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.dll | +| 117 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Extensions.dll | +| 118 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Handles.dll | +| 119 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.dll | +| 120 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll | +| 121 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll | +| 122 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Intrinsics.dll | +| 123 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Loader.dll | +| 124 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Numerics.dll | +| 125 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Serialization.dll | +| 126 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Formatters.dll | +| 127 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Json.dll | +| 128 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Primitives.dll | +| 129 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Xml.dll | +| 130 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.AccessControl.dll | +| 131 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Claims.dll | +| 132 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Cryptography.Algorithms.dll | +| 133 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Cryptography.Cng.dll | +| 134 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Cryptography.Csp.dll | +| 135 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Cryptography.dll | +| 136 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Cryptography.Encoding.dll | +| 137 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Cryptography.OpenSsl.dll | +| 138 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Cryptography.Primitives.dll | +| 139 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Cryptography.X509Certificates.dll | +| 140 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.dll | +| 141 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Principal.dll | +| 142 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.Principal.Windows.dll | +| 143 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Security.SecureString.dll | +| 144 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ServiceModel.Web.dll | +| 145 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ServiceProcess.dll | +| 146 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Text.Encoding.CodePages.dll | +| 147 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Text.Encoding.dll | +| 148 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Text.Encoding.Extensions.dll | +| 149 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Text.Encodings.Web.dll | +| 150 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Text.Json.dll | +| 151 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Text.RegularExpressions.dll | +| 152 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.AccessControl.dll | +| 153 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.Channels.dll | +| 154 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.dll | +| 155 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.Overlapped.dll | +| 156 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.Tasks.Dataflow.dll | +| 157 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.Tasks.dll | +| 158 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.Tasks.Extensions.dll | +| 159 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.Tasks.Parallel.dll | +| 160 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.Thread.dll | +| 161 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.ThreadPool.dll | +| 162 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Threading.Timer.dll | +| 163 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Transactions.dll | +| 164 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Transactions.Local.dll | +| 165 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.ValueTuple.dll | +| 166 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Web.dll | +| 167 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Web.HttpUtility.dll | +| 168 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Windows.dll | +| 169 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Xml.dll | +| 170 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Xml.Linq.dll | +| 171 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Xml.ReaderWriter.dll | +| 172 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Xml.Serialization.dll | +| 173 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Xml.XDocument.dll | +| 174 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Xml.XmlDocument.dll | +| 175 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Xml.XmlSerializer.dll | +| 176 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Xml.XPath.dll | +| 177 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/System.Xml.XPath.XDocument.dll | +| 178 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/ref/net10.0/WindowsBase.dll | | 179 | /features:"InterceptorsNamespaces=;Microsoft.Extensions.Validation.Generated" | | 180 | /debug+ | | 181 | /debug:portable | @@ -191,15 +191,15 @@ | 190 | /deterministic+ | | 191 | /langversion:14.0 | | 192 | /analyzerconfig:obj/Debug/net10.0/test.GeneratedMSBuildEditorConfig.editorconfig | -| 193 | /analyzerconfig:/usr/share/dotnet/sdk/10.0.100/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_10_default.globalconfig | -| 194 | /analyzer:/usr/share/dotnet/sdk/10.0.100/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll | -| 195 | /analyzer:/usr/share/dotnet/sdk/10.0.100/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.NetAnalyzers.dll | -| 196 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/Microsoft.Interop.ComInterfaceGenerator.dll | -| 197 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/Microsoft.Interop.JavaScript.JSImportGenerator.dll | -| 198 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/Microsoft.Interop.LibraryImportGenerator.dll | -| 199 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/Microsoft.Interop.SourceGeneration.dll | -| 200 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/System.Text.Json.SourceGeneration.dll | -| 201 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.0/analyzers/dotnet/cs/System.Text.RegularExpressions.Generator.dll | +| 193 | /analyzerconfig:/usr/share/dotnet/sdk/10.0.201/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_10_default.globalconfig | +| 194 | /analyzer:/usr/share/dotnet/sdk/10.0.201/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll | +| 195 | /analyzer:/usr/share/dotnet/sdk/10.0.201/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.NetAnalyzers.dll | +| 196 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/analyzers/dotnet/cs/Microsoft.Interop.ComInterfaceGenerator.dll | +| 197 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/analyzers/dotnet/cs/Microsoft.Interop.JavaScript.JSImportGenerator.dll | +| 198 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/analyzers/dotnet/cs/Microsoft.Interop.LibraryImportGenerator.dll | +| 199 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/analyzers/dotnet/cs/Microsoft.Interop.SourceGeneration.dll | +| 200 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/analyzers/dotnet/cs/System.Text.Json.SourceGeneration.dll | +| 201 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/10.0.5/analyzers/dotnet/cs/System.Text.RegularExpressions.Generator.dll | | 202 | Program.cs | | 203 | obj/Debug/net10.0/test.GlobalUsings.g.cs | | 204 | obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs | diff --git a/csharp/ql/integration-tests/linux/compiler_args/global.json b/csharp/ql/integration-tests/linux/compiler_args/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/linux/compiler_args/global.json +++ b/csharp/ql/integration-tests/linux/compiler_args/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/linux/diag_nuget_config_casing/global.json b/csharp/ql/integration-tests/linux/diag_nuget_config_casing/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/linux/diag_nuget_config_casing/global.json +++ b/csharp/ql/integration-tests/linux/diag_nuget_config_casing/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json b/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json +++ b/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/dotnet_test/global.json b/csharp/ql/integration-tests/posix/dotnet_test/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/dotnet_test/global.json +++ b/csharp/ql/integration-tests/posix/dotnet_test/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json b/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json +++ b/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/inherit-env-vars/global.json b/csharp/ql/integration-tests/posix/inherit-env-vars/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/inherit-env-vars/global.json +++ b/csharp/ql/integration-tests/posix/inherit-env-vars/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected index 619475882b5..8a3fdeb74b6 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected @@ -1,170 +1,170 @@ | test-db/working/packages/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll:0:0:0:0 | Avalara.AvaTax.RestClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be94eb8ba37fd33c | | test-db/working/packages/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll:0:0:0:0 | Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | | test-db/working/packages/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies/global.json index 376af49c07f..ce67766bbb5 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected index 619475882b5..8a3fdeb74b6 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected @@ -1,170 +1,170 @@ | test-db/working/packages/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll:0:0:0:0 | Avalara.AvaTax.RestClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be94eb8ba37fd33c | | test-db/working/packages/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll:0:0:0:0 | Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | | test-db/working/packages/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json index 376af49c07f..ce67766bbb5 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected index 7e3b8f6e453..c3861c7a846 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected @@ -1,167 +1,167 @@ -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json index 376af49c07f..ce67766bbb5 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/posix/warn_as_error/global.json b/csharp/ql/integration-tests/posix/warn_as_error/global.json index 481e95ec7be..ed604974070 100644 --- a/csharp/ql/integration-tests/posix/warn_as_error/global.json +++ b/csharp/ql/integration-tests/posix/warn_as_error/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } diff --git a/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected b/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected index 90a2806afe5..c4532a2d554 100644 --- a/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected +++ b/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected @@ -1,217 +1,217 @@ | test-db/working/packages/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll:0:0:0:0 | Avalara.AvaTax.RestClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be94eb8ba37fd33c | | test-db/working/packages/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll:0:0:0:0 | Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/10.0.0/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Design.dll:0:0:0:0 | System.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Private.Windows.GdiPlus.dll:0:0:0:0 | System.Private.Windows.GdiPlus, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Windows.Primitives.dll:0:0:0:0 | System.Windows.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.0/ref/net10.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Console.dll:0:0:0:0 | System.Console, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.IO.dll:0:0:0:0 | System.IO, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.AsyncEnumerable.dll:0:0:0:0 | System.Linq.AsyncEnumerable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.ServerSentEvents.dll:0:0:0:0 | System.Net.ServerSentEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/10.0.5/ref/net10.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Design.dll:0:0:0:0 | System.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Private.Windows.GdiPlus.dll:0:0:0:0 | System.Private.Windows.GdiPlus, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Windows.Primitives.dll:0:0:0:0 | System.Windows.Primitives, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/10.0.5/ref/net10.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | | test-db/working/packages/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/windows/standalone_dependencies/global.json b/csharp/ql/integration-tests/windows/standalone_dependencies/global.json index 376af49c07f..ce67766bbb5 100644 --- a/csharp/ql/integration-tests/windows/standalone_dependencies/global.json +++ b/csharp/ql/integration-tests/windows/standalone_dependencies/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.100" + "version": "10.0.201" } } From 56153d583e50c13ffa4f862f0dcf6f9c5e1cb4ca Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 26 Mar 2026 17:31:18 +0000 Subject: [PATCH 70/81] C++: Switch to doublyBoundedFastTC when computing virtual dispatch edges and inline pairCand to avoid a giant tuple explosion. --- .../ir/dataflow/internal/DataFlowDispatch.qll | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll index 0d63558c956..bce93655276 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll @@ -238,7 +238,12 @@ private module TrackVirtualDispatch { private import TypeTracking::TypeTrack::Graph - private predicate edgePlus(PathNode n1, PathNode n2) = fastTC(edges/2)(n1, n2) + private predicate isSource(PathNode n) { n.isSource() } + + private predicate isSink(PathNode n) { n.isSink() } + + private predicate edgePlus(PathNode n1, PathNode n2) = + doublyBoundedFastTC(edges/2, isSource/1, isSink/1)(n1, n2) /** * Gets the most specific implementation of `mf` that may be called when the @@ -255,6 +260,15 @@ private module TrackVirtualDispatch { ) } + pragma[nomagic] + private MemberFunction mostSpecificForSource(PathNode p1, MemberFunction mf) { + p1.isSource() and + exists(Class derived | + qualifierSourceImpl(p1.getNode(), derived) and + result = mostSpecific(mf, derived) + ) + } + /** * Gets a possible pair of end-points `(p1, p2)` where: * - `p1` is a derived-to-base conversion that converts from some @@ -264,16 +278,16 @@ private module TrackVirtualDispatch { * - `callable` is the most specific implementation that may be called when * the qualifier has type `derived`. */ + bindingset[p1, p2] + pragma[inline_late] private predicate pairCand( PathNode p1, PathNode p2, DataFlowPrivate::DataFlowCallable callable, DataFlowPrivate::DataFlowCall call ) { - exists(Class derived, MemberFunction mf | - qualifierSourceImpl(p1.getNode(), derived) and + p2.isSink() and + exists(MemberFunction mf | qualifierOfVirtualCallImpl(p2.getNode(), call.asCallInstruction(), mf) and - p1.isSource() and - p2.isSink() and - callable.asSourceCallable() = mostSpecific(mf, derived) + callable.asSourceCallable() = mostSpecificForSource(p1, mf) ) } From f897575d3fee366c942fd2ac7872ab5237cb35db Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 27 Mar 2026 10:11:13 +0000 Subject: [PATCH 71/81] Update change note --- cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md b/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md index 1fcb2d6ac6c..41d77b518f1 100644 --- a/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md +++ b/cpp/ql/lib/change-notes/2026-03-26-convert-csv-models-to-yml.md @@ -1,4 +1,4 @@ --- category: breaking --- -* ZeroMQ and `getc`-family models have been migrated from inline CSV specifications in QL files to `.model.yml` data extension files in the `ext/` directory. The `SourceModelCsv`, `SinkModelCsv`, and `SummaryModelCsv` classes and the associated CSV parsing infrastructure have been removed from `ExternalFlow.qll`. New models should be added as `.model.yml` files in the `ext/` directory. +* The `SourceModelCsv`, `SinkModelCsv`, and `SummaryModelCsv` classes and the associated CSV parsing infrastructure have been removed from `ExternalFlow.qll`. New models should be added as `.model.yml` files in the `ext/` directory. From 7e1ad825c38647040670d33388e363c24b556202 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 27 Mar 2026 11:17:15 +0000 Subject: [PATCH 72/81] Fix model row with misaligned columns The original CSV had too many columns, and copilot cut off the last one, before adding the provenance column at the end. --- .../library-tests/dataflow/models-as-data/testModels.ext.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml index bc2709d647b..c6bebdb95a4 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml @@ -70,7 +70,7 @@ extensions: - ["", "", False, "madArg0ToReturnFieldIndirect", "", "", "Argument[0]", "ReturnValue.Field[*ptr]", "taint", "manual"] - ["", "", False, "madFieldToFieldVar", "", "", "Field[value]", "Field[value2]", "taint", "manual"] - ["", "", False, "madFieldToIndirectFieldVar", "", "", "Field[value]", "Field[*ptr]", "taint", "manual"] - - ["", "", False, "madIndirectFieldToFieldVar", "", "", "", "Field[value]", "Field[value2]", "manual"] + - ["", "", False, "madIndirectFieldToFieldVar", "", "", "Field[value]", "Field[value2]", "taint", "manual"] - ["", "MyClass", True, "madArg0ToSelf", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] - ["", "MyClass", True, "madSelfToReturn", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["", "MyClass", True, "madArg0ToField", "", "", "Argument[0]", "Argument[-1].Field[val]", "taint", "manual"] From c07a8145154fecf4135a3793504c0752169eecb9 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 27 Mar 2026 11:23:33 +0000 Subject: [PATCH 73/81] Add comments to converted MaD file --- .../dataflow/models-as-data/testModels.ext.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml index c6bebdb95a4..95261223473 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.ext.yml @@ -12,7 +12,7 @@ extensions: - ["", "", False, "remoteMadSourceIndirectArg0", "", "", "Argument[*0]", "remote", "manual"] - ["", "", False, "remoteMadSourceIndirectArg1", "", "", "Argument[*1]", "remote", "manual"] - ["", "", False, "remoteMadSourceVar", "", "", "", "remote", "manual"] - - ["", "", False, "remoteMadSourceVarIndirect", "", "", "*", "remote", "manual"] + - ["", "", False, "remoteMadSourceVarIndirect", "", "", "*", "remote", "manual"] # we can't express this source/sink correctly at present, "*" is not a valid access path - ["", "", False, "remoteMadSourceParam0", "", "", "Parameter[0]", "remote", "manual"] - ["MyNamespace", "", False, "namespaceLocalMadSource", "", "", "ReturnValue", "local", "manual"] - ["MyNamespace", "", False, "namespaceLocalMadSourceVar", "", "", "", "local", "manual"] @@ -21,7 +21,7 @@ extensions: - ["", "MyClass", True, "memberRemoteMadSourceIndirectArg0", "", "", "Argument[*0]", "remote", "manual"] - ["", "MyClass", True, "memberRemoteMadSourceVar", "", "", "", "remote", "manual"] - ["", "MyClass", True, "subtypeRemoteMadSource1", "", "", "ReturnValue", "remote", "manual"] - - ["", "MyClass", False, "subtypeNonSource", "", "", "ReturnValue", "remote", "manual"] + - ["", "MyClass", False, "subtypeNonSource", "", "", "ReturnValue", "remote", "manual"] # the tests define this in MyDerivedClass, so it should *not* be recongized as a source - ["", "MyClass", True, "qualifierSource", "", "", "Argument[-1]", "remote", "manual"] - ["", "MyClass", True, "qualifierFieldSource", "", "", "Argument[-1].val", "remote", "manual"] - ["", "MyDerivedClass", False, "subtypeRemoteMadSource2", "", "", "ReturnValue", "remote", "manual"] @@ -36,7 +36,7 @@ extensions: - ["", "", False, "madSinkIndirectArg0", "", "", "Argument[*0]", "test-sink", "manual"] - ["", "", False, "madSinkDoubleIndirectArg0", "", "", "Argument[**0]", "test-sink", "manual"] - ["", "", False, "madSinkVar", "", "", "", "test-sink", "manual"] - - ["", "", False, "madSinkVarIndirect", "", "", "*", "test-sink", "manual"] + - ["", "", False, "madSinkVarIndirect", "", "", "*", "test-sink", "manual"] # we can't express this source/sink correctly at present, "*" is not a valid access path - ["", "", False, "madSinkParam0", "", "", "Parameter[0]", "test-sink", "manual"] - ["", "MyClass", True, "memberMadSinkArg0", "", "", "Argument[0]", "test-sink", "manual"] - ["", "MyClass", True, "memberMadSinkVar", "", "", "", "test-sink", "manual"] @@ -61,16 +61,16 @@ extensions: - ["", "", False, "madArg0IndirectToArg1Indirect", "", "", "Argument[*0]", "Argument[*1]", "taint", "manual"] - ["", "", False, "madArgsComplex", "", "", "Argument[*0..1,2]", "ReturnValue", "taint", "manual"] - ["", "", False, "madAndImplementedComplex", "", "", "Argument[2]", "ReturnValue", "taint", "manual"] - - ["", "", False, "madArgsAny", "", "", "Argument", "ReturnValue", "taint", "manual"] + - ["", "", False, "madArgsAny", "", "", "Argument", "ReturnValue", "taint", "manual"] # we can't express this source/sink correctly at present, "Argument" is not a valid input - ["", "", False, "madArg0FieldToReturn", "", "", "Argument[0].Field[value]", "ReturnValue", "taint", "manual"] - ["", "", False, "madArg0IndirectFieldToReturn", "", "", "Argument[*0].Field[value]", "ReturnValue", "taint", "manual"] - ["", "", False, "madArg0FieldIndirectToReturn", "", "", "Argument[0].Field[*ptr]", "ReturnValue", "taint", "manual"] - ["", "", False, "madArg0ToReturnField", "", "", "Argument[0]", "ReturnValue.Field[value]", "taint", "manual"] - ["", "", False, "madArg0ToReturnIndirectField", "", "", "Argument[0]", "ReturnValue[*].Field[value]", "taint", "manual"] - ["", "", False, "madArg0ToReturnFieldIndirect", "", "", "Argument[0]", "ReturnValue.Field[*ptr]", "taint", "manual"] - - ["", "", False, "madFieldToFieldVar", "", "", "Field[value]", "Field[value2]", "taint", "manual"] - - ["", "", False, "madFieldToIndirectFieldVar", "", "", "Field[value]", "Field[*ptr]", "taint", "manual"] - - ["", "", False, "madIndirectFieldToFieldVar", "", "", "Field[value]", "Field[value2]", "taint", "manual"] + - ["", "", False, "madFieldToFieldVar", "", "", "Field[value]", "Field[value2]", "taint", "manual"] # we can't express this source/sink correctly at present, "Field[value]" is not a valid input and "Field[value2]" is not a valid output + - ["", "", False, "madFieldToIndirectFieldVar", "", "", "Field[value]", "Field[*ptr]", "taint", "manual"] # we can't express this source/sink correctly at present, "Field[value]" is not a valid input and "Field[*ptr]" is not a valid output + - ["", "", False, "madIndirectFieldToFieldVar", "", "", "Field[value]", "Field[value2]", "taint", "manual"] # we can't express this source/sink correctly at present, "Field[value]" is not a valid input and "Field[value2]" is not a valid output - ["", "MyClass", True, "madArg0ToSelf", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] - ["", "MyClass", True, "madSelfToReturn", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["", "MyClass", True, "madArg0ToField", "", "", "Argument[0]", "Argument[-1].Field[val]", "taint", "manual"] From a9449cc99183003883f6ec6375974d4382aecbff Mon Sep 17 00:00:00 2001 From: MarkLee131 Date: Fri, 27 Mar 2026 19:08:27 +0800 Subject: [PATCH 74/81] Add EC to secure algorithm whitelist for Java CWE-327 query --- .../2026-03-27-add-ec-to-secure-algorithms.md | 4 +++ .../semmle/code/java/security/Encryption.qll | 6 +++- .../security/CWE-327/semmle/tests/Test.java | 33 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md diff --git a/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md b/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md new file mode 100644 index 00000000000..2c46d38ebfe --- /dev/null +++ b/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `java/potentially-weak-cryptographic-algorithm` query no longer flags Elliptic Curve algorithms (`EC`, `ECDSA`, `ECDH`, `EdDSA`, `Ed25519`, `Ed448`, `XDH`, `X25519`, `X448`) as potentially insecure. These are modern, secure algorithms recommended by NIST SP 800-57 and other standards bodies. Previously, these algorithms were not included in the secure algorithm whitelist, causing false positives when using standard Java cryptographic APIs such as `KeyPairGenerator.getInstance("EC")`. diff --git a/java/ql/lib/semmle/code/java/security/Encryption.qll b/java/ql/lib/semmle/code/java/security/Encryption.qll index b0a0fc72df7..afbace5bf45 100644 --- a/java/ql/lib/semmle/code/java/security/Encryption.qll +++ b/java/ql/lib/semmle/code/java/security/Encryption.qll @@ -259,7 +259,11 @@ string getASecureAlgorithmName() { result = [ "RSA", "SHA-?(256|384|512)", "CCM", "GCM", "AES(?![^a-zA-Z](ECB|CBC/PKCS[57]Padding))", - "Blowfish", "ECIES", "SHA3-(256|384|512)" + "Blowfish", "ECIES", "SHA3-(256|384|512)", + // Elliptic Curve algorithms: EC (key generation), ECDSA (signatures), ECDH (key agreement), + // EdDSA/Ed25519/Ed448 (Edwards-curve signatures), XDH/X25519/X448 (key agreement). + // These are modern, secure algorithms recommended by NIST and other standards bodies. + "EC", "ECDSA", "ECDH", "EdDSA", "Ed25519", "Ed448", "XDH", "X25519", "X448" ] } diff --git a/java/ql/test/query-tests/security/CWE-327/semmle/tests/Test.java b/java/ql/test/query-tests/security/CWE-327/semmle/tests/Test.java index 2f66d499639..41ce1e69784 100644 --- a/java/ql/test/query-tests/security/CWE-327/semmle/tests/Test.java +++ b/java/ql/test/query-tests/security/CWE-327/semmle/tests/Test.java @@ -46,6 +46,39 @@ class Test { cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); byte[] encrypted = cipher.doFinal(input.getBytes("UTF-8")); + + KeyPairGenerator keyPairGenerator; + + // GOOD: EC is a secure algorithm for key pair generation + keyPairGenerator = KeyPairGenerator.getInstance("EC"); + + // GOOD: ECDSA is a secure algorithm for digital signatures + Signature ecdsaSig = Signature.getInstance("ECDSA"); + + // GOOD: ECDH is a secure algorithm for key agreement + KeyAgreement ecdhKa = KeyAgreement.getInstance("ECDH"); + + // GOOD: EdDSA is a secure algorithm (Edwards-curve Digital Signature Algorithm) + keyPairGenerator = KeyPairGenerator.getInstance("EdDSA"); + + // GOOD: Ed25519 is a secure algorithm + keyPairGenerator = KeyPairGenerator.getInstance("Ed25519"); + + // GOOD: Ed448 is a secure algorithm + keyPairGenerator = KeyPairGenerator.getInstance("Ed448"); + + // GOOD: XDH is a secure algorithm for key agreement + keyPairGenerator = KeyPairGenerator.getInstance("XDH"); + + // GOOD: X25519 is a secure algorithm for key agreement + keyPairGenerator = KeyPairGenerator.getInstance("X25519"); + + // GOOD: X448 is a secure algorithm for key agreement + keyPairGenerator = KeyPairGenerator.getInstance("X448"); + + // GOOD: SHA256withECDSA is a secure signature algorithm + Signature sha256Ecdsa = Signature.getInstance("SHA256withECDSA"); + } catch (Exception e) { // fail } From da4a2238bc706382a41d402e5a907d9d95d6424a Mon Sep 17 00:00:00 2001 From: MarkLee131 Date: Sat, 28 Mar 2026 16:51:13 +0800 Subject: [PATCH 75/81] Address PR review: add Signature.getInstance sink, HMAC/PBKDF2 whitelist, fix test APIs - Model Signature.getInstance() as CryptoAlgoSpec sink (previously only Signature constructor was modeled) - Add HMAC-based algorithms (HMACSHA1/256/384/512, HmacSHA1/256/384/512) and PBKDF2 to the secure algorithm whitelist - Fix XDH/X25519/X448 tests to use KeyAgreement.getInstance() instead of KeyPairGenerator.getInstance() to match their key agreement semantics - Add test cases for SHA384withECDSA, HMACSHA*, and PBKDF2WithHmacSHA1 from user-reported false positives - Update change note to document all additions --- .../2026-03-27-add-ec-to-secure-algorithms.md | 3 ++- .../semmle/code/java/security/Encryption.qll | 10 +++++++-- .../security/CWE-327/semmle/tests/Test.java | 21 +++++++++++++------ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md b/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md index 2c46d38ebfe..1e323fafd35 100644 --- a/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md +++ b/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md @@ -1,4 +1,5 @@ --- category: minorAnalysis --- -* The `java/potentially-weak-cryptographic-algorithm` query no longer flags Elliptic Curve algorithms (`EC`, `ECDSA`, `ECDH`, `EdDSA`, `Ed25519`, `Ed448`, `XDH`, `X25519`, `X448`) as potentially insecure. These are modern, secure algorithms recommended by NIST SP 800-57 and other standards bodies. Previously, these algorithms were not included in the secure algorithm whitelist, causing false positives when using standard Java cryptographic APIs such as `KeyPairGenerator.getInstance("EC")`. +* The `java/potentially-weak-cryptographic-algorithm` query no longer flags Elliptic Curve algorithms (`EC`, `ECDSA`, `ECDH`, `EdDSA`, `Ed25519`, `Ed448`, `XDH`, `X25519`, `X448`), HMAC-based algorithms (`HMACSHA1`, `HMACSHA256`, `HMACSHA384`, `HMACSHA512`), or PBKDF2 key derivation as potentially insecure. These are modern, secure algorithms recommended by NIST and other standards bodies. Previously, these algorithms were not included in the secure algorithm whitelist, causing false positives when using standard Java cryptographic APIs such as `KeyPairGenerator.getInstance("EC")` or `new SecretKeySpec(key, "HMACSHA256")`. +* The `Signature.getInstance(...)` method is now modeled as a `CryptoAlgoSpec` sink, alongside the existing `Signature` constructor sink. This ensures that algorithm strings passed to `Signature.getInstance(...)` are also checked by the query. diff --git a/java/ql/lib/semmle/code/java/security/Encryption.qll b/java/ql/lib/semmle/code/java/security/Encryption.qll index afbace5bf45..6af8d29cc4a 100644 --- a/java/ql/lib/semmle/code/java/security/Encryption.qll +++ b/java/ql/lib/semmle/code/java/security/Encryption.qll @@ -263,7 +263,9 @@ string getASecureAlgorithmName() { // Elliptic Curve algorithms: EC (key generation), ECDSA (signatures), ECDH (key agreement), // EdDSA/Ed25519/Ed448 (Edwards-curve signatures), XDH/X25519/X448 (key agreement). // These are modern, secure algorithms recommended by NIST and other standards bodies. - "EC", "ECDSA", "ECDH", "EdDSA", "Ed25519", "Ed448", "XDH", "X25519", "X448" + "EC", "ECDSA", "ECDH", "EdDSA", "Ed25519", "Ed448", "XDH", "X25519", "X448", + // HMAC-based algorithms and key derivation functions. + "HMACSHA(1|256|384|512)", "HmacSHA(1|256|384|512)", "PBKDF2" ] } @@ -370,9 +372,13 @@ class JavaSecuritySignature extends JavaSecurityAlgoSpec { exists(Constructor c | c.getAReference() = this | c.getDeclaringType().hasQualifiedName("java.security", "Signature") ) + or + exists(Method m | m.getAReference() = this | + m.hasQualifiedName("java.security", "Signature", "getInstance") + ) } - override Expr getAlgoSpec() { result = this.(ConstructorCall).getArgument(0) } + override Expr getAlgoSpec() { result = this.(Call).getArgument(0) } } /** A call to the `getInstance` method declared in `java.security.KeyPairGenerator`. */ diff --git a/java/ql/test/query-tests/security/CWE-327/semmle/tests/Test.java b/java/ql/test/query-tests/security/CWE-327/semmle/tests/Test.java index 41ce1e69784..23aff65161c 100644 --- a/java/ql/test/query-tests/security/CWE-327/semmle/tests/Test.java +++ b/java/ql/test/query-tests/security/CWE-327/semmle/tests/Test.java @@ -52,7 +52,7 @@ class Test { // GOOD: EC is a secure algorithm for key pair generation keyPairGenerator = KeyPairGenerator.getInstance("EC"); - // GOOD: ECDSA is a secure algorithm for digital signatures + // GOOD: ECDSA is a secure signature algorithm Signature ecdsaSig = Signature.getInstance("ECDSA"); // GOOD: ECDH is a secure algorithm for key agreement @@ -61,24 +61,33 @@ class Test { // GOOD: EdDSA is a secure algorithm (Edwards-curve Digital Signature Algorithm) keyPairGenerator = KeyPairGenerator.getInstance("EdDSA"); - // GOOD: Ed25519 is a secure algorithm + // GOOD: Ed25519 is a secure algorithm for key pair generation keyPairGenerator = KeyPairGenerator.getInstance("Ed25519"); - // GOOD: Ed448 is a secure algorithm + // GOOD: Ed448 is a secure algorithm for key pair generation keyPairGenerator = KeyPairGenerator.getInstance("Ed448"); // GOOD: XDH is a secure algorithm for key agreement - keyPairGenerator = KeyPairGenerator.getInstance("XDH"); + KeyAgreement xdhKa = KeyAgreement.getInstance("XDH"); // GOOD: X25519 is a secure algorithm for key agreement - keyPairGenerator = KeyPairGenerator.getInstance("X25519"); + KeyAgreement x25519Ka = KeyAgreement.getInstance("X25519"); // GOOD: X448 is a secure algorithm for key agreement - keyPairGenerator = KeyPairGenerator.getInstance("X448"); + KeyAgreement x448Ka = KeyAgreement.getInstance("X448"); // GOOD: SHA256withECDSA is a secure signature algorithm Signature sha256Ecdsa = Signature.getInstance("SHA256withECDSA"); + // GOOD: HMAC-based SecretKeySpec should not be flagged + new SecretKeySpec(null, "HMACSHA1"); + new SecretKeySpec(null, "HMACSHA256"); + new SecretKeySpec(null, "HMACSHA384"); + new SecretKeySpec(null, "SHA384withECDSA"); + + // GOOD: PBKDF2 key derivation is a secure algorithm + SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); + } catch (Exception e) { // fail } From 0c5e89a68eff355ca81aa710827194f501046496 Mon Sep 17 00:00:00 2001 From: MarkLee131 Date: Sat, 28 Mar 2026 17:39:40 +0800 Subject: [PATCH 76/81] Exclude bounds-check arithmetic from tainted-arithmetic sinks The java/tainted-arithmetic query now recognizes when an arithmetic expression appears directly as an operand of a comparison (e.g., `if (off + len > array.length)`). Such expressions are bounds checks, not vulnerable computations, and are excluded via the existing overflowIrrelevant predicate. Add test cases for bounds-checking patterns that should not be flagged. --- ...2026-03-28-tainted-arithmetic-bounds-check.md | 4 ++++ .../code/java/security/ArithmeticCommon.qll | 16 +++++++++++++++- .../CWE-190/semmle/tests/ArithmeticTainted.java | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 java/ql/lib/change-notes/2026-03-28-tainted-arithmetic-bounds-check.md diff --git a/java/ql/lib/change-notes/2026-03-28-tainted-arithmetic-bounds-check.md b/java/ql/lib/change-notes/2026-03-28-tainted-arithmetic-bounds-check.md new file mode 100644 index 00000000000..238b1e2978f --- /dev/null +++ b/java/ql/lib/change-notes/2026-03-28-tainted-arithmetic-bounds-check.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `java/tainted-arithmetic` query no longer flags arithmetic expressions that are used directly as an operand of a comparison in bounds-checking patterns. For example, `if (off + len > array.length)` is now recognized as a bounds check rather than a potentially vulnerable computation, reducing false positives. diff --git a/java/ql/lib/semmle/code/java/security/ArithmeticCommon.qll b/java/ql/lib/semmle/code/java/security/ArithmeticCommon.qll index 9282e766627..791c1ab7ba0 100644 --- a/java/ql/lib/semmle/code/java/security/ArithmeticCommon.qll +++ b/java/ql/lib/semmle/code/java/security/ArithmeticCommon.qll @@ -132,7 +132,21 @@ private predicate inBitwiseAnd(Expr exp) { /** Holds if overflow/underflow is irrelevant for this expression. */ predicate overflowIrrelevant(Expr exp) { inBitwiseAnd(exp) or - exp.getEnclosingCallable() instanceof HashCodeMethod + exp.getEnclosingCallable() instanceof HashCodeMethod or + arithmeticUsedInBoundsCheck(exp) +} + +/** + * Holds if `exp` is an arithmetic expression used directly as an operand of a + * comparison, indicating it is part of a bounds check rather than a vulnerable + * computation. For example, in `if (off + len > array.length)`, the addition + * is the bounds check itself. + */ +private predicate arithmeticUsedInBoundsCheck(ArithExpr exp) { + exists(ComparisonExpr comp | + comp.getAnOperand() = exp and + comp.getEnclosingStmt() instanceof IfStmt + ) } /** diff --git a/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.java b/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.java index 5fde69929b2..80a83392873 100644 --- a/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.java +++ b/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.java @@ -138,4 +138,18 @@ public class ArithmeticTainted { // BAD: may underflow if input data is very small --data; } + + public static void boundsCheckGood(byte[] bs, int off, int len) { + // GOOD: arithmetic used directly in a bounds check, not as a computation + if (off + len > bs.length) { + throw new IndexOutOfBoundsException(); + } + } + + public static void boundsCheckGood2(int[] arr, int offset, int count) { + // GOOD: subtraction used directly in a bounds check + if (offset - count < 0) { + throw new IndexOutOfBoundsException(); + } + } } From ea9b99f67c575574a484d1de0a2cd54b866d771c Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com> Date: Sat, 28 Mar 2026 16:36:39 +0000 Subject: [PATCH 77/81] Rephrase change note --- .../change-notes/2026-03-27-add-ec-to-secure-algorithms.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md b/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md index 1e323fafd35..adf25c03a59 100644 --- a/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md +++ b/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md @@ -1,5 +1,5 @@ --- category: minorAnalysis --- -* The `java/potentially-weak-cryptographic-algorithm` query no longer flags Elliptic Curve algorithms (`EC`, `ECDSA`, `ECDH`, `EdDSA`, `Ed25519`, `Ed448`, `XDH`, `X25519`, `X448`), HMAC-based algorithms (`HMACSHA1`, `HMACSHA256`, `HMACSHA384`, `HMACSHA512`), or PBKDF2 key derivation as potentially insecure. These are modern, secure algorithms recommended by NIST and other standards bodies. Previously, these algorithms were not included in the secure algorithm whitelist, causing false positives when using standard Java cryptographic APIs such as `KeyPairGenerator.getInstance("EC")` or `new SecretKeySpec(key, "HMACSHA256")`. -* The `Signature.getInstance(...)` method is now modeled as a `CryptoAlgoSpec` sink, alongside the existing `Signature` constructor sink. This ensures that algorithm strings passed to `Signature.getInstance(...)` are also checked by the query. +* The `java/potentially-weak-cryptographic-algorithm` query no longer flags Elliptic Curve algorithms (`EC`, `ECDSA`, `ECDH`, `EdDSA`, `Ed25519`, `Ed448`, `XDH`, `X25519`, `X448`), HMAC-based algorithms (`HMACSHA1`, `HMACSHA256`, `HMACSHA384`, `HMACSHA512`), or PBKDF2 key derivation as potentially insecure. These are modern, secure algorithms recommended by NIST and other standards bodies. This will reduce the number of false positives for this query. +* The first argument of the method `getInstance` of `java.security.Signature` is now modeled as a sink for `java/potentially-weak-cryptographic-algorithm`, `java/weak-cryptographic-algorithm` and `java/rsa-without-oaep`. From 2b8558706f07b170a83426e4bdb0b934182a7012 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com> Date: Sat, 28 Mar 2026 16:39:16 +0000 Subject: [PATCH 78/81] Add sentence to change note. --- .../lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md b/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md index adf25c03a59..ee53bedd417 100644 --- a/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md +++ b/java/ql/lib/change-notes/2026-03-27-add-ec-to-secure-algorithms.md @@ -2,4 +2,4 @@ category: minorAnalysis --- * The `java/potentially-weak-cryptographic-algorithm` query no longer flags Elliptic Curve algorithms (`EC`, `ECDSA`, `ECDH`, `EdDSA`, `Ed25519`, `Ed448`, `XDH`, `X25519`, `X448`), HMAC-based algorithms (`HMACSHA1`, `HMACSHA256`, `HMACSHA384`, `HMACSHA512`), or PBKDF2 key derivation as potentially insecure. These are modern, secure algorithms recommended by NIST and other standards bodies. This will reduce the number of false positives for this query. -* The first argument of the method `getInstance` of `java.security.Signature` is now modeled as a sink for `java/potentially-weak-cryptographic-algorithm`, `java/weak-cryptographic-algorithm` and `java/rsa-without-oaep`. +* The first argument of the method `getInstance` of `java.security.Signature` is now modeled as a sink for `java/potentially-weak-cryptographic-algorithm`, `java/weak-cryptographic-algorithm` and `java/rsa-without-oaep`. This will increase the number of alerts for these queries. From f5cfc5e282d73e4f89eb2377aa9e7966ed54d8e1 Mon Sep 17 00:00:00 2001 From: Kaixuan Li Date: Sun, 29 Mar 2026 10:25:10 +0800 Subject: [PATCH 79/81] Update java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.java Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com> --- .../security/CWE-190/semmle/tests/ArithmeticTainted.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.java b/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.java index 80a83392873..04020aac31f 100644 --- a/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.java +++ b/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.java @@ -119,6 +119,8 @@ public class ArithmeticTainted { test2(data); test3(data); test4(data); + boundsCheckGood(null, data, 5); + boundsCheckGood2(null, data, 5); } } From b595a70384d4e118dd5fdb94afbb73e27474fb40 Mon Sep 17 00:00:00 2001 From: Kaixuan Li Date: Sun, 29 Mar 2026 11:45:27 +0800 Subject: [PATCH 80/81] Update java/ql/lib/change-notes/2026-03-28-tainted-arithmetic-bounds-check.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../change-notes/2026-03-28-tainted-arithmetic-bounds-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/lib/change-notes/2026-03-28-tainted-arithmetic-bounds-check.md b/java/ql/lib/change-notes/2026-03-28-tainted-arithmetic-bounds-check.md index 238b1e2978f..0688815c822 100644 --- a/java/ql/lib/change-notes/2026-03-28-tainted-arithmetic-bounds-check.md +++ b/java/ql/lib/change-notes/2026-03-28-tainted-arithmetic-bounds-check.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* The `java/tainted-arithmetic` query no longer flags arithmetic expressions that are used directly as an operand of a comparison in bounds-checking patterns. For example, `if (off + len > array.length)` is now recognized as a bounds check rather than a potentially vulnerable computation, reducing false positives. +* The `java/tainted-arithmetic` query no longer flags arithmetic expressions that are used directly as an operand of a comparison in `if`-condition bounds-checking patterns. For example, `if (off + len > array.length)` is now recognized as a bounds check rather than a potentially vulnerable computation, reducing false positives. From e6adfbca77eeb010bd0a8fbb4df5857d8829f177 Mon Sep 17 00:00:00 2001 From: MarkLee131 Date: Sun, 29 Mar 2026 11:53:06 +0800 Subject: [PATCH 81/81] Address review: update QLDoc comment and fix expected test output - Clarify that arithmeticUsedInBoundsCheck applies to if-condition comparisons, not all comparisons - Update expected test line numbers to reflect added test calls --- .../code/java/security/ArithmeticCommon.qll | 6 +-- .../semmle/tests/ArithmeticTainted.expected | 40 +++++++++---------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/java/ql/lib/semmle/code/java/security/ArithmeticCommon.qll b/java/ql/lib/semmle/code/java/security/ArithmeticCommon.qll index 791c1ab7ba0..42b7ec7b02d 100644 --- a/java/ql/lib/semmle/code/java/security/ArithmeticCommon.qll +++ b/java/ql/lib/semmle/code/java/security/ArithmeticCommon.qll @@ -138,9 +138,9 @@ predicate overflowIrrelevant(Expr exp) { /** * Holds if `exp` is an arithmetic expression used directly as an operand of a - * comparison, indicating it is part of a bounds check rather than a vulnerable - * computation. For example, in `if (off + len > array.length)`, the addition - * is the bounds check itself. + * comparison in an `if`-condition, indicating it is part of a bounds check + * rather than a vulnerable computation. For example, in + * `if (off + len > array.length)`, the addition is the bounds check itself. */ private predicate arithmeticUsedInBoundsCheck(ArithExpr exp) { exists(ComparisonExpr comp | diff --git a/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.expected b/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.expected index f7277e3079c..a39920b9065 100644 --- a/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.expected +++ b/java/ql/test/query-tests/security/CWE-190/semmle/tests/ArithmeticTainted.expected @@ -4,10 +4,10 @@ | ArithmeticTainted.java:50:17:50:24 | ... + ... | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:50:17:50:20 | data | This arithmetic expression depends on a $@, potentially causing an overflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | | ArithmeticTainted.java:71:17:71:27 | ... + ... | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:71:17:71:23 | herring | This arithmetic expression depends on a $@, potentially causing an overflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | | ArithmeticTainted.java:95:37:95:46 | ... + ... | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:95:37:95:40 | data | This arithmetic expression depends on a $@, potentially causing an overflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | -| ArithmeticTainted.java:127:3:127:8 | ...++ | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:127:3:127:6 | data | This arithmetic expression depends on a $@, potentially causing an overflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | -| ArithmeticTainted.java:131:3:131:8 | ++... | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:131:5:131:8 | data | This arithmetic expression depends on a $@, potentially causing an overflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | -| ArithmeticTainted.java:135:3:135:8 | ...-- | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:135:3:135:6 | data | This arithmetic expression depends on a $@, potentially causing an underflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | -| ArithmeticTainted.java:139:3:139:8 | --... | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:139:5:139:8 | data | This arithmetic expression depends on a $@, potentially causing an underflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | +| ArithmeticTainted.java:129:3:129:8 | ...++ | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:129:3:129:6 | data | This arithmetic expression depends on a $@, potentially causing an overflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | +| ArithmeticTainted.java:133:3:133:8 | ++... | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:133:5:133:8 | data | This arithmetic expression depends on a $@, potentially causing an overflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | +| ArithmeticTainted.java:137:3:137:8 | ...-- | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:137:3:137:6 | data | This arithmetic expression depends on a $@, potentially causing an underflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | +| ArithmeticTainted.java:141:3:141:8 | --... | ArithmeticTainted.java:17:46:17:54 | System.in : InputStream | ArithmeticTainted.java:141:5:141:8 | data | This arithmetic expression depends on a $@, potentially causing an underflow. | ArithmeticTainted.java:17:46:17:54 | System.in | user-provided value | edges | ArithmeticTainted.java:17:24:17:64 | new InputStreamReader(...) : InputStreamReader | ArithmeticTainted.java:18:40:18:56 | readerInputStream : InputStreamReader | provenance | | | ArithmeticTainted.java:17:24:17:64 | new InputStreamReader(...) : InputStreamReader | ArithmeticTainted.java:18:40:18:56 | readerInputStream : InputStreamReader | provenance | | @@ -38,14 +38,14 @@ edges | ArithmeticTainted.java:66:18:66:24 | tainted : Holder [dat] : Number | ArithmeticTainted.java:66:18:66:34 | getData(...) : Number | provenance | | | ArithmeticTainted.java:66:18:66:24 | tainted : Holder [dat] : Number | Holder.java:16:13:16:19 | parameter this : Holder [dat] : Number | provenance | | | ArithmeticTainted.java:66:18:66:34 | getData(...) : Number | ArithmeticTainted.java:71:17:71:23 | herring | provenance | | -| ArithmeticTainted.java:118:9:118:12 | data : Number | ArithmeticTainted.java:125:26:125:33 | data : Number | provenance | | -| ArithmeticTainted.java:119:10:119:13 | data : Number | ArithmeticTainted.java:129:27:129:34 | data : Number | provenance | | -| ArithmeticTainted.java:120:10:120:13 | data : Number | ArithmeticTainted.java:133:27:133:34 | data : Number | provenance | | -| ArithmeticTainted.java:121:10:121:13 | data : Number | ArithmeticTainted.java:137:27:137:34 | data : Number | provenance | | -| ArithmeticTainted.java:125:26:125:33 | data : Number | ArithmeticTainted.java:127:3:127:6 | data | provenance | | -| ArithmeticTainted.java:129:27:129:34 | data : Number | ArithmeticTainted.java:131:5:131:8 | data | provenance | | -| ArithmeticTainted.java:133:27:133:34 | data : Number | ArithmeticTainted.java:135:3:135:6 | data | provenance | | -| ArithmeticTainted.java:137:27:137:34 | data : Number | ArithmeticTainted.java:139:5:139:8 | data | provenance | | +| ArithmeticTainted.java:118:9:118:12 | data : Number | ArithmeticTainted.java:127:26:127:33 | data : Number | provenance | | +| ArithmeticTainted.java:119:10:119:13 | data : Number | ArithmeticTainted.java:131:27:131:34 | data : Number | provenance | | +| ArithmeticTainted.java:120:10:120:13 | data : Number | ArithmeticTainted.java:135:27:135:34 | data : Number | provenance | | +| ArithmeticTainted.java:121:10:121:13 | data : Number | ArithmeticTainted.java:139:27:139:34 | data : Number | provenance | | +| ArithmeticTainted.java:127:26:127:33 | data : Number | ArithmeticTainted.java:129:3:129:6 | data | provenance | | +| ArithmeticTainted.java:131:27:131:34 | data : Number | ArithmeticTainted.java:133:5:133:8 | data | provenance | | +| ArithmeticTainted.java:135:27:135:34 | data : Number | ArithmeticTainted.java:137:3:137:6 | data | provenance | | +| ArithmeticTainted.java:139:27:139:34 | data : Number | ArithmeticTainted.java:141:5:141:8 | data | provenance | | | Holder.java:12:22:12:26 | d : Number | Holder.java:13:9:13:9 | d : Number | provenance | | | Holder.java:13:3:13:5 | this <.field> [post update] : Holder [dat] : Number | Holder.java:12:14:12:20 | parameter this [Return] : Holder [dat] : Number | provenance | | | Holder.java:13:9:13:9 | d : Number | Holder.java:13:3:13:5 | this <.field> [post update] : Holder [dat] : Number | provenance | | @@ -86,14 +86,14 @@ nodes | ArithmeticTainted.java:119:10:119:13 | data : Number | semmle.label | data : Number | | ArithmeticTainted.java:120:10:120:13 | data : Number | semmle.label | data : Number | | ArithmeticTainted.java:121:10:121:13 | data : Number | semmle.label | data : Number | -| ArithmeticTainted.java:125:26:125:33 | data : Number | semmle.label | data : Number | -| ArithmeticTainted.java:127:3:127:6 | data | semmle.label | data | -| ArithmeticTainted.java:129:27:129:34 | data : Number | semmle.label | data : Number | -| ArithmeticTainted.java:131:5:131:8 | data | semmle.label | data | -| ArithmeticTainted.java:133:27:133:34 | data : Number | semmle.label | data : Number | -| ArithmeticTainted.java:135:3:135:6 | data | semmle.label | data | -| ArithmeticTainted.java:137:27:137:34 | data : Number | semmle.label | data : Number | -| ArithmeticTainted.java:139:5:139:8 | data | semmle.label | data | +| ArithmeticTainted.java:127:26:127:33 | data : Number | semmle.label | data : Number | +| ArithmeticTainted.java:129:3:129:6 | data | semmle.label | data | +| ArithmeticTainted.java:131:27:131:34 | data : Number | semmle.label | data : Number | +| ArithmeticTainted.java:133:5:133:8 | data | semmle.label | data | +| ArithmeticTainted.java:135:27:135:34 | data : Number | semmle.label | data : Number | +| ArithmeticTainted.java:137:3:137:6 | data | semmle.label | data | +| ArithmeticTainted.java:139:27:139:34 | data : Number | semmle.label | data : Number | +| ArithmeticTainted.java:141:5:141:8 | data | semmle.label | data | | Holder.java:12:14:12:20 | parameter this [Return] : Holder [dat] : Number | semmle.label | parameter this [Return] : Holder [dat] : Number | | Holder.java:12:22:12:26 | d : Number | semmle.label | d : Number | | Holder.java:13:3:13:5 | this <.field> [post update] : Holder [dat] : Number | semmle.label | this <.field> [post update] : Holder [dat] : Number |